chore: add files from master-wiki repo

This commit is contained in:
Alexander Navarro 2024-11-20 20:00:35 -03:00
parent f99a9ae2ac
commit 1847f6bf28
315 changed files with 1047341 additions and 0 deletions

View file

@ -0,0 +1,197 @@
# zk configuration file
#
# Uncomment the properties you want to customize.
# NOTE SETTINGS
#
# Defines the default options used when generating new notes.
[note]
# Language used when writing notes.
# This is used to generate slugs or with date formats.
#language = "en"
# The default title used for new note, if no `--title` flag is provided.
#default-title = "Untitled"
# Template used to generate a note's filename, without extension.
#filename = "{{id}}"
# The file extension used for the notes.
#extension = "md"
# Template used to generate a note's content.
# If not an absolute path, it is relative to .zk/templates/
template = "default.md"
# Path globs ignored while indexing existing notes.
#ignore = [
# "drafts/*",
# "log.md"
#]
# Configure random ID generation.
# The charset used for random IDs. You can use:
# * letters: only letters from a to z.
# * numbers: 0 to 9
# * alphanum: letters + numbers
# * hex: hexadecimal, from a to f and 0 to 9
# * custom string: will use any character from the provided value
#id-charset = "alphanum"
# Length of the generated IDs.
#id-length = 4
# Letter case for the random IDs, among lower, upper or mixed.
#id-case = "lower"
# EXTRA VARIABLES
#
# A dictionary of variables you can use for any custom values when generating
# new notes. They are accessible in templates with {{extra.<key>}}
[extra]
#key = "value"
# GROUP OVERRIDES
#
# You can override global settings from [note] and [extra] for a particular
# group of notes by declaring a [group."<name>"] section.
#
# Specify the list of directories which will automatically belong to the group
# with the optional `paths` property.
#
# Omitting `paths` is equivalent to providing a single path equal to the name of
# the group. This can be useful to quickly declare a group by the name of the
# directory it applies to.
#[group."<NAME>"]
#paths = ["<DIR1>", "<DIR2>"]
#[group."<NAME>".note]
#filename = "{{format-date now}}"
#[group."<NAME>".extra]
#key = "value"
# MARKDOWN SETTINGS
[format.markdown]
# Format used to generate links between notes.
# Either "wiki", "markdown" or a custom template. Default is "markdown".
link-format = "[[{{path}}|{{title}}]]"
# Indicates whether a link's path will be percent-encoded.
# Defaults to true for "markdown" format and false for "wiki" format.
#link-encode-path = true
# Indicates whether a link's path file extension will be removed.
# Defaults to true.
#link-drop-extension = true
# Enable support for #hashtags.
hashtags = true
# Enable support for :colon:separated:tags:.
colon-tags = false
# Enable support for Bear's #multi-word tags#
# Hashtags must be enabled for multi-word tags to work.
multiword-tags = true
# EXTERNAL TOOLS
[tool]
# Default editor used to open notes. When not set, the EDITOR or VISUAL
# environment variables are used.
#editor = "vim"
# Pager used to scroll through long output. If you want to disable paging
# altogether, set it to an empty string "".
#pager = "less -FIRX"
# Command used to preview a note during interactive fzf mode.
# Set it to an empty string "" to disable preview.
# bat is a great tool to render Markdown document with syntax highlighting.
#https://github.com/sharkdp/bat
#fzf-preview = "bat -p --color always {-1}"
# LSP
#
# Configure basic editor integration for LSP-compatible editors.
# See https://github.com/zk-org/zk/blob/main/docs/editors-integration.md
#
[lsp]
[lsp.diagnostics]
# Each diagnostic can have for value: none, hint, info, warning, error
# Report titles of wiki-links as hints.
#wiki-title = "hint"
# Warn for dead links between notes.
dead-link = "error"
[lsp.completion]
# Customize the completion pop-up of your LSP client.
# Show the note title in the completion pop-up, or fallback on its path if empty.
#note-label = ""
# Filter out the completion pop-up using the note title or its path.
#note-filter-text = " "
# Show the note filename without extension as detail.
#note-detail = ""
# NAMED FILTERS
#
# A named filter is a set of note filtering options used frequently together.
#
[filter]
# Matches the notes created the last two weeks. For example:
# $ zk list recents --limit 15
# $ zk edit recents --interactive
#recents = "--sort created- --created-after 'last two weeks'"
# COMMAND ALIASES
#
# Aliases are user commands called with `zk <alias> [<flags>] [<args>]`.
#
# The alias will be executed with `$SHELL -c`, please refer to your shell's
# man page to see the available syntax. In most shells:
# * $@ can be used to expand all the provided flags and arguments
# * you can pipe commands together with the usual | character
#
[alias]
# Here are a few aliases to get you started.
# Shortcut to a command.
#ls = "zk list $@"
# Default flags for an existing command.
#list = "zk list --quiet $@"
# Edit the last modified note.
#editlast = "zk edit --limit 1 --sort modified- $@"
# Edit the notes selected interactively among the notes created the last two weeks.
# This alias doesn't take any argument, so we don't use $@.
#recent = "zk edit --sort created- --created-after 'last two weeks' --interactive"
# Print paths separated with colons for the notes found with the given
# arguments. This can be useful to expand a complex search query into a flag
# taking only paths. For example:
# zk list --link-to "`zk path -m potatoe`"
#path = "zk list --quiet --format {{path}} --delimiter , $@"
# Show a random note.
#lucky = "zk list --quiet --format full --sort random --limit 1"
# Returns the Git history for the notes found with the given arguments.
# Note the use of a pipe and the location of $@.
#hist = "zk list --format path --delimiter0 --quiet $@ | xargs -t -0 git log --patch --"
# Edit this configuration file.
#conf = '$EDITOR "$ZK_NOTEBOOK_DIR/.zk/config.toml"'

Binary file not shown.

View file

@ -0,0 +1,9 @@
---
title: "{{title}}"
tags:
created: {{format-date now "%Y-%m-%d %H:%M"}}
---
# {{title}}
{{content}}

View file

@ -0,0 +1,18 @@
# 17-Year-Old Student Exposes Germany's 'Secret' Pirate Site Blocklist
![rw-book-cover](https://news.ycombinator.com/favicon.ico)
## Metadata
- Author: [[isaacfrond]]
- Full Title: 17-Year-Old Student Exposes Germany's 'Secret' Pirate Site Blocklist
- Category: #articles
- URL: https://torrentfreak.com/17-year-old-student-exposes-germanys-secret-pirate-site-blocklist-240822/
> [!tldr]
> A 17-year-old student in Germany has created a website to reveal the blocked pirate sites that major internet providers do not disclose. This initiative aims to increase transparency and address concerns about censorship related to copyright enforcement. The site, CUIIliste.de, lists 275 blocked domains, allowing users to see which sites are restricted.
## Highlights
watchdog - ([View Highlight](https://read.readwise.io/read/01j64wj1fy8b0dyhcdsjgv4vta))
> [!note]
> Watchdog: A term used to describe an individual or organization that monitors and oversees the actions of others, often to ensure accountability, transparency, and adherence to laws or regulations. Watchdogs play a critical role in various fields, including journalism, government, and environmental protection, by investigating misconduct, exposing corruption, and advocating for the public interest. Their function is essential in promoting ethical standards and fostering public trust in institutions.
> In the context of Isaac Frond's article, the term "watchdog" refers to individuals or organizations that monitor and ensure accountability regarding governmental or institutional actions, particularly in relation to transparency and rights. The lack of public knowledge about the blocked pirate sites in Germany has led to frustration among journalists and advocates, highlighting the need for oversight. The 17-year-old student, along with his friends, embodies this watchdog role by exposing the secretive blocklist, thereby promoting transparency and challenging potential overreach in copyright enforcement.

View file

@ -0,0 +1,25 @@
---
id: 9f0419b3-2f89-4734-96b3-55aa984414ac
title: |
How to Learn Rust
status: ARCHIVED
tags:
- read-later
- Youtube
- Youtube
date_added: 2023-10-12 17:55:48
url_omnivore: |
https://omnivore.app/me/how-to-learn-rust-18b25ac93bb
url_original: |
https://www.youtube.com/watch?v=2hXNd6x9sZs
---
# How to Learn Rust
## Original
<div class="page" id="readability-page-1">
<iframe data-omnivore-anchor-idx="1" width="619.4690265486726" height="350" src="https://www.youtube.com/embed/2hXNd6x9sZs" title="How to Learn Rust" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p data-omnivore-anchor-idx="2"><a data-omnivore-anchor-idx="3" href="https://www.youtube.com/watch?v=2hXNd6x9sZs" target="_blank">How to Learn Rust</a></p>
<p data-omnivore-anchor-idx="4" itemscope itemprop="author" itemtype="http://schema.org/Person">By <a data-omnivore-anchor-idx="5" href="https://www.youtube.com/@NoBoilerplate" target="_blank">No Boilerplate</a></p>
</div>

View file

@ -0,0 +1,272 @@
---
id: 85f31880-6935-11ee-86f4-f7cb87ce263e
title: |
The Secret Power of Read It Later Apps
status: ARCHIVED
tags:
- read-later
date_added: 2023-10-12 16:28:29
url_omnivore: |
https://omnivore.app/me/the-secret-power-of-read-it-later-apps-18b255ca194
url_original: |
https://fortelabs.co/blog/the-secret-power-of-read-it-later-apps
---
# The Secret Power of Read It Later Apps
## Highlights
> People who cling to paradigms (which means just about all of us) take one look at the spacious possibility that everything they think is guaranteed to be nonsense and pedal rapidly in the opposite direction. Surely there is no power, no control, no understanding, not even a reason for being, much less acting, in the notion or experience that there is no certainty in any worldview. But, in fact, everyone who has managed to entertain that idea, for a moment or for a lifetime, has found it to be the basis for radical empowerment. **If no paradigm is right, you can choose whatever one will help to achieve your purpose.**
> It is in this space of mastery over paradigms that people throw off addictions, live in constant joy, bring down empires, get locked up or burned at the stake or crucified or shot, and **have impacts that last for millennia**.
> In the end, it seems that mastery has less to do with pushing leverage points than it does with **strategically, profoundly, madly letting go.**
> [!note]
> Read again and understand it better
[source](https://omnivore.app/me/the-secret-power-of-read-it-later-apps-18b255ca194#42edb9e2-3799-430e-bbff-db1170ebbad1)
---
## Original
<DIV class="page" id="readability-page-1">
<div>
<div data-widget_type="theme-post-content.default" data-element_type="widget" data-id="5d9db16f">
<figure>
<figure>
<img src="https://proxy-prod.omnivore-image-cache.app/900x380,sXXV7f9Au3y4tF2zoOnAQ1G8Xnf3Uh8IRqZcfVY3HoSY/https://i0.wp.com/cdn-images-1.medium.com/max/2000/1*rPXwIczUJRCE54v8FfAHGw.jpeg?resize=900%2C380&ssl=1" alt="" width="900" height="380" data-recalc-dims="1">
<figcaption> Image via Nuno Cruz </figcaption>
</figure>
<figcaption></figcaption>
</figure>
<p>
<em>By Tiago Forte of</em> <a href="http://fortelabs.co/" target="_blank" rel="noopener noreferrer"><em>Forte Labs</em></a>
</p>
<p> At the end of 2014 I received an email informing me that I had read over a million words in the read it later app Pocket over the course of the year. </p>
<p>
<img loading="lazy" src="https://proxy-prod.omnivore-image-cache.app/358x377,ssfZXhGmomcxzcD-VkrtnzD-6vk-rI8GUuXk4JlRMX2s/https://i0.wp.com/cdn-images-1.medium.com/max/600/1*Hd7YIhMrS5lldl1gDU8iWQ.png?resize=358%2C377&ssl=1" width="358" height="377" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/600/1*Hd7YIhMrS5lldl1gDU8iWQ.png?resize=358%2C377&ssl=1" data-recalc-dims="1">
</p>
<p> This number by itself isnt impressive, considering our daily intake of information is equivalent to <a href="http://bits.blogs.nytimes.com/2009/12/09/the-american-diet-34-gigabytes-a-day/" target="_blank" rel="noopener noreferrer">34 gigabytes</a>, 100,000 words, or <a href="http://www.nytimes.com/2014/08/10/opinion/sunday/hit-the-reset-button-in-your-brain.html?smprod=nytcore-iphone&smid=nytcore-iphone-share" target="_blank" rel="noopener noreferrer">174 newspapers</a>, depending on who you ask. </p>
<p> What makes this number significant (in my view) is that it represents 22 books-worth of long-form reading that would not have happened without a system in place. </p>
<p> Weve made a habit of filling those hundred random spaces in our day with glances at Twitter, Instagram, and Facebook. But those glances have slowly become stares, and those stares have grown to encompass a major portion of our waking hours. </p>
<p> The end result is the same person who spends 127 hours per year on Instagram (the <a href="http://www.businessinsider.com/people-spend-21-minutes-per-day-on-instagram-2014-10" target="_blank" rel="noopener noreferrer">global average</a>) complains that she has “no time” for reading. </p>
<p> The fact is, <strong>the ability to read is becoming a source of competitive advantage in the world</strong>. </p>
<p> Im not talking about basic literacy. What has become exceedingly scarce (and therefore, valuable) is the physical, emotional, attentional, and mental capability to sit quietly and direct focused attention for sustained periods of time. </p>
<p> A <a href="https://hbr.org/2005/01/overloaded-circuits-why-smart-people-underperform" target="_blank" rel="noopener noreferrer">recent article</a> in the Harvard Business Review puts a name to this new neurological phenomenon: Attention Deficit Trait. Basically, the terms ADD and ADHD are falling out of use because effectively the entire population fits the diagnostic criteria. Its not a condition anymore, its a <em>trait</em>the inherent and unavoidable experience of modern life characterized by “distractibility, inner frenzy, and impatience.” </p>
<form action="https://app.convertkit.com/forms/1022733/subscriptions" method="post" data-sv-form="1022733" data-uid="308d24305b" data-format="inline" data-version="5" min-width="400 500 600 700">
<div data-style="full">
<p><img src="https://proxy-prod.omnivore-image-cache.app/0x0,sCKKsi_KsyhXjSRvn7hvFRJEjLKQkBiJU0agepFckkI4/https://embed.filekitcdn.com/e/oP2q5jihy5hj474ZFtvPjw/3edWskTMDwFhuVEtauLv5X"></p>
<p> Start Building Your Second Brain </p>
<p> Subscribe below to learn more about the next cohort of the Building a Second Brain course </p>
</div>
</form>
<h3> Read It.&nbsp;Later. </h3>
<p> Before I explain the massive, under-appreciated benefits these apps provide, and how to use them most effectively, a quick primer in case youre unfamiliar. </p>
<p> So-called “Read It Later” apps give you the ability to “save” content on the web for later consumption. They are essentially advanced bookmarking apps, pulling in the content from a page to be read or viewed in a cleaner, simpler visual layout. </p>
<p> On top of that core function they add features like favoriting, tags, search, cross-platform syncing, recommended content, offline viewing, and archiving. The most popular options are: </p>
<ul>
<li>
<a href="https://www.instapaper.com/" target="_blank" rel="noopener noreferrer">Instapaper</a>
</li>
<li>
<a href="https://getpocket.com/a/" target="_blank" rel="noopener noreferrer">Pocket</a>
</li>
<li>
<a href="https://chrome.google.com/webstore/detail/send-to-kindle-for-google/cgdjpilhipecahhcilnafpblkieebhea?hl=en" target="_blank" rel="noopener noreferrer">Send to Kindle</a> (for sending articles to your Kindle)
</li>
<li>
<a href="https://feedly.com/i/welcome" target="_blank" rel="noopener noreferrer">Feedly</a> (for those RSS fans)
</li>
<li>and <a href="https://support.apple.com/en-us/HT200294" target="_blank" rel="noopener noreferrer">Safaris built-in “Add to Reading List” feature</a>. </li>
</ul>
<p> The app I use, Pocket, adds a button to the Chrome toolbar that looks like this: </p>
<figure>
<img loading="lazy" src="https://proxy-prod.omnivore-image-cache.app/130x58,syYiQlMJ3hP3JyGS_AYz8D5Oq9FZ1QxR2ef29Fia7Ht0/https://i0.wp.com/cdn-images-1.medium.com/max/800/1*Lk-DPDFjLslM4h2GAv8KIA.png?resize=130%2C58&ssl=1" alt="" width="130" height="58" data-image-id="1*Lk-DPDFjLslM4h2GAv8KIA.png" data-width="130" data-height="58" data-recalc-dims="1">
<figcaption> Chrome toolbar </figcaption>
</figure>
<p>
<em>Note: at time of writing, I was using Pocket, but have recently switched to Instapaper because of Pockets “Share to Evernote” bug mentioned below.</em>
</p>
<p> Clicking the button while viewing a webpage turns the button pink, and saves the page to your “list.” Navigating to getpocket.com, or opening the Pocket app on your computer or mobile device shows you a list of everything youve saved: </p>
<figure>
<figure>
<img loading="lazy" src="https://proxy-prod.omnivore-image-cache.app/800x507,smjUUrOduWv7T0bCSx9oh_Ag0Yasq_HyFfgAoDXryOcM/https://i0.wp.com/cdn-images-1.medium.com/max/800/1*wkKD4oP3-kWJERxmBBI2cA.png?resize=800%2C507&ssl=1" alt="" width="800" height="507" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/800/1*wkKD4oP3-kWJERxmBBI2cA.png?resize=800%2C507&ssl=1" data-recalc-dims="1">
<figcaption> Mac desktop client </figcaption>
</figure>
<p> You can also view your list in a “tile” layout on the web, making it into essentially a personalized magazine. Personalized, in this case, not by a cold, unfeeling algorithm, but by your past self: </p>
</figure>
<figure>
<img loading="lazy" src="https://proxy-prod.omnivore-image-cache.app/800x478,sFjAZnzFiVzsVRlXF9QyD5dq_jzT69dsyyp3Bb-k5ZGU/https://i0.wp.com/cdn-images-1.medium.com/max/800/1*ug06oorCHGFpEzMyl9kfhg.png?resize=800%2C478&ssl=1" alt="" width="800" height="478" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/800/1*ug06oorCHGFpEzMyl9kfhg.png?resize=800%2C478&ssl=1" data-recalc-dims="1">
<figcaption> Web browser “tile” view </figcaption>
</figure>
<p> Marking an item as read in one version of the app will quickly sync across all platforms. It will also save your current progress on one device, so you can continue where you left off on a different device (for those longer pieces). </p>
<h3> The highest leverage point in a system is in the intakethe initial assumptions and paradigms that inform its development </h3>
<p> Ive <a href="https://medium.com/forte-labs/how-to-use-evernote-for-your-creative-workflow-f048f0aa3ed1" target="_blank" rel="noopener noreferrer">written previously</a> about how to use Evernote as a general reference filing system, not only to stay organized but to inspire creativity. </p>
<p> But I didnt address a key question when creating any workflow: how and from where does information enter the system? The quality of a workflows outputs is fundamentally limited by the quality of its inputs. Garbage in, garbage out. </p>
<p> There are A LOT of ways we could talk about to improve the quality of the information you consume. But I want to focus now on the two that Read It Later apps can help with: </p>
<ol>
<li>Increasing consumption of long-form content (which is presumably more substantive) </li>
<li>Better filtering </li>
</ol>
<h3> #1 | Increasing Consumption of Long-Form Content </h3>
<p> In order to consume good ideas, first you have to consume many ideas. </p>
<p> This is the fundamental flaw in the “information diet” advice from Tim Ferriss and others: strong filters work best on a larger initial flow. Using your friends as your primary filter for new ideas ensures you remain the dumbest person in the room, and contribute nothing to the conversation. </p>
<p> The problem is that our entire digital world is geared toward snackable chunks of low-grade informationphotos, tweets, statuses, snaps, feeds, cards, etc. To fight the tide you have to redesign your environmentyou have to create affordances. </p>
<blockquote>
<p> Affordance (n.): a relation between an object and an organism that, through a collection of stimuli, <strong>affords the opportunity for that organism to perform an action.</strong>
</p>
</blockquote>
<p> Lets look at the 4 main barriers to consuming long-form content, and the affordances that Read It Later apps use to overcome them: </p>
<h4> 1. App performance </h4>
<p> We know that the most infinitesimal delays in the loading time of a webpage will dramatically impact how many people stay on the page. <a href="https://blog.kissmetrics.com/speed-is-a-killer/" target="_blank" rel="noopener noreferrer">Google found</a> that increasing the number of results per page from 10 to 30 took only half a second longer, but <strong>caused 20% of people to drop off</strong>. </p>
<p> If you think your behavior is not affected by such trivialities, think again. Even on a subconscious level, you will resist even opening apps that dont reward you with snappy response times. Which is a problem because the apps most people turn to for reading are either ebook apps like iBooks and Kindle, or web browsers like Chrome and Safari. Im not sure which category is slower, but theyre both abysmal. </p>
<p> Meanwhile, your snaps and instas refresh at precog-like speeds. </p>
<p> Read It Later apps, by slurping in content (articles, videos, slideshows) into a clean interface, eliminate the culpritsads, site analytics, popupsall the stuff you dont care about. </p>
<p> A <a href="http://www.nytimes.com/2015/10/01/technology/personaltech/ad-blockers-mobile-iphone-browsers.html" target="_blank" rel="noopener noreferrer">recent analysis</a> by The New York Times of 3 leading ad-blockers (which have the same effect) measured a <strong>21% increase in battery life</strong>, and in the most egregious case of Boston.com, a drop in loading time <strong>from 33 seconds to 7 seconds</strong>. Many other leading sites were not that far off. </p>
<figure>
<img loading="lazy" src="https://proxy-prod.omnivore-image-cache.app/563x365,sFABKoLfIzSHIwYCEllG7t2i-uxewZOlI9ALe6-KJLSs/https://i0.wp.com/cdn-images-1.medium.com/max/800/1*vfmR5LKEjfx-0Lx-kWb4bw.png?resize=563%2C365&ssl=1" alt="" width="563" height="365" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/800/1*vfmR5LKEjfx-0Lx-kWb4bw.png?resize=563%2C365&ssl=1" data-recalc-dims="1">
<figcaption> Effect of ad-blocker on loading times of Boston.com, via <a href="http://www.nytimes.com/2015/10/01/technology/personaltech/ad-blockers-mobile-iphone-browsers.html" target="_blank" rel="noopener noreferrer">NYT</a>
</figcaption>
</figure>
<p> Yeah thats pretty much an eternity in mobile behavior land. </p>
<h4> 2. Matching content with your&nbsp;context </h4>
<figure>
<figure>
<img loading="lazy" src="https://proxy-prod.omnivore-image-cache.app/507x676,sxG7LpsFKxnoEDDIOpwI06zJ3e8CoE30WZseOtRT8u6s/https://i0.wp.com/cdn-images-1.medium.com/max/600/1*N15BlTDGq8kTc7HdGUmShA.png?resize=507%2C676&ssl=1" alt="" width="507" height="676" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/600/1*N15BlTDGq8kTc7HdGUmShA.png?resize=507%2C676&ssl=1" data-recalc-dims="1">
<figcaption> My Pocket list on iPad </figcaption>
</figure>
</figure>
<p> Much of the time when we pull out our phone, were looking for something to match our mood (or energy, or time available, or other context). We use our constellation of shiny apps as mood regulators and self-soothers, as time-fillers and boredom-suppressors, for better or worse. </p>
<p> So you need a little entertainment, and you open…an ebook? Yeah right. Monochrome pages dont attract you. They dont draw you in. </p>
<p> Pocket gives reading some of this stimulatory pleasure by laying out your list in a pleasing, magazine-style layout (at left). Not only is it generally attractive, but it gives you that same magazine-flipping pleasure of engaging with something that interests you <em>right in that moment</em>. </p>
<p> David Allen puts it this way: </p>
<blockquote>
<p> “Its practical to have organized reading material at hand when youre on your way to a meeting that may be starting late, a seminar that may have a window of time when nothing is going on, a dentist appointment that may keep you waiting, or, of course, if youre going to have some time on a train or plane. Those are all great opportunities to browse and work through that kind of reading. People who dont have their Read/Review material organized can waste a lot of time, since <strong>life is full of weird little windows when it could be used.</strong></p>
</blockquote>
<p> Youre not fighting your impulses forcing yourself to read a dense tome after a long work day. Willpower preserved ✓ </p>
<h4> 3. Asynchronous reading </h4>
<p> This is one of the least understood barriers to reading in our fragmented timescape. </p>
<p> There is something deeply, deeply unsatisfying about repeatedly starting something and not finishing it. This is what we experience all day at work, being continuously interrupted by a stream of “emergencies.” The last thing we want after a stressful day starved of wins is to fail even at reading an article. </p>
<p> The <a href="https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity-ebook/dp/B00KWG9M2E/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=fortelabs07-20&linkId=fe6db72d8e5bbb38b1ea43241924f7e9&language=en_US" target="_blank" rel="noopener noreferrer">2015 revised edition (affiliate link)</a> of <em>Getting Things Done</em> <a href="http://users.wfu.edu/masicaej/MasicampoBaumeister2011JPSP.pdf" target="_blank" rel="noopener noreferrer">cites the work</a> of Dr. Roy Baumeister, who has shown that “uncompleted tasks take up room in the mind, which then limits clarity and focus.” The risk of cognitive dissonance at not being able to finish a long article (much less a book) keep us from even beginning it. </p>
<p> Read It Later apps address this by simply saving your progress in a given article, allowing you to pick back up at a different time, or on a different device, and clearly marking items as “read” once youre finished. </p>
<h4> 4. Focus </h4>
<p> A common response when I recommend people adopt <em>yet another</em> category of apps is “Why dont I just use Evernote?” Or whatever app theyre using for general reference or task management. Evernote even makes a Chrome extension called <a href="https://evernote.com/clearly/" target="_blank" rel="noopener noreferrer">Clearly</a> for reading online content and <a href="https://evernote.com/webclipper/?downloaded" target="_blank" rel="noopener noreferrer">Web Clipper</a> for saving it. </p>
<p> It is a question of focus. Why dont you use your task manager to keep track of content (i.e. “Read this article”)? Because the last thing you want to see when you cuddle up with your hot cocoa for some light reading is the hundreds of tasks youre not doing. </p>
<p> Likewise, the last thing you want to see when you (finally!) have time to read is the thousands of notes youve collected from every corner of the universe, only some of which you havent read, only some of which you <em>want</em> to read, only some of which are <em>meant</em> to be read. </p>
<blockquote>
<p> Actionable info ≠ Reference info ≠ To Read&nbsp;pile </p>
</blockquote>
<p> Ergo, </p>
<blockquote>
<p> Task manager ≠ Evernote ≠&nbsp;Pocket </p>
</blockquote>
<h3> #2 | Better filtering </h3>
<p> Now youve got the funnel filled. Its time to narrow it. </p>
<p> Most advice on this topic focuses on being more selective about your sources. Cutting out the email digests that just throw you off track, unfollowing people posting crap, or even <a href="https://chrome.google.com/webstore/detail/ad-replacer-turn-spammy-a/eckeeomlpacfhejaameopnmgipghaoam" target="_blank" rel="noopener noreferrer">directly replacing ads with quality sources</a>. </p>
<p> The problem is that this assumes you are always at your best, always at 100% self-discipline, totally aligned with your life values, priorities ship shape. </p>
<p> Yeah. </p>
<p> In the moment, with your blood sugar at a negative value and every fiber of your being screaming for a dopamine hit, <em>of course</em> that Buzzfeed article seems like the best conceivable use of your time. If you think you can permanently seal off your life from the celebrity news, content marketing, and spammy friends that dominate the web, the NSA has a job for you. </p>
<p> Procrastination is the most powerful force in the universe. <em>It will find a way.</em>
</p>
<p> I have a different approach: <strong>waiting periods</strong>. Every time I come across something I may want to read/watch, Im totally allowed to. No limits! The only requirement is I have to save it to Pocket, and then choose to consume it at a later time. </p>
<p> Ive found that even just clicking a link to open the URL, in order to save it to Pocket, is too much of a temptation. The first glimpse of a cute GIF and Im off to Reddit, completely forgetting my morning email session. </p>
<p> So instead I just <strong>command-click</strong> every link Im interested in (or <strong>right-click &gt; Open link in new tab</strong>), which opens each link in a separate tab <em>without taking me to that tab</em>. </p>
<p> Heres what a typical Monday morning link-fest looks like, just from email: </p>
<p>
<img src="https://proxy-prod.omnivore-image-cache.app/0x0,s6KkWg-OdGcQNuvOShcztrmaslDz3Cm5o9rD1eDOxxRc/https://i0.wp.com/cdn-images-1.medium.com/max/2000/1*cLy09F0SPJJmi0WfazXi3Q.png?w=900&ssl=1" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/2000/1*cLy09F0SPJJmi0WfazXi3Q.png?w=900&ssl=1" data-recalc-dims="1">
</p>
<p> Then, because Im still in <strong>collection mode</strong>, not in read mode, I cycle through each tab one at a time (<strong>shift-command-}</strong> or <strong>control-tab</strong>), saving each one to Pocket using the shortcut I set up: <strong>command-p</strong> (chosen for irony and to avoid inadvertent printing). </p>
<p> Theres only one rule: <strong>NO READING OR WATCHING!</strong>
</p>
<p> Bringing this back to filtering, not only am I saving time and preserving focus by batch processing both the collection and the consumption of new content, Im <strong>time-shifting the curation process</strong> to a time better suited for reading, and (most critically) removed from the temptations, stresses, and biopsychosocial hooks that first lured me in. </p>
<p> I am always amazed by what happens: no matter how stringent I was in the original collecting, no matter how certain I was that this thing was worthwhile, I <strong>regularly eliminate 1/3 of my list before reading</strong>. The post that looked SO INTERESTING when compared to that one task Id been procrastinating on, in retrospect isnt even something I care about. </p>
<p> What Im essentially doing is creating a buffer. Instead of pushing a new piece of info through from intake to processing to consumption without any scrutiny, Im creating a pool of options drawn from a longer time period, which allows me to make decisions from a higher perspective, where those decisions are much better aligned with what truly matters to me. </p>
<blockquote>
<p> Remove any feature, process, or effort that does not directly contribute to the learning you seek.Eric Ries, The Leaders Guide </p>
</blockquote>
<p> Heres a visual of how this works, from my Pocket analytics: </p>
<p>
<img src="https://proxy-prod.omnivore-image-cache.app/0x0,stGbUueP6GB86OSUIreA-v1CvD10SF4A-ecLznSBpGQc/https://i0.wp.com/cdn-images-1.medium.com/max/800/1*YRExWXbhPma8-AcWP_KSrw.png?w=900&ssl=1" data-src="https://i0.wp.com/cdn-images-1.medium.com/max/800/1*YRExWXbhPma8-AcWP_KSrw.png?w=900&ssl=1" data-recalc-dims="1">
</p>
<p> You can see that I save more things toward the beginning of the week and the weekend, and then draw down the buffer more towards the end of the week. </p>
<p>
<strong><em>/sidebar</em></strong>
</p>
<p> Imagine for a second if we could do this with everything. On Saturday morning, well-rested and wise, you retroactively decide everything you <em>want to have done</em> during the previous week. Anything you decide was not worthwhile, you <em>get that time back</em>. </p>
<p> I experienced this recently with emailafter returning from a 10-day meditation course during which I was completely off the grid, I was surprised to notice it took only 1.9 hours to process almost 2 weeks worth of email (I track these things). I normally spend on average 2.19 hours on email <strong>per week</strong> —<em>what happened to those extra 2.48 hours?!</em> Besides the gains from batch processing such a large quantity of emails at once, I believe the main factor was that I evaluated my emails from a longer time horizon and higher perspective, more correctly judging whether something was worth responding to or acting on. </p>
<p> If only this method would scale. </p>
<p>
<strong>/end_sidebar</strong>
</p>
<h3> Mo apps, mo&nbsp;problems </h3>
<p> There are drawbacks, which Ive glossed over until now. The two main ones: </p>
<h4> 1. Formatting issues </h4>
<p> Many sites, including popular ones, arent presented correctly within the Pocket app (and I imagine others). Theres always the option of opening the link in a web browser, but this eliminates all the positive affordances and then some. If there wasnt so much value provided otherwise, this would be a deal breaker. </p>
<p> The worst part is that, sometimes, the article is cut off or links dont appear <em>without any indication that something is amiss</em>. On Tim Ferriss blog, for example, links (of which there are many) are simply removed. </p>
<p> One solution is to tag problematic items with “desktop” so you know that these need to be read/viewed on your computer. </p>
<h4> 2. Dependence </h4>
<p> Every productivity tool eventually becomes a victim of its own success. In this case, Ive become so dependent on Pocket that bugs really affect me. </p>
<p> For example, the Share to Evernote feature, which I use to highlight and save key passages, has been broken for at least a month. My hysterical tweets to Pocket Support have been answered but not resolved. </p>
<p> You wouldnt think such a minor feature within one app could be so disruptive, but it has been massively so. This simple workflow: </p>
<p>
<em>Highlight &gt; Share &gt; Share to Evernote &gt; Save</em>
</p>
<p> …has been replaced with this: </p>
<p>
<em>Highlight &gt; Copy &gt; Switch to Evernote &gt; New note &gt; Paste &gt; Switch back to Pocket &gt; Share &gt; More &gt; Copy URL &gt; Switch back to Evernote &gt; Paste URL &gt; Switch back to Pocket</em>
</p>
<p> Worse, I often forget to go back and grab the URL, so I have to hunt it down at some later date. </p>
<p>
<strong>/rant_over</strong>
</p>
<h3> Progress Traps and Paradigms </h3>
<p> The amount of information in the world is a <a href="https://en.wikipedia.org/wiki/Progress_trap" target="_blank" rel="noopener noreferrer">progress trap</a>. Too much stuff to read is just as limiting as too little. </p>
<p> As the inimitable Venkatesh Rao <a href="http://breakingsmart.com/season-1/" target="_blank" rel="noopener noreferrer">has written</a>, were moving from a world of <strong>containers</strong> (companies, departments, semesters, packages, silos) to a world of <strong>streams</strong> (social networks, info feeds, main streets of thriving cities, Twitter). Problems and opportunities alike resist having neat little boxes drawn around them. Theres way too much to absorb. Way too much to even guess what you dont know. </p>
<p> As the pace of change in the world accelerates, we double down on all the methods that created the problems in the first placemore planning, more forecasting, more control and risk management. Were left with massive institutions that nobody trusts, that are simultaneously brittle and too-big-to-fail, creating precarity at every level of the socioeconomic pyramid. </p>
<p> What would it look like instead to solve problems (and explore opportunities) in a way that gets better the faster we go? </p>
<p> I cant do justice to Raos blog series linked above (its in 20 partsmay want to save it for later&nbsp;;), but the first step he proposes is “exposing yourself to as many different diverse streams as possible.” </p>
<p> When youre immersed in a stream, the faster it goes, the more novel perspectives and ideas youre exposed to. You develop an <a href="http://rogerlmartin.com/lets-read/the-opposable-mind" target="_blank" rel="noopener noreferrer">opposable mind</a>the ability to juggle and play around with different perspectives on any issue, instead of seeing it through one lens. </p>
<p> Increasingly, the only metric that will matter in your journey of personal growth will be <strong>ROL: Rate-of-Learning</strong>. Weve heard a lot in recent years about the importance of hands-on learning and practical experimentation. We get it. Burying your head in a book by itself gets you nowhere. </p>
<p> But the pendulum is swinging too far in that direction. Yes, you can be <em>too</em> action-oriented. Ideas, while cheap when compared to effective execution, are still more valuable than many of the other things we spend time on. </p>
<p> Theres another way to learn faster: assimilate and build on the ideas of others. Sure, you wont understand every tacit lesson their experience gave them, but you can incorporate many of them, and in a fraction of the time it would take you to make every mistake yourself. </p>
<p> Ideas are high leverage agents. They become more so when arranged in highly cross-referenced networks. The only tool we have available that is capable of both creating and accessing these networks on demand is the human brain. </p>
<p> I lied before. There is one form of leverage even more powerful than the initial assumptions and paradigms that inform a systems development: the <strong>ability to transcend paradigms</strong>. </p>
<p> I cant put it any better than Donella Meadows, in her <a href="http://www.donellameadows.org/archives/leverage-points-places-to-intervene-in-a-system/" target="_blank" rel="noopener noreferrer">seminal piece</a> on complex systems: </p>
<blockquote>
<p> People who cling to paradigms (which means just about all of us) take one look at the spacious possibility that everything they think is guaranteed to be nonsense and pedal rapidly in the opposite direction. Surely there is no power, no control, no understanding, not even a reason for being, much less acting, in the notion or experience that there is no certainty in any worldview. But, in fact, everyone who has managed to entertain that idea, for a moment or for a lifetime, has found it to be the basis for radical empowerment. <strong>If no paradigm is right, you can choose whatever one will help to achieve your purpose.</strong>
</p>
</blockquote>
<blockquote>
<p> It is in this space of mastery over paradigms that people throw off addictions, live in constant joy, bring down empires, get locked up or burned at the stake or crucified or shot, and <strong>have impacts that last for millennia</strong>. </p>
</blockquote>
<blockquote>
<p> In the end, it seems that mastery has less to do with pushing leverage points than it does with <strong>strategically, profoundly, madly letting go.</strong>
</p>
</blockquote>
<p> Reading is the closest thing we have to thinking anothers thoughts. Its long and sometimes ponderous, but that work is required to wrap yourself in another persons paradigm. Which is the first step in madly letting go of your own. </p>
<p> The amazing thing about ideas is that it takes zero time for one to change your paradigm. It happens in time, but takes no time, like an inter-dimensional wormhole, one entangled particle in your brain mirroring its twin across a chasm even more vast than the universethe chasm between two minds. </p>
<p> And that is the secret power of Read It Later apps. </p>
<p>
<strong>P.S.</strong> <em>My latest setup has 2 parts: 1) using</em> <a href="https://ifttt.com/recipes/182352-instpaper-to-evernote" target="_blank" rel="noopener noreferrer"><em>this IFTTT recipe</em></a> <em>to automatically send “liked” articles in Instapaper to an Evernotebook called “Instapaper favorites” (for things I want to save in general but dont have any particular notes on), and 2)</em> <a href="https://ifttt.com/recipes/368728-send-instapaper-highlights-to-evernote-default-notebook" target="_blank" rel="noopener noreferrer"><em>this recipe</em></a> <em>that saves anything I highlight in Instapaper to a new note, and sends it to the Evernote default notebook where I can decide where it belongs later (for when I have specific passages I want to extract)</em>
</p>
<hr>
<p><em><strong>Subscribe below to receive free weekly emails with our best new content, or follow us on <a href="https://twitter.com/fortelabs/">Twitter</a>, <a href="https://www.facebook.com/fortelabs/">Facebook</a>, <a href="https://www.instagram.com/fortelabsco/">Instagram</a>, <a href="https://www.linkedin.com/in/tiagoforte/">LinkedIn</a>, or <a href="https://www.youtube.com/user/simulacrumsquared/">YouTube</a>. Or become a <a href="https://fortelabs.co/about-praxis/">Praxis member</a> to receive instant access to our full collection of members-only posts.</strong></em></p>
<form action="https://app.convertkit.com/forms/1022693/subscriptions" method="post" data-sv-form="1022693" data-uid="c4407a2f08" data-format="inline" data-version="5" min-width="400 500 600 700">
<div data-style="full">
<p><img src="https://proxy-prod.omnivore-image-cache.app/0x0,sqWznQTJOu8MLbN_KvWQgeSkhwNPdvLRWTom32MHspAE/https://embed.filekitcdn.com/e/oP2q5jihy5hj474ZFtvPjw/pkwszL6w2hsV41vY6MLfdR"></p>
<p> Join the Forte Labs Newsletter </p>
<p> Join 50,000+ people receiving my best ideas on learning, productivity &amp; knowledge management every Tuesday. I'll send you my Top 10 All-Time Articles right away as a thank you. </p>
</div>
</form>
</div>
<div data-widget_type="post-info.default" data-element_type="section" data-id="60a66d24">
<ul>
<li itemprop="about">
<span><span>POSTED IN:</span> <span><a href="https://fortelabs.co/blog/category/topics/building-a-second-brain/">Building a Second Brain</a>, <a href="https://fortelabs.co/blog/category/topics/curation/">Curation</a>, <a href="https://fortelabs.co/blog/category/types/free/">Free</a>, <a href="https://fortelabs.co/blog/category/topics/note-taking/">Note-taking</a>, <a href="https://fortelabs.co/blog/category/topics/technology/">Technology</a>, <a href="https://fortelabs.co/blog/category/topics/workflow/">Workflow</a></span></span>
</li>
</ul>
</div>
</div>
</DIV>

View file

@ -0,0 +1,46 @@
---
id: 23360258-5e55-4f51-ae84-83f073539aef
title: |
Using CSS custom properties like this is a waste - YouTube
status: ARCHIVED
tags:
- read-later
- Youtube
date_added: 2023-10-14 20:11:15
url_omnivore: |
https://omnivore.app/me/using-css-custom-properties-like-this-is-a-waste-you-tube-18b30754bdc
url_original: |
https://m.youtube.com/watch?index=12&list=WL&pp=gAQBiAQB&v=_2LwjfYc1x8
---
# Using CSS custom properties like this is a waste - YouTube
## Notes
Definir _"variables locales"_ en la clase más alta de un _componente_ (Ej: ˋ.cardˋ), esta variable se puede utilizar para hacer variantes del componente de manera más rápida y limpia y se puede utilizar en los decendientes de la clase.
Esto tiene la ventaja de:
1. Para crear una variante de nuestro componente solo debemos crear una nueva clase y añadirla junto a la clase más alta (ˋ.card-successˋ), y ya solo debemos sobre escribir las variables en vez de tener que actualizar cada parte del componente (ˋ.card.card-success .buttonˋ & ˋ.card.card-success .card-header h3ˋ).
2. Si tenemos propiedades complejas o animaciones donde solo varia una parte de ellas (Ej: ˋdrop-shadowˋ) no tenemos que re-escribir en cada variante la propiedad completa.
## Original
![](https://proxy-prod.omnivore-image-cache.app/0x0,sQQWw6iRP7foFYzYmrRdXk9An2XA-R-aURCV45HDFUPA/data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMjE2IiBoZWlnaHQ9IjQyNSIgdmlld0JveD0iMCAwIDIyMTYgNDI1IiBmaWxsPSJub25lIj48cGF0aCBkPSJNMjg3LjYyIDQxNi4yNUMzNzcuNzQgNDE2LjA1IDQ4Mi4wNyA0MTIuODAgNTEzLjc0IDQwNC4wN0M1MzguMDkgMzk3LjU4IDU1Ni45NyAzNzguNzAgNTYzLjQ3IDM1NC4xNEM1NzIuMTkgMzIyLjQ4IDU3NS42NCAyNjIuMzkgNTc1Ljg1IDIxNC45MEM1NzUuNjQgMTY3LjgxIDU3Mi4xOSAxMDcuOTMgNTYzLjQ3IDc2LjY3QzU1Ni45NyA1MS45MCA1MzguMyAzMy4yMyA1MTMuNzQgMjYuNzNDNDgyLjA3IDE4LjAxIDM3Ny43NCAxNC41NiAyODcuNjIgMTQuMzVDMTk3LjcwIDE0LjU2IDkzLjU3IDE4LjAxIDYyLjExIDI2LjczQzM3Ljc1IDMzLjIzIDE4Ljg3IDUyLjExIDExLjk3IDc2LjY3QzMuNDUgMTA3LjkzIC4yMCAxNjcuODEgMCAyMTQuOTBDMC4yMCAyNjIuMzkgMy40NSAzMjIuNDggMTEuOTcgMzU0LjE0QzE4Ljg3IDM3OC41MCAzNy45NSAzOTcuNTggNjIuMTEgNDA0LjA3QzkzLjU3IDQxMi44MCAxOTcuNzAgNDE2LjA1IDI4Ny42MiA0MTYuMjVaTTIzMi4wMCAxMzEuNjdMMzc2LjMyIDIxNC45MEwyMzIuMDAgMjk4LjczVjEzMS42N1oiIGZpbGw9IndoaXRlIiAvPjxwYXRoIGQ9Ik03MzEuNTUgNDI1VjBIODYyLjYxVjcxLjg3SDgxNC45NVYxNzVIODU2LjMzVjI0Ni4yNUg4MTQuOTVWNDI1SDczMS41NVpNODc4LjczIDQyNVYwSDk2MS41MVY0MjVIODc4LjczWk05ODAuNjEgNDI1VjBIMTExMS42N1Y3MS44N0gxMDY0LjAyVjE3NUgxMTA1LjRWMjQ2LjI1SDEwNjQuMDJWNDI1SDk4MC42MVpNMTE1NS40MSA0MjVWNzEuODdIMTEyNC42N1YwSDEyNjkuNTNWNzEuODdIMTIzOC43OVY0MjVIMTE1NS40MVpNMTMzMC41NiA0MjVWMjc3LjUwTDEyODEuMDMgMEgxMzYyLjU2TDEzNzIuNTkgMTczLjc0SDEzNzMuODRMMTM4NS43NSAwSDE0NjUuMzlMMTQxNC42IDI3Ni4yNFY0MjQuOThIMTMzMC41NlY0MjVaTTE1NTcuMTUgNDI1VjBIMTY0My42OEMxNzAwLjEzIDAgMTczMy4zNiAzNC4zNyAxNzMzLjM2IDg5LjM3VjMzNi4yNEMxNzMzLjM2IDM5MS4yNCAxNjk5LjUgNDI1IDE2NDMuNjggNDI1SDE1NTcuMTVaTTE3NTEuNDkgNDI1VjBIMTg3OS40MlY3MS44N0gxODM0LjkxVjE3NUgxODc0LjRWMjQ2LjI1SDE4MzQuODlWMzUzLjc0SDE4NzkuNDFWNDI1SDE3NTEuNDlaTTE4OTYuMjQgNDI1VjBIMjAyNC4xN1Y3MS44N0gxOTc5LjY1VjE3NUgyMDE5LjE0VjI0Ni4yNUgxOTc5LjY1VjM1My43NEgyMDI0LjE3VjQyNUgxODk2LjI0Wk0yMDQwLjk4IDQyNVYwSDIxMzAuNjVDMjE5Ny4xMyAwIDIyMTUuOTQgMjkuOTkgMjIxNS45NCA4OS45OVYxNjkuMzdDMjIxNS45NCAyMzEuMjQgMjE5Mi4xMSAyNjEuODcgMjEyNy41MyAyNjEuODdIMjEyNC4zOVY0MjVIMjA0MC45OFoiIGZpbGw9IndoaXRlIiAvPjwvc3ZnPg==)
0:02 / 16:11•Watch full video
[![](https://proxy-prod.omnivore-image-cache.app/40x0,sUOpLNtzeeUoCYwskk1a5QzW3BGsoVGnMK_ykZEtZE5c/https://yt3.ggpht.com/ytc/APkrFKa6XiLa13mMVPzkmmTBcgNPjjqCGPrY86KfJFmf5w=s48-c-k-c0x00ffffff-no-rj)](https://m.youtube.com/@KevinPowell)
45K views 2 days ago [#css](https://m.youtube.com/hashtag/css)
If you're interested in checking out ICodeThis, you can find it here: [https://icodethis.com/?ref=kevin](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbVZsbWpVZ3M1NUdacFdJSVZha3BFQ0ZIaTNoZ3xBQ3Jtc0ttWG5nU0ltOTdzSE9YSDQ3aWlsUVFGcEVoMlRFaVhLb0hrczRKRVgta3N0bXBIeC1Sc1ZtTWJHY2MycUpfdVN6OE5pWDlfTG9WQlhTMlRzcW1YX2p1MTY4bjVybTd1ZG02RV9zM1l0QkFWeTNybjBtcw&q=https%3A%2F%2Ficodethis.com%2F%3Fref%3Dkevin&v=%5F2LwjfYc1x8) and if you want to sign up for one of their premium plans, use KEVIN at checkout for an extra 10% off. Custom properties are amazing, but a lot of people dont take advantage of how awesome they are. They set them up in the :root and thats it, but they can be so much more useful than that! So, in this …
...more
...more
45,645 views • Oct 12, 2023 • #css
#### License
Shop the Kevin Powell store

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,349 @@
---
id: 512f7bbc-6ba0-11ee-be2a-83432433f852
title: |
Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2023-10-15 16:10:23
url_omnivore: |
https://omnivore.app/me/highlighting-fold-text-community-fork-of-null-ls-leetcode-integr-18b3533f57b
url_original: |
https://dotfyle.com/this-week-in-neovim/55
---
# Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration
## Highlights
hinell/duplicate.nvim
> [!note]
> Add to nvim config
[source](https://omnivore.app/me/highlighting-fold-text-community-fork-of-null-ls-leetcode-integr-18b3533f57b#5de369b4-f406-446f-b59a-358d59dd9eb1) #Todo
---
## Original
## Introduction
This week we have new features in Neovim Core, new plugins and new releases. Some new Neovim features include `:fclose` to close floating windows, support spaces in in directory names, treesitter highlighting in folds and NVIM\_APPNAME supports relative paths.
We have several new plugins, e.g. you can now grind LeetCode inside Neovim, mini.pick a new fuzzy finder + selector added to the mini.nvim library, and a plugin to start/stop LSP servers upon demand to keep RAM usage low etc..
Hope you enjoy!
## Neovim core
> Updates of Neovim itself, which are available on Neovim nightly.
> * [@neovim](https://twitter.com/neovim) on Twitter
> * [Neovim news](https://neovim.io/doc/user/news.html)
> * `:h news.txt` updates in Neovim directly
> * [PR's on GitHub](https://github.com/neovim/neovim/pulls)
* [:fclose to close floating window](https://github.com/neovim/neovim/commit/fd39f5ce8c9bbda1b77ff6c03553148fadac5d57)
* [Spaces can be used to separate directory names. To have a space in a directory name, precede it with an extra backslash, and escape the space](https://github.com/neovim/neovim/commit/f5eabaa9407ae3d1ccf6592337453c423eff3d9a)
* [Ignore swapfile for running Nvim processes](https://github.com/neovim/neovim/commit/29fe883aa9166bdbcae3f935523c75a8aa56fe45)
* [vim.lsp.util.parse\_snippet() will now strictly follow the snippet grammar defined by LSP, and hence previously parsed snippets might now be considered invalid input.](https://github.com/neovim/neovim/commit/eb1f0e8fcca756a00d287e23bf87554e0e7f6dfd)
* [vim.treesitter.foldtext() applies treesitter highlighting to foldtext.](https://github.com/neovim/neovim/commit/9ce1623837a817c3f4f5deff9c8ba862578b6009)
* [Better cmdline completion for string option value](https://github.com/neovim/neovim/commit/01c51a491330bd10202c73aff92c0978984c0692)
* [Support toggling showing of float window](https://github.com/neovim/neovim/commit/4200a0f1678c06c6da4e4cfb0184c29c1174ed21)
* [NVIM\_APPNAME now supports relative paths](https://github.com/neovim/neovim/commit/a66b0fdfaa35715c832b98b8941cc5673505e0c2)
### Highlighted folds on Neovim Nightly
![](https://proxy-prod.omnivore-image-cache.app/0x0,ss9FR9nPpf2xd7VL3QE_RfLsetWTtmxbY61RRMWJImHA/https://user-images.githubusercontent.com/76068197/275348092-0703f60e-6593-46d5-9c71-a24bd2d66e0c.png)
* [PR](https://github.com/neovim/neovim/pull/25209)
* [Reddit](https://www.reddit.com/r/neovim/comments/16sqyjz/finally%5Fwe%5Fcan%5Fhave%5Fhighlighted%5Ffolds/)
## Neovim Plugin Community
> Neovim is full of active plugins. This section is about the community and what is going on.
---
### Resources & articles
#### Open Neovim From Your Browser - Integrating nvim with Sveltes Inspector
* [Blog](https://theosteiner.de/open-neovim-from-your-browser-integrating-nvim-with-sveltes-inspector)
* [Reddit](https://www.reddit.com/r/neovim/comments/177p9fj/open%5Fneovim%5Ffrom%5Fyour%5Fbrowser%5Fintegrating%5Fnvim/)
---
### New plugins
#### none-ls.nvim is a community fork of null-ls.nvim
> null-ls.nvim reloaded / Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua.
null-ls.nvim fork, maintained by the community. Only the repository name has changed for compatibility reasons. All the API's will stay as is.
Migrate by replacing `jose-elias-alvarez/null-ls.nvim` with `nvimtools/none-ls.nvim` in your package manager.
* [GitHub](https://github.com/nvimtools/none-ls.nvim)
* [Dotfyle](https://dotfyle.com/plugins/nvimtools/none-ls.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16wystn/nonelsnvim%5Fis%5Fa%5Fcommunity%5Ffork%5Fof%5Fnulllsnvim/)
#### kawre/leetcode.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,s-nS7H-H7wHHTmPvfG-wYq6Nm4dc-d7uCDI5EGUQUPi4/https://user-images.githubusercontent.com/76068197/275347053-9da7144f-3228-458a-8b4a-d90c0697a5ad.png)
> A Neovim plugin enabling you to solve LeetCode problems within Neovim.
* [GitHub](https://github.com/kawre/leetcode.nvim)
* [Dotfyle](https://dotfyle.com/plugins/kawre/leetcode.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/173ctlz/leetcodenvim%5Fsolve%5Fleetcode%5Fproblems%5Fwithin%5Fneovim/)
#### echasnovski/mini.pick
![](https://proxy-prod.omnivore-image-cache.app/0x0,s39XpvBv25BzmpXHxoR7A457BdtASjng52-Nraygomjo/https://user-images.githubusercontent.com/76068197/275347316-ab621b68-d2a8-4386-a78d-ca5fdac782a9.png)
> pick anything. Interactive non-blocking picker with one window design, toggleable preview, fast default matching, built-in pickers, and more
* [GitHub](https://github.com/echasnovski/mini.pick)
* [Dotfyle](https://dotfyle.com/plugins/echasnovski/mini.pick)
* [Reddit](https://www.reddit.com/r/neovim/comments/176yv8g/minipick%5Fpick%5Fanything%5Finteractive%5Fnonblocking/)
#### hinell/lsp-timeout.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sgj8zqD5oSQCb-ORZmumOFzudjNHrLNufD7JlTpy5urI/https://user-images.githubusercontent.com/76068197/275345414-3aa97afd-c01b-4fe8-b366-27bc0d8bfb4f.png)
> Start/stop LSP servers upon demand; keeps RAM usage low
Some LSP servers are terribly inefficient at memory management and can easily take up gigabytes of RAM MBs if left unattended (just like VS Code huh?!). This plugin prevents excessive memory usage by stopping and restarting LSP servers automatically upon gaining or loosing window focus, keeping neovim fast.
* [GitHub](https://github.com/hinell/lsp-timeout.nvim)
* [Dotfyle](https://dotfyle.com/plugins/hinell/lsp-timeout.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16vkkj8/lsptimeoutnvim/)
---
#### luckasRanarison/clear-action.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,seOp3qhUyv-KN0pPWVksq0S1sQrzgNR1ebFvWYsFGHYw/https://github.com/luckasRanarison/clear-action.nvim/assets/101930730/bdf6be6c-e463-4b60-98f7-d5d2aea4450d)
> Predictable LSP code actions
A simple Neovim plugin that enhances LSP code actions with fully customizable signs, personalized actions, and server-specific mappings, making code actions more predictable.
* [GitHub](https://github.com/luckasRanarison/clear-action.nvim)
* [Dotfyle](https://dotfyle.com/plugins/luckasRanarison/clear-action.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16v32p5/clearactionnvim%5Fmakes%5Flsp%5Fcode%5Factions/)
---
#### JMarkin/gentags.lua
> autogenerate tags for neovim
* [GitHub](https://github.com/JMarkin/gentags.lua)
* [Dotfyle](https://dotfyle.com/plugins/JMarkin/gentags.lua)
---
#### roobert/palette.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,s8b0Q9_Xq79ZxkXKntykjcCCimV7CZNvJCliwh7P3BWY/https://github.com/roobert/palette.nvim/assets/226654/2d7ff03c-f1d5-46b9-9359-973fcf7002ed)
> 🎨 Palette - A beautiful, versatile, systematic, Neovim theme system
Palette is a Neovim theme system to make creating and customizing themes easy.
Highlight groups are logically arranged to strike a harmonious balance between clarity and aesthetic appeal.
Caching ensures themes are performant.
Build easily distributable themes using the provided build script.
Generate application color schemes, such as for LS\_COLORS and iterm2 for matching terminal feel.
* [GitHub](https://github.com/roobert/palette.nvim)
* [Dotfyle](https://dotfyle.com/plugins/roobert/palette.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16smdr6/introducing%5Froobertpalettenvim%5Fa%5Fbeautiful/)
---
#### MunifTanjim/nougat.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sBQFkFPJmYnt_ybC-QlTLMUDHmtH1dUWINAJLYuzPkV8/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/bubbly-statusline.png) ![](https://proxy-prod.omnivore-image-cache.app/0x0,s8721VcLMluVw2o5zbqpq42Cou9n_DNRnQ-6EEYIaZDA/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/pointy-statusline.png) ![](https://proxy-prod.omnivore-image-cache.app/0x0,sdxJRzRzMam9Pp5vuY69AdXlipU1JYPRZ4t_bLOL0y_g/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/slanty-statusline.png)
> 🍫 Hyperextensible Statusline / Tabline / Winbar for Neovim 🚀
* [GitHub](https://github.com/MunifTanjim/nougat.nvim)
* [Dotfyle](https://dotfyle.com/plugins/MunifTanjim/nougat.nvim)
---
#### trimclain/builder.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,ssQSPS4kiVqJmf8x8O7zqevhYjyAgS-oxuOyaaU2VRLg/https://github.com/trimclain/builder.nvim/assets/84108846/6f94dc76-b652-4ac8-b54e-c3d19aaebdaa)
> Simple building plugin for neovim
* [GitHub](https://github.com/trimclain/builder.nvim)
* [Dotfyle](https://dotfyle.com/plugins/trimclain/builder.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16qwcl7/buildernvim%5Fsimple%5Fbuild%5Fplugin%5Ffor%5Fneovim/)
---
#### niuiic/git-log.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,suRdnhdGKggw0zuXb7Axpp8Ykw_8unFeoGTBiquP2o84/https://user-images.githubusercontent.com/76068197/275345480-b7d2cc41-5e59-4a13-a5b7-cadf3e5ecbdd.png)
> Check git log of the selected code.
* [GitHub](https://github.com/niuiic/git-log.nvim)
* [Dotfyle](https://dotfyle.com/plugins/niuiic/git-log.nvim)
---
#### 2KAbhishek/nerdy.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sO3ro_AEJRwkyAM2Zgz3qr5ZpUkndJ4K7GkSz9HLc0oQ/https://user-images.githubusercontent.com/76068197/275345538-f957e324-fbd6-408c-a0c2-810b29559a6e.png)
> Find Nerd Glyphs Easily 🤓🔭
Do you like Nerd fonts, but don't like going over to the site just to find a glyph? nerdy.nvim, is a super handy plugin that lets you easily search, preview and insert any nerd font glyph from Neovim!
* [GitHub](https://github.com/2KAbhishek/nerdy.nvim)
* [Dotfyle](https://dotfyle.com/plugins/2KAbhishek/nerdy.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16qr135/nerdynvim%5Feasily%5Ffind%5Fand%5Finsert%5Fnerd%5Ffont%5Fglyphs/)
---
#### David-Kunz/gen.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sDEgBaEypwAzP6zU-c2NJ7cP01Q09bjxV4HNeiC_XbrU/https://user-images.githubusercontent.com/1009936/273126287-7b5f2b40-c678-47c5-8f21-edf9516f6034.jpg)
> Neovim plugin to generate text using LLMs with customizable prompts
* [GitHub](https://github.com/David-Kunz/gen.nvim)
* [Dotfyle](https://dotfyle.com/plugins/David-Kunz/gen.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16x1zf7/local%5Fllms%5Fin%5Fneovim%5Fgennvim/)
* [Youtube](https://www.youtube.com/watch?v=FIZt7MinpMY)
---
#### VidocqH/data-viewer.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,srNNDmEeUxRH-7_Y1wRlwYn94Oat2ouVMlUCBmdHneEI/https://github.com/VidocqH/data-viewer.nvim/assets/16725418/7b933b3a-fd4e-4758-9917-9055c35796db)
> Table view for data files, csv, tsv
Lightweight neovim plugin provides a table view for inspect data files such as csv, tsv
* [GitHub](https://github.com/VidocqH/data-viewer.nvim)
* [Dotfyle](https://dotfyle.com/plugins/VidocqH/data-viewer.nvim)
---
#### ==hinell/duplicate.nvim==
![](https://proxy-prod.omnivore-image-cache.app/0x0,slEysMO2620IzV16kXsH9RrCm7Ei5n-k7nnKR6htL-2Q/https://user-images.githubusercontent.com/76068197/275346764-065046c6-d267-4c8f-bf52-6b9fa0683229.png)
> Duplicate visual selection, lines, and textobjects
Duplicate lines in different directions (up/down) by specified offset Duplicate visual selection & line-wise blocks
* [GitHub](https://github.com/hinell/duplicate.nvim)
* [Dotfyle](https://dotfyle.com/plugins/hinell/duplicate.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16vkd4x/duplicatenvim/)
---
#### niuiic/remote.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sltK2sIjx8vjII6g18eOoH3oI0BmzGHzVDlVE9RdUdLA/https://raw.githubusercontent.com/niuiic/assets/main/remote.nvim/usage.gif)
> Edit remote files locally.
Edit remote files with local neovim configuration.
Edit them as local directories.
No other dependencies required for remote machine except ssh.
* [GitHub](https://github.com/niuiic/remote.nvim)
* [Dotfyle](https://dotfyle.com/plugins/niuiic/remote.nvim)
---
#### niuiic/typst-preview.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sE0IeNg46_eRW_AAomtq470uTgYbmvFlRqfrozGff0FY/https://raw.githubusercontent.com/niuiic/assets/main/typst-preview.nvim/usage.gif)
> Neovim plugin to preview typst document.
Generate pdf files by typst compile. Respond to subsequent file changes with typst-lsp. Redirect these pdf files to a fixed path when you switch buffer. Preview this pdf by a pdf viewer with the ability to respond to the file changes.
* [GitHub](https://github.com/niuiic/typst-preview.nvim)
* [Dotfyle](https://dotfyle.com/plugins/niuiic/typst-preview.nvim)
---
#### SalOrak/whaler.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sFs6Ddy-8eYOlxjXwza6MvJFpi5bUL_iCLP3Ipz6DvL0/https://raw.githubusercontent.com/SalOrak/whaler.nvim/main/whaler-example.gif)
> Telescope extension to change between directories blazingly fast
Whaler is a Telescope extension to move between directories. It is based on the concept of [tmux-windowizer](https://github.com/ThePrimeagen/.dotfiles/blob/master/bin/.local/scripts/tmux-windowizer) which uses a set of directories and fzf to move to another directory whilst creating a new tmux session.
* [GitHub](https://github.com/SalOrak/whaler.nvim)
* [Dotfyle](https://dotfyle.com/plugins/SalOrak/whaler.nvim)
* [Reddit](https://www.reddit.com/r/neovim/comments/16wgw0b/whalernvim/)
---
#### gsuuon/note.nvim
![](https://proxy-prod.omnivore-image-cache.app/0x0,sBOuCCo6p72mfZPAiqP1Ivk-u3waye8dHKUsd-UNJfxY/https://github.com/gsuuon/note.nvim/assets/6422188/813e74e7-d9dc-4b5f-b433-4ef294491797)
> Notes in neovim
A simple Neovim note taking plugin with daily notes, task tracking and syntax highlighting.
note.nvim makes it easy to take working notes and track tasks. It adds commands to help manipulate task items, create daily notes, and navigate within (and between) notes.
* [GitHub](https://github.com/gsuuon/note.nvim)
* [Dotfyle](https://dotfyle.com/plugins/gsuuon/note.nvim)
---
#### A retrospective on why Nyoom is archived
* [Reddit](https://www.reddit.com/r/neovim/comments/16sk266/nyoom%5Fwhy%5Fim%5Fultimately%5Farchiving%5Fit%5Fa%5Fshort/)
#### indent-blankline.nvim v3 is released
* [GitHub](https://github.com/lukas-reineke/indent-blankline.nvim)
* [Dotfyle](https://dotfyle.com/plugins/lukas-reineke/indent-blankline.nvim)
* [Migration guide](https://github.com/lukas-reineke/indent-blankline.nvim/wiki/Migrate-to-version-3)
* [Reddit](https://www.reddit.com/r/neovim/comments/16u5abl/indent%5Fblankline%5Fv3%5Fis%5Freleased/)
#### LazyVim 10.0.0 has been released!
* [GitHub](https://github.com/LazyVim/LazyVim)
* [Dotfyle](https://dotfyle.com/plugins/LazyVim/LazyVim)
* [Changelog](https://github.com/LazyVim/LazyVim/blob/main/CHANGELOG.md)
* [Reddit](https://www.reddit.com/r/neovim/comments/1766fl1/lazyvim%5F1000%5Fhas%5Fbeen%5Freleased/)
---
## Contributing
Add your the plugin in either of the following to be featured in This Week in Neovim and Dotfyle:
* [rockerBOO/awesome-neovim](https://github.com/rockerBOO/awesome-neovim)
* [SUBMITTED\_PLUGINS.md](https://github.com/codicocodes/dotfyle/blob/main/SUBMITTED-PLUGINS.md)
Contribute to the development of Dotfyle:
* File issues and submit pull requests on [GitHub](https://github.com/codicocodes/dotfyle)
* Discuss ideas on [Discord](https://discord.gg/AMbnnN5eep)

View file

@ -0,0 +1,592 @@
---
id: 07f91eda-1940-4aaa-8e27-78b0bf176193
title: |
The Unreasonable Effectiveness Of Plain Text
status: ARCHIVED
tags:
- read-later
date_added: 2023-10-18 10:01:51
url_omnivore: |
https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185
url_original: |
https://github.com/0atman/noboilerplate/blob/main/scripts/34-Plain-Text-Team.md
---
# The Unreasonable Effectiveness Of Plain Text
## Highlights
## [Tie Yourself to the Mast](#tie-yourself-to-the-mast)
%%pron. oh diss e us%% In the Odyssey, Odysseus (confusingly called Ulysses in English literature) had to travel through siren-infested waters.
This was a well-understood problem in his world. Sailors would simply solve this by putting wax in their ears, so the sirens' tempting song wouldn't lure them to their deaths.
But Odysseus had a challenge: He WANTED to hear the Sirens' beautiful song. He certainly didn't want to drown, so he ordered his crew to tie him to the mast of the ship, and to ignore any of his pleas to let him go, until safety.
This way, he was able to guard against future bad decisions he knew he would make by setting up a framework to control his future self.
This is the Ulysses pact, and it's a very common trick:
* Leaving your credit card or car keys at home when going out drinking is a Ulysses pact.
* Publishing a warrant canary on your company's website is a Ulysses pact,
* and standardising all your tools on plain text is a Ulysses pact.
> [!note]
> El pacto de Ulysses es una estrategia (o framework) en donde tomamos medidas tempranamente para prevenir malas desiciones en un futuro.
[source](https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185#7466a699-a115-4b9f-99fc-416852b5aef2) #frameworks
---
"The difference between science and screwing around is _writing it down_."
## [— Adam Savage](#-adam-savage)
> [!note]
> This was just a cool quote...
[source](https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185#9a030eb7-6269-4863-8e5e-61b59a1704b6) #quote
---
## Original
<style> :root {--r-code-font: "FiraCode Nerd Font";} .reveal .hljs {min-height: 50%;} </style>
!\[\[git-logo.png|500\]\]
## [Plain-Text Team](#plain-text-team)
notes: %%
* Tell them what you're going to tell them
* Tell them
* Tell them what you told them %% Hi friends my name is Tris and this is No Boilerplate, focusing on fast, technical videos.
All good teams are alike; each bad team is bad in its own way. %% to paraphrase Tolstoy %%
Software is an incredible thing, isn't it? Combined with the internet, a small team of friends can change the world overnight.
Every company, no matter what their industry, must now run a tech team, even if only to maintain their website.
So why are they all so bad at it?
---
!\[\[cc-logo.png\]\]
## [Public Domain Videos](#public-domain-videos)
<https://github.com/0atman/noboilerplate/>
notes: Everything you see in this video: script, links, and images are part of a plain-text markdown document available freely on GitHub under a public domain licence.
---
## [First World Problems](#first-world-problems)
notes: If you've worked in a web team, tech team or any digital creative team, you've likely felt the pain.
* Bad software,
* constantly changing processes,
* and lots and lots of meetings.
I discussed some of these problems in my Agile video that made me a lot of friends. But today, I want to go bigger. You can solve all these problems in a single blow.
The secret is, in order to do more, you must have the discipline to do LESS.
---
!\[\[rework-book.png|400\]\]
!\[\[remote-book.png|400\]\]
notes:
A lot of the ideas that I will mention today are not new. They've been well-understood in the startup and digital world for a long time.
But regression to the mean is prevalent.
It's not just enough to argue for good tools today, you must stop the future churn of new apps and processes that solve the same things in different, but equivalent ways.
And you do this with a Ulysses pact.
---
!\[\[ulysses-and-the-sirens-waterhouse.jpg\]\]
_"Ulysses and the Sirens"_ [John William Waterhouse](https://en.wikipedia.org/wiki/John%5FWilliam%5FWaterhouse)
notes:
## ==[Tie Yourself to the Mast](#tie-yourself-to-the-mast)==
==%%pron. oh diss e us%%
In the Odyssey, Odysseus (confusingly called Ulysses in English literature) had to travel through siren-infested waters.==
==This was a well-understood problem in his world.
Sailors would simply solve this by putting wax in their ears, so the sirens' tempting song wouldn't lure them to their deaths.==
==But Odysseus had a challenge: He WANTED to hear the Sirens' beautiful song. He certainly didn't want to drown, so he ordered his crew to tie him to the mast of the ship, and to ignore any of his pleas to let him go, until safety.==
==This way, he was able to guard against future bad decisions he knew he would make by setting up a framework to control his future self.==
==This is the Ulysses pact, and it's a very common trick:==
* ==Leaving your credit card or car keys at home when going out drinking is a Ulysses pact.==
* ==Publishing a warrant canary on your company's website is a Ulysses pact,==
* ==and standardising all your tools on plain text is a Ulysses pact.==
---
!\[\[the-fbi-has-not-been-here.png\]\]
An example of a warrant canary
notes:
In the future, you, or your successor, or your team might well be tempted to try the latest hot project management software, or documentation tool or scrum system.
While it might be good for a while, the act of changing tools constantly is an enormous overhead for your team, and one that gives the lasting impression that anything we write is likely to be legacy very soon, trapped in a deprecated app that "we just don't use any more", so why bother writing anything down.
Tying yourself to the mast by standardising on one tool, and not only that, but a plain text tool, means your data will live forever, and the network effect can make it more and more valuable over time, instead of less and less.
---
"The greatest problem in communication is the _illusion_ that it has been achieved."
## [— William H. Whyte](#-william-h-whyte)
[(not George Bernard Shaw, apparently)](https://quoteinvestigator.com/2014/08/31/illusion/)
notes:
## [Decoupled Organisation Through Plain Text](#decoupled-organisation-through-plain-text)
Teams of people need to be on the same page. Both literally and figuratively.
The natural way to do this is by talking to one another. But talking does not scale, and is extremely impermanent. After the sound waves have bounced off the walls and reverberated for a second... the words are gone, and what is left is our memory of them.
---
=="The difference between science and screwing around is== _==writing it down==_==."==
## ==[— Adam Savage](#-adam-savage)==
notes:
Human memory is extremely unreliable, subjective, and the root cause of many problems.
After a discussion, it is not apparent that everyone has agreed upon exactly the same thing. And you now need another meeting to double-check that.
The solution is documentation.
---
## [Documentation-First Teams](#documentation-first-teams)
notes: Communication is most reliable when it is in black and white.
Everyone understands this, from 10,000-page government specifications to an email sign-off from the client you're making a 3-minute track for.
Yes, have more immediate conversations, by video, or chat, but write down what you concluded, and get the other person to confirm it.
---
## [](#documenting-architecture-decisions)["Documenting Architecture Decisions"](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)
(aka the _ADR_ process)
— [Michael Nygard](https://cognitect.com/authors/MichaelNygard.html)
notes: You can improve every part of your team, business, or organisation by recording what decisions you have made, and WHY, in a system that allows for asynchronous discussion and improvements.
The ADR process is excellent for this, for example.
There are a thousand competing apps that claim to solve these problems for you.
---
!\[\[gdocs-screenshot.png|200\]\]
!\[\[jamboard-photo.png|200\]\]
!\[\[confluence-screenshot.png|200\]\]
!\[\[pivotal-tracker-screenshot.png|200\]\]
!\[\[notion-screenshot.png|200\]\]
!\[\[trello-screenshot.png|200\]\]
notes: These apps all re-invent the wheel in their own way, and new ones are being released every week. I've used most of them, perhaps you have too, and they're all rubbish.
But there is a group of people who are extremely practised at managing enormous distributed, concurrent, text projects:
_Programmers!_
As an example, if you use Google Docs, your small team can collaborate on a few files a day, in a drive of perhaps a hundred or two hundred. And just like in most other documentation systems, that won't scale.
Programmers simultaneously edit thousands of files a day, across repositories of data so numerous that we don't keep count.
What are programmers using, and can non-programmers use it too?
---
## [Enter Git](#enter-git)
* GitHub
* GitLab
* Bitbucket
* SourceForge
* Etc.
notes:
The answer is yes, yes we can.
I recommend you use the most popular distributed version control system on the planet: Git.
You'll use this through one of the many git web hosts, the largest of which is GitHub, which I recommend for most people.
---
## [Popularity Matters](#popularity-matters)
notes:
Though I mention GitHub primarily in this video, I'm not sponsored by them, or anything like that, I just acknowledge that popularity matters. Support, experience, and integrations with other services will all be far, far easier if you use the standard.
All these tools started as a web interface around the incredible tool: Git.
---
## [Aside:](#aside)
## [Linux & Git](#linux--git)
notes: By the way, the creator of Linux, Linus Torvalds, also later created git, to solve the problem that he created: that the Linux project had become SO LARGE that existing plain text collaboration tools were not scaling.
He jokes that he named his first project, Linux, after himself, and so it was natural to name the second one after himself too!
---
## [Github Et Al. Are Greater Than the Sum of Their Parts](#github-et-al-are-greater-than-the-sum-of-their-parts)
notes: From simple code-hosting beginnings, these git services have grown to be so much more than that, trusted by the largest projects in the world, built by the largest companies in the world.
The foundation of my ideal team uses the raw materials that GitHub has given us.
What are the raw materials?
I'll show you this with a demo: We're going to build a GitHub organisation for No Boilerplate.
This video is not sponsored by GitHub, my work is possible, thanks to viewers like you.
---
!\[\[nb-patreon-aug-23.png|700\]\]
<https://www.patreon.com/noboilerplate>
notes:
If you'd like to see and give feedback on my videos up to a week early, as well as get discord perks, and even your name in the credits, it would be very kind of you to check my Patreon.
I'm also offering a limited number of mentoring slots. If you'd like 1:1 tuition on Rust, Python, Web tech, Personal organisation, or anything that I talk about in my videos, do sign up and let's chat!
It's just me running this channel, and I'm so grateful to everyone for supporting me on this wild adventure.
Let's make our plain text team:
---
!\[\[repo.png\]\]
## [Repos](#repos)
notes: The foundational unit with any git host is the repo. This doesn't just correspond with one git repository, but one logical project or subproject. Organisational tools like the Wiki (for documentation), Projects (for project management) and more can sit here, right next to your project's files, right where you need them.
---
!\[\[wiki2.png\]\]
## [Wikis](#wikis)
notes: Each GitHub repository has a wiki, a folder of linked markdown files that anyone with access can edit, either in the friendly web editor, or, by cloning the wiki with git, on their own computer with whatever editor they like.
This is the minimum viable documentation tool, and it's useful for when git's full collaboration system isn't needed, and you just want to throw some linked markdown files together quickly.
---
## [\# This is a Heading](#-this-is-a-heading)
### [\### This is a Sub Heading](#-this-is-a-sub-heading)
_\_this is italic text\__
**\*\*this is bold\*\***
\[[this is a link](https://github.com/0atman/noboilerplate/blob/main/scripts)\]([http://example.com](http://example.com/))
_(learn more: [markdownguide.org/basic-syntax/](https://www.markdownguide.org/basic-syntax/))_
notes:
## [Aside: Markdown is Great](#aside-markdown-is-great)
Github, GitLab, and most of the Internet have standardised on Markdown. Just like Slack, Discord, many websites, and sometimes Facebook depending on the phase of the moon, they all format text using this lightweight standard called Markdown.
Markdown is my favourite text format, it's really simple to use, and is designed to look good both in plain text and rendered as rich text, unlike HTML, which is unreadable by most people unless rendered in a browser.
Here we've got a heading, denoted by the hash symbol, italic with underscores, bold with double asterisks, and links using this bracket pairing syntax.
There are a few more options available, which you can look up at markdownguide.org, but this is the overwhelming majority of formatting you'll need on a day-to-day basis.
---
!\[\[obsidian-kanban-paint.png\]\]
notes:
The genius of storing your data in this universal plain-text format is that should you wish to migrate from GitHub to another similar platform, your data is portable and under your control.
GitHub formats Markdown very nicely, but you can export it in any format you like, and edit it with any tool you like, present and future.
Including my favourite tool here, Obsidian.
Markdown keeps your team focussed on what is important by allowing you just enough formatting, but no rich customisation options. You're not making a beautiful client brochure, so you shouldn't use 90s desktop publishing tools to make your company's critical documentation.
Back to GitHub's features:
---
!\[\[issues.png\]\]
## [Issues](#issues)
notes:
Though not part of the git system, Issues are a natural addition that all git hosts have implemented: A simple task system for capturing work that needs doing. These could be new features, customer requests, bug reports, or ideas. They have a rich comment thread for discussion, can be assigned to team members, and tagged with custom tags.
This minimum viable project management system could be all you need. Certainly, for a solo or small team, capturing requirements in Issues might be enough.
But if you need more, you need Milestones.
---
!\[\[milestones.png\]\]
## [Milestones](#milestones)
notes: GH milestones are a grouping of issues with a deadline.
They typically represent a target, a release, or something the team is working towards. Milestones just have a title, a description, and a date. No burndown charts, no swim lanes, no complex statistics, just a progress bar.
This might be enough project management for you. If not, it is time for GH Projects.
---
!\[\[projects.png\]\]
## [Projects](#projects)
notes:
Each GitHub repo, team, and organisation can have a project board, a lightweight kanban board with customisable columns, allowing you to group your issues together, and observe their progress through your current iteration.
This represents the information radiator for your team, a bird's-eye view of what is happening with the project, and something you might gather around for your morning catchup meeting.
You don't need all the features of Trello, JIRA, or anything like that. You need the minimum viable board.
This bare-bones tool completely side-steps 'the JIRA effect', which is if you have a tool that is packed full of time tracking, velocity points, and so on, the temptation is to use all these features, even if they give no value, and complicate your processes.
---
## [Aside:](#aside-1)
## [Standups Are Great](#standups-are-great)
notes:
If you have one meeting a day, it should be a standup. Good standups replace other meetings and accelerate your project dramatically.
The way I like to do standups is not by asking everyone what they did yesterday and what they intend to do today.
That's a great way to find out at length what Dave did on his day off, but not a good way to find out what's happening with the project specifically.
I recommend walking your board, backwards, from right to left. Everyone is timeboxed, keeping the meeting tight. If you don't have an issue on the board, you don't speak yet. Perhaps you could write or pick up a task from the backlog and talk about it tomorrow.
At the end, the team member who is facilitating the meeting asks if anyone has any blockers, and we're done.
The most important part of this most important meeting is asking if you have any blockers. A good standup means that no-one can get lost or delayed by more than 24 hours.
Note I didn't say the PM or DM or scrum master or whoever facilitates. That person doesn't exist in my team. These are not roles, they are hats.
I don't know if your team needs any other meetings, but it is vital that you do a standup.
Back to GitHub.
---
!\[\[org-public.png\]\]
## [Organisations](#organisations)
notes: GitHub provides an umbrella group of users called an organisation. This is your company, and if you're building your products in the open, as I recommend you do, you won't pay GitHub a thing. Most git hosts provide their services for free for open-source companies. If you have too much money, you can pay GitHub for a plan to make your data closed.
If you require more subdivision, Organisations are divided into Teams.
---
!\[\[teams.png\]\]
## [Teams](#teams)
notes:
Teams on GitHub allow you to granularly scope repo, project, wiki, and other permissions to the different teams in your organisation.
I recommend allowing everyone to write and contribute to all projects, you want the network effect and low admin overhead. This pattern is called "internal open source".
But if you wish, perhaps for regulatory reasons, read and write access to repos can be restricted by team.
---
!\[\[PR.png\]\]
## [Pull Requests](#pull-requests)
notes:
Now we're getting into the detail of GitHub. I adore pull requests, sometimes called merge requests in other systems. PRs represent a change to the files in a repo, with an explanation of what you did, some links, and a discussion.
---
!\[\[PR diff.png\]\]
## [Pull Requests (diffs)](#pull-requests-diffs)
notes:
After the discussion is satisfied, perhaps as simply as a colleague saying "LGTM" or as heavy weight as a full change review with an audit trail that would satisfy a bank, the changes are merged into the repo.
PRs can have powerful automation, called Actions
---
!\[\[action.png\]\]
## [Github Actions](#github-actions)
notes:
PRs and actions can run your company for you if you let them. Though Actions were built for running tests on source code, with a little imagination, they can be used for anything:
* If you're uploading vector images, an action can build all the rasterised resolutions the client wants.
* If you're uploading video or audio clips, an action can run them through plugins to remove noise, add a music track, and upload the draft to YouTube.
* If you're checking in company documents, an action can simply spellcheck it.
Actions can run hundreds of times an hour, always adhere to best practice, and never make mistakes.
Automating your company gives you an enormous competitive speed and quality advantage.
---
!\[\[language-tool-on-premise.png\]\]
notes: You could also, for example, set up style guide enforcement, blocking the PR if the phrase "on premise" has been found.
---
!\[\[nvme.png\]\] notes:
## [Offline Work](#offline-work)
When your company's code, visual assets, and administration, are all in git repositories, you gain another huge superpower.
All of this becomes accessible offline. Every file, every photo, every design, and document can be on your computer. The magic of offline isn't necessarily that you don't need the internet (though that is a handy feature on a plane) But that it's FAST, the data is RIGHT HERE on your computer, and you can do ANYTHING with it. If you need to change the company's name across 10,000 files, it's trivial. It's find and replace.
If you, instead, had 5-15 different web services that you scattered all your team's data across, you'd have to log in to each one, and hope they had the feature to find and replace within their own walled garden.
Most, somehow, don't have this basic feature.
---
## [Who is flying this thing?](#who-is-flying-this-thing)
notes:
GOOGLE DOCS doesn't have this basic feature: you can't find and replace across a drive of files!?
And the reason for this, I suspect, is that would be TERRIFYING, wouldn't it? What if a new hire accidentally did that, you'd have to roll back all those files manually, that could take days!
But with git, it would be a PR, clearly showing what was happening, and mistakes are trivial to fix.
Plain-text files, with just enough Markdown syntax to convey meaning, allow you and your team to work with this data in the way that they want, not the way that google or Atlassian or WHOEVER thinks is best.
Doesn't this take up a lot of space on your disk? Not plain text. But even if you're storing large files, storage is cheap if you're smart. A topic for another video, perhaps.
---
## [Future-Proofing](#future-proofing)
notes: The benefits of git, especially for teams already using it for code and text collaboration, are that
1. you're already paying for it, and
2. It's never going away.
It is impossible to imagine a management reshuffle that might decide on another tool just because it is the flavour of the month. Git and GitHub dominate the coding world, and I recommend GitHub not only because it is the biggest but also the most featureful.
---
!\[\[killed-by-google-10-23.png\]\]
[https://killedbygoogle.com](https://killedbygoogle.com/)
notes:
Even if you don't think git and plain text are the best option, I still suggest you use them because stability is far, far better than a constantly churning tool choice, as staff come, and go and fashions change, and Google decommission ANOTHER product.
RIP Jamboard :-(
---
## [Conclusion](#conclusion)
Click around my demo organisation for yourself:<https://github.com/noboilerplate>
notes:
You can't do all these utopian things in most companies, I'm painfully aware.
But you CAN do SOME of these things, even just in your immediate team, or only for yourself.
I'd be interested to know what other ways good teams buck the hype cycle in favour of sane, evidence-based improvements.
Thank you.
---
!\[\[tri-hex-moon-white-transparent.png|300\]\]
## [Thank You](#thank-you)
## [](#patreoncomnoboilerplate)[Patreon.com/NoBoilerplate](http://www.patreon.com/noboilerplate)
notes:
## [OUTRO](#outro)
If you would like to support my channel, get early ad-free and tracking-free videos, vip discord access or 1:1 mentoring, head to patreon.com/noboilerplate.
If you're interested in transhumanism and hopepunk stories, please check out my weekly sci-fi podcast, Lost Terminal.
Or if urban fantasy is more your bag, do listen to a strange and beautiful podcast I produce every full moon called Modem Prometheus.
Transcripts and compile-checked markdown source code are available on GitHub, links in the description, and corrections are in the pinned ERRATA comment.
Thank you so much for watching, talk to you on Discord.
%% NOW READ THE INTRO AGAIN %%

View file

@ -0,0 +1,29 @@
---
id: f07b145f-4fc5-4acf-99a4-4e3201c009b9
title: |
How Game Reviews Actually Affect You
status: ARCHIVED
tags:
- read-later
- Youtube
date_added: 2023-10-21 16:01:08
url_omnivore: |
https://omnivore.app/me/how-game-reviews-actually-affect-you-18b539cd3a3
url_original: |
https://youtu.be/8LbLvi9llCI?si=7MMwTZTpCb-mHDH5
---
# How Game Reviews Actually Affect You
## Notes
Según estudios, los jugadores se ven afectados por reviews que leen/ven, ya sean por críticos o por otros jugadores. Destacar que en ambos casos, pero principalmente en otros jugadores hay opiniones que pueden decir lo mismo pero con una altas carga emocional, lo que amplifica su impacto.
Estas críticas tienen un impacto inconciente en el jugador en forma de _"self fulfilling prophecy"_ ó _"probar lo contrario"_.
Esto nos afecta queramos o no, por lo que es mejor evitar opiniones lo más posible y solo disfrutar el juego por lo que es, podemos validar nuestras opiniones luego de terminar el juego.
## Original
[How Game Reviews Actually Affect You](https://youtu.be/8LbLvi9llCI?si=7MMwTZTpCb-mHDH5)
By [Daryl Talks Games](https://www.youtube.com/@DarylTalksGames)

View file

@ -0,0 +1,77 @@
---
id: bcb6f4ba-cb8e-4e8d-847f-911cda184b83
title: |
Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily
status: ARCHIVED
tags:
- read-later
date_added: 2023-10-23 10:56:32
url_omnivore: |
https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed
url_original: |
https://www.sciencedaily.com/releases/2021/03/210319080820.htm
---
# Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily
## Highlights
"Our take-home message is to use paper notebooks for information we need to learn or memorize," said Sakai.
[source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#1c9a0a5a-c3a9-40d8-a6de-9e986dd27aec)
---
Researchers say that personalizing digital documents by highlighting, underlining, circling, drawing arrows, handwriting color-coded notes in the margins, adding virtual sticky notes, or other types of unique mark-ups can mimic analog-style spatial enrichment that may enhance memory.
[source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#85a6ad74-1b87-4f32-95b3-f0a549d32089)
---
Although the current research focused on learning and memorization, the researchers encourage using paper for creative pursuits as well.
"It is reasonable that one's creativity will likely become more fruitful if prior knowledge is stored with stronger learning and more precisely retrieved from memory. For art, composing music, or other creative works, I would emphasize the use of paper instead of digital methods," said Sakai.
[source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#aeb79efa-7582-4493-94e1-6a7004b5ed80)
---
## Original
FULL STORY
---
A study of Japanese university students and recent graduates has revealed that writing on physical paper can lead to more brain activity when remembering the information an hour later. Researchers say that the unique, complex, spatial and tactile information associated with writing by hand on physical paper is likely what leads to improved memory.
"Actually, paper is more advanced and useful compared to electronic documents because paper contains more one-of-a-kind information for stronger memory recall," said Professor Kuniyoshi L. Sakai, a neuroscientist at the University of Tokyo and corresponding author of the research recently published in _Frontiers in Behavioral Neuroscience_. The research was completed with collaborators from the NTT Data Institute of Management Consulting.
Contrary to the popular belief that digital tools increase efficiency, volunteers who used paper completed the note-taking task about 25% faster than those who used digital tablets or smartphones.
Although volunteers wrote by hand both with pen and paper or stylus and digital tablet, researchers say paper notebooks contain more complex spatial information than digital paper. Physical paper allows for tangible permanence, irregular strokes, and uneven shape, like folded corners. In contrast, digital paper is uniform, has no fixed position when scrolling, and disappears when you close the app.
=="Our take-home message is to use paper notebooks for information we need to learn or memorize," said Sakai.==
In the study, a total of 48 volunteers read a fictional conversation between characters discussing their plans for two months in the near future, including 14 different class times, assignment due dates and personal appointments. Researchers performed pre-test analyses to ensure that the volunteers, all 18-29 years old and recruited from university campuses or NTT offices, were equally sorted into three groups based on memory skills, personal preference for digital or analog methods, gender, age and other aspects.
Volunteers then recorded the fictional schedule using a paper datebook and pen, a calendar app on a digital tablet and a stylus, or a calendar app on a large smartphone and a touch-screen keyboard. There was no time limit and volunteers were asked to record the fictional events in the same way as they would for their real-life schedules, without spending extra time to memorize the schedule.
After one hour, including a break and an interference task to distract them from thinking about the calendar, volunteers answered a range of simple (When is the assignment due?) and complex (Which is the earlier due date for the assignments?) multiple choice questions to test their memory of the schedule. While they completed the test, volunteers were inside a magnetic resonance imaging (MRI) scanner, which measures blood flow around the brain. This is a technique called functional MRI (fMRI), and increased blood flow observed in a specific region of the brain is a sign of increased neuronal activity in that area.
Participants who used a paper datebook filled in the calendar within about 11 minutes. Tablet users took 14 minutes and smartphone users took about 16 minutes. Volunteers who used analog methods in their personal life were just as slow at using the devices as volunteers who regularly use digital tools, so researchers are confident that the difference in speed was related to memorization or associated encoding in the brain, not just differences in the habitual use of the tools.
Volunteers who used analog methods scored better than other volunteers only on simple test questions. However, researchers say that the brain activation data revealed significant differences.
Volunteers who used paper had more brain activity in areas associated with language, imaginary visualization, and in the hippocampus -- an area known to be important for memory and navigation. Researchers say that the activation of the hippocampus indicates that analog methods contain richer spatial details that can be recalled and navigated in the mind's eye.
"Digital tools have uniform scrolling up and down and standardized arrangement of text and picture size, like on a webpage. But if you remember a physical textbook printed on paper, you can close your eyes and visualize the photo one-third of the way down on the left-side page, as well as the notes you added in the bottom margin," Sakai explained.
Researchers say that personalizing digital documents by highlighting, underlining, circling, drawing arrows, handwriting color-coded notes in the margins, adding virtual sticky notes, or other types of unique mark-ups can mimic analog-style spatial enrichment that may enhance memory.
Although they have no data from younger volunteers, researchers suspect that the difference in brain activation between analog and digital methods is likely to be stronger in younger people.
"High school students' brains are still developing and are so much more sensitive than adult brains," said Sakai.
Although the current research focused on learning and memorization, the researchers encourage using paper for creative pursuits as well.
"It is reasonable that one's creativity will likely become more fruitful if prior knowledge is stored with stronger learning and more precisely retrieved from memory. For art, composing music, or other creative works, I would emphasize the use of paper instead of digital methods," said Sakai.

View file

@ -0,0 +1,111 @@
---
id: 6f1925bb-b86c-40d2-9363-6784aa2d402f
title: |
Train Your Brain to Be More Creative
status: ARCHIVED
tags:
- read-later
date_added: 2023-10-23 10:56:30
url_omnivore: |
https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390
url_original: |
https://hbr.org/2021/06/train-your-brain-to-be-more-creative
---
# Train Your Brain to Be More Creative
## Highlights
## **Engage with nature**
Its been proven that [spending time in nature](https://greatergood.berkeley.edu/article/item/how%5Fnature%5Fmakes%5Fyou%5Fkinder%5Fhappier%5Fmore%5Fcreative) makes us more creative. Looking at trees and leaves — instead of our electronic devices — reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to make [connections more easily](https://bjsm.bmj.com/content/49/4/272.abstract?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c).
By spending time in nature, Im not referring to a trek in the wilderness either. Walking in an urban green space for just 25 minutes can quiet our brains and help us switch into autopilot node. According to the [_British Journal of Sports Medicine_](https://bjsm.bmj.com/content/49/4/272?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c), this state sparks our present awareness and fuels imagination. We are more easily able to connect existing notions, thoughts, and images to form a new, relevant, and useable concept.
[source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#9190b653-c9fe-4438-b02d-10ac2095ecd1)
---
You may have heard that creativity uses your right brain while your left brain is triggered during more analytical tasks. Well, [neuroscientists have found](https://www.livescience.com/39671-roots-of-creativity-found-in-brain.html) that creativity actually draws on your _entire_ brain — and meditation can you give you access to it.
[source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#6b9b547e-2d87-4b4e-8fb5-76c0fe82be37)
---
Try to add workout time on your calendar and make sure not to skip it. If you feel you dont have time for a dedicated workout, block 20 minutes on your calendar and spend that time doing stretches at your desk.
[source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#339a25cd-d9b8-4c5c-90bb-34f31965dea8)
---
## Original
[ ![](https://proxy-prod.omnivore-image-cache.app/0x0,soxosZVFQZnXwxzP9rgu_9TRZBUG3bjD3lZNejHcEJZc/https://hbr.org/resources/css/images/ascend/Ascend-Landing-FINAL.png) ](https://hbr.org/ascend)
Where your work meets your life.
![](https://proxy-prod.omnivore-image-cache.app/0x0,sMVn7kBr4jEHmNBxbTdR1-qfuR5jP7cDJsmkVG0w5jRY/https://hbr.org/resources/images/article_assets/2021/06/A_Jun21_16_1255250589.jpg)
Anastasia Usenko/Getty Images
Creativity isnt inherent. You have to hone it. Here are a few ways to do that, based on neuroscience. Engage with nature: Looking at trees and leaves, instead of our electronic devices, reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to...
[![Ascend logo](https://proxy-prod.omnivore-image-cache.app/105x20,sdbRjRBiTtM89dGr0O-MZ2bZF4PuOMPYm7J_ky4ZT0M4/https://hbr.org/resources/images/article_assets/2020/10/Ascend_Logo_2020_2x.png)](https://hbr.org/insight-center/ascend)
Where your work meets your life. See more from Ascend [here](https://hbr.org/insight-center/ascend).
I dont do ruts.
Not because Im some brilliant creative, but because Ive learned how my brain works. Your brain needs fuel, and it needs to be stretched to create those “OMG!” moments on demand.
Think about it. Great athletes train their bodies for days, weeks, and years to whip them into peak performance. Why, then, wouldnt a creator do the same with their brain?
Ive spent more than two decades (and counting) in the advertising industry, and contrary to popular belief, creativity isnt inherent. You have to hone it. Over time, Ive figured out what I need to do to get ideas flowing freely, and a lot of that insight comes from my interest in neuroscience. The more we learn about the workings of our gray matter, the better we can train it, control it, and make it do what we want.
Here a few things that have worked for me over the years.
## **==Engage with nature==**
==Its been proven that== ==[spending time in nature](https://greatergood.berkeley.edu/article/item/how%5Fnature%5Fmakes%5Fyou%5Fkinder%5Fhappier%5Fmore%5Fcreative)== ==makes us more creative. Looking at trees and leaves — instead of our electronic devices — reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to make== ==[connections more easily](https://bjsm.bmj.com/content/49/4/272.abstract?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c)====.==
==By spending time in nature, Im not referring to a trek in the wilderness either. Walking in an urban green space for just 25 minutes can quiet our brains and help us switch into autopilot node. According to the== [_British Journal of Sports Medicine_](https://bjsm.bmj.com/content/49/4/272?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c)==, this state sparks our present awareness and fuels imagination. We are more easily able to connect existing notions, thoughts, and images to form a new, relevant, and useable concept.==
So make disconnecting a priority. Take a walk in your neighborhood park, stroll along the beach, or just add plants to your balcony and spend some time out there. For me, walking my dog — even when my name is not on the family schedule — works. Youll feel the benefits of moving away from screens almost immediately.
## **Meditate**
I know, I know, youve heard this a million times: [Meditation](https://www.frontiersin.org/articles/10.3389/fpsyg.2013.01020/full) clears our minds of jumbled thoughts, and gives our brains the space to observe and reflect, improving task concentration and enhancing our ability to make smart decisions.
But did you know that meditation also puts the entire brain to work?
==You may have heard that creativity uses your right brain while your left brain is triggered during more analytical tasks. Well,== ==[neuroscientists have found](https://www.livescience.com/39671-roots-of-creativity-found-in-brain.html)== ==that creativity actually draws on your== _==entire==_ ==brain — and meditation can you give you access to it.==
This intentional practice can be as simple as closing your eyes and focusing on your breath. Headspace, the popular meditation app, even has guided meditations for inspiring creativity. The idea is that when we intentionally pause in awareness, [we allow our minds the freedom and space to be still and creative](https://www.headspace.com/meditation/creativity). I practice this between meetings. I find a quiet space, focus on my breathing, and get my brain into an alpha state, or a wakeful state of relaxation. This allows me to disconnect from my initial ideas (after all, the human brain is hardwired to take the path of least resistance) and create new pathways in my mind.
## **Get moving**
[Steve Jobs](https://financialpost.com/executive/c-suite/steve-jobs-was-right-about-walking) was a big advocate for walking meetings for a reason. Moving around [has been linked to increased performance](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1332529/pdf/brjsmed00003-0076.pdf) on creative tests. Exercising releases endorphins — chemicals our bodies produce to relieve stress and pain. When we are less stressed, our brains venture into more fruitful territory.
In fact, [a recent article](https://www.irishexaminer.com/lifestyle/healthandwellbeing/arid-40251431.html) compared the chemical that our brain releases during physical activity to Miracle-Gro, the water-soluble plant food that helps grow bigger, healthier plants. The good part is moving around is super simple to do, especially when youre working at home. I often attend meetings while cycling on a stationary bike or plan short walks in between (and this can be done in an office too).
==Try to add workout time on your calendar and make sure not to skip it. If you feel you dont have time for a dedicated workout, block 20 minutes on your calendar and spend that time doing stretches at your desk.==
Find a routine that works for you.
Ascend
Career and life advice for young professionals.
## **Connect with different kinds of people**
When consciously seeking inspiration, not enough can be said about diversity. Remember the brain and its predisposition to take the lazy way out? Diversity makes the brain work harder [by challenging stereotypes.](https://www.theguardian.com/lifeandstyle/2015/nov/01/diversity-good-for-your-brain-mind-multicultural) In addition, researchers at Johns Hopkins University [found](https://muse.jhu.edu/article/536530/summary) that “exposure to diversity experiences might foster the development of more complex forms of thought, including the ability to think critically.”
I make it a point to surround myself with people who come from different backgrounds than I do because their perspectives are a catalyst for creative thinking. Contrasting opinions sparks new possibilities, and allow us to make connections we hadnt seen before, leading to better decisions. There was something to be said about Abraham Lincoln filling his cabinet with [a “team of rivals.”](https://bigthink.com/in-their-own-words/you-can-be-your-own-team-of-rivals) Productive discussions, brainstorms, and debates often result in wiser outcomes. At my agency, weve set up an “inspiration council,” which brings together our people from various regions, cultures, genders, and more, to initiate these kind of discussions.
Today, the distributed working model born out of the pandemic has made it even easier to bring people together. I recommend using social media channels like LinkedIn and Instagram to follow and connect with people who have backgrounds and experiences that diverge from your own. Dont limit yourself by geography when youre reaching out to someone or expanding your network. We are much better at creative problem-solving when we dont have the comfort of knowing what to expect, which can happen if we only surround ourselves with people just like us.
Use these principles of neuroscience to give your brain the exercise that it needs. It will get you out of any rut. Or prevent you from getting into one in the first place.
#### Readers Also Viewed These Items
* [Bas Korsten](https://hbr.org/search?term=bas%20korsten&search%5Ftype=search-all) is the Global Chief Creative Officer at Wunderman Thompson.

View file

@ -0,0 +1,67 @@
---
id: 46eadaec-733a-11ee-aae2-4b1c5b8d8405
title: |
Let's Get Webby! 🦀 🕸️
status: ARCHIVED
tags:
- read-later
- Newsletter
date_added: 2023-10-25 10:27:43
url_omnivore: |
https://omnivore.app/me/let-s-get-webby-18b6705008a
url_original: |
https://omnivore.app/no_url?q=bec70357-3199-44e0-9c84-40dd5a7bf774
---
# Let's Get Webby! 🦀 🕸️
## Highlights
...and front-end frameworks like [Yew](https://letsgetrusty.krtra.com/c/y9r3LFJzeRCp/OQKy) and [Seed](https://letsgetrusty.krtra.com/c/mN30voJhWLXc/OQKy) letting you write web apps in Rust!
> [!note]
> I can create front end web apps with this libraries
[source](https://omnivore.app/me/let-s-get-webby-18b6705008a#7065ade5-765c-4d60-bd89-1ecb0d919389)
---
## Original
![](https://proxy-prod.omnivore-image-cache.app/0x0,s4bBfm-ltnUNFUa4ETTgSxP2wMeHZVVuOj5N9oi2Ba2I/https://kartrausers.s3.amazonaws.com/letsgetrusty/25597207_1643064007NFuWebsite_Header.png)
Hey Alexander,
JavaScript isn't the fastest language out there.
In fact, it's **pretty dang slow** compared to C/C++!
Unfortunately, this limits the type of web apps we could build.
How great would it be if we could write code that runs **at native speeds** in the browser?
This would allow computationally intensive apps like video editors, AAA games, and IDEs to be run in the browser!
Great news... **this is possible today** with the help of WebAssembly.
WebAssembly or WASM for short, is a technology that allows code written in languages such as C/C++, Java, Swift, and Rust to run in the browser at native speeds!
**And Rust has first-class support for WASM!**
With crates such as [wasm-bindgen ](https://letsgetrusty.krtra.com/c/Fv1n9JiwhxdT/OQKy)facilitating high-level interactions between Rust and JavaScript...
==...and front-end frameworks like== ==[Yew](https://letsgetrusty.krtra.com/c/y9r3LFJzeRCp/OQKy)== ==and== ==[Seed](https://letsgetrusty.krtra.com/c/mN30voJhWLXc/OQKy)== ==letting you write web apps in Rust!==
Are you ready to give Rust + WASM a try?
Check out this video I made: **[\>> Building a Rust App with Yew! <<](https://letsgetrusty.krtra.com/c/6AUVThScIsa4/OQKy)**
Have you built any WASM projects in Rust? Let me know!
Stay Rusty my friend!
Bogdan, Let's Get Rusty
**[Website](https://letsgetrusty.krtra.com/c/FBKvcPOtTzlF/OQKy)** | **[YouTube](https://letsgetrusty.krtra.com/c/4KIGD3ocszdT/OQKy)**
© Copyrights by Let's Get Rusty. All Rights Reserved.

View file

@ -0,0 +1,97 @@
---
id: ad8a0732-733a-11ee-b2ab-13f1d6012322
title: |
What the Rust Book didn't tell you about testing...
status: ARCHIVED
tags:
- read-later
- Newsletter
date_added: 2023-10-25 10:30:35
url_omnivore: |
https://omnivore.app/me/what-the-rust-book-didn-t-tell-you-about-testing-18b6707a120
url_original: |
https://omnivore.app/no_url?q=1fed5fd7-7706-46cf-9947-927b26a77112
---
# What the Rust Book didn't tell you about testing...
## Highlights
We want to test _get\_user_ without making real database queries.
The solution is to mock the _Database_ trait and assert _execute\_query_ is called with the correct query. But how?
We can use the [mockall crate](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=00a07042b3&e=d0eb971086)!
[source](https://omnivore.app/me/what-the-rust-book-didn-t-tell-you-about-testing-18b6707a120#f9650419-c778-4974-9da2-aabce209609f)
---
## Original
The Rust Book has an [entire chapter dedicated to testing](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=a95a715235&e=d0eb971086), but it's missing a critical piece…
What happens when your code needs to make API calls or database queries?
Unit tests should be be fast, reliable, and deterministic.
We don't want to make expensive calls that might fail for various reasons.
Well here is some good news… we don't have to!
We can use mocking to substitute real objects for mock objects and assert certain expectations…
What's that? You want an example? Consider the following code…
trait Database {
fn execute_query(&self, query: String);
}
fn get_user(db: impl Database, id: i32) {
let query = format!("SELECT * from Users where id={}", id);
db.execute_query(query);
}
We want to test _get\_user_ without making real database queries.
The solution is to mock the _Database_ trait and assert _execute\_query_ is called with the correct query. But how?
We can use the [mockall crate](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=00a07042b3&e=d0eb971086)!
Here is how we would test _get\_user_…
#[cfg(test)]
use mockall::{automock, predicate::*};
#[cfg_attr(test, automock)]
trait Database {
fn execute_query(&self, query: String);
}
fn get_user(db: impl Database, id: i32) {
let query = format!("SELECT * from Users where id={}", id);
db.execute_query(query);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_user_executes_correct_query() {
let mut mock_database = MockDatabase::new();
mock_database.expect_execute_query()
.with(eq("SELECT * from Users where id=22".to_owned()))
.once()
.returning(|_x| ());
get_user(mock_database, 22);
}
}
Boom! Now we have a unit test that's fast, reliable, and deterministic!
If you haven't seen my [intro to testing in Rust video](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=90d4167901&e=d0eb971086) make sure to check it out!
Happy testing, and stay Rusty!

View file

@ -0,0 +1,76 @@
---
id: 7b7ae540-77ef-11ee-9aed-e318464fef5a
title: |
Use cases for Rust
status: ARCHIVED
tags:
- read-later
- Newsletter
date_added: 2023-10-31 10:14:54
url_omnivore: |
https://omnivore.app/me/use-cases-for-rust-18b85df6f3a
url_original: |
https://omnivore.app/no_url?q=9e2f3a10-e4fd-4c33-85a3-ff3609f3c4d6
---
# Use cases for Rust
## Highlights
Some popular server-side web frameworks written in Rust include Actix Web, Warp, and Axum.
[source](https://omnivore.app/me/use-cases-for-rust-18b85df6f3a#64793bd7-d3bd-4597-9f2c-9b4697217661)
---
## Original
![](https://proxy-prod.omnivore-image-cache.app/374x0,sWwbkQPNcQS05Cyma-JsPnEwyj7_G5D8tak-9k2Pm7g8/https://kartrausers.s3.amazonaws.com/letsgetrusty/25597207_1643064007NFuWebsite_Header.png)
Hi Rustaceans,
Rust is fast, safe and hip.
But, what can you actually build with Rust?
…whether you want to use Rust professionally or as a hobbyist.
Here are a few common types of applications built using Rust:
**Blockchain**
* Rust is a great choice for blockchain applications because it is fast and secure.
* You can write both smart contracts and entire blockchains using Rust.
* Some popular blockchain projects written in Rust include Solana, Polkadot, and Near.
**Embedded programs**
* Rust is also well-suited for embedded programs, such as those used in cars, airplanes, and other devices.
* This is because Rust is memory-safe, memory-efficient and can be compiled to run on a variety of platforms.
**Server-side applications / Microservices**
* Rust is a great choice for server-side applications and microservices because it is fast and efficient.
* ==Some popular server-side web frameworks written in Rust include Actix Web, Warp, and Axum.==
* Many companies are migrating their critical microservices to Rust because of its safety and performance guarantees.
**WebAssembly**
* Rust can be compiled to WebAssembly, which means that you can use Rust to build web applications.
* Rusts small runtime and first-class support for WebAssembly often make it the first contender for any WebAssembly projects.
This is only a small sample of what you can build in Rust.
In general, Rust is a great choice if you are looking for speed, safety and versatility.
If you want more details, heres a YouTube video I made on the same topic.
**[\>>> What can you build in Rust?!](https://letsgetrusty.krtra.com/c/BgXaOx7YGua4/OQKy)**
Have fun building!
Bogdan
\---
PS - Looking for a Rust job? Apply here - [https://letsgetrusty.com/jobs](https://letsgetrusty.krtra.com/c/ysWbInNFr59c/OQKy)

View file

@ -0,0 +1,30 @@
---
id: e41b4086-963e-45e7-9ef7-2cfee7061047
title: |
Why Signals Are Better Than React Hooks
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-01 14:16:42
url_omnivore: |
https://omnivore.app/me/https-youtu-be-so-8-l-bvwf-2-y-8-si-zy-gl-ie-hl-ai-pg-w-5-xo-18b8be328e5
url_original: |
https://youtu.be/SO8lBVWF2Y8?si=zyGlIeHlAiPgW5Xo
---
# Why Signals Are Better Than React Hooks
## Notes
Signals ayuda a la performance y legibilidad de una aplicación haciendo que la funcionalidades que normalmente se realizarían con los hooks `useState` y `useEffect` se realizen dentro de `signals`.
Esto permite compartir este _"estado"_ entre componentes pero solo actualizar los involucrados y no todos los desendientes del componente mayor.
Además, podemos extraer toda la lógica del estado a un archivo aparte que solo tenga código relevante, y en los componentes se mantiene solo la implementación.
Es obviamente más rápido de implementar y más limpio que hacer custom hooks, pero es añadir otra dependencia, habrá otras ventajas y desventajas??
## Original
[Why Signals Are Better Than React Hooks](https://youtu.be/SO8lBVWF2Y8?si=zyGlIeHlAiPgW5Xo)
By [Web Dev Simplified](https://www.youtube.com/@WebDevSimplified)

View file

@ -0,0 +1,41 @@
---
id: 24bd8d1e-b118-4930-a86d-3929f2dad34c
title: |
The First Rule of Comments in Code
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-02 23:25:19
url_omnivore: |
https://omnivore.app/me/https-youtu-be-hxsx-3-vbf-qq-si-c-5-qy-m-mg-8-j-yhc-bbq-18b92ffccf6
url_original: |
https://youtu.be/hxsx3vbf-QQ?si=-C5QyMMg8JYhcBBQ
---
# The First Rule of Comments in Code
## Notes
Comments are bad by nature:
- They get outdated pretty quickly, and you don't know if the comments is updated with the code.
- A comments is most probably noise, because it's not gonna provide more information than the code itself.
- Commented code is broken code, because it's probably outdated compared to it's context.
Some rules to evade writing comments:
**Code that needs a comment, needs to be rewritten**. Always try to put the information in the code. if it needs a comment, it's not good enough.
**Move information somewhere else**. this is similar to the previous, move to a variable name, or to a documentation file in the worst case.
**How quickly the information will goes out of date**. It's so simple that a comments goes out of sync with the code, to prevent that transform the comment in code.
**If a comment gives no more information than the code, delete it**.
**"I need to explain the complexity"**. No, you need to fix the complexity. If the complexity is so big, put in the documentation instead. A comment cannot fix complexity, and will require hard work to change that code.
**Don't comment out code, delete it**. Commented code goes quickly out of sync with it's context, is not tested in any way and the effort of updating it is almost the same if not higher that writing it over with better knowledge, so it's better to just delete it. If we need this code back, we can recover it with git.
## Original
[The First Rule of Comments in Code](https://youtu.be/hxsx3vbf-QQ?si=-C5QyMMg8JYhcBBQ)
By [Bran van der Meer](https://www.youtube.com/@branvandermeer)

View file

@ -0,0 +1,266 @@
---
id: 88b1e080-79be-11ee-b19c-971f00999697
title: |
Web Accessibility Tips for Developers A11y Principles Explained
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2023-11-02 11:17:51
url_omnivore: |
https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5
url_original: |
https://www.freecodecamp.org/news/web-accessibility-for-devs/
---
# Web Accessibility Tips for Developers A11y Principles Explained
## Highlights
you can provide captions for audio and video materials.
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#a243f9e5-2cf7-437b-afdb-725d69408fa5)
---
color contrast for text and background
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#7da331b9-d92c-40b1-b9ff-03cd350b19e0)
---
it's a good idea to include descriptive alternative text (alt text) for images, explaining what they depict and their purpose.
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#c2a6ebd3-44b3-4bac-b723-be08ec3191d3)
---
You should also describe your icon buttons.
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#644def06-75fc-41b3-ad64-8b0eb34eb055)
---
First, make sure you use clear and consistent headings.
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#5d22dea1-4451-4052-a211-ffbc432cb3be)
---
And make sure you think about [keyboard accessibility](https://www.freecodecamp.org/news/designing-keyboard-accessibility-for-complex-react-experiences/) so users can navigate and communicate using the keyboard, and not exclusively using a mouse.
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#a6f33320-f395-41f2-92e4-7e5c70337377)
---
Organize content using headings, subheadings, and bullet points to enhance readability.
> [!note]
> Use semantic HTML
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#d6c8b9dc-b9e7-4ab7-8b53-0057246fea9a)
---
* Use [HTML5 semantic elements](https://www.freecodecamp.org/news/semantic-html-alternatives-to-using-divs/) like ``, ``, ``, and `` to enhance the document's structure.
* Ensure that your [JavaScript code is efficient](https://www.freecodecamp.org/news/javascript-performance-async-defer/) and doesn't block the rendering process.
* Utilize [browser developer tools](https://www.freecodecamp.org/news/learn-how-to-use-the-chrome-devtools-to-troubleshoot-websites/) and online testing services to identify and fix compatibility issues.
* Conduct [usability testing](https://www.freecodecamp.org/news/10-best-ux-testing-software-tools/) with a diverse group of users, including those who rely on assistive technologies, to gather feedback and make improvements.
* Optimize your website for fast loading times and low data usage using techniques like [caching](https://www.freecodecamp.org/news/a-detailed-guide-to-pre-caching/) and [tools like CDNs](https://www.freecodecamp.org/news/cdns-speed-up-performance-by-reducing-latency/) to reduce latency. This benefits both accessibility and user experience.
* Document your code and accessibility features for future maintainers.
* Test [website compatibility across various browsers](https://www.freecodecamp.org/news/cross-browser-compatibility-testing-best-practices-for-web-developers/). Testing website compatibility involves ensuring that your website functions correctly and looks good on a variety of devices, browsers, and assistive technologies.
[source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#ade773c1-f3e3-499b-8b34-c9d8a2c084e3)
---
## Original
![Web Accessibility Tips for Developers A11y Principles Explained](https://proxy-prod.omnivore-image-cache.app/2000x2000,sLi0R_mqQEUImakjW-uLiNCHUb_gUQOi3alWrqxEZEdI/https://www.freecodecamp.org/news/content/images/size/w2000/2023/10/51314.jpg)
Accessibility isn't just something you check off as done when you're building websites and web apps. It's a basic part of making the online world a better and fairer place for everyone.
In this article, you'll learn what accessibility means, and why it's important to make accessibility a part of your regular workflow. I'll also give you practical tips with examples to make your websites more accessible.
Let's explore the key parts of web accessibility together and help you make a website that includes everyone.
## What is Web Accessibility?
[Web accessibility](https://www.freecodecamp.org/news/accessibility-best-practices-to-make-web-apps-accessible/) refers to the practice of designing and developing websites, applications, and digital content in a way that ensures people with disabilities can perceive, understand, navigate, and interact with them effectively.
## Principles of Web Accessibility
To effectively enhance the accessibility of your websites and apps, you'll want to follow these fundamental principles outlined by the Web Content Accessibility Guidelines ([WCAG](https://www.w3.org/WAI/WCAG21/quickref/?versions=2.0)):
### Is it Perceivable?
Content should be displayed in a manner that all users can understand, regardless of their sensory abilities. Here are some ways you can make your content more perceivable:
First, ==you can provide captions for audio and video materials.== Adding captions to your website or application allows those with hearing disabilities to understand the information being shared, and make the content more accessible to everyone.
You can see an example of adding captions to a video in the image below:
![img](https://proxy-prod.omnivore-image-cache.app/600x400,s7JqQDCWlwfKv-nbThftb-4yQ3i9ewlt7dUGAOYpaZEw/https://www.freecodecamp.org/news/content/images/2023/10/img.jpg)
Image of a video illustrating the use of captions.
Next, make sure you use proper ==color contrast for text and background== elements.
Colors are an important part of a website, and we can describe them in terms of hue, lightness, and saturation.
There are several categories of colors which include warm colors, cool colors, and neutral colors
**Warm Colors:** Warm colors include red, orange, and yellow, and variations of
those three colors. These are the colors of fire, fall leaves, sunsets, and sunrises, and are generally energizing, passionate, and positive.
**Cool Colors:** Cool colors include green, blue, and purple, are often more
subdued than warm colors. They are the colors of night, water, of nature, and are usually calming, relaxing, and somewhat reserved.
**Neutral Colors:** Neutral colors often serve as the backdrop in design. Theyre
commonly combined with brighter accent colors. But they can also be used on their own in designs and can create very sophisticated layouts. Neutral colors include black, white, gray, cream, and beige.
Examples of colors that will make good contrast are white and blue, purple and white, yellow and white, light purple and black, green and white, black and white, and so on basically any colors that are different enough from each other to create that contrast.
Examples of colors that will make a bad contrast are gray and white, brown and orange, red and purple, and so on.
Here is an example that shows good color contrast that's easy to read:
![1](https://proxy-prod.omnivore-image-cache.app/600x400,spVLqkxfdpXB-5frjoYMtKQEeDQOoEbzW9pxOwGx5O_M/https://www.freecodecamp.org/news/content/images/2023/10/1.png)
Image illustrating good contrast using a dark blue background with white text
And here's an image with poor color contrast that's hard to read:
![2](https://proxy-prod.omnivore-image-cache.app/600x400,s13rNy0QO-cvE8T395BejB0TpXsi54-iolzLNTmS3bJk/https://www.freecodecamp.org/news/content/images/2023/10/2.png)
Image Illustrating bad contrast using a white background with light grey text
Also, ==it's a good idea to include descriptive alternative text (alt text) for images, explaining what they depict and their purpose.==
So for example, when you want to add an image to your website, you can add alt text to it explaining what it depicts.
Here is a markup description of how to add alt text to an image:
```routeros
<img src="Dog.png" alt="Image of a dog">
```
Here is an example that shows an image of two (2) dogs:
![dog](https://proxy-prod.omnivore-image-cache.app/600x400,s6zcOQSeNNFcbuGihDt5hMqHPhzrqgvYvQged6TAj_8o/https://www.freecodecamp.org/news/content/images/2023/10/dog.jpg)
Image of two dogs
And here's an example of an image that illustrates the use of alt text:
![dog1-1](https://proxy-prod.omnivore-image-cache.app/600x400,sXHxH9U-xfHDWpum3b4_FwBqU3n6zQ04pphIEvAkY5JA/https://www.freecodecamp.org/news/content/images/2023/10/dog1-1.jpg)
Image of dog with alt text displayed
==You should also describe your icon buttons.==
Icons can be easily understood most of the time. It's widely recognized that an x symbol, like this ❌, typically closes a window, a check mark ✅ signifies completion, a forward arrow ▶ signifies send (or play), and a plus sign represents addition.
But this is clear only for individuals with visual capabilities. For people who aren't able to see the buttons, you'll need to provide a description so they know what that button does.
Let's take a look at this HTML and CSS code that shows how to make buttons access:
Document
Here's the result of the code implemented above:
![code1](https://proxy-prod.omnivore-image-cache.app/600x400,shhm4_h1vW3_Etmiiy2C9La0vhNBfDbaNa_p0azyu_vo/https://www.freecodecamp.org/news/content/images/2023/10/code1.jpg)
### Is it Operable?
Users should be able to navigate and interact with the interface quickly. Consider the following factors:
==First, make sure you use clear and consistent headings.==
This is what clear and consistent headings look like:
## I am a Title
## I am a Subtitle
### This is heading 3
#### This is Heading 4
##### This is Heading 5
###### This is heading 6
As you can see, these headings go from largest to smallest in order. We have an H1 heading first, followed by H2, H3, and so on.
Here are some headings that don't follow the proper hierarchy:
###### This is heading 6
##### This is Heading 5
#### This is Heading 4
### This is heading 3
## I am a Subtitle
## I am a Title
In this example, the headings go in reverse order, starting from H6 and moving up through H5, H4, and so on.
Just remember to use proper heading hierarchy don't use an H2 and then jump straight to H4 for a subheading, for example, as this is visually jarring and doesn't convey the proper importance or hierarchy of the text.
Here's why heading hierarchy is important:
* A clear heading hierarchy helps readers easily navigate and understand the content of a document.
* Heading hierarchy is crucial for accessibility, as it helps screen readers and assistive technologies interpret the structure of the content. This is important for individuals with visual impairments who rely on such tools to access information.
* A well-organized heading hierarchy implement a logical flow of information, ensuring that topics are presented in a coherent order.
Also, refrain from using elements that might trigger physical discomfort, like bright flashing lights.
==And make sure you think about== ==[keyboard accessibility](https://www.freecodecamp.org/news/designing-keyboard-accessibility-for-complex-react-experiences/)== ==so users can navigate and communicate using the keyboard, and not exclusively using a mouse.==
### Is it Understandable?
Content and functionality should be presented clearly and understandably. Consider the following factors:
* ==Organize content using headings, subheadings, and bullet points to enhance readability.==
* Provide instructions and error messages that are easy to understand.
* Use simple and concise language, avoid complex terms.
### Is it Robust?
Websites should be built using robust and widely supported technologies to enable compatibility across devices and assistive technologies.
You'll want to maximize compatibility with current and future user agents, including assistive technologies.
Here are some of the ways you can maximize compatibility with current and future agents, including assistive tools:
* ==Use== ==[HTML5 semantic elements](https://www.freecodecamp.org/news/semantic-html-alternatives-to-using-divs/)== ==like== `==&lt;====header====&gt;==`==,== `==&lt;====nav====&gt;==`==,== `==&lt;====main====&gt;==`==, and== `==&lt;====footer====&gt;==` ==to enhance the document's structure.==
* ==Ensure that your== ==[JavaScript code is efficient](https://www.freecodecamp.org/news/javascript-performance-async-defer/)== ==and doesn't block the rendering process.==
* ==Utilize== ==[browser developer tools](https://www.freecodecamp.org/news/learn-how-to-use-the-chrome-devtools-to-troubleshoot-websites/)== ==and online testing services to identify and fix compatibility issues.==
* ==Conduct== ==[usability testing](https://www.freecodecamp.org/news/10-best-ux-testing-software-tools/)== ==with a diverse group of users, including those who rely on assistive technologies, to gather feedback and make improvements.==
* ==Optimize your website for fast loading times and low data usage using techniques like== ==[caching](https://www.freecodecamp.org/news/a-detailed-guide-to-pre-caching/)== ==and== ==[tools like CDNs](https://www.freecodecamp.org/news/cdns-speed-up-performance-by-reducing-latency/)== ==to reduce latency. This benefits both accessibility and user experience.==
* ==Document your code and accessibility features for future maintainers.==
* ==Test== ==[website compatibility across various browsers](https://www.freecodecamp.org/news/cross-browser-compatibility-testing-best-practices-for-web-developers/)====. Testing website compatibility involves ensuring that your website functions correctly and looks good on a variety of devices, browsers, and assistive technologies.==
Here are the steps you can follow to test website compatibility effectively:
1. **Device Testing**: Test your website on various devices, such as desktop computers, laptops, tablets, and smartphones. This includes both iOS and Android devices.
2. **Browser Testing**: Check your website's performance and appearance on multiple browsers, including but not limited to Google Chrome, Mozilla Firefox, Apple Safari, and Microsoft Edge.
3. **User Testing**: Conduct usability testing with real users. Ask them to use your website on different devices and browsers and collect feedback on compatibility issues.
4. **Performance Testing**: Assess website loading times, and optimize for speed using tools like Google PageSpeed Insights, GTmetrix, or Lighthouse. Check for compatibility with slow internet connections.
## Conclusion
Understanding web accessibility can enhance the user experience by creating a smooth and seamless interaction with websites and web applications.
Implementing these tips can improve the overall user-friendliness and navigability of your app. It'll help create a more enjoyable experience for all users, and will also allow people with disabilities to perceive, understand, navigate, and interact with your sites effectively.
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,27 @@
---
id: fc51bf82-66d3-451f-8f64-17d6add50f92
title: |
Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?
status: ARCHIVED
tags:
- read-later
- Youtube
date_added: 2023-11-04 14:14:49
url_omnivore: |
https://omnivore.app/me/https-www-youtube-com-watch-pp-yg-ukz-2-l-0-ih-nxd-w-fza-a-253-d-18b9b548407
url_original: |
https://www.youtube.com/watch?pp=ygUKZ2l0IHNxdWFzaA%253D%253D&v=HlmZLXMOpEM
---
# Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?
## Notes
- Merge commit: Se crea un commit que tiene 2 padres, el último commit de main y la feature branch, se mantiene la trazabilidad hacia la feature branch pero el historial queda visualmente más complejo
- Rebase: Se copian los commits de la feature branch a main como nuevos commits, se pierde la trazabilidad hacia la feature branch pero queda un historial lineal en main
- Squash commit: Se juntan todos los commits en uno solo con un squash que queda en main, se pierde la trazabilidad hacia la feature branch pero queda un historial lineal en main
## Original
[Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?](https://www.youtube.com/watch?pp=ygUKZ2l0IHNxdWFzaA%253D%253D&v=HlmZLXMOpEM)
By [CodelyTV - Redescubre la programación](https://www.youtube.com/@CodelyTV)

View file

@ -0,0 +1,402 @@
---
id: 616d5d08-7d04-11ee-8eaa-9f56108b78ec
title: |
How to Write Components that Work in Any Framework
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2023-11-06 17:25:12
url_omnivore: |
https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079
url_original: |
https://www.freecodecamp.org/news/write-components-that-work-in-any-framework/
---
# How to Write Components that Work in Any Framework
## Highlights
With Custom Elements you can author your own custom HTML elements that you can reuse across your site. They can be as simple as text, images, or visual decorations. You can push them further and build interactive components, complex widgets, or entire web applications.
[source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#bceef8c0-728e-422a-aed6-b047736cb395)
---
### Writing a web component requires understanding all of its underlying technologies
As we saw above, web components are made up of three technologies. You can also see in the hello world code snippet, that we explicitly need to know and understand these three technologies.
1. Were creating a **template element** and setting its inner HTML
2. Were creating a **shadow root**, and explicitly setting its mode to open.
3. Were cloning our **template** and appending it to our **shadow root**
4. Were registering a new **custom element** to the document
[source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#46fc130a-1549-40c8-b950-42035c227bc4)
---
As web component authors, we need to consider a lot of things:
* Setting up the shadow DOM
* Setting up the HTML templates
* Cleaning up event listeners
* Defining properties that we want to observe
* Reacting to properties when they change
* Handling type conversions for attributes
[source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#855f444c-49f1-4176-9537-aaeeb6a01355)
---
One such tool is called Lit, which is developed by a team at Google. [Lit](https://lit.dev/) is a lightweight library designed to make writing web components simple, by removing the need for the boilerplate weve already seen above.
[source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#385d9ef8-13fb-4799-bff5-ef767b3df67f)
---
## Original
![How to Write Components that Work in Any Framework](https://proxy-prod.omnivore-image-cache.app/1200x600,sbNnkMyaVUIiiSYXNfn_YVuWBIhu0N84ey_fbF6pQlVw/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/og-button.png)
The browser has a built-in way of writing reusable components in the form of **web components**. Theyre an excellent choice for building interactive and reusable components that work in any frontend framework.
With that said, writing highly interactive and robust web components isnt simple. They require a lot of boilerplate and feel much less intuitive than the components you may have written in frameworks like React, Svelte, or Vue.
In this tutorial, Ill give you an example of an interactive component written as a web component, and then refactor it using a library that softens the edges and removes heaps of boilerplate.
Dont sweat it if youre not familiar with web components. In the next section, Ill do a (brief) overview of what web components are, and what theyre made out of. If you have some basic experience with them, you can skip the next section.
## What are Web Components?
Before web components, the browser didnt have a standard way of writing reusable components. Many libraries solve this problem, but they often run into limitations like performance, interoperability, and issues with web standards.
Web components are a technology made up of 3 different browser features:
* Custom elements
* Shadow DOM
* HTML Templates
Well do a quick crash course covering these technologies, but its by no means a comprehensive breakdown.
### What are Custom Elements?
==With Custom Elements you can author your own custom HTML elements that you can reuse across your site. They can be as simple as text, images, or visual decorations. You can push them further and build interactive components, complex widgets, or entire web applications.==
Youre not just limited to using them in your projects, but you can publish them and allow other developers to use them on their sites.
Here are some of the reusable components from my library [A2K](https://a2000-docs.netlify.app/). You can see that they come in all shapes and sizes, and have a range of different functionalities. Using them in your projects is similar to using any old HTML element.
![A small collection of web components from the A2K library](https://proxy-prod.omnivore-image-cache.app/1936x1576,sJHqJR3aX72y4hbKfS4SGGmJwoFGcBRrCJxB2ozU2rIU/https://www.freecodecamp.org/news/content/images/2023/11/web-components.png)
A small collection of web components from the A2K library
Heres how youd use the progress element in your project:
```xml
<!DOCTYPE html>
<html>
<head>
<title>Quick Start</title>
<meta charset="UTF-8" />
</head>
<body>
<!-- Use web components in your HTML like regular built-in elements. -->
<a2k-progress progress="50" />
<!-- a2k web components use standard JavaScript modules. -->
<script type="module">
import 'https://cdn.jsdelivr.net/npm/@a2000/progress@0.0.5/lib/src/a2k-progress.js';
</script>
</body>
</html>
```
Once youve imported the third-party scripts, you can start using the component, `a2k-progress` in this case, just like any other HTML element.
If youre building your own web components, theres virtually no limit to how complex you can make your custom elements.
I recently created a web component that renders a CodeSandbox code editor in the browser. And because its a web component, you can use it in any framework you like! If youd like to learn a little more about that, [you can read more here](https://component-odyssey.com/articles/00-sandpack-lit-universal).
### What is the Shadow DOM?
If you have a working knowledge of CSS, youll know that vanilla CSS is scoped globally. Writing something like this in your global.css:
```css
p {
color: tomato;
}
```
will give all `p` elements a nice orange/red color, assuming that no other, more specific CSS selectors are applied to a `p` element.
Take this select menu, for example:
![A select menu component with a visual design reminiscent of the old Windows operating systems](https://proxy-prod.omnivore-image-cache.app/1034x502,s9CkMnQ9nLrjRpsbeELOUs7SesB_nfO2NrbzcalU2UFE/https://www.freecodecamp.org/news/content/images/2023/11/a2k-select-menu.png)
It has a distinct character which is driven by the visual design. You might want to use this component, but if your global styles affect things like the font family, the color, or the font size, it could cause issues with the appearance of the component:
```xml
<head>
<style>
body {
color: blue;
font-size: 12px;
font-family: system-ui;
}
</style>
</head>
<body>
<a2k-select></a2k-select>
</body>
```
![The same select menu, but with a lot of its defining characteristics overridden by global CSS.](https://proxy-prod.omnivore-image-cache.app/1904x824,s6vwLXZ-23v_oU3NRFu4pagLJRfGUCz14nw0IkGnQuPU/https://www.freecodecamp.org/news/content/images/2023/11/a2k-select-menu-2.png)
This is where the Shadow DOM comes in. The Shadow DOM is an encapsulation mechanism that prevents the rest of the DOM from interfering with your web components. It ensures that the global styles of the web application dont interfere with any components that you consume. It also means that component library developers can author their components with the confidence that theyll look and behave as expected across different web applications.
Theres a lot more nuance when it comes to the Shadow DOM, as well as other features that were not going to touch on in this article. If youd like to learn more about web components though, I have an entire course ([Component Odyssey](https://component-odyssey.com/)) dedicated to teaching you how to build reusable components that work in any framework.
### HTML Templates
The last feature in our whistle-stop tour of web component features is HTML Templates.
What makes this HTML element different from other elements, is that the browser doesnt render its content to the page. If you were to write the following HTML you wouldnt see the text “Im a header” displayed on the page:
```xml
<body>
<template>
<h1>I'm a header</h1>
</template>
</body>
```
Instead of being used to render the content directly, the content of the template is designed to be copied. The copied template can then be used to render content to the page.
You can think of the template element much like the template for a 3D print. The template isnt a physical entity, but its used to create real-life clones.
You would then reference the template element in your web component, clone it, and render the clone as the markup for your component.
I wont spend any more time on these web component features, but youve probably already noticed that to write vanilla web components, there are a lot of new browser features that you need to know and understand.
Youll see in the next section that the mental model for building web components doesnt feel as streamlined as it does for other component frameworks.
## How to Build a Basic Web Component
Now that weve briefly covered the fundamental technologies powering a web component, heres how to build a _hello world_ component:
```scala
const template = document.createElement('template');
template.innerHTML = `<p>Hello World</p>`;
class HelloWorld extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.append(template.content.cloneNode(true));
}
}
customElements.define('hello-world', HelloWorld);
```
This is the most simple component you can write, but theres already so much going on. For someone completely new to web components, and without the background knowledge I provided above, theyre going to be left with a lot of questions, and a lot of confusion.
For me, there are at least two key reasons why web components can be challenging to write, at least within the context of the hello world examples.
### The markup is decoupled from the component logic
In many frameworks, the markup of the component is often treated as a first-class citizen. Its often the content that gets returned from the component function, or has direct access to the components state, or has built-in utilities to help manipulate markup (like loops, conditionals, and so on).
This isnt the case for web components. In fact, the markup is often defined outside of the components class. Theres also no built-in way for the template to reference the current state of the component. This becomes a cumbersome limitation as the complexity of a component grows.
In the world of frontend, components are designed to help developers reuse markup in several pages. As a result, the markup and the component logic are inextricably linked, and so they should be colocated with one another.
### ==Writing a web component requires understanding all of its underlying technologies==
==As we saw above, web components are made up of three technologies. You can also see in the hello world code snippet, that we explicitly need to know and understand these three technologies.==
1. ==Were creating a== **==template element==** ==and setting its inner HTML==
2. ==Were creating a== **==shadow root==**==, and explicitly setting its mode to open.==
3. ==Were cloning our== **==template==** ==and appending it to our== **==shadow root==**
4. ==Were registering a new== **==custom element==** ==to the document==
Theres nothing inherently wrong with this, since web components are supposed to be a “lower-level” browser API, making them prime for building abstractions on top of. But for a developer coming from a React or a Svelte background, having to understand these new browser features, and then having to write components with them can feel like too much friction.
## More Advanced Web Components
Lets take a look at a more advanced web component, a counter button.
![A simple counter button. There's a clickable button, and some text showing how many times the button has been clicked](https://proxy-prod.omnivore-image-cache.app/388x228,sHWCz4gELDISUuDwuoPIHQHGqCm0zEx5YHunEIzF9BE0/https://www.freecodecamp.org/news/content/images/2023/11/counter-button.png)
You click the button, and the counter increments.
The following example contains a few extra web component concepts, like lifecycle functions and observable attributes. You dont need to understand everything going on in the code snippet. This example is really only used to illustrate how much boilerplate is required for the most basic of interactive interfaces, a counter button:
```kotlin
const templateEl = document.createElement("template");
templateEl.innerHTML = `
<button>Press me!</button>
<p>You pressed me 0 times.</p>
`;
export class OdysseyButton extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
this.shadowRoot.appendChild(templateEl.content.cloneNode(true));
this.button = this.shadowRoot.querySelector("button");
this.p = this.shadowRoot.querySelector("p");
this.setAttribute("count", "0");
}
// Note: Web components have lifecycle methods,
// If we're setting event listeners when the component is added to the DOM, it's our job to clean
// them up when it gets removed from the DOM
connectedCallback() {
this.button.addEventListener("click", this.handleClick);
}
disconnectedCallback() {
this.button.removeEventListener("click", this.handleClick);
}
// Unlike frameworks like React, Web Components don't automatically rerender when a prop (or attribute)
// changes. Instead, we need to explicitly define which attributes we want to observe.
static get observedAttributes() {
return ["disabled", "count"];
}
// When one of the above attributes changes, this lifecycle method runs, and we can
// react to the new attribute's value accordingly.
attributeChangedCallback(name, _, newVal) {
if (name === "count") {
this.p.innerHTML = `You pressed me ${newVal} times.`;
}
if (name === "disabled") {
this.button.disabled = true;
}
}
// In HTML, attribute values are always strings. This means that it's our job to
// convert types. You can see below that we're converting a string -> number, and then back to a string
handleClick = () => {
const counter = Number(this.getAttribute("count"));
this.setAttribute("count", `${counter + 1}`);
};
```
==As web component authors, we need to consider a lot of things:==
* ==Setting up the shadow DOM==
* ==Setting up the HTML templates==
* ==Cleaning up event listeners==
* ==Defining properties that we want to observe==
* ==Reacting to properties when they change==
* ==Handling type conversions for attributes==
And there are still so many other things to consider that I havent touched on in this article.
That isnt to say that web components are bad and that you shouldnt write them. In fact, Id argue that you learn so much about the browser platform by building with them.
But I feel that there are better ways to write components if your priority is to write interoperable components in a much more streamlined and ergonomic way.
## How to Write Web Components with Less Boilerplate
As I mentioned earlier, there are a lot of tools out there to help make writing web components much easier.
==One such tool is called Lit, which is developed by a team at Google.== ==[Lit](https://lit.dev/)== ==is a lightweight library designed to make writing web components simple, by removing the need for the boilerplate weve already seen above.==
As well see, Lit does a lot of heavy lifting under-the-hood to help cut down the total lines of code by nearly half! And because Lit is a wrapper around web components and other native browser features, all your existing knowledge about web components is transferable.
To start seeing how Lit simplifies your web components. Heres the **hello world** example from earlier, but refactored to use Lit instead of a vanilla web component:
```scala
import { LitElement, html } from "lit";
export class HelloWorld extends LitElement {
render() {
return html`<p>Hello World!</p>`;
}
}`
customElements.define('hello-world', HelloWorld);
```
Theres a lot less boilerplate with the Lit component, and Lit handles the two problems I mentioned earlier, a little bit differently. Lets see how:
1. The markup is directly defined from within the component class. While you can define your templates outside of the class, its common practice to return the template from the `render` function. This is more in line with the mental model presented in other UI frameworks, where the UI is a function of the state.
2. Lit also doesnt require developers to attach the shadow DOM, or create templates and clone template elements. While having an understanding of the underlying web component features will help when developing Lit components, theyre not required for getting started, so the barrier for entry is much lower.
So now for the big finale, what does the counter component look like once weve migrated it over to Lit?
```typescript
import { LitElement, html } from "lit";
export class OdysseyCounter extends LitElement {
static properties = {
// We define the component's properties as well as their type.
// These properties will trigger the component to re-render when their values change.
// While they're not the same, you can think of these "properties" as being
// Lit's alternatives to "observed attributes"
// If the value is passed down as an attribute, Lit converts the value
// to the correct type
count: { type: Number },
disabled: { type: Boolean },
};
constructor() {
super();
// There's no need to create a shadow DOM, clone the template,
// or store references to our DOM nodes.
this.count = 0;
}
onCount() {
this.count = this.count + 1;
}
render() {
// Instead of using the attributeChangedCallback lifecycle, the
// render function has access to all of the component's properties,
// which simplifies the process of manipulating our templates.
return html`
<button ?disabled=${this.disabled} @click=${this.onCount}>
Press me!
</button>
<p>You pressed me ${this.count} times.</p>
`;
}
}`
```
The amount of code were writing is cut down by almost half! And this difference becomes more noticeable when creating more complex user interfaces.
## Why am I going on about Lit?
Im a big believer in web components, but I recognise that the barrier to entry is high for many developers. Writing complex web components requires understanding heaps of browser features and the education around web components isnt as comprehensive as other technologies, like React or Vue.
This is why I think its important to use tools like Lit can make writing performant and interoperable web components much easier. This is great if you want your components to work within any frontend framework.
If youd like to learn even more, this is the approach I teach in my upcoming course [Component Odyssey](https://component-odyssey.com/). This course is excellent for anyone who wants to understand how to write components that work in any framework.
I do this by covering the absolute basics of web components, before moving on to tools like Lit that simplify the process of writing web components without complicating your development environment. By the end, youll learn how to build and publish a component library that works across any frontend framework.
If you want early-bird discount codes for Component Odyssey, then head on [over to the site to get notified](https://component-odyssey.com/subscribe).
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,479 @@
---
id: aceac380-7e10-11ee-992a-432064e77190
title: |
How to Avoid Prop Drilling in React
status: ARCHIVED
tags:
- read-later
- RSS
- react
date_added: 2023-11-07 19:58:39
url_omnivore: |
https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2
url_original: |
https://www.freecodecamp.org/news/avoid-prop-drilling-in-react/
---
# How to Avoid Prop Drilling in React
## Highlights
Prop drilling occurs when a parent component generates its state and passes it down as `props` to its children components that do not consume the props instead, they only pass it down to another component that finally consumes it.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#05db3def-4e59-4cfe-b8dd-1044ce91a9d5)
---
First of all, **grouping static elements and dependent components** together to achieve an appealing UI design is the major cause of prop drilling. You can't avoid prop drilling when your UI groups static elements and dependent components together in a parent. The parent component clearly won't use the `prop`, as everything within it is a static element except the component that needs a prop.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#fa2c28c0-1b7e-4416-8553-c1b5c7a59637)
---
Second of all, when a **component accepts `props` that it doesn't use but merely passes it down to its children**, this is a sign that you have prop drilling in your component:
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#6749a89e-a38c-4f4f-aa3f-c6455e6daf85)
---
Third, when a component that represents an independent section of a page is **forced to take props from its parent**, prop drilling is inevitable. It should ideally be self-contained with its state and operations.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#751d81de-62b7-444b-a2f0-a0b374f6ce45)
---
And finally, **the presence of elongated `props`** is a sure sign of prop drilling. Since an elongated prop is a fundamental element that's consistently present in every case of prop drilling, grasping this concept allows you to instinctively avoid prop drilling.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#90f807ca-03a3-4804-bcf1-c5df4e53a997)
---
Component composition is a good approach to fix prop drilling. If you ever find yourself in a situation where a component passes down a prop it neither creates nor consumes, you can use component composition to fix it.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#0112181f-34b7-4ca3-b941-f1c16303c6c0)
---
To avoid prop drilling in this case, any grandchildren components that require access to the same `props`, especially when their parent don't consume the data, should be passed as children ensuring that the data remains within the `App` context.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#c17f1d4e-8f5c-45d1-9078-fe8ab740e11e)
---
Prop drilling can also be fixed by moving state to where it is consumed. The example of prop drilling in this article has a component named `Content`. But the component is forced to receive a `prop` from its parent instead of having a state and be an independent component and so we have prop drilling.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#9f94fd13-9558-4bd3-a60c-60074b3495d2)
---
It's essential to highlight what to avoid when dealing with prop drilling to prevent unnecessary challenges.
* **Avoid React Context, if possible, to fix prop drilling.** This approach ties your component to a specific context, restricting its usability outside of that context and hindering composition and reusability.
* **Steer clear of redundant components by employing a children-parent replacement approach.** This approach naturally incorporates [component composition](https://www.codementor.io/@dinerismail/the-power-of-component-composition-in-react-21goassg4m) without introducing redundant components or states when resolving prop drilling.
[source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#8ff7b79b-5503-4e1a-b7fe-1a07a46c578c)
---
## Original
![How to Avoid Prop Drilling in React](https://proxy-prod.omnivore-image-cache.app/1280x720,sKh6f6Y_QlOrf22lUoux3sSuSVezHNMNwL0zz9QlJgdQ/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/Purple-Creative-Livestream-YouTube-Thumbnail.png)
In order to write scalable, reusable, and maintainable applications with React, you'll need to go beyond the surface of using React components, useEffect, useContext, useState, and the like. It involves learning in detail how React works in more depth.
And if you don't properly understand these key React concepts, you can run into various issues, like [prop drilling](https://www.quora.com/What-is-prop-drilling-in-ReactJS).
In this tutorial, you'll learn what prop drilling is. I'll also teach you how to intuitively avoid it without relying on React context. In the end, you'll understand how to identify prop drilling without thinking and fix it with precision.
If you prefer a visual guide, here's a video version of this tutorial on my [YouTube channel](https://youtu.be/KZnQ5R8Kd4I) (approximately 15 minutes).
[![Watch the video](https://proxy-prod.omnivore-image-cache.app/480x360,sEF1bGD-Lf4T-Vw-XRelb5_QXFIgGpiBvkoeFBwT8sbs/https://img.youtube.com/vi/ELZZnqHJhlw/hqdefault.jpg)](https://www.youtube.com/embed/ELZZnqHJhlw)
## What is Prop Drilling?
==Prop drilling occurs when a parent component generates its state and passes it down as== `==props==` ==to its children components that do not consume the props instead, they only pass it down to another component that finally consumes it.==
Below is an example of prop drilling in React:
```xquery
function App() {
const [profile, setProfile] = useState({ame: 'John'});
return (
<div> <Header profile={profile} />
</div>
);
}
function Header({ profile }) {
return (
<header>
<h1>This is the header</h1>
<Content profile={profile} />
</header>
);
}
function Content({ profile }) {
return (
<main>
<h2>Content Component</h2>
<p>{profile.name}</p>
</main>
);
}
export default App;
```
If you check out the example above, you'll notice that `profile` is passed from the `App` component through the `Header` to the `Content` component, which eventually makes use of the `props`. This is commonly referred to as prop drilling as the `Header` component doesn't consume the `prop` but only passes it down to the `Content` component that finally consumes it.
Now that you understand what prop drilling is, the next challenge is to figure out how to avoid it because it's not always an intuitive process.
You'll need to start exploring methods to address it. While you can use component composition and React context to resolve it, the challenge lies in not always recognizing the issue until later.
To truly master the art of handling prop drilling intuitively, you must learn how to identify elongated props and contexts.
## What is an Elongated Prop?
![Where is the love sung by The Black Eye Peas recreated in a tunnel underpass.](https://proxy-prod.omnivore-image-cache.app/2000x1333,s26q4lqLPqkZI3s4R-g30Fqa9bmslwGSLqHbqRqvKgwc/https://images.unsplash.com/photo-1484069560501-87d72b0c3669?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fHF1ZXN0aW9uaW5nfGVufDB8fHx8MTY5OTMyMzQ0MXww&ixlib=rb-4.0.3&q=80&w=2000)
Photo by [Emily Morter](https://unsplash.com/@emilymorter?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)
An elongated prop is a `prop` that is not consumed but it is only passed down to another component. When a component receives a `prop` from its parent and doesn't consume the `prop`, it passes the prop down to another component. This prop is called elongated prop because it has been extended.
Whenever you see a `prop` being passed down by components that neither creates nor consumes the `prop`, you have an an elongated prop (as well as prop drilling) in your code. The code snippet below is an example:
```javascript
function Profile({ user }) {
return (
<header>
<h1>This is the header</h1>
<Content user={user} />
</header>
);
}
```
`user`, in this example, is an elongated `prop` as it is neither created nor consumed by the `Profile` component. Instead, it is only passed down to the `Content` component. And that means we have extended `user` through a component that doesn't need it so that it can get to the one that does.
Now, let's revisit the example we used to illustrate prop drilling. Wait, are you thinking what I'm thinking? The `prop` that's being passed down in the prop drilling example is indeed an elongated prop, right? Yes, you've got it.
```xquery
function App() {
const [profile, setProfile] = useState({ame: 'John'});
return (
<div>
<Header profile={profile} />
</div>
);
}
function Header({ profile }) {
return (
<header>
<h1>This is the header</h1>
<Content profile={profile} />
</header>
);
}
function Content({ profile }) {
return (
<main>
<h2>Content Component</h2>
<p>{profile.name}</p>
</main>
);
}
export default App;
```
In the code above, you can observe that the `prop` passed to `Header` is created in the `App` component. Then, `Header` passes it down to its child component named `Content`. As a result, the `profile` being passed down can be considered elongated because it is passed through a component (`Header`) that neither creates nor consumes it down to the one that does.
The `Header` component passing down the `prop` it doesn't create or need is unnecessarily stretching the context of the `prop`.
Now, the question is, how do elongated props help to intuitively avoid prop drilling in React? They make it easy for you to spot `props` being used where they're are neither created nor consumed.
Rather than focusing on how to solve prop drilling, elongated props enable you to avoid it. This is because it's intuitive to recognize when a component neither creates nor consumes `props`, and that helps you to know the component is irrelevant.
But before you learn how to quickly avoid prop drilling with your understanding of elongated props, it is important that you know the main causes of prop drilling. Then you'll truly know how to avoid it without thinking about it.
## What Causes Prop Drilling?
![»What is your story?«](https://proxy-prod.omnivore-image-cache.app/2000x1500,sA8o6QjJC2cc6DWaXvdQrHJrsY7uC26GCnLTYhFTKN7E/https://images.unsplash.com/photo-1617575521317-d2974f3b56d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRyaWdnZXJ8ZW58MHx8fHwxNjk5MzIzNTU2fDA&ixlib=rb-4.0.3&q=80&w=2000)
Photo by [Etienne Girardet](https://unsplash.com/@etiennegirardet?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)
Prop drilling doesn't occur out of thin air. It's a consequence of inadequate component organization, and it is not a React problem. It is a thinking or design problem.
You won't encounter an instance of prop drilling without observing one of the following layout mistakes:
==First of all,== **==grouping static elements and dependent components==** ==together to achieve an appealing UI design is the major cause of prop drilling. You can't avoid prop drilling when your UI groups static elements and dependent components together in a parent. The parent component clearly won't use the== `==prop==`==, as everything within it is a static element except the component that needs a prop.==
Here's an example:
```javascript
function Header({ profile }) {
return (
<header>
<h1>This is the header</h1>
<Content profile={profile} />
</header>
);
}
```
In this case, static elements `<header> and <h1>` are grouped with a dependent component `Content` and that's why we have prop drilling therein.
Provided that the `Content` component is independent or takes no `props`, it won't need `profile` and there won't be prop drilling in the first place. This is why forcing a component that should be independent to take `props` from its parent is a recipe for prop drilling in React.
==Second of all, when a== **==component accepts== `==props==` ==that it doesn't use but merely passes it down to its children==**==, this is a sign that you have prop drilling in your component:==
```php
function App () {
const [profile, setProfile] = useState({name: "Ayobami"})
return (
<>
<Parent profile={profile} />
</>
);
};
function Parent({ profile }) {
return (
<div>
<Hero profile={profile} />
<Features profile={profile} />
</div>
);
};
```
In this case there is prop drilling because the `Parent` component takes `profile` and it doesn't use it though it passes it down to its children.
==Third, when a component that represents an independent section of a page is== **==forced to take props from its parent==**==, prop drilling is inevitable. It should ideally be self-contained with its state and operations.==
The exception would be if it's intentionally tied to its parent for specific reasons. In such cases, prop drilling becomes a necessary trade-off.
If you revisit the example of prop drilling cited in this article, you will realize it has a prop drilling issue because the `Content` component which could have been an independent component by having a state is forced to receive props from its parent.
==And finally,== **==the presence of elongated== `==props==`** ==is a sure sign of prop drilling. Since an elongated prop is a fundamental element that's consistently present in every case of prop drilling, grasping this concept allows you to instinctively avoid prop drilling.==
When you spot an elongated prop, you can be certain that one of the other three mistakes is also in play. In short, an elongated prop is a prop that is not consumed and is also passed down to another component.
So grouping static elements with dependent components, forcing components to take props, elongated props, and receiving a prop without consuming it are the signs to recognize prop drilling in React.
## How to Fix Prop Drilling with Component Composition
==Component composition is a good approach to fix prop drilling. If you ever find yourself in a situation where a component passes down a prop it neither creates nor consumes, you can use component composition to fix it.==
But to use component composition, you need to understand a component context.
### What is a component context?
The context of a component encompasses everything that is visible within it, including state, props, and children. The following code further illustrates this concept:
```javascript
function App() {
const [profile, setProfile] = useState({name: 'Ayobami'});
return (
<div>
<Header profile={profile} />
</div>
);
}
export default App;
```
In this scenario, the context of `App` refers to everything we can see within the `App` component including the `profile` prop, the `Header`, and other `App` content. Therefore, any data created in the `App` component should ideally be utilized within the `App` component itself, either as its own data or as `props` to its children.
Prop drilling always emerges when the children receiving the `props` doesn't consume it but only passes it down to its children.
==To avoid prop drilling in this case, any grandchildren components that require access to the same== `==props==`==, especially when their parent don't consume the data, should be passed as children ensuring that the data remains within the== `==App==` ==context.==
```javascript
export function App() {
const [profile, setProfile] = useState({name: 'Ayobami'});
return (
<div>
<Header>
<Content profile={profile} />
</Header>
</div>
);
}
```
**`Or`**
```javascript
export function App() {
const [profile, setProfile] = useState({name: 'Ayobami'});
return (
<div>
<Header children={<Content profile={profile} />} >
</div>
);
}
```
As you can see, we have resolved the prop drilling issue in the previous example, even though we still have a redundant component, `<Header>`, right? We've successfully addressed prop drilling through component composition.
This process is quite straightforward because we concentrate on recognizing elongated props and repositioning them within appropriate contexts.
The concept of prop drilling is problem-focused, but prop elongation is solution-driven. When dealing with elongated props, our primary goal is to identify props that are not consumed but only passed down to another components.
## How to Fix Prop Drilling by Moving State to the Consumer
==Prop drilling can also be fixed by moving state to where it is consumed. The example of prop drilling in this article has a component named== `==Content==`==. But the component is forced to receive a== `==prop==` ==from its parent instead of having a state and be an independent component and so we have prop drilling.==
We can fix the prop drilling in this case by moving the profile state to where it is consumed.
Let's revisit the example:
```xquery
function App() {
const [profile, setProfile] = useState({ame: 'John'});
return (
<div>
<Header profile={profile} />
<Footer profile={profile />
</div>
);
}
function Header({ profile }) {
return (
<header>
<h1>This is the header</h1>
<Content profile={profile} />
</header>
);
}
function Content({ profile }) {
return (
<main>
<h2>Content Component</h2>
<p>{profile.name}</p>
</main>
);
}
export default App;
```
We can fix prop drilling in this case by moving `profile` to where it is consumed:
```javascript
function App() {
return (
<div>
<Header />
<Footer profile={profile />
</div>
);
}
function Header() {
return (
<header>
<h1>This is the header</h1>
<Content />
</header>
);
}
function Content({ profile }) {
const [profile, setProfile] = useState({ame: 'John'});
return (
<main>
<h2>Content Component</h2>
<p>{profile.name}</p>
</main>
);
}
```
Now that we have lifted the profile to the `Content` component where it is consumed, the `App` component doesn't have a state, while the `Header` component doesn't receive a prop again as the `Content` component has its state.
But wait! There is a problem. The `Footer` component needs the state we moved away from `App`. There you are! That is the problem with lifting or moving state to where we think it is needed. In this case, if the `Footer` component doesn't need it, we won't have any issue but `Footer` also needs the prop.
Now that `Footer` needs `profile` as a prop, we need to solve prop drilling with another method.
## How to Fix Prop Drilling with a Children-Replacing-Parent Strategy
Earlier in this article, we talked about how to use component composition and moving state to its consumer to solve prop drilling. But as you saw, they have some issues duplicated components or states.
But using this children-replacing-parent approach fixes the problem effectively:
****Working but could be better:**
```xquery
export function App() {
const [profile, setProfile] = useState({name: 'Ayobami'});
return (
<div>
<Header>
<Content profile={profile} />
</Header>
</div>
);
}
function Header({ profile }) {
return (
<header>
<h1>This is the header</h1>
<Content profile={profile} />
</header>
);
}
```
The example above shows a solution to the prop drilling example in this article. But as you can see, it has a redundant component, as `Header` does nothing.
**Here's a better version:**
```javascript
export function App() {
const [profile, setProfile] = useState({name: 'Ayobami'});
return (
<header>
<h1>This is the header</h1>
<Content profile={profile} />
</header>
);
}
```
In the above code, we enhance the component composition solution we previously implemented for the prop drilling example by replacing the redundant `Header` component with its content in its parent (`App`).
## What to Avoid
![photo-1587065915399-8f8c714ab540?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkYW5nZXJ8ZW58MHx8fHwxNjk5MzIzMDgxfDA&ixlib=rb-4.0](https://proxy-prod.omnivore-image-cache.app/2000x1333,svvd90JJPHx2cRZ_A6-9SXg8LuqQJ_kGlJbtNXwk4tTc/https://images.unsplash.com/photo-1587065915399-8f8c714ab540?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkYW5nZXJ8ZW58MHx8fHwxNjk5MzIzMDgxfDA&ixlib=rb-4.0.3&q=80&w=2000)
Photo by [Edwin Hooper](https://unsplash.com/@edwinhooper?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)
==It's essential to highlight what to avoid when dealing with prop drilling to prevent unnecessary challenges.==
* **==Avoid React Context, if possible, to fix prop drilling.==** ==This approach ties your component to a specific context, restricting its usability outside of that context and hindering composition and reusability.==
* **==Steer clear of redundant components by employing a children-parent replacement approach.==** ==This approach naturally incorporates== ==[component composition](https://www.codementor.io/@dinerismail/the-power-of-component-composition-in-react-21goassg4m)== ==without introducing redundant components or states when resolving prop drilling.==
By avoiding elongated props, you pave the way for crafting maintainable, high-performing, reusable, and scalable React components. It simplifies the process of lifting states and components by removing the struggle of deciding where to place them.
With your understanding of elongated props, you can confidently position props and components within the right context without undue stress.
In short, you can now discover prop drilling intuitively by paying attention to any component that takes `props` it doesn't consume and only passes it down to another component.
Thanks for reading cheers!
Hey wait! I am [Ayobami Ogundiran](https://twitter.com/codingnninja) and I am about to start showing how to build your own React, Redux, TypeScript, Zod or Ecommerce websites on my YouTube channel. [Click to subscribe](https://youtube.com/youtoocancode) to stay connected.
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,31 @@
---
id: b453f3fe-d74e-4a3a-b778-8e4f6450da30
title: |
The one thing you need to finish your game
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-14 22:58:47
url_omnivore: |
https://omnivore.app/me/https-youtu-be-b-6-au-n-gi-ue-m-si-ixu-ds-nh-t-2-k-5-b-3-jf-s-18bd0b3d045
url_original: |
https://youtu.be/B6auN-GIUeM?si=ixuDsNhT2k5b3JfS
---
# The one thing you need to finish your game
## Notes
What you need... is a **plan**...
Because it makes the game feasible, realizable and gives it a scope, to see how "big" it's going to be. Also prevents burn out by all the stuff you _"need to do"_.
A plan is not a immovable wall, you can tweak it if you need to adjust to new discoveries or new inputs, this is better than wandering without a goal. But try to not increment the scope so you don't end up with an interminable project.
> The code is more of a guide than law...
> Jack Sparrow
## Original
[The one thing you need to finish your game](https://youtu.be/B6auN-GIUeM?si=ixuDsNhT2k5b3JfS)
By [Game Maker's Toolkit](https://www.youtube.com/@GMTK)

View file

@ -0,0 +1,313 @@
---
id: 49d7bfb2-8911-11ee-9b49-a315c7dbc2d7
title: |
Career Mistakes to Avoid as a Developer
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2023-11-21 21:04:22
url_omnivore: |
https://omnivore.app/me/career-mistakes-to-avoid-as-a-developer-18bf626412f
url_original: |
https://www.freecodecamp.org/news/career-mistakes-to-avoid-as-a-dev/
---
# Career Mistakes to Avoid as a Developer
## Highlights
Build authentic connections to get the best out of it. Then once you're connected, here are a few things you can do:
* Show interest in their posts.
* Engage with discussions by commenting or sharing posts.
* Repost with your thoughts
* Exchange ideas, or even build things together!
A strong social connection may help you in getting information faster. You may learn about a new release of a library/framework/product, how an industry is moving, how certain technologies might impact your work, and so on.
[source](https://omnivore.app/me/career-mistakes-to-avoid-as-a-developer-18bf626412f#3d561a03-61e0-4ca6-8e70-81651abe90c1)
---
## Original
![Career Mistakes to Avoid as a Developer](https://proxy-prod.omnivore-image-cache.app/900x500,sGVypdu65MfEK6xblt6wD3fjcwv0W_bp2owQhQLbB3nU/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/Career-Mistakes-2.png)
What does the word `career` mean to you? To me, it is a roller coaster journey during which we find opportunities, progress, and growth in life. The journey involves learning objectives, work, and other personal and professional aspects.
A promising career is one where you enjoy most (if not all) of your daily work. You see your personal, professional, and financial growth and gradually define what success means to you.
A lousy career is just the opposite. It may pay your bills, but you need more work satisfaction, and measuring your progress and growth becomes hard.
Several factors define a career: promising versus lousy, good versus bad, and successful versus failed. A few of them we can not control but, we can avoid some career mistakes to build a better career path.
I have spent more than 18 years in Software Engineering and have seen a lot of ups and downs, including in my own career and those of my colleagues. In this article, I will discuss ten career mistakes you should avoid.
Usually, I [share knowledge](https://www.freecodecamp.org/news/author/tapas/) on technical topics like JavaScript, web development, React, Node, Next.js, and so on. But this time, let's connect on essential tips for our Career Development.
If you like to learn from video content as well, this article is also available as a video tutorial here: 🙂
## A Few Things Before We Start
You may or may not agree with all the points. That's fine with me, because what I'm planning to share here is based on my own experiences.
You may strongly agree or disagree with my conclusions, but if there are any additional points that you think I still need to include, please let me know. You can contact me on the social handles I mention at the end of this article.
Also, this article is not only meant for working professionals. All these mistakes we will discuss are relevant for everyone, including students, people seeking jobs, or anyone getting ready for tomorrow in the software industry or any industry.
All set? Let's get started.
## 1\. You Don't Set Realistic Goals
![Goal](https://proxy-prod.omnivore-image-cache.app/500x300,sZlEz5U8f4r-gcUKirTKEqCpwGIhdqyjt3j17G-PPBq0/https://www.freecodecamp.org/news/content/images/2023/11/Goal.png)
One of the biggest mistakes most of us make in our careers is not having a goal. What exactly is a goal? It is something like a target.
Let's take an example. Let's say you're going shopping to buy something. You usually have a list of items that you want to get. You don't randomly pick things and come home and feel like, "Oh, it was a complete waste of time and money". So, if that list is your shopping goal, why not have something like this for your career?
Usually, we have a lot of short-term goals, for example,
* I have to fix this bug today.
* I have to build this project this week.
* I have to get a promotion this year.
These are great goals to have. But we need to have long-term goals as well. Like, what do you want to be in the long-term in your career. How do you plan every steps to achieve that goal?
Say you are in mechanical engineering, but your heart is in software engineering (mechanical engineering is excellent I'm just taking this as an example). In that case, you should have a goal for the next few years to translate yourself into a software developer and try to seek more roles more opportunities in the software industry.
I can tell you my story, as I think it'll help give you some perspective. I set myself a long term career goal to transition from my regular multi-national corporation job and start my career full time as an independent teacher and content creator. It took me four years to realize it, but without that goal it would have been impossible for me to chase my passion.
You may ask, will I be able to fulfill all the goals in my life? Well, maybe not. Still, it's important to have some and prioritize the most important ones. That way, even if you can't achieve some, you may identify a few more new goals along the way.
You may have a different way of going about it. But, if you don't have a starting point, you do not have anything to work toward and chase. Your career may become stagnant.
If you don't have any career goals for yourself right now, take some time to come up with a couple realistic goals. Here's some advice on [how to set SMART goals you can actually achieve](https://www.freecodecamp.org/news/how-to-set-smart-goals-you-can-achieve/).
## 2\. You Fail to Recognize Your Potential
![Potential](https://proxy-prod.omnivore-image-cache.app/500x300,sISkbO2BdaLyGJk0rTtjr_TO8Ss9Lsq_VlPbxRtwf2Nw/https://www.freecodecamp.org/news/content/images/2023/11/Potential.png)
> **Human potential** is the capacity for humans to **improve** themselves through **studying**, **training**, and **practice**, to reach the limit of their ability to develop **aptitudes** and **skills**. Definition of Human Potential from Wikipedia.
For us, the software developers, is about improving ourselves through practice, training, and study to reach the heights of our ability. But many of us do not know our potential at the start our careers. We figure it out gradually, and when we become aware of it, this helps us improve our careers.
When you know your potential, someone else will not dictate how to shape your career. Instead, you will be able to identify what would be good for you based on your strengths and where you need to bridge the gaps.
But you may ask, "How do I know my potential?". That's where having a goal and working towards it helps. Say you have a goal of mastering machine learning and data science to have a career as a data scientist. As you work towards this goal, you will find the areas where you excel, and other areas where you need to work especially hard. You figure out your potential as you work towards this goal.
Also, try not to settle for unimportant things. Constantly challenge yourself to produce better and more significant outcomes. When you do so, you discover your true potential in a much better way.
## 3\. You Don't Take the Time to Network
![Networking](https://proxy-prod.omnivore-image-cache.app/500x300,sF4FuUqxCuuR77gk4MFD3BzctuTT31Q1js5nFk5ad3wI/https://www.freecodecamp.org/news/content/images/2023/11/Networking.png)
Hey, we're gonna talk about something other than computer networking here. We will focus on human-to-human networking. We are going to talk about socializing. But why?
Networking or socializing with like-minded people, talking to them, and getting inspired by their work are as important as learning to code in programming. You might be a great programmer and fantastic coder. But suppose you do it in a silo. In that case, no one knows you or what you're capable of, so you will most likely lose out on more significant opportunities in your career.
When you socialize and network with others in the tech space, you may find a meaningful community to join. You'll be able to discuss important topics with like-minded people who have interests similar to yours and this can help you multiply your growth by many times.
This is one mistake I made in my career for several years, as I was unaware of its vast potential. Be active on platforms like LinkedIn, follow people you'd like to connect with on tech Twitter (now X), and make authentic connections with them. Spending mindful time on these platforms, and at in-person events as you're able, can really help boost your career.
Check out the `You Miss Out on Learning Opportunities` section below for some real-life tips on how to reach out and connect with people.
## 4\. You Waste Your Precious Time
![Wasting-Time](https://proxy-prod.omnivore-image-cache.app/500x300,sbrWtGEjNeLoAcrJT43fE9RiNXisYDS_W0CJ3Vjif07s/https://www.freecodecamp.org/news/content/images/2023/11/Wasting-Time.png)
"Wasting time" means not effectively utilizing your time. Would you agree that time is precious? Using and managing your time properly will help your career and life in general.
To clarify, watching a movie, going out with your friends and family, participating in festive activities, and so are not wasting time. You need these to balance out the time you spend working.
Rather, I'm more concerned about the tasks you may have to perform that take away from your "focus time" at work.
Let me walk you through a few situations:
You are working on a task, and here comes some notifications on your phone. You pause whatever you are doing and jump on your phone to see what's happening on that side of the world. The notification may take you 10-15 seconds to read, but you then spend 10 minutes browsing the phone.
This is a habit many of us have built in recent times. And then when you get back to your work, your brain has to recalculate and bring you back to the topic at hand where you were, and what you were doing and get you started with the task gain. This context switching is costly, and the same amount of focus may not be possible.
The best way of tackle a situation like this is,
* Switch off the phone's internet while you're working if you do not need it. You can switch it on when you take breaks, maybe at lunch time.
* You can also set your phone in "Do Not Disturb" mode while your work needs your utmost attention. Just make sure you add some of your family and friend's contacts as emergency contacts so that only a limited set of people can reach out to you during those times in case of any emergencies.
Let's talk about another situation. Suppose you need to prepare and send a design doc to a senior dev for review. But instead, you spend time on something low priority or some little luxury that delayed preparing the doc. You keep postponing until it's become an urgent thing that you'll have to do within a limited time.
This act of delaying something knowingly is called `procrastination`, an ultimate way to kill time. There are some well-known and proven methods to tackle procrastination.
* The first step is to realize and admit to yourself that you procrastinate.
* Then list out your distractors. This list may vary from person to person. Remove these distractors. It could be your phone, TV, novels, anything.
* Break down your deliverables into smaller tasks. Achieve them one by one and give yourself a pat on your back once you've finished each small task.
* Take small breaks and come back to the point where you left off on your task to continue with a fresh brain.
Instead of finding yourself in these types of situations, use your time wisely. If you have to get something done, get it done. When you're procrastinating, something that depends on one task may also get delayed, creating a cycle of time waste, frustrations, and complicated situations.
## 5\. You Neglect Upskilling
![Upskill](https://proxy-prod.omnivore-image-cache.app/500x300,s8u5vP0_rMNrQ-LfgTF0nQtckWlBvz5IEAaeyOSQTz7Q/https://www.freecodecamp.org/news/content/images/2023/11/Upskill.png)
`Upskilling` means getting better at your current skill or acquiring relevant new skills. It is essential to upskill at any and all stages of your career.
One of the common mistakes we make is that we stop upskilling after a few years in our professional life. We get used to the projects, domains, technologies, and environments that create a comfort zone around us. Upskilling is always about coming out of that comfort zone.
Here are a few common excuses we give to ourselves when it comes to upskilling:
* I already have a lot of work at the office or assignments in university.
* I need to have a personal life.
* I am happy with whatever I know now, and my work only demands so much.
* There is so much to learn and it is never ending (sigh!).
But you really don't need that much time in a week to up-skill. You just need to have a plan and to stay consistent in executing it. Set just 1 hour aside in your day. Fork it out from any non-urgent activities and plan your learning schedule in that one hour.
In this one hour, here are some things you can do:
* Assess the gaps, weaknesses, and strengths in your technical and non technical abilities.
* List them out in a place where you can easily get back to them and make modifications.
* Prioritize them based on your current needs and near future goals.
* Time-box each of the items so that you can get something tangible within a specified duration. For example, you want to do a certification on cloud computing within a month, or the Responsive Web Design course from freeCodeCamp over the next few weeks, and so on.
* Start working on these defined tasks. You may find many resources on internet. Glance over them to create an index of resources that you can understand easily and relate to well.
* Read and watch tutorials, but also practice hard.
* Finally, recognize your progress.
You may ask, is that one hour really enough? And I will tell you it works like magic if you keep it up. Upskilling is not a race or sprint. It needs time, consistency, and perseverance to get from the one end to other.
Have you heard about the power of tiny gains?
![image-21](https://proxy-prod.omnivore-image-cache.app/659x675,s6nxgcNX-v7bKwCnG4qrq4gj6H3-MyQgJ2A4TXvhJd_k/https://www.freecodecamp.org/news/content/images/2023/11/image-21.png)
Credit: James Clear
It is a strategy of being just 1% better every day. If you continue to do that for a year, you get almost 38% better at the end of the year. Being 1% worse does the opposite. The strategy was represented in mathematical graphs by James Clear in explanation of [Continuous improvements and how it works](https://jamesclear.com/continuous-improvement).
Upskilling can also help you out a lot if you're preparing for the job search. The way the tech industry is moving, we may not be able to avoid layoffs but we can be better prepared to get our next job faster. And that becomes much more attainable when you stay relevant and continue learning new things.
## 6\. You Don't Ask for What You Want
![Don-t-ask-Don-t-Get](https://proxy-prod.omnivore-image-cache.app/500x300,sX_fVxbzhUPPh33KyrDzm0tr5vYezZqdzTekYPBlkhUc/https://www.freecodecamp.org/news/content/images/2023/11/Don-t-ask-Don-t-Get.png)
Let me start by sharing an experience of mine. Back in the early 2000s when I was a fresher, I had to attend a meeting with some of the project leads and the manager. We were discussing how to modernize our product with HTML5 features.
I was aware of HTML5, and every time a discussion point was raised, I thought of adding to it, but I didn't. I thought of asking some valuable questions, but I didn't. I felt that in order to ask something in a meeting, I needed a lot of guts! I was wrong.
Oftentimes in your career journey, if you do not ask, you simply won't get what you want or deserve. If someone has some knowledge and you lack it, ask about it. If you have a questiona bout something, ask before you commit to the work. Ask about your promotion, a salary hike, career growth, and anything that is related to your career. There is no such thing as a silly question when it comes to your career growth.
## 7\. You Only Focus on the Money
![Money-honey](https://proxy-prod.omnivore-image-cache.app/500x300,sA_mQAKK-nW0_lpZxvJr_wiH5WuNcHXVUsErXQtrA-3g/https://www.freecodecamp.org/news/content/images/2023/11/Money-honey.png)
Come on, money is important. But is it the only important thing, especially in the context of switching jobs or working towards your career goals? No, certainly not.
When you plan to switch jobs, you also need to look into other factors like work culture, the amount of time you need to spend at the office working, whether it's going to be more stressful compared to the compensation you'll be getting, and so on.
I would certainly look into the following factors along with the compensation (the money part) to make an informed decision about my job switching:
* What will be my technical growth and learning opportunities?
* What will the work environment be like? Remote/Work From Office/Hybrid? How will that impact me?
* What skills (both tech and soft) will I be able to learn in the new position?
* What kind of employee benefits will I get compared to my current organization?
* Will my work-life balance be impacted positively?
* What are the company's vision, culture, and values?
Then when you're considering the salary, be careful and make sure you understand the breakdown. What percentage of the CTC comes from any bonus? Is it inclusive or exclusive of CTC? How does the bonus payout happen? If the company doesn't do well in a fiscal year, will you get paid less? Are there stock options or other benefits they pay out instead of cash? All this matters.
The mistake people often make is that they see only the `money` figure as the most important part of a job offer. Make sure you talk to someone from the company, do your research, and learn about what else they're offering as we mentioned above.
## 8\. You Neglect Work-Life Balance
![Work-Life](https://proxy-prod.omnivore-image-cache.app/500x300,sN3pJRnCgrOdMDPZNVr7Os7gYEWeVs4rhIK60IqUvbfQ/https://www.freecodecamp.org/news/content/images/2023/11/Work-Life.png)
Another mistake you might make is not balancing your work and life. The last thing you want is to `burn out` at the cost of things you love the most, like your friends, family, and long-term career.
We must learn to prioritize things, and this includes both work and personal life. Your priority list for the day should not have only work related items. While it's important to ship a bug fix, it is also essential to accompany your kids to their soccer games or school plays, or make time to go on a date with your partner, or do something nice for yourself.
Do not be afraid to say "No". At the same time, don't be arrogant when you accept or decline tasks. This is important to keep a healthy work-life balance. When you already have plenty on your plate, trying to accommodate more or do more will only spill over and negatively affect your work-life balance.
So say no when you need to, communicate your intentions ahead of time when possible, and proactively ask for what tasks you'd like to work on when your plate has room for more.
For a long time in my career, I attended meetings late at night to match the timezones of my customers and other colleagues. Then, slowly, it started affecting my health and productivity.
When I thought about it more carefully, I discovered a couple of things. First, I realized that I didn't have to attend all the meetings, and that I could request that they take place in my clients' evenings sometimes. That way we'd both be taking turns compromising. And it worked.
At times, our habits drive us towards the work-life imbalance. For example, staying late at office while the same work can wait till the next morning is a classic example of a habit that may lead to health issues and frustrations in a long run.
We all need to find a way to sustain both work and life. So plan ahead, and stick to your schedule as much as possible. There might be exceptions where you have to give one thing priority above another but do not allow the exception to become the norm.
## 9\. You Miss Out on Learning Opportunities
![GOAT](https://proxy-prod.omnivore-image-cache.app/500x300,sABSdR2gJMwi_HJ_GLBI-Ri7W6pCZbA6UJNku96Ij7aM/https://www.freecodecamp.org/news/content/images/2023/11/GOAT.png)
If you have the opportunity to learn from a person who specializes in a particular field, grab it. If you use social media platforms like LinkedIn and X/Twitter wisely, it can lead you to the people who share great insights about subjects you're interested in.
A quick tip for you:
When you send someone a connection request on LinkedIn/X, take some time to introduce yourself. Things that you can mention briefly:
* What did you find unique about the person you want to connect to?
* A bit about yourself, introducing some of your uniqueness, too.
* Why do you want to connect?
==Build authentic connections to get the best out of it. Then once you're connected, here are a few things you can do:==
* ==Show interest in their posts.==
* ==Engage with discussions by commenting or sharing posts.==
* ==Repost with your thoughts==
* ==Exchange ideas, or even build things together!==
==A strong social connection may help you in getting information faster. You may learn about a new release of a library/framework/product, how an industry is moving, how certain technologies might impact your work, and so on.==
Apart from learning a lot, you may also get to know about job openings, hirings, and references. After all, companies have also started recruiting talent from social media pages.
Also, being part of a forum like the [freeCodeCamp forum](https://forum.freecodecamp.org/) can be helpful for networking and learning as well. It is also a place for you to share solutions to a problem, talk about what you've learned, and make yourself visible gradually.
When we learn from someone, we not only come to understand what they've achieved or how they did it, but we also learn about the struggles, failures, and how they made the turnaround. Learning from someone else's experience can help accelerate your career journey. Don't make the mistake of living in a silo and missing out on these opportunities.
## 10\. You Can't See the Bigger Picture
![Big-Picture](https://proxy-prod.omnivore-image-cache.app/500x300,sr2JlkGqO_uQHX5rsG4F0iDS4Pk9HCvqL8kRgkiiUUG4/https://www.freecodecamp.org/news/content/images/2023/11/Big-Picture.png)
By `Big Picture`(or Bigger Picture), I mean understanding and developing a wider perspective on your career as a whole. It is about your ability to consider and assess many different aspects of a situation, rather than focusing on just the minute details.
As developers, we're supposed to implement features, do bug fixes, maintain code, and deliver quality software to our end-users. That's great!
But, we need to think beyond the individual tasks assigned to us. Our understanding of the overall project goals, the user acceptance criteria, delivery mechanisms, and perspectives of other engineers is key. And so is judging the impact of our work, as it will help us get the big picture of a project.
Suppose your product manager wants your team to build user interfaces that also cater to the needs of specially-abled and visually challenged users. In this case, you and your team members must see the bigger picture around `Accessibility`.
If your designer doesn't define the site's colors accordingly, or the developers do not implement keyboard accessibility along with ARIA roles and attributes, then they're missing the bigger picture.
Another example could be over-optimizing performance while your users do not care about it. Your users may be waiting to get a feature ASAP so it can help them achieve their business goals. But by addressing unnecessary optimizations, you may be delaying that release and missing crucial deadlines.
Missing the bigger picture may lead to a lack of synergy in your organization. It can also result in software products that need multiple iterations to meet customer needs because those needs weren't understood at the beginning. This can cause you to miss deadlines and do more work, and can greatly increase the cost to your client.
Along with understanding "what" tasks you need to perform, also ask "why" your tasks are important and how they will impact the rest of the project or other people's work.
Irrespective of what you build, how big or small it is, how glorified or dull is the outcome, you need to know the impact of it on end users and your internal customers (like product/project managers, quality assurance team, documentation team, whoever).
Once you look at the bigger picture and act accordingly, your margin of error reduces automatically.
## Some More Advice and Wrapping Up
I wanted to share all this career advice with you because I have been on the other side and learned the hard way. Before I move on to write my next article or record my next video, one more quick tip for you: make sure you work to build up your finances.
Financial independence brings peace and the mental stability to think wildly about things you want to pursue in your career. But getting to the point of financial stability is not an overnight thing. You need to plan, save, and invest wisely such that your money grows faster than your age.
I am not a finance expert, but I relied on some good ones and took their suggestions early on. If you have the opportunity and mindset to build your finances for the future, the time is now.
That's all for now. I hope you found this article informative and insightful. I regularly publish meaningful posts on my [GreenRoots Blog](https://blog.greenroots.info/), you may find them helpful, too.
Let's connect.
* I am an educator on my YouTube channel, `tapaScript`. Please [SUBSCRIBE](https://www.youtube.com/tapasadhikary?sub%5Fconfirmation=1) to the channel if you want to learn JavaScript, ReactJS, Next.js, Node.js, Git, and all about Web Development in the fundamental way.
* [Follow me on X (Twitter](https://twitter.com/tapasadhikary)) or [LinkedIn](https://www.linkedin.com/in/tapasadhikary/) if you don't want to miss the daily dose of Web Development and Programming Tips.
* Find all my public speaking talks [here](https://www.tapasadhikary.com/talks).
* Check out and follow my Open Source work on [GitHub](https://github.com/atapas).
See you soon with my next article. Until then, please take care of yourself, and stay happy.
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,265 @@
---
id: 2a685647-d920-4ba6-b837-3ee29a2f7f10
title: |
Conventional Commits
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-21 16:36:37
url_omnivore: |
https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb
url_original: |
https://www.conventionalcommits.org/en/v1.0.0/
---
# Conventional Commits
## Highlights
The commit message should be structured as follows:
---
```fortran
[optional scope]:
[optional body]
[optional footer(s)]
```
[source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#0a71a3f4-0b81-4ccf-849b-f45c65951d5b)
---
## Specification
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt).
1. Commits MUST be prefixed with a type, which consists of a noun, `feat`, `fix`, etc., followed by the OPTIONAL scope, OPTIONAL `!`, and REQUIRED terminal colon and space.
2. The type `feat` MUST be used when a commit adds a new feature to your application or library.
3. The type `fix` MUST be used when a commit represents a bug fix for your application.
4. A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., `fix(parser):`
5. A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., _fix: array parsing issue when multiple spaces were contained in string_.
6. A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.
7. A commit body is free-form and MAY consist of any number of newline separated paragraphs.
8. One or more footers MAY be provided one blank line after the body. Each footer MUST consist of a word token, followed by either a `:` or `#` separator, followed by a string value (this is inspired by the[git trailer convention](https://git-scm.com/docs/git-interpret-trailers)).
9. A footers token MUST use `-` in place of whitespace characters, e.g., `Acked-by` (this helps differentiate the footer section from a multi-paragraph body). An exception is made for `BREAKING CHANGE`, which MAY also be used as a token.
10. A footers value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer token/separator pair is observed.
11. Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the footer.
12. If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g.,_BREAKING CHANGE: environment variables now take precedence over config files_.
13. If included in the type/scope prefix, breaking changes MUST be indicated by a`!` immediately before the `:`. If `!` is used, `BREAKING CHANGE:` MAY be omitted from the footer section, and the commit description SHALL be used to describe the breaking change.
14. Types other than `feat` and `fix` MAY be used in your commit messages, e.g., _docs: update ref docs._
15. The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.
16. BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer.
[source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#5670099d-60fe-4b9c-82b9-814e423c0e61)
---
### What do I do if the commit conforms to more than one of the commit types?
Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs.
[source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#6ae81ced-efe6-464a-8026-c2f286faf4b7)
---
### How does this relate to SemVer?
`fix` type commits should be translated to `PATCH` releases. `feat` type commits should be translated to `MINOR` releases. Commits with `BREAKING CHANGE` in the commits, regardless of type, should be translated to `MAJOR` releases.
[source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#6876934a-5761-49f8-8905-3153e5d667b7)
---
## Original
## [](#summary)Summary
The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with [SemVer](http://semver.org/), by describing the features, fixes, and breaking changes made in commit messages.
==The commit message should be structured as follows:==
---
```fortran
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
```
---
The commit contains the following structural elements, to communicate intent to the consumers of your library:
1. **fix:** a commit of the _type_ `fix` patches a bug in your codebase (this correlates with [PATCH](http://semver.org/#summary) in Semantic Versioning).
2. **feat:** a commit of the _type_ `feat` introduces a new feature to the codebase (this correlates with [MINOR](http://semver.org/#summary) in Semantic Versioning).
3. **BREAKING CHANGE:** a commit that has a footer `BREAKING CHANGE:`, or appends a `!` after the type/scope, introduces a breaking API change (correlating with [MAJOR](http://semver.org/#summary) in Semantic Versioning). A BREAKING CHANGE can be part of commits of any _type_.
4. _types_ other than `fix:` and `feat:` are allowed, for example [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional) (based on the [Angular convention](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines)) recommends `build:`, `chore:`,`ci:`, `docs:`, `style:`, `refactor:`, `perf:`, `test:`, and others.
5. _footers_ other than `BREAKING CHANGE: <description>` may be provided and follow a convention similar to[git trailer format](https://git-scm.com/docs/git-interpret-trailers).
Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in Semantic Versioning (unless they include a BREAKING CHANGE).A scope may be provided to a commits type, to provide additional contextual information and is contained within parenthesis, e.g., `feat(parser): add ability to parse arrays`.
## [](#examples)Examples
### [](#commit-message-with-description-and-breaking-change-footer)Commit message with description and breaking change footer
```routeros
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
```
### [](#commit-message-with--to-draw-attention-to-breaking-change)Commit message with `!` to draw attention to breaking change
```routeros
feat!: send an email to the customer when a product is shipped
```
### [](#commit-message-with-scope-and--to-draw-attention-to-breaking-change)Commit message with scope and `!` to draw attention to breaking change
```routeros
feat(api)!: send an email to the customer when a product is shipped
```
### [](#commit-message-with-both--and-breaking-change-footer)Commit message with both `!` and BREAKING CHANGE footer
```crmsh
chore!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.
```
### [](#commit-message-with-no-body)Commit message with no body
```avrasm
docs: correct spelling of CHANGELOG
```
### [](#commit-message-with-scope)Commit message with scope
```stylus
feat(lang): add Polish language
```
### [](#commit-message-with-multi-paragraph-body-and-multiple-footers)Commit message with multi-paragraph body and multiple footers
```http
fix: prevent racing of requests
Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.
Remove timeouts which were used to mitigate the racing issue but are
obsolete now.
Reviewed-by: Z
Refs: #123
```
## [](#specification)==Specification==
==The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in== ==[RFC 2119](https://www.ietf.org/rfc/rfc2119.txt)====.==
1. ==Commits MUST be prefixed with a type, which consists of a noun,== `==feat==`==,== `==fix==`==, etc., followed
by the OPTIONAL scope, OPTIONAL== `==!==`==, and REQUIRED terminal colon and space.==
2. ==The type== `==feat==` ==MUST be used when a commit adds a new feature to your application or library.==
3. ==The type== `==fix==` ==MUST be used when a commit represents a bug fix for your application.==
4. ==A scope MAY be provided after a type. A scope MUST consist of a noun describing a
section of the codebase surrounded by parenthesis, e.g.,== `==fix====(parser)====:==`
5. ==A description MUST immediately follow the colon and space after the type/scope prefix.
The description is a short summary of the code changes, e.g.,== _==fix: array parsing issue when multiple spaces were contained in string==_==.==
6. ==A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.==
7. ==A commit body is free-form and MAY consist of any number of newline separated paragraphs.==
8. ==One or more footers MAY be provided one blank line after the body. Each footer MUST consist of
a word token, followed by either a== `==:====&lt;====space====&gt;==` ==or== `==&lt;====space====&gt;====#==` ==separator, followed by a string value (this is inspired by the====[git trailer convention](https://git-scm.com/docs/git-interpret-trailers)====).==
9. ==A footers token MUST use== `==-==` ==in place of whitespace characters, e.g.,== `==Acked-====by==` ==(this helps differentiate
the footer section from a multi-paragraph body). An exception is made for== `==BREAKING== ==CHANGE==`==, which MAY also be used as a token.==
10. ==A footers value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer
token/separator pair is observed.==
11. ==Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the
footer.==
12. ==If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g.,==_==BREAKING CHANGE: environment variables now take precedence over config files==_==.==
13. ==If included in the type/scope prefix, breaking changes MUST be indicated by a==`==!==` ==immediately before the== `==:==`==. If== `==!==` ==is used,== `==BREAKING== ==CHANGE:==` ==MAY be omitted from the footer section,
and the commit description SHALL be used to describe the breaking change.==
14. ==Types other than== `==feat==` ==and== `==fix==` ==MAY be used in your commit messages, e.g.,== _==docs: update ref docs.==_
15. ==The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.==
16. ==BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer.==
## [](#why-use-conventional-commits)Why Use Conventional Commits
* Automatically generating CHANGELOGs.
* Automatically determining a semantic version bump (based on the types of commits landed).
* Communicating the nature of changes to teammates, the public, and other stakeholders.
* Triggering build and publish processes.
* Making it easier for people to contribute to your projects, by allowing them to explore a more structured commit history.
## [](#faq)FAQ
### [](#how-should-i-deal-with-commit-messages-in-the-initial-development-phase)How should I deal with commit messages in the initial development phase?
We recommend that you proceed as if youve already released the product. Typically _somebody_, even if its your fellow software developers, is using your software. Theyll want to know whats fixed, what breaks etc.
### [](#are-the-types-in-the-commit-title-uppercase-or-lowercase)Are the types in the commit title uppercase or lowercase?
Any casing may be used, but its best to be consistent.
### [](#what-do-i-do-if-the-commit-conforms-to-more-than-one-of-the-commit-types)==What do I do if the commit conforms to more than one of the commit types?==
==Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs.==
### [](#doesnt-this-discourage-rapid-development-and-fast-iteration)Doesnt this discourage rapid development and fast iteration?
It discourages moving fast in a disorganized way. It helps you be able to move fast long term across multiple projects with varied contributors.
### [](#might-conventional-commits-lead-developers-to-limit-the-type-of-commits-they-make-because-theyll-be-thinking-in-the-types-provided)Might Conventional Commits lead developers to limit the type of commits they make because theyll be thinking in the types provided?
Conventional Commits encourages us to make more of certain types of commits such as fixes. Other than that, the flexibility of Conventional Commits allows your team to come up with their own types and change those types over time.
### [](#how-does-this-relate-to-semver)==How does this relate to SemVer?==
`==fix==` ==type commits should be translated to== `==PATCH==` ==releases.== `==feat==` ==type commits should be translated to== `==MINOR==` ==releases. Commits with== `==BREAKING== ==CHANGE==` ==in the commits, regardless of type, should be translated to== `==MAJOR==` ==releases.==
### [](#how-should-i-version-my-extensions-to-the-conventional-commits-specification-eg-jameswomackconventional-commit-spec)How should I version my extensions to the Conventional Commits Specification, e.g. `@jameswomack/conventional-commit-spec`?
We recommend using SemVer to release your own extensions to this specification (and encourage you to make these extensions!)
### [](#what-do-i-do-if-i-accidentally-use-the-wrong-commit-type)What do I do if I accidentally use the wrong commit type?
#### [](#when-you-used-a-type-thats-of-the-spec-but-not-the-correct-type-eg-fix-instead-of-feat)When you used a type thats of the spec but not the correct type, e.g. `fix` instead of `feat`
Prior to merging or releasing the mistake, we recommend using `git rebase -i` to edit the commit history. After release, the cleanup will be different according to what tools and processes you use.
#### [](#when-you-used-a-type-not-of-the-spec-eg-feet-instead-of-feat)When you used a type _not_ of the spec, e.g. `feet` instead of `feat`
In a worst case scenario, its not the end of the world if a commit lands that does not meet the Conventional Commits specification. It simply means that commit will be missed by tools that are based on the spec.
### [](#do-all-my-contributors-need-to-use-the-conventional-commits-specification)Do all my contributors need to use the Conventional Commits specification?
No! If you use a squash based workflow on Git lead maintainers can clean up the commit messages as theyre merged—adding no workload to casual committers. A common workflow for this is to have your git system automatically squash commits from a pull request and present a form for the lead maintainer to enter the proper git commit message for the merge.
### [](#how-does-conventional-commits-handle-revert-commits)How does Conventional Commits handle revert commits?
Reverting code can be complicated: are you reverting multiple commits? if you revert a feature, should the next release instead be a patch?
Conventional Commits does not make an explicit effort to define revert behavior. Instead we leave it to tooling authors to use the flexibility of _types_ and _footers_ to develop their logic for handling reverts.
One recommendation is to use the `revert` type, and a footer that references the commit SHAs that are being reverted:
```http
revert: let us never again speak of the noodle incident
Refs: 676104e, a215868
```

View file

@ -0,0 +1,253 @@
---
id: 1996b6ce-9449-415d-8c18-609ddb9cd580
title: |
How to Write Better Git Commit Messages A Step-By-Step Guide
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-21 12:10:32
url_omnivore: |
https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f
url_original: |
https://www.freecodecamp.org/news/how-to-write-better-git-commit-messages/
---
# How to Write Better Git Commit Messages A Step-By-Step Guide
## Highlights
To come up with thoughtful commits, consider the following:
* Why have I made these changes?
* What effect have my changes made?
* Why was the change needed?
* What are the changes in reference to?
[source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#b1693951-0a92-44f4-804d-7c5008bf3113)
---
See the differences below:
1. `git commit -m 'Add margin'`
2. `git commit -m 'Add margin to nav items to prevent them from overlapping the logo'`
[source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#a3c842a2-18b0-46b9-8131-c37ecd867c19)
---
Conventional Commit is a formatting convention that provides a set of rules to formulate a consistent commit message structure like so:
```fortran
[optional scope]:
[optional body]
[optional footer(s)]
```
The commit type can include the following:
* `feat` a new feature is introduced with the changes
* `fix` a bug fix has occurred
* `chore` changes that do not relate to a fix or feature and don't modify src or test files (for example updating dependencies)
* `refactor` refactored code that neither fixes a bug nor adds a feature
* `docs` updates to documentation such as a the README or other markdown files
* `style` changes that do not affect the meaning of the code, likely related to code formatting such as white-space, missing semi-colons, and so on.
* `test` including new or correcting previous tests
* `perf` performance improvements
* `ci` continuous integration related
* `build` changes that affect the build system or external dependencies
* `revert` reverts a previous commit
[source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#f3ea8f19-6480-43ac-a72f-2856ee003fb6)
---
## Original
![How to Write Better Git Commit Messages A Step-By-Step Guide](https://proxy-prod.omnivore-image-cache.app/1200x600,s0l1fwKZBNqL0bSd2aeEioVceLJjdlKhWsHRkZlRIk7A/https://www.freecodecamp.org/news/content/images/size/w2000/2022/01/gitcommitmessage.png)
When first introduced to Git, it's typical for developers to feel uncomfortable with the process.
You might feel uncertainty when encountering the Git commit message, unsure how to properly summarize the changes you've made and why you've made them. But the earlier in your career you can develop good committing habits, the better.
Have you ever wondered how you can improve your Git commit messages? This guide outlines steps to elevate your commit messages that you can start implementing today.
This article assumes you already understand basic Git workflow. If not, I suggest reading through the [Git Handbook](https://guides.github.com/introduction/git-handbook/).
It is also important to note that you should follow your team's conventions first and foremost. These tips are based on suggestions based upon research and general consensus from the community. But by the end of this article you may have some implementations to suggest that may help your team's workflow.
> I think git enters a whole other realm the moment you start working in teams -- there are so many cool different flows and ways that people can commit code, share code, and add code to your repo open-source or closed-source-wise. — [Scott Tolinski, Syntax.fm](https://syntax.fm/).
## Why should you write better commit messages?
I challenge you to open up a personal project or any repository for that matter and run `git log` to view a list of old commit messages. The vast majority of us who have run through tutorials or made quick fixes will say "Yep... I have absolutely no idea what I meant by 'Fix style' 6 months ago."
Perhaps you have encountered code in a professional environment where you had no idea what it was doing or meant for. You've been left in the dark without code comments or a traceable history, and even wondering "what are the odds this will break everything if I remove this line?"
### Back to the Future
By writing good commits, you are simply future-proofing yourself. You could save yourself and/or coworkers hours of digging around while troubleshooting by providing that helpful description.
The extra time it takes to write a thoughtful commit message as a letter to your potential future self is extremely worthwhile. On large scale projects, documentation is imperative for maintenance.
Collaboration and communication are of utmost importance within engineering teams. The Git commit message is a prime example of this. I highly suggest setting up a convention for commit messages on your team if you do not already have one in place.
## The Anatomy of a Commit Message
#### Basic:
`git commit -m <message>`
#### Detailed:
`git commit -m <title> -m <description>`
![Screen-Shot-2022-01-03-at-10.31.49-AM](https://proxy-prod.omnivore-image-cache.app/1192x122,sHp5nlkupArC1L0Wk1l4Qjg9Wx_fb7YOHA-sE4vCD1Do/https://www.freecodecamp.org/news/content/images/2022/01/Screen-Shot-2022-01-03-at-10.31.49-AM.png)
## 5 Steps to Write Better Commit Messages
Let's summarize the suggested guidelines:
1. Capitalization and Punctuation: Capitalize the first word and do not end in punctuation. If using Conventional Commits, remember to use all lowercase.
2. Mood: Use imperative mood in the subject line. Example `Add fix for dark mode toggle state`. Imperative mood gives the tone you are giving an order or request.
3. Type of Commit: Specify the type of commit. It is recommended and can be even more beneficial to have a consistent set of words to describe your changes. Example: Bugfix, Update, Refactor, Bump, and so on. See the section on Conventional Commits below for additional information.
4. Length: The first line should ideally be no longer than 50 characters, and the body should be restricted to 72 characters.
5. Content: Be direct, try to eliminate filler words and phrases in these sentences (examples: though, maybe, I think, kind of). Think like a journalist.
### How to Find Your Inner Journalist
I never quite thought my Journalism minor would benefit my future career as a Software Engineer, but here we are!
Journalists and writers ask themselves questions to ensure their article is detailed, straightforward, and answers all of the reader's questions.
When writing an article they look to answer _who_, _what_, _where_, _when_, _why_ and _how._ For committing purposes, it is most important to answer the what and why for our commit messages.
==To come up with thoughtful commits, consider the following:==
* ==Why have I made these changes?==
* ==What effect have my changes made?==
* ==Why was the change needed?==
* ==What are the changes in reference to?==
Assume the reader does not understand what the commit is addressing. They may not have access to the story addressing the detailed background of the change.
Don't expect the code to be self-explanatory. This is similar to the point above.
It might seem obvious to you, the programmer, if you're updating something like CSS styles since it is visual. You may have intimate knowledge on why these changes were needed at the time, but it's unlikely you will recall why you did that hundreds of pull requests later.
Make it clear _why_ that change was made, and note if it may be crucial for the functionality or not.
==See the differences below:==
1. `==git== ==commit -m== =='Add margin'==`
2. `==git commit -m 'Add margin== ==to== ==nav items== ==to== ==prevent them== ==from== ==overlapping== ==the== ==logo'==`
It is clear which of these would be more useful to future readers.
Pretend you're writing an important newsworthy article. Give the headline that will sum up what happened and what is important. Then, provide further details in the body in an organized fashion.
In filmmaking, it is often quoted "show, don't tell" using visuals as the communication medium compared to a verbal explanation of what is happening.
In our case, "**tell**, don't \[just\] show" though we have some visuals at our disposal such as the browser, most of the specifics come from reading the physical code.
If you're a VSCode user, download the [Git Blame](https://marketplace.visualstudio.com/items?itemName=waderyan.gitblame) extension. This is a prime example of when useful commit messages are helpful to future developers.
This plugin will list the person who made the change, the date of the changes, as well as the commit message commented inline.
Imagine how useful this could be in troubleshooting a bug or back-tracing changes made. Other honorable mentions to see Git historical information are [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory) and [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens).
![Screen-Shot-2022-01-03-at-10.45.49-AM](https://proxy-prod.omnivore-image-cache.app/2068x418,szGePuf8TNML7r1MA_vhSRoULcLczTSddFDMSz6X_nck/https://www.freecodecamp.org/news/content/images/2022/01/Screen-Shot-2022-01-03-at-10.45.49-AM.png)
## Conventional Commits
Now that we've covered basic commit structure of a good commit message, I'd like to introduce Conventional Commits to help provide some detail on creating solid commit messages.
At D2iQ, we use Conventional Commit which is a great practice among engineering teams. ==Conventional Commit is a formatting convention that provides a set of rules to formulate a consistent commit message structure like so:==
```fortran
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
```
==The commit type can include the following:==
* `==feat==` == a new feature is introduced with the changes==
* `==fix==` == a bug fix has occurred==
* `==chore==` == changes that do not relate to a fix or feature and don't modify src or test files (for example updating dependencies)==
* `==ref====actor==` == refactored code that neither fixes a bug nor adds a feature==
* `==docs==` == updates to documentation such as a the README or other markdown files==
* `==style==` == changes that do not affect the meaning of the code, likely related to code formatting such as white-space, missing semi-colons, and so on.==
* `==test==` == including new or correcting previous tests==
* `==perf==` == performance improvements==
* `==ci==` == continuous integration related==
* `==build==` == changes that affect the build system or external dependencies==
* `==revert==` == reverts a previous commit==
The commit type subject line should be all lowercase with a character limit to encourage succinct descriptions.
The optional commit body should be used to provide further detail that cannot fit within the character limitations of the subject line description.
It is also a good location to utilize `BREAKING CHANGE: <description>` to note the reason for a breaking change within the commit.
The footer is also optional. We use the footer to link the JIRA story that would be closed with these changes for example: `Closes D2IQ-<JIRA #>` .
#### Full Conventional Commit Example
```http
fix: fix foo to enable bar
This fixes the broken behavior of the component by doing xyz.
BREAKING CHANGE
Before this fix foo wasn't enabled at all, behavior changes from <old> to <new>
Closes D2IQ-12345
```
To ensure that these committing conventions remain consistent across developers, commit message linting can be configured before changes are able to be pushed up. [Commitizen](https://commitizen-tools.github.io/commitizen/) is a great tool to enforce standards, sync up semantic versioning, along with other helpful features.
To aid in adoption of these conventions, it's helpful to include guidelines for commits in a contributing or README markdown file within your projects.
Conventional Commit works particularly well with semantic versioning (learn more at [SemVer.org](https://semver.org/)) where commit types can update the appropriate version to release. You can also [read more about Conventional Commits here](https://www.conventionalcommits.org/en/v1.0.0/).
## Commit Message Comparisons
Review the following messages and see how many of the suggested guidelines they check off in each category.
#### Good
* `feat: improve performance with lazy load implementation for images`
* `chore: update npm dependency to latest version`
* `Fix bug preventing users from submitting the subscribe form`
* `Update incorrect client phone number within footer body per client request`
#### Bad
* `fixed bug on landing page`
* `Changed style`
* `oops`
* `I think I fixed it this time?`
* empty commit messages
## Conclusion
Writing good commit messages is an extremely beneficial skill to develop, and it helps you communicate and collaborate with your team. Commits serve as an archive of changes. They can become an ancient manuscript to help us decipher the past, and make reasoned decisions in the future.
There is an existing set of agreed-upon standards we can follow, but as long as your team agrees upon a convention that is descriptive with future readers in mind, there will undoubtedly be long-term benefits.
In this article, we've learned some tactics to level up our commit messages. How do you think these techniques can improve your commits?
I hope you've learned something new, thanks for reading!
Connect with me on Twitter [@ui\_natalie](https://twitter.com/ui%5Fnatalie).
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,55 @@
---
id: f5956559-3eb2-4717-93bd-3f3a2f0c5549
title: |
The Life-Changing Magic of Tidying Up Your To-Do List
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-21 08:05:01
url_omnivore: |
https://omnivore.app/me/https-todoist-com-inspiration-life-changing-magic-tidying-todois-18bf18e00a2
url_original: |
https://todoist.com/inspiration/life-changing-magic-tidying-todoist
---
# The Life-Changing Magic of Tidying Up Your To-Do List
## Notes
Before you even start looking at your tasks, write down what having a neatly organized and prioritized to-do list would mean for your life. Maybe you want to run a successful business, get in shape, be more present with your family, have closer relationships with friends, or lead a more adventurous life.
Find a medium that lets you truly envision the details. You can describe it in words, mind map it, draw it out, create a Pinterest board, collect YouTube videos, or brainstorm in whatever form suits you.
Why do you want to get in shape? The answer might be "to have more energy and feel more confident." Why do you want to have more energy and feel more confident? Maybe the answer is "to be more fully yourself and stop worrying about what other people think of you." Ask yourself "why" 3-5 times for every item in your vision.
## Original
---
## Other readers also enjoyed...
![](https://proxy-prod.omnivore-image-cache.app/340x180,sZ_977ycD6VGwVRgscq88kMFQTyjSqu6XZhquhlHBmEM/https://res.cloudinary.com/imagist/image/fetch/q_auto/f_auto/c_scale,w_2624/https%3A%2F%2Ftdinspiration.wpengine.com%2Fwp-content%2Fuploads%2F2015%2F12%2FBanner_image%402x1.png)
## How to Vanquish Busywork and Spend More Time on What Matters
These tips for improving your focus and productivity will help you avoid getting sucked into busywork.
[Read more](https://todoist.com/inspiration/busywork-productivity-focus)
* [Productivity](https://todoist.com/inspiration/category/productivity)
![](https://proxy-prod.omnivore-image-cache.app/340x180,sYXX0C2yKXuKVXm2tjpJ8fNVgmGJUVGqDXIl5u7JvUvE/https://res.cloudinary.com/imagist/image/fetch/q_auto/f_auto/c_scale,w_2624/https%3A%2F%2Ftdinspiration.wpengine.com%2Fwp-content%2Fuploads%2F2019%2F03%2FNegotiate_Working_from_Home-scaled.jpg)
## How to Ask to Work From Home (With Exact Scripts & Email Templates to Aid Your Negotiation)
Follow these 9 steps to secure a remote work arrangement even in the most skeptical of organizations
[Read more](https://todoist.com/inspiration/how-to-ask-to-work-from-home)
* [Remote Work](https://todoist.com/inspiration/category/remote-work)
![](https://proxy-prod.omnivore-image-cache.app/340x180,snqFtOXYibl3YNEzgIr_nXxyF6xQm3nbVTPgILKPaK_8/https://res.cloudinary.com/imagist/image/fetch/q_auto/f_auto/c_scale,w_2624/https%3A%2F%2Ftdinspiration.wpengine.com%2Fwp-content%2Fuploads%2F2020%2F12%2F1.-Banner_Doist_Angel-scaled.jpg)
## How to Complete Your Own Annual Review
Reflect on work, health, finances, and more with a personal year in review
[Read more](https://todoist.com/inspiration/annual-review)
* [Goals](https://todoist.com/inspiration/category/goals)

View file

@ -0,0 +1,79 @@
---
id: 01b3b6c1-27ae-40a4-99fa-d297febc1e7c
title: |
tbaggery - A Note About Git Commit Messages
status: ARCHIVED
tags:
- read-later
date_added: 2023-11-21 11:59:10
url_omnivore: |
https://omnivore.app/me/https-tbaggery-com-2008-04-19-a-note-about-git-commit-messages-h-18bf2646727
url_original: |
https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
---
# tbaggery - A Note About Git Commit Messages
## Notes
- Tratar de mantener el limite que muestra Treesitter
- Utilizar la primera linea como "el asunto de un correo"
- Escribir el cuerpo con una separación de una linea en blanco
- Usar lenguaje imperativo, _"Fix bug"_ en vez de _"Fixes bug."_.
## Original
I want to take a moment to elaborate on what makes a well formed commit message. I think the best practices for commit message formatting is one of the little details that makes Git great. Understandably, some of the first commits to rails.git have messages of the really-long-line variety, and I want to expand on why this is a poor practice.
Heres a model Git commit message:
```livecodeserver
Capitalized, short (50 chars or less) summary
More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of an email and the rest of the text as the body. The blank
line separating the summary from the body is critical (unless you omit
the body entirely); tools like rebase can get confused if you run the
two together.
Write your commit message in the imperative: "Fix bug" and not "Fixed bug"
or "Fixes bug." This convention matches up with commit messages generated
by commands like git merge and git revert.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Typically a hyphen or asterisk is used for the bullet, followed by a
single space, with blank lines in between, but conventions vary here
- Use a hanging indent
```
Lets start with a few of the reasons why wrapping your commit messages to 72 columns is a good thing.
* `git log` doesnt do any special special wrapping of the commit messages. With the default pager of `less -S`, this means your paragraphs flow far off the edge of the screen, making them difficult to read. On an 80 column terminal, if we subtract 4 columns for the indent on the left and 4 more for symmetry on the right, were left with 72 columns.
* `git format-patch --stdout` converts a series of commits to a series of emails, using the messages for the message body. Good email netiquette dictates we wrap our plain text emails such that theres room for a few levels of nested reply indicators without overflow in an 80 column terminal. (The current rails.git workflow doesnt include email, but who knows what the future will bring.)
Vim users can meet this requirement by installing my [vim-git runtime files](http://github.com/tpope/vim-git), or by simply setting the following option in your git commit message file:
For Textmate, you can adjust the “Wrap Column” option under the view menu, then use `^Q` to rewrap paragraphs (be sure theres a blank line afterwards to avoid mixing in the comments). Heres a shell command to add 72 to the menu so you dont have to drag to select each time:
```lsl
$ defaults write com.macromates.textmate OakWrapColumns '( 40, 72, 78 )'
```
More important than the mechanics of formatting the body is the practice of having a subject line. As the example indicates, you should shoot for about 50 characters (though this isnt a hard maximum) and always, always follow it with a blank line. This first line should be a concise summary of the changes introduced by the commit; if there are any technical details that cannot be expressed in these strict size constraints, put them in the body instead. The subject line is used all over Git, oftentimes in truncated form if too long of a message was used. The following are just a handful of examples of where it ends up:
* `git log --pretty=oneline` shows a terse history mapping containing the commit id and the summary
* `git rebase --interactive` provides the summary for each commit in the editor it invokes
* if the config option `merge.summary` is set, the summaries from all merged commits will make their way into the merge commit message
* `git shortlog` uses summary lines in the changelog-like output it produces
* `git format-patch`, `git send-email`, and related tools use it as the subject for emails
* reflogs, a local history accessible with `git reflog` intended to help you recover from stupid mistakes, get a copy of the summary
* `gitk` has a column for the summary
* GitHub uses the summary in various places in their user interface
The subject/body distinction may seem unimportant but its one of many subtle factors that makes Git history so much more pleasant to work with than Subversion.

View file

@ -0,0 +1,182 @@
---
id: a82f2e4b-829e-48a5-9e5c-c152860743a7
title: |
Historias de usuario | Ejemplos y plantilla | Atlassian
status: ARCHIVED
tags:
- read-later
date_added: 2023-12-24 18:35:22
url_omnivore: |
https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-user-stories-18c9dc0ecd1
url_original: |
https://www.atlassian.com/es/agile/project-management/user-stories
---
# Historias de usuario | Ejemplos y plantilla | Atlassian
## Highlights
una historia de usuario es una explicación general e informal de una función de software escrita desde la perspectiva del usuario final. Su propósito es articular cómo proporcionará una función de software valor al cliente.
[source](https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-user-stories-18c9dc0ecd1#d1988eb3-4939-4bf3-b932-44aad141c065)
---
Las historias encajan perfectamente en marcos ágiles como [scrum](https://www.atlassian.com/es/agile/scrum) y [kanban](https://www.atlassian.com/es/agile/kanban). En el scrum, las historias de los usuarios se añaden a los sprints y se van realizando a lo largo del sprint. Los equipos de kanban incorporan las historias de usuario en su backlog y las ejecutan siguiendo su flujo de trabajo.
[source](https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-user-stories-18c9dc0ecd1#3e9e29ab-43db-4c8f-b517-c2f3b8892432)
---
Las historias de usuario son también los componentes básicos de los marcos ágiles más grandes, como los epics y las iniciativas. Los epics son grandes elementos de trabajo divididos en un conjunto de historias, y varios epics constituyen una iniciativa.
[source](https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-user-stories-18c9dc0ecd1#8f41f654-4b72-4789-b848-b46c2d185291)
---
## Cómo escribir historias de usuario
Piensa en lo siguiente cuando escribas historias de usuario:
* **Definición de “Listo”**: la historia suele estar “lista” cuando el usuario puede completar la tarea descrita, pero debes asegurarte de definir lo que representa completarla.
* **Describe tareas o subtareas**: decide qué pasos específicos deben completarse y quién es responsable de cada uno de ellos.
* **Perfiles de usuario**: ¿para quién? Si hay varios usuarios finales, considera crear varias historias.
* **Pasos ordenados**: escribe una historia para cada paso en un proceso más grande.
* **Escucha el feedback**: habla con los usuarios y capta sus problemas o necesidades en lo que dicen. No es necesario tener que estar adivinando las historias cuando puedes obtenerlas de tus clientes.
* **Tiempo**: el tiempo es un tema delicado. Muchos equipos de desarrollo evitan hablar sobre el tiempo, y en su lugar confían en sus marcos de trabajo de estimación. Dado que las historias deberían completarse en un sprint, aquellas que puedan necesitar semanas o meses deberían dividirse en historias más pequeñas o considerarse un epic independiente.
[source](https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-user-stories-18c9dc0ecd1#536ca974-d30c-4d48-a02f-a9c16c469e01)
---
Las historias de usuario suelen expresarse con una frase simple con la siguiente estructura:
**“Como \[perfil\], \[quiero\] \[para\].”**
Desglosemos esta estructura:
* “Como \[perfil\]”: ¿para quién desarrollamos esto? No solo buscamos un puesto, buscamos el perfil de la persona. Max. Nuestro equipo debería comprender quién es Max. Con suerte hemos entrevistado a muchos Max. Comprendemos cómo trabaja esa persona, cómo piensa y cómo se siente. Sentimos empatía por Max.
* “Quiere”: aquí describimos su intención, no las funciones que usan. ¿Qué es lo que están intentando lograr realmente? Esta descripción debería realizarse con independencia de las implementaciones; si describes algún elemento de la IU y no el objetivo del usuario, estás cometiendo un error.
* “Para”: ¿cómo encaja su deseo inmediato de hacer algo en la perspectiva general? ¿Cuál es el beneficio general que intentan lograr? ¿Cuál es el gran problema que debe resolverse?
[source](https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-user-stories-18c9dc0ecd1#74f6051c-6394-4c99-94c9-176857d9caf2)
---
## Original
* [DevOps](#)
* [Entrega continua](https://www.atlassian.com/es/continuous-delivery)
* [Git](https://www.atlassian.com/es/git)
* [Agile](https://www.atlassian.com/es/agile)
* [Microservicios](https://www.atlassian.com/es/microservices)
Las historias de usuario son tareas de desarrollo que se suelen expresar como "persona + necesidad + propósito".
Resumen: _==una historia de usuario es una explicación general e informal de una función de software escrita desde la perspectiva del usuario final. Su propósito es articular cómo proporcionará una función de software valor al cliente.==_
Es tentador pensar que las historias de usuario son, en pocas palabras, requisitos del sistema de software. Pero no lo son.
Un componente clave del desarrollo de software ágil es poner a las personas en primer lugar, y las historias de usuarios ponen a los usuarios finales reales en el centro de la conversación. Las historias utilizan un lenguaje no técnico para ofrecer contexto al equipo de desarrollo y sus esfuerzos. Después de leer una historia de usuario, el equipo sabe por qué está compilando lo que está compilando y qué valor crea.
Las historias de usuario son uno de los componentes centrales de un programa ágil. Ayudan a proporcionar un marco centrado en el usuario para el trabajo diario, lo que impulsa la colaboración y la creatividad y mejora el producto en general.
## ¿Qué son las historias de usuario ágiles?
Una historia de usuario es la unidad de trabajo más pequeña en un marco ágil. Es un objetivo final, no una función, expresado desde la perspectiva del usuario del software.
Una historia de usuario es una explicación general e informal de una función de software escrita desde la perspectiva del usuario final o cliente.
El propósito de una historia de usuario es articular cómo un elemento de trabajo entregará un valor particular al cliente. Ten en cuenta que los "clientes" no tienen por qué ser usuarios finales externos en el sentido tradicional, también pueden ser clientes internos o colegas dentro de tu organización que dependen de tu equipo.
Las historias de usuario son unas pocas frases en lenguaje sencillo que describen el resultado deseado. No entran en detalles, ya que los requisitos se añaden más tarde, una vez acordados por el equipo.
==Las historias encajan perfectamente en marcos ágiles como== ==[scrum](https://www.atlassian.com/es/agile/scrum)== ==y== ==[kanban](https://www.atlassian.com/es/agile/kanban)====. En el scrum, las historias de los usuarios se añaden a los sprints y se van realizando a lo largo del sprint. Los equipos de kanban incorporan las historias de usuario en su backlog y las ejecutan siguiendo su flujo de trabajo.== Es este trabajo sobre las historias de usuario lo que ayuda a los equipos de scrum a mejorar en la [estimación](https://www.atlassian.com/es/agile/project-management/estimation) y planificación de sprints, lo que conduce a un pronóstico más preciso y a una mayor agilidad. Gracias a las historias, los equipos de kanban aprenden a gestionar el trabajo en curso (WIP) y pueden perfeccionar aún más sus flujos de trabajo.
==Las historias de usuario son también los componentes básicos de los marcos ágiles más grandes, como los epics y las iniciativas. Los epics son grandes elementos de trabajo divididos en un conjunto de historias, y varios epics constituyen una iniciativa.== Estas estructuras más grandes garantizan que el trabajo diario del equipo de desarrollo contribuya a los objetivos de la organización incorporados en los epics y las iniciativas.
[Más información sobre epics e iniciativas](https://www.atlassian.com/es/agile/project-management/epics-stories-themes)
![Epics frente a historias y frente a temas ágiles | Orientador ágil de Atlassian](https://proxy-prod.omnivore-image-cache.app/0x0,sW2bi5Evxhti5v5nDhvukDixoEeUjIrdTwJc6L7dtKiA/https://wac-cdn.atlassian.com/dam/jcr:a679339b-0098-4c88-acdb-7009b0de6efb/epics-vs-stories-agile-development.png?cdnVersion=1373)
## ¿Por qué crear historias de usuario?
Para los equipos de desarrollo nuevos en la metodología ágil, las historias de usuario a veces parecen un paso más. ¿Por qué no dividir el gran proyecto ([el epic](https://www.atlassian.com/es/agile/project-management/epics)) en una serie de pasos y seguir adelante? Pero las historias dan al equipo un contexto importante y asocian las tareas con el valor que estas aportan.
Las historias de usuario tienen varios beneficios clave:
* **Las historias centran la atención en el usuario.** Una lista de tareas pendientes mantiene al equipo centrado en tareas que deben completarse, pero un conjunto de historias lo mantiene centrado en solucionar problemas para usuarios reales.
* **Las historias permiten la colaboración.** Con el objetivo definido, el equipo puede colaborar para decidir cómo ofrecer un mejor servicio al usuario y cumplir con dicho objetivo.
* **Las historias impulsan soluciones creativas.** Las historias fomentan que el equipo piense de forma crítica y creativa sobre cómo lograr mejor un objetivo.
* **Las historias motivan.** Con cada historia el equipo de desarrollo disfruta de un pequeño reto y una pequeña victoria, lo que aumenta la motivación.
## Trabajar con historias de usuario
Una vez que se ha escrito una historia, es hora de integrarla en tu flujo de trabajo. Por lo general, una historia la escribe el propietario del producto, el gestor del producto o el gestor del programa, y la envía para su revisión.
Durante una reunión de planificación de sprint o iteración, el equipo decide qué historias afrontará en ese sprint. Los equipos discuten los requisitos y la funcionalidad que requiere cada historia de usuario. Esta es una oportunidad para ponerse técnico y creativo en la implementación de la historia por parte del equipo. Una vez acordados, estos requisitos se añaden a la historia.
Otro paso común en esta reunión es calificar las historias en función de su complejidad o tiempo hasta su finalización. Los equipos usan las tallas de las camisetas, la secuencia de Fibonacci o el Planning Poker para hacer las estimaciones adecuadas. Una historia debe ser de un tamaño que pueda completarse en un sprint; por lo tanto, cuando el equipo establezca las especificaciones de cada historia, se deben asegurar de dividir las historias que superen ese horizonte de finalización.
## ==Cómo escribir historias de usuario==
==Piensa en lo siguiente cuando escribas historias de usuario:==
* **==Definición de “Listo”==**==: la historia suele estar “lista” cuando el usuario puede completar la tarea descrita, pero debes asegurarte de definir lo que representa completarla.==
* **==Describe tareas o subtareas==**==: decide qué pasos específicos deben completarse y quién es responsable de cada uno de ellos.==
* **==Perfiles de usuario==**==: ¿para quién? Si hay varios usuarios finales, considera crear varias historias.==
* **==Pasos ordenados==**==: escribe una historia para cada paso en un proceso más grande.==
* **==Escucha el feedback==**==: habla con los usuarios y capta sus problemas o necesidades en lo que dicen. No es necesario tener que estar adivinando las historias cuando puedes obtenerlas de tus clientes.==
* **==Tiempo==**==: el tiempo es un tema delicado. Muchos equipos de desarrollo evitan hablar sobre el tiempo, y en su lugar confían en sus marcos de trabajo de estimación. Dado que las historias deberían completarse en un sprint, aquellas que puedan necesitar semanas o meses deberían dividirse en historias más pequeñas o considerarse un epic independiente.==
Una vez que las historias de usuario estén definidas de forma clara, debes asegurarte de que todo el equipo pueda verlas.
==Las historias de usuario suelen expresarse con una frase simple con la siguiente estructura:==
**==“Como [perfil], [quiero] [para].”==**
==Desglosemos esta estructura:==
* ==“Como [perfil]”: ¿para quién desarrollamos esto? No solo buscamos un puesto, buscamos el perfil de la persona. Max. Nuestro equipo debería comprender quién es Max. Con suerte hemos entrevistado a muchos Max. Comprendemos cómo trabaja esa persona, cómo piensa y cómo se siente. Sentimos empatía por Max.==
* ==“Quiere”: aquí describimos su intención, no las funciones que usan. ¿Qué es lo que están intentando lograr realmente? Esta descripción debería realizarse con independencia de las implementaciones; si describes algún elemento de la IU y no el objetivo del usuario, estás cometiendo un error.==
* ==“Para”: ¿cómo encaja su deseo inmediato de hacer algo en la perspectiva general? ¿Cuál es el beneficio general que intentan lograr? ¿Cuál es el gran problema que debe resolverse?==
Por ejemplo, las historias de usuario pueden tener este aspecto:
* Como Max, quiero invitar a mis amigos, para que podamos disfrutar de este servicio juntos.
* Como Sascha, quiero organizar mi trabajo, para poder sentir que tengo un mayor control.
* Como gestor, quiero poder comprender el progreso de mis compañeros, para poder informar sobre nuestros éxitos y fallos.
Esta estructura no es obligatoria, pero resulta de ayuda para establecer una definición de "hecho". Cuando ese perfil puede alcanzar su valor deseado, la historia está completa. Recomendamos a nuestros equipos definir su propia estructura, y que no se desvíen de ella.
## Introducción a las historias de usuario ágiles
Las historias de los usuarios describen el por qué y el qué que hay detrás del trabajo diario de los miembros del equipo de desarrollo; a menudo las historias de usuario se expresan de la siguiente manera: _perfil + necesidad + propósito_. Entender su papel como fuente de verdad para lo que el equipo está entregando, pero también el por qué, es clave para un proceso sin problemas.
Empieza por evaluar el siguiente gran proyecto o el más apremiante (por ejemplo, un epic). Divídelo en historias de usuario más pequeñas y trabaja con el equipo de desarrollo para mejorarlo. Una vez que tus historias están fuera, donde todo el equipo puede verlas, ya tienes todo listo para empezar a trabajar.
![Max Rehkopf](https://proxy-prod.omnivore-image-cache.app/0x0,syT9pntR4CaQYCcIqba5ypD-oikurrflhJTjV7sO1ExQ/https://wac-cdn.atlassian.com/es/dam/jcr:ba03a215-2f45-40f5-8540-b2015223c918/Max-R_Headshot%20(1).jpg?cdnVersion=1373)
Max Rehkopf
Como persona caótica que soy, confío en las prácticas de la metodología ágil y en los principios optimizados para poner orden en mi día a día. Me alegra compartir estas lecciones con otras personas a través de los muchos artículos, ponencias y vídeos que hago para Atlassian.
![](https://proxy-prod.omnivore-image-cache.app/0x0,sl_ZksgNpNXWZfy83BHaRWg43nNL2e3UI5RkRcT2a1T0/https://wac-cdn.atlassian.com/dam/jcr:c185cc4f-0ee1-4ed0-bd7d-cd77fef8a8d8/ScrumTutorial.svg?cdnVersion=1373)
tutorial
#### Cómo crear historias de usuario en Jira Software
Descubre cómo los equipos pueden utilizar los tiques para realizar un seguimiento del trabajo que debe completarse.
[Probar el tutorial ](https://www.atlassian.com/es/agile/tutorials/issues)
![](https://proxy-prod.omnivore-image-cache.app/0x0,sayxceodUXJRoop6GCfPrE2jGieRSxdK-gPbtyLUKwNw/https://wac-cdn.atlassian.com/dam/jcr:689d8fe7-3859-41cc-b3b4-92004cd7b7af/ProjectManagementTitle.png?cdnVersion=1373)
artículo
#### ¿Qué son los puntos de historia y cómo se estiman?
Conoce por dentro los secretos de la estimación ágil y los puntos de historia. Una buena estimación ágil permite a los propietarios del producto optimizar sus procesos en términos de eficiencia e impacto.
[Leer el artículo ](https://www.atlassian.com/es/agile/project-management/estimation)

View file

@ -0,0 +1,114 @@
---
id: 22bb5f59-fddb-4ab4-89dd-bb28fe723f4f
title: |
¿Qué son los puntos de historia en la metodología ágil y cómo se estiman?
status: ARCHIVED
tags:
- read-later
date_added: 2023-12-24 18:36:25
url_omnivore: |
https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-estimation-18c9dc1e48a
url_original: |
https://www.atlassian.com/es/agile/project-management/estimation
---
# ¿Qué son los puntos de historia en la metodología ágil y cómo se estiman?
## Highlights
Se trata de unidades de medida que permiten expresar una estimación del esfuerzo total que deberá hacer el equipo para implementar íntegramente un elemento del backlog del producto o cualquier otro trabajo. Los equipos asignan puntos de historia en función de la complejidad y del volumen del trabajo, así como del riesgo o de la incertidumbre.
[source](https://omnivore.app/me/https-www-atlassian-com-es-agile-project-management-estimation-18c9dc1e48a#4ddb962e-4ff6-44fa-8e72-b74db4a9b7a2)
---
## Original
* [DevOps](#)
* [Entrega continua](https://www.atlassian.com/es/continuous-delivery)
* [Git](https://www.atlassian.com/es/git)
* [Agile](https://www.atlassian.com/es/agile)
* [Microservicios](https://www.atlassian.com/es/microservices)
## Puntos de historia y estimación
Una buena estimación ayuda a los propietarios de los productos a optimizar sus procesos en términos de eficiencia e impacto. Por eso es tan importante.
Hacer estimaciones es complicado. Para los desarrolladores de software, es uno de los aspectos más difíciles de su trabajo, por no decir el más difícil. Conlleva tener en cuenta un montón de factores que ayudan a los propietarios de los productos a tomar decisiones que afectan a todo el equipo, así como a la empresa. Con todo eso en juego, no es de extrañar que todos, desde los desarrolladores hasta la alta dirección, tiendan a perder los estribos sobre este tema. Craso error. La estimación ágil de los puntos de historia no es más que eso, un cálculo: no es un pacto de sangre.
No es obligatorio trabajar los fines de semana para compensar el tiempo de más que nos lleva un trabajo que habíamos subestimado. Dicho eso, veamos algunas maneras de realizar estimaciones con la mayor precisión posible.
## Colaboración con el propietario del producto
En un desarrollo ágil, el [propietario del producto](https://www.atlassian.com/es/agile/product-management) se encarga de priorizar el [backlog](https://www.atlassian.com/es/agile/scrum/backlogs), es decir, la lista ordenada de trabajo que contiene descripciones breves de todas las funciones y correcciones de un producto. Los propietarios del producto capturan los [requisitos](https://www.atlassian.com/es/agile/product-management/requirements) empresariales, pero no siempre entienden los detalles de la implementación. Por ello, una buena estimación puede informar al propietario del producto sobre el nivel de esfuerzo de cada elemento de trabajo, que a su vez sirve para evaluar la prioridad relativa de cada elemento.
Cuando el equipo de ingeniería empieza su proceso de estimación, normalmente surgen preguntas sobre los requisitos y las historias de usuario. Esto es algo positivo: las preguntas ayudan a todo el equipo a entender el trabajo mejor. Específicamente en el caso de los propietarios de los productos, la división granular de los elementos de trabajo y las estimaciones les ayudan a priorizar todas las áreas del trabajo, incluidas las que pueden estar ocultas. Con las estimaciones del equipo de desarrollo en la mano, no es extraño que un propietario del producto reordene los elementos del backlog.
## La estimación ágil de los puntos de historia es un trabajo en equipo
Involucrar a todo el mundo (desarrolladores, diseñadores, testers, deployers... todos) en el equipo es clave. Cada miembro del equipo aporta una perspectiva diferente sobre el producto y el trabajo necesario para entregar una historia de usuario. Por ejemplo, si la gestión de productos quiere hacer algo que parece sencillo, como admitir un nuevo navegador web, el desarrollo y el control de calidad deben dar su opinión también, ya que su experiencia les ha enseñado qué dragones pueden estar al acecho bajo la superficie.
Asimismo, los cambios de diseño requieren no sólo la aportación del equipo de diseño, sino también la del de desarrollo y la del de QA. Dejar a parte del equipo de producto más amplio fuera del proceso de estimación crea estimaciones de menor calidad, baja la moral porque los contribuyentes clave no se sienten incluidos y compromete la calidad del software.
No dejes que tu equipo sea víctima de las estimaciones poco precisas. Es un camino seguro al fracaso.
## Puntos de historia frente a horas
Los equipos de software tradicionales proporcionan estimaciones en un formato de tiempo concreto: pueden ser días, semanas o meses. Sin embargo, muchos equipos ágiles han decidido pasarse a los puntos de historia. ==Se trata de unidades de medida que permiten expresar una estimación del esfuerzo total que deberá hacer el equipo para implementar íntegramente un elemento del backlog del producto o cualquier otro trabajo. Los equipos asignan puntos de historia en función de la complejidad y del volumen del trabajo, así como del riesgo o de la incertidumbre.== Los valores se asignan para desglosar el trabajo de forma más eficaz en partes más pequeñas. De esta manera, se puede gestionar la incertidumbre. Con el tiempo, esto ayuda a los equipos a ser conscientes de lo que pueden llegar a conseguir en un período de tiempo concreto y genera un sentimiento de consenso y compromiso con la solución. Aunque pueda parecer contradictorio, esta abstracción es realmente útil, ya que obliga al equipo a tomar decisiones más complejas sobre la dificultad del trabajo. A continuación, se indican algunos motivos por los cuales es recomendable utilizar puntos de historia:
* Las fechas no tienen en cuenta el trabajo no relacionado con el proyecto que inevitablemente surge en nuestro día a día, como correos electrónicos, reuniones y entrevistas en las que un miembro del equipo puede participar.
* Las fechas tienen una connotación emocional. La estimación relativa elimina este componente.
* Cada equipo estima el trabajo en una escala ligeramente diferente, lo cual significa que su velocidad (medida en puntos) será diferente, como es natural. Asimismo, esto imposibilita que se politiquee usando la velocidad como arma.
* Una vez que se llegue a un acuerdo sobre el esfuerzo relativo del valor de cada punto de historia, podrás asignar puntos rápidamente sin que haya lugar a demasiado debate.
* Los puntos de historia recompensan a los miembros del equipo por resolver incidencias basándose en la dificultad, y no en el tiempo empleado. De esta forma, los miembros del equipo se mantienen centrados en entregar valor, no en el tiempo dedicado.
Lamentablemente, los puntos de historia se suelen utilizar de forma incorrecta; por ejemplo, cuando se emplean para juzgar a las personas o para asignar cronogramas y recursos detallados, o bien cuando se confunden con una medida de productividad. La auténtica función de los puntos de historia es que los equipos puedan hacerse una idea del volumen de trabajo y saber qué partes tienen prioridad. Para ver un debate en profundidad sobre los puntos de historia y las prácticas relacionadas con las estimaciones, échale un vistazo a esta [mesa redonda con expertos del sector](https://community.atlassian.com/t5/Agile-articles/Six-experts-sound-off-on-story-points-the-evolution-of-agile/ba-p/1553590). Si quieres más consejos sobre la estimación ágil, sigue leyendo.
[ ](https://www.youtube.com/watch?v=%5FN5gj9gzOjg)
## Puntos de historia y póker de planificación
Los equipos que se están iniciando en los puntos de historia usan un ejercicio llamado [Planning Poker](https://www.atlassian.com/blog/platform/a-brief-overview-of-planning-poker). En Atlassian, el Planning Poker es una práctica habitual en toda la empresa. Los miembros del equipo toman un elemento del backlog, hablan sobre él brevemente y cada uno fórmula mentalmente una estimación. A continuación, todos levantan una tarjeta con el número que refleje su estimación. Si todo el mundo está de acuerdo, ¡estupendo! De lo contrario, dedica algo de tiempo (no mucho, tan solo un par de minutos) para entender el motivo de las distintas estimaciones. Recuerda, sin embargo, que la estimación debe ser una actividad bastante general. Si el equipo se va por las ramas, respira hondo y deriva el debate a un superior.
**¿Listo para intentarlo?**
* Instala esta [Aplicación de póker de planificación](https://marketplace.atlassian.com/apps/1212495/planning-poker?hosting=cloud&tab=overview)
* Obtén más información sobre el [póker de planificación](https://www.atlassian.com/blog/agile/planning-poker-sane-healthy)
## Estima con mayor inteligencia, no con mayor esfuerzo
Ninguna tarea individual debe superar las 16 horas de trabajo. (Si usas puntos de historia, puedes decidir que 20 puntos es el límite superior, por ejemplo). Sencillamente, es demasiado complicado estimar elementos de trabajo individuales de mayor duración con confianza. Esa confianza es especialmente importante para los elementos en la parte superior del backlog. Cuando algo se estima por encima del límite de 16 horas (o 20 puntos) del equipo, será una señal para dividirlo granularmente y volver a estimarlo.
Para los elementos que se encuentren más abajo en el backlog, basta con una estimación aproximada. Cuando el equipo empiece a trabajar en esos elementos, los requisitos podrían haber cambiado y la aplicación seguramente habrá cambiado también, de modo que las estimaciones no serán tan precisas. No pierdas tiempo estimando trabajo que posiblemente cambiará. Da al propietario del producto una cifra aproximada que pueda utilizar para priorizar la hoja de ruta del producto adecuadamente.
## Aprende de las estimaciones anteriores
Las retrospectivas constituyen un momento para que el equipo incorpore ideas de iteraciones anteriores, incluida la precisión de sus estimaciones. Hay muchas herramientas ágiles (como [Jira Software](https://www.atlassian.com/es/software/jira)) que realizan el seguimiento de los puntos de historia, cosa que facilita en gran medida el análisis y el recalibrado de las estimaciones. Prueba, por ejemplo, a comparar las cinco últimas historias de usuario que haya entregado el equipo con un valor de 8 puntos de historia. Estudia si cada uno de estos elementos de trabajo tuvo un nivel de esfuerzo similar. Si no, analizad por qué. Utilizad esta información en los siguientes debates de estimaciones.
Al igual que [el resto de los aspectos de un proceso ágil](https://www.atlassian.com/es/agile/project-management), la estimación es una cuestión de práctica. Irás mejorando con el tiempo.
![Dan Radigan](https://proxy-prod.omnivore-image-cache.app/0x0,s9OKxpW9uX89PL44D0A_DX8yh1LxH26TPVUB3WHhB_W4/https://wac-cdn.atlassian.com/es/dam/jcr:2a395b8a-4485-4727-80c1-82fb787b4479/Dan_Radigan_200x200.png?cdnVersion=1373)
Dan Radigan
La metodología ágil ha influido mucho en mí, tanto en el aspecto profesional como en el personal: he aprendido que las mejores experiencias se basan en el modelo ágil, tanto al programar como en la vida real. Mis intereses suelen moverse entre la tecnología, la fotografía y el motociclismo.
![](https://proxy-prod.omnivore-image-cache.app/0x0,sl_ZksgNpNXWZfy83BHaRWg43nNL2e3UI5RkRcT2a1T0/https://wac-cdn.atlassian.com/dam/jcr:c185cc4f-0ee1-4ed0-bd7d-cd77fef8a8d8/ScrumTutorial.svg?cdnVersion=1373)
tutorial
#### Aprender a usar diagramas de trabajo pendiente con Jira Software
La guía completa sobre diagramas de evolución en Jira Software. Aprende a supervisar epics y sprints con diagramas de evolución.
[Probar el tutorial ](https://www.atlassian.com/es/agile/tutorials/burndown-charts)
![](https://proxy-prod.omnivore-image-cache.app/0x0,sayxceodUXJRoop6GCfPrE2jGieRSxdK-gPbtyLUKwNw/https://wac-cdn.atlassian.com/dam/jcr:689d8fe7-3859-41cc-b3b4-92004cd7b7af/ProjectManagementTitle.png?cdnVersion=1373)
artículo
#### Cinco métricas ágiles que no odiarás
¿Cómo usar métricas ágiles? Descubre las gráficas de trabajo pendiente de sprints, epics y publicaciones, los gráficos de control y velocidad, y el diagrama de flujo acumulado.
[Leer el artículo ](https://www.atlassian.com/es/agile/project-management/metrics)

View file

@ -0,0 +1,412 @@
---
id: d529f41a-ca28-11ee-97f3-f78c291f6623
title: |
Debouncing in JavaScript Explained by Building Auto-Complete Functionality in React
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-02-12 20:23:30
url_omnivore: |
https://omnivore.app/me/debouncing-in-java-script-explained-by-building-auto-complete-fu-18da0bc7510
url_original: |
https://www.freecodecamp.org/news/deboucing-in-react-autocomplete-example/
---
# Debouncing in JavaScript Explained by Building Auto-Complete Functionality in React
## Highlights
Debouncing accepts a function and transforms it in to an updated (debounced) function so that the code inside the original function is executed after a certain period of time.
[source](https://omnivore.app/me/debouncing-in-java-script-explained-by-building-auto-complete-fu-18da0bc7510#2c8f31bd-f011-49bd-99bc-36192f7fd823)
---
function debounce(func, delay) {let timeout=null return (...args) => {if(timeout) clearTimeout(timeout) timeout=setTimeout(() \=> { func(...args) timeout=null }, delay) } }
[source](https://omnivore.app/me/debouncing-in-java-script-explained-by-building-auto-complete-fu-18da0bc7510#5a57c802-520a-409a-a51c-e554a6ec8bd5)
---
const useDebounce = (func, delay) => { let timeout\=null return (...args) => {if(timeout) clearTimeout(timeout)timeout\=setTimeout(() => { func(...args) }, delay) } }export default useDebounce
[source](https://omnivore.app/me/debouncing-in-java-script-explained-by-building-auto-complete-fu-18da0bc7510#226d8c7b-6900-4b2f-a705-5f5b6e10afc5)
---
## Original
![Debouncing in JavaScript Explained by Building Auto-Complete Functionality in React](https://proxy-prod.omnivore-image-cache.app/2000x1333,st8a8yNqtoznuGhyo0BqzXJQ0cEap88iHr4kvlN3Ff1Y/https://www.freecodecamp.org/news/content/images/size/w2000/2024/02/photo-1550063873-ab792950096b.jpeg)
Hi readers, I hope you are doing great! I am back with another tutorial on web development. If you are someone who enjoys developing web apps with JavaScript and React, then this post is for you.
When you roll out a new app into production, you want to make sure that it's user friendly. A website's performance is a key part of the user experience. Every user wants the website and its contents to load quickly. Each and every second is valuable and could result into a user never visiting your website again.
In this guide, we are going to understand a very important technique in JavaScript known as debouncing. Then, I will show you how to implement the autocomplete functionality in React with debouncing.
Now, in order to get the most out of this tutorial, I am assuming you have a basic knowledge of JavaScript. If you need to get started or review, here are a couple resources for you:
* Learn JavaScript basics [handbook for beginners](https://www.freecodecamp.org/news/learn-javascript-for-beginners/)
* The freeCodeCamp [JavaScript Algorithms and Data Structures certification](https://www.freecodecamp.org/news/learn-javascript-with-new-data-structures-and-algorithms-certification-projects/)
## **Table of Contents:**
* [What is Debouncing?](#what-is-debouncing)
* [How to Implement Debouncing in JavaScript](#how-to-implement-debouncing-in-javascript)
* [Use Case of Debouncing](#use-case-of-debouncing)
* [Conclusion](#conclusion)
## What is Debouncing?
Debouncing is a strategy used to improve the performance of a feature by controlling the time at which a function should be executed.
==Debouncing accepts a function and transforms it in to an updated (debounced) function so that the code inside the original function is executed after a certain period of time.==
If the debounced function is called again within that period, the previous timer is reset and a new timer is started for this function call. The process repeats for each function call.
An example will help you understand better. Let's take a function `fun()`. We want this function to execute after 500ms.
```crystal
function fun() {
console.log('This is a function')
}
```
After debouncing, a new function `debouncedFun()` is returned. Now, whenever you call `debouncedFun()`, it will be called after 500ms.
If you call it again within the next 500ms after first calling it, the previous timer is reset and a new timer is started for the second function call. The process repeats if you keep calling the function within 500ms.
## How to Implement Debouncing in JavaScript
Let's understand how to implement debouncing in JavaScript. First, we'll go over our requirements. What behavior do we want from the debounced function?
* Delay the function execution by a certain time, `delay`.
* Reset the timer if the function is called again.
To debounce a function, we'll have a separate function that accepts the function reference and the delay as parameters, and returns a debounced function.
```ada
function debounce(func, delay) {
return () => {} // return debounced function
}
```
This function will only be called once to return a debounced function and that, in turn, will be used in the subsequent code.
To delay a function by some milliseconds, we can simply use the `setTimeout` function in JavaScript.
```arcade
function debounce(func, delay) {
return () => {
setTimeout(() => {
func()
}, delay)
}
}
```
This delays the function call by `delay` milliseconds. But this is incomplete as it only satisfies the first requirement. How do we achieve the second behaviour?
Let's create a variable `timeout` and assign it to the return value of `setTimeout` method. The `setTimeout` method returns a unique identifier to the timeout, which is held by `timeout` variable.
```javascript
function debounce(func, delay) {
let timeout=null
return () => {
timeout=setTimeout(() => {
func()
}, delay)
}
}
```
Each time you invoke `setTimeout`, the ID is different. We will use this `timeout` variable to reset the timer.
But how do we get access to `timeout` from outside the `debounce()` method? As mentioned before, `debounce()` is only used once to return a debounced function. This, in turn, performs the debouncing logic.
Then, how does the debounced function have access to `timeout` even if it is used outside the `debounce()` function? Well, it uses a concept called closure.
### What's a closure in JavaScript?
In JavaScript, an inner function always has access to the local variables of the outer function. In our case, the inner function has access to `timeout` that has function level scope in the `debounce()` method.
But when the outer function returns this inner function, the inner function still holds a reference to the local variables of the outer function long after the outer function has finished execution. This is the concept of a closure.
Let's understand closures with an example.
```javascript
function outerFunction() {
const x = 5;
return () => {
console.log(x);
}
}
const inner = outerFunction();
inner(); // prints 5
// console.log(x) Throws reference error
```
Here, if we call `inner()`, the code runs without any errors and prints 5\. But, if we try to access `x` directly, JavaScript throws a reference error.
![Screenshot-2024-02-09-141749](https://proxy-prod.omnivore-image-cache.app/691x199,sr83BH8L2pwjWfvF3o3ztAC_Fg8t5J_j8jc8rZM45-I8/https://www.freecodecamp.org/news/content/images/2024/02/Screenshot-2024-02-09-141749.png)
JavaScript Reference Error
Here, `inner()` closes over `x` and only this function can use the variable and no one other one can. We cannot access the variable explicitly.
You can check out [this beginner-friendly tutorial](https://www.freecodecamp.org/news/closures-in-javascript/) to learn more about closures.
### Back to Debouncing
Let's get back to where we left off:
```javascript
function debounce(func, delay) {
let timeout=null
return () => {
timeout=setTimeout(() => {
func()
}, delay)
}
}
```
Here, JavaScript uses a closure to hold access to `timeout` every time we use the debounced function.
Let's use this to our advantage. Since `debouncedFun()` has access to the same `timeout` variable in every function call, we can add a condition to check whether a previous timeout exists. We can simply do this with a null check, `if(timeout !== null)` or `if(timeout)`.
Then, we use the `clearTimeout()` method to cancel the previous timeout, thus resetting the timer.
Add the following statement before starting a new timeout:
```lisp
if(timeout)
clearTimeout(timeout)
```
Once the timeout is reset, a new timeout is started for the current function call, whose ID is then assigned to `timeout`. The process is repeated for the subsequent function calls who have access to the same `timeout` due to closures.
```javascript
function debounce(func, delay) {
let timeout=null
return () => {
if(timeout) clearTimeout(timeout)
timeout=setTimeout(() => {
func()
}, delay)
}
}
```
With this, we have satisfied our second requirement that is, resetting the timer and starting a new one. It's time to use this debounced function.
Let's pass `fun()` to the `debounce()` method with a delay of 500ms.
```kotlin
const debouncedFun = debounce(fun, 500)
```
`debouncedFun()` is basically `fun()` with debouncing behaviour. Let's call this function at different time intervals to test our functionality.
```stylus
debouncedFun()
setTimeout(debouncedFun, 300)
setTimeout(debouncedFun, 900)
```
The first function call is made instantly. The other two are made after 300ms and 900ms respectively. Can you guess the output?
The code prints `This is a function` two times. Let's understand why. Here, after the first call is made, `fun()` is scheduled to execute after 500ms. But the second one is made in 300ms which resets the timer and starts a new one.
500ms have passed and the `fun()` method executes. Then, at 900ms, another function call is made. This again executes `fun()` after 500ms.
There is still a small improvement we should make. Our logic does not consider function arguments. Let's replace `fun()` with `fun(a, b)`.
```javascript
function fun(a, b) {
console.log(`This is a function with arguments ${a} and ${b}`)
}
```
To incorporate arguments while debouncing, return a debounced function that accepts arguments.
```javascript
function debounce(func, delay) {
let timeout=null
return (...args) => {
if(timeout) clearTimeout(timeout)
timeout=setTimeout(() => {
func(...args)
timeout=null
}, delay)
}
}
```
By using the spread operator, any arguments passed to the debounced function will be stored as an array in the `args` variable. Then, spread out the same `args` array to call the actual function with the arguments passed.
```kotlin
const debouncedFun=debounce(fun, 500)
debouncedFun(2,3)
```
The above code prints `This is a function with arguments 2 and 3` after 500ms.
## Use Case of Debouncing
Let's see how debouncing is used in practical applications. The most common use case of debouncing is the autocomplete functionality. You must have seen many websites where you type into an input field and it shows a list of results as you type them.
Here's an example from Google Search:
![Screenshot-2024-02-09-163240](https://proxy-prod.omnivore-image-cache.app/1462x487,s2SiKOKcVhwfHi5VYnRJVYbQ5pPYw6Qo8YMUAIGDxKzs/https://www.freecodecamp.org/news/content/images/2024/02/Screenshot-2024-02-09-163240.png)
Google Search Autocomplete after typing in "Top 10"
Google search shows the most recent and commonly searched terms. The information is mostly fetched from the browser cache. But, several websites make API calls to backend server to fetch the data from a database.
This can easily be implemented by adding an `onchange` event to the `input` element and implementing the fetch logic in the event handler. But there's a slight issue with this.
Consider the following example:
![Screenshot-2024-02-09-163930](https://proxy-prod.omnivore-image-cache.app/1915x882,sAcuTnmrT0AUE51eNXOrpzFo5aQn4QNd8NLdDhqrwkD0/https://www.freecodecamp.org/news/content/images/2024/02/Screenshot-2024-02-09-163930.png)
API Request made for each input value
When I type the word _absolute_, an API request is made every time the value of the input field changes. We are making 8 API requests in very few milliseconds which puts a lot of load on the backend server and could cause performance issues.
Ideally, we want to show the auto-complete results some time after the user has finished typing. Here, the user has typed _absolute_ in one go, so instead of showing results every time the input changes, we could show them once the user has finished typing that is, we could add some delay between the input change and the results being displayed.
So, we only make the API calls when the user finishes typing their word and not on every input change. This reduces the number of API calls and improves performance. We can achieve this behavior with debouncing.
Let's understand how to implement the autocomplete functionality in React.
### Auto-complete example
Use `create-react-app` (or a modern build tool like Vite) to create the project. Remove the existing boilerplate code. There is no need to install any additional dependencies. Run `npm start` command to start the project. You can find the complete code on [GitHub](https://github.com/KunalN25/react-debouncing).
I have set up a Node server to fetch data for the app. You can find it in the Git repo. Run the `node server` command to start it. I am not going to show the Node.js code as it's out of the scope of this tutorial.
Let's get started with the implementation. We will write a simple autocomplete functionality. The app should show a list of cities that contain an input string typed by the user.
#### App Component
We'll first need an `input` element to accept user input and a _results container_ for the search results. Attach an event handler to the `input` element which is an `async` function since it will include the fetching logic.
```javascript
function App() {
const [data, setData] = useState(null)
const loadData = async (event) => {
}
return (
<div className="App">
<input type="text" onChange={(e) => loadData(e)}/>
{data && data.length !== 0 &&
<div className="results-container">
{data.map(item => (
<div key={item.id} className="result-item">
<p> {item.city} </p>
</div>
))}
</div>}
</div>
);
}
```
The data will be stored as state and the results will only be shown if the data is non-empty. I'll skip over the CSS for this tutorial, you can find it in the [Git Repo](https://github.com/KunalN25/react-debouncing).
#### Event Handler
The `loadData()` function fetches our data and stores the response as state.
```cs
const loadData = async (event) => {
const value=event.target.value
if(value === '') {
setData(null)
return
}
const response=await fetch(`http://localhost:8000/data/${value}`)
const res=await response.json()
setData(res)
}
```
If no value is entered, simply exit the function. Else, make the request to the node server endpoint. This function is called every time the input changes, so we will debounce this function.
#### Debounce Implementation using a Custom Hook
We will write the debouncing logic inside a custom hook. The advantage of custom hooks is that you can re-use the same logic throughout your application. It is highly advisable to do so.
Create a new folder `custom-hooks` and inside it, create a file `useDebounce.js`. As explained before, the `useDebounce()` method should take a function and delay as parameters and return the debounced function.
```routeros
const useDebounce = (func, delay) => {
let timeout=null
return (...args) => {
if(timeout) clearTimeout(timeout)
timeout=setTimeout(() => {
func(...args)
}, delay)
}
}
export default useDebounce
```
Now, inside the app component, call this method once to get `loadDataDebounced()`.
```angelscript
const loadDataDebounced = useDebounce(loadData, 400)
```
We'll use this new method as the event handler for the `input` element.
```reasonml
<input type="text" onChange={(e) => loadDataDebounced(e)}/>
```
#### Output
Enter a search string inside the `input` element to test our code.
![Screenshot-2024-02-09-190240](https://proxy-prod.omnivore-image-cache.app/835x564,sb5zP6lXJrIxE_8ItjnafuRCnKNnHRzFsCN62XGBrLfQ/https://www.freecodecamp.org/news/content/images/2024/02/Screenshot-2024-02-09-190240.png)
On-screen output
![Screenshot-2024-02-09-191234](https://proxy-prod.omnivore-image-cache.app/1283x452,sHxsFT2-w6tk2KBgte1fwMNck9ai0l4qA7S8k1fzQDew/https://www.freecodecamp.org/news/content/images/2024/02/Screenshot-2024-02-09-191234.png)
As you can see in the Network tab, only one request is getting sent instead of three. This makes the search performance much better.
## Conclusion
In this tutorial, you learned what debouncing is and how it is implemented. Debouncing delays the function execution by a certain time and resets the previous timer if the function is called again.
Debouncing uses the important concept of closures. I took a slight detour from the implementation to explain what closure is. It can be a confusing concept for beginners, so take your time understanding it. Closures allow you to work with local variables even after a function has finished execution.
After that, I showed you a popular use case of debouncing, the auto-complete functionality. The performance of the feature can be improved with debouncing. I also showed you how to implement auto-complete in React and use debouncing with custom hooks. I hope this helps you in future projects.
If you are unable to understand the content or find the explanation unsatisfactory, let me know. New ideas are always appreciated! Feel free to connect with me on Twitter. Till then, Goodbye!
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,764 @@
---
id: c4ab379e-cc84-11ee-b3d0-afc69cc1061d
title: |
React Optimization Techniques to Help You Write More Performant Code
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-02-15 21:57:28
url_omnivore: |
https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2
url_original: |
https://www.freecodecamp.org/news/react-performance-optimization-techniques/
---
# React Optimization Techniques to Help You Write More Performant Code
## Highlights
List visualization, or windowing, involves rendering only the items currently visible on the screen.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#9fb355ed-811d-44e7-aa61-12c0b18db7e2)
---
Lazy loading allows you to defer or delay the loading of images until they are needed or visible to the user instead of loading all the images on page load.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#f9c0a23a-9d66-4a80-bb4c-a4f2806ed1aa)
---
Another approach is to use the [intersection observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection%5FObserver%5FAPI), which is a web API that allows you to detect when an element enters or exists the viewport efficiently.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#a44706c9-5cce-4765-ac78-77efdca40a30)
---
Memoization in React is a technique used to optimize the performance of functional components by caching the results of expensive computations or function calls. It's particularly useful when dealing with computationally intensive or frequently called functions with the same input values, as it helps avoid redundant calculations and improves the overall efficiency of the application.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#051f1544-65d2-4eae-87c6-bb7f226c4fa7)
---
Below is an example on how to use the `React.memo` with a functional component:
```javascript
import React from 'react';
const Post = ({ signedIn, post }) => {
console.log('Rendering Post');
return (
{post.title}
{post.content}
{signedIn && Edit Post}
);
};
export default React.memo(Post);
```
In the code above, `Post` (functional component) depends on the `signedIn` and `post` props. By wrapping it with `React.memo()`, React will only re-render the `Post` component if either `signedIn` or `post` changes.
> [!note]
> You can memoize complete components to prevent re-renders if the props doesn't change, this use `React.memo()`, not the `useMemo()` hook
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#f0735f25-7bdf-4562-84cb-6f93f3a0b5a6)
---
The `useMemo()` hook optimizes performance by memoizing the result of a function call or an expensive computation. It caches the result and recalculates it only when the input values change.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#360c5717-251f-40d7-9dd8-24bccb26a59b)
---
The `useCallback()` hook in React is used to memoize a function instead of memoizing the function result. It is particularly useful when passing events as props to child components to prevent unnecessary re-renders.
`useCallback()` memoizes the function, ensuring it remains the same across re-renders as long as the dependencies haven't changed.
This is especially beneficial when passing functions as props to child components, preventing unnecessary re-renders.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#c01f0766-7401-44ae-9888-ee1da6d10ca7)
---
It's important to note that `useCallback` should be used sparingly and only for performance-critical parts of your application. Overusing `useCallback` can actually lead to worse performance due to the overhead of memoization itself. Always measure the performance impact before and after using `useCallback` to ensure it's having the desired effect.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#4292a582-b6cb-44e9-baff-3be6a127ed14)
---
Throttling in React is a technique used to limit the number of times a function or an event handler is invoked. It ensures that the function is called at a specified interval, preventing it from being executed too frequently.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#5e73fc50-7717-449d-a27f-f3bb87fd100f)
---
Debouncing, on the other hand, is also used to limit the number of times a function or an event handler is invoked. It ensures that the function is called only after a certain period of inactivity. Debouncing allows you to postpone the function call until the user has finished typing or a specific time has elapsed since the last event.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#2926578f-0a36-4acc-8c03-5d740981bb04)
---
// Debounce function to delay the searchAPI call const debounce = (func, delay) => {let timeoutId;return function (...args) { clearTimeout(timeoutId); timeoutId = setTimeout(() \=> { func(...args); }, delay); }; };
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#131255d3-029e-43c9-8c5e-0489e786e425)
---
Code splitting in React is a technique used to split a large JavaScript bundle into smaller, manageable chunks. It helps improve performance by loading only the necessary code for a specific part of an application rather than loading the entire bundle upfront.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#9f66f0bf-2185-499a-a4f1-591e5af60182)
---
In this example, `AsyncComponent` is a component that uses `lazy` and `Suspense` to perform code splitting. The `DynamicComponent` is dynamically imported using the import() syntax.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#aff44dd9-50f2-4ad2-8f93-d52e6ab0988d)
---
Web Workers serve as a solution to alleviate the burden on the main thread. They allow the execution of scripts in the background on a separate thread, distinct from the main JavaScript thread.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#16416227-0870-4503-a67d-76418223953a)
---
The `useTransition` hook in React plays a pivotal role in improving the performance of applications by allowing the marking of state updates as non-blocking transitions. This capability enables React to defer rendering for these updates, preventing UI blocking and enhancing overall responsiveness.
[source](https://omnivore.app/me/react-optimization-techniques-to-help-you-write-more-performant--18db03268c2#0622edf4-fa98-4848-aeee-174fa1cbde22)
---
## Original
![React Optimization Techniques to Help You Write More Performant Code](https://proxy-prod.omnivore-image-cache.app/2000x1333,sjdHfCDBz1P_bmEqEy9XMcgTCv4J-TX2BuonAzVYMZmk/https://www.freecodecamp.org/news/content/images/size/w2000/2024/02/pexels-howard-adams-575835--1-.jpg)
Performance optimization is a critical aspect of developing web applications. Users expect applications to load quickly and respond to their interactions smoothly.
In the React ecosystem, performance optimization techniques can significantly enhance the user experience by reducing load times and improving responsiveness.
In this article, we will discuss eight effective techniques for optimizing the performance of your React application.
## Table of Contents
1. [Why Performance Optimization is Important](#why-performance-optimization-is-important)
2. [List visualization](#list-visualization)
3. [Lazy Loading Images](#lazy-loading-images)
4. [Memoization](#memoization)
5. [Throttling and Debouncing Events](#throttling-and-debouncing-events)
6. [Code Splitting](#code-splitting)
7. [React Fragments](#react-fragments)
8. [Web Workers](#web-workers)
9. [UseTransition Hook](#usetransition-hook)
10. [Conclusion](#conclusion)
## Why Performance Optimization is Important
Optimizing the performance of your React application is crucial for several reasons:
* **Better User Experience:** A slow-loading or laggy application can lead to a poor user experience, negatively impacting your business. Users expect fast and responsive interactions, and performance optimization helps deliver that.
* **Improved SEO:** Search engines like Google consider page load times and overall performance when ranking websites. A well-optimized application will rank higher in search results, making it more visible to potential users.
* **Reduced Bounce Rates:** If your application takes too long to load or respond, users will likely leave and never return. By optimizing performance, you can reduce bounce rates and increase engagement.
* **Cost Savings** A performant application requires fewer resources (like servers and memory) to handle the same workload. This means lower hosting costs and reduced infrastructure needs.
* **Competitive Advantage:** A fast and efficient application sets you apart from competitors whose applications may be slower or less optimized. According to research by [Portent](https://www.portent.com/blog/analytics/research-site-speed-hurting-everyones-revenue.htm), a website that loads within one second has a conversion rate five times higher than a site that takes ten seconds to load. Therefore, ensuring your React applications perform well is crucial for retaining users and maintaining a competitive edge.
## 8 React Performance Optimization Techniques
Below are eight React performance optimization techniques you can use to speed up your applications.
### List visualization
==List visualization, or windowing, involves rendering only the items currently visible on the screen.==
When dealing with a large number of items in a list, rendering all the items at once can lead to slow performance and consume a significant amount of memory. List virtualization tackles this issue by rendering only a subset of the list items currently visible within the view, which conserves resources as the users scroll through the list.
The virtualization technique dynamically replaces rendered items with new ones, keeping the visible portion of the list updated and responsive. It efficiently allows you to render large lists or tabular data by only rendering the visible portion, recycling components as needed, and optimizing scroll performance.
There are different approaches to implementing list visualization in React, and one is using a popular library called [React Virtualized](https://www.npmjs.com/package/react-virtualized).
To install `react-virtualized`, you can use the following command:
```sql
npm install react-virtualized --save
```
After installing `react-virtualized`, you can import the required components and styles. Below is an example of how to use the `List` component to create a virtualized list:
```javascript
import React from 'react';
import { List } from 'react-virtualized';
import 'react-virtualized/styles.css'; // Import styles
// Your list data
const list = Array(5000).fill().map((_, index) => ({
id: index,
name: `Item ${index}`
}));
// Function to render each row
function rowRenderer({ index, key, style }) {
return (
<div key={key} style={style}>
{list[index].name}
</div>
);
}
// Main component
function MyVirtualizedList() {
return (
<List
width={300}
height={300}
rowCount={list.length}
rowHeight={20}
rowRenderer={rowRenderer}
/>
);
}
export default MyVirtualizedList;
```
In this example, `List` is the main component provided by `react-virtualized`. The `rowRenderer` function defines how each row should be rendered. The `width`, `height`, `rowCount`, `rowHeight`, and `rowRenderer` props are essential for configuring the list's behavior and appearance.
React applications can handle massive amounts of data by leveraging list virtualization without sacrificing performance or user experience.
### Lazy Loading Images
Similar to the list virtualization technique, lazy loading images prevents the creation of unnecessary DOM nodes, thereby boosting performance. Lazy loading allows you to defer or delay the loading of images until they are needed or visible to the user instead of loading all the images on page load.
The concept behind lazy loading is to initiate the load of a placeholder or a small low-resolution version of the image, typically a small-sized thumbnail or a blurred placeholder. As the user scrolls or interacts with the page, the actual image is loaded dynamically, replacing the placeholder when the user enters the viewport or when it becomes visible.
Lazy loading in React can be achieved using various libraries and techniques. One of the popular libraries is the [react-lazyload](https://www.npmjs.com/package/react-lazyload).
To install `react-lazyload`, you can use the following command:
```sql
npm install --save react-lazyload
```
Below is an example of a simple React component that uses `react-lazyload` to implement lazy loading for images:
```javascript
import React from 'react';
import LazyLoad from 'react-lazyload';
const MyLazyLoadedImage = ({ src, alt }) => {
return (
<LazyLoad height={200} offset={100}>
{/* The height and offset props control when the image should start loading */}
<img src={src} alt={alt} />
</LazyLoad>
);
};
export default MyLazyLoadedImage;
```
In this example, `MyLazyLoadedImage` uses the `LazyLoad` component from `react-lazyload`. The `height` prop specifies the height of the placeholder, and the `offset` prop determines how far below the viewport the placeholder should start loading.
==Another approach is to use the== ==[intersection observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection%5FObserver%5FAPI)====, which is a web API that allows you to detect when an element enters or exists the viewport efficiently.== Here's how we can use the Intersection Observer API along with the `useEffect` hook in React:
```javascript
import React, { useEffect, useRef } from 'react';
const IntersectionLazyLoad = ({ src, alt }) => {
const imageRef = useRef();
useEffect(() => {
const options = {
root: null, // Use the viewport as the root
rootMargin: '0px', // No margin around the root
threshold: 0.5, // 50% of the image should be visible
};
const observer = new IntersectionObserver(handleIntersection, options);
if (imageRef.current) {
observer.observe(imageRef.current);
}
return () => {
// Cleanup the observer when the component is unmounted
observer.disconnect();
};
}, []);
const handleIntersection = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
// Load the image when it becomes visible
imageRef.current.src = src;
imageRef.current.alt = alt;
}
});
};
return <img ref={imageRef} style={{ height: '200px' }} alt="Placeholder" />;
};
export default IntersectionLazyLoad;
```
In this example, `IntersectionLazyLoad` uses the Intersection Observer API to determine when the image becomes visible in the viewport.
By utilizing this API along with React `useEffect` hook, you can implement your custom lazy loading solution for images in React.
### Memoization
Memoization in React is a technique used to optimize the performance of functional components by caching the results of expensive computations or function calls. It's particularly useful when dealing with computationally intensive or frequently called functions with the same input values, as it helps avoid redundant calculations and improves the overall efficiency of the application.
In React, there are three techniques for memoization: `React.memo()`, `useMemo(),` and `useCallback().` Let's delve into the details for each:
#### How to use `React.memo()`
This higher-order component wraps purely functional components to prevent re-rendering if the received props remain unchanged.
By using `React.memo()`, the rendering result is cached based on props. If the props haven't changed since the last render, React reuses the previously rendered result instead of redoing the rendering process. This saves time and resources.
==Below is an example on how to use the== `==React====.====memo==` ==with a functional component:==
```javascript
import React from 'react';
const Post = ({ signedIn, post }) => {
console.log('Rendering Post');
return (
<div>
<h2>{post.title}</h2>
<p>{post.content}</p>
{signedIn && <button>Edit Post</button>}
</div>
);
};
export default React.memo(Post);
```
==In the code above,== `==Post==` ==(functional component) depends on the== `==signedIn==` ==and== `==post==` ==props. By wrapping it with== `==React====.====memo====()==`==, React will only re-render the== `==Post==` ==component if either== `==signedIn==` ==or== `==post==` ==changes.==
You can now use the memoized component like any other component in your application:
```javascript
import React, { useState } from 'react';
import Post from './Post';
const App = () => {
const [signedIn, setSignedIn] = useState(false);
const post = { title: 'Hello World', content: 'Welcome to my blog!' };
return (
<div>
<Post signedIn={signedIn} post={post} />
<button onClick={() => setSignedIn(!signedIn)}>
Toggle Signed In
</button>
</div>
);
};
export default App;
```
When you click the `Toggle Signed In` button, it will toggle the `signedIn` state. Since `Post` is wrapped with `React.memo()`, it will only re-render when the `signedIn` prop changes, thus saving rendering time and resources
#### How to use `useMemo()`
The `useMemo()` hook optimizes performance by memoizing the result of a function call or an expensive computation. It caches the result and recalculates it only when the input values change. Below is an example on how to use the `useMemo` hook in functional component:
```javascript
import React, { useMemo } from 'react';
function App() {
const [count, setCount] = React.useState(0);
const [otherState, setOtherState] = React.useState('');
const expensiveComputation = (num) => {
let i = 0;
while (i < 1000000000) i++;
return num * num;
};
const memoizedValue = useMemo(() => expensiveComputation(count), [count]);
return (
<div>
<p>Count: {count}</p>
<p>Square: {memoizedValue}</p>
<button onClick={() => setCount(count + 1)}>Increase Count</button>
<input type="text" onChange={(e) => setOtherState(e.target.value)} />
</div>
);
}
export default App;
```
In the code above, the `expensiveComputation` function simulates a resource-intensive operation, like squaring a number.
The `useMemo` hook is utilized to cache the result of this computation. The memoized value, stored in `memoizedValue`, is only recalculated when the `count` state changes, as `count` is specified as a dependency in the `useMemo` dependency array. Consequently, clicking the `Increase Count` button increments the `count` state, triggering a recalculation of the memoized value.
Conversely, changing the `otherState` via the input field does not prompt a recalculation, as `otherState` is not included in the `useMemo` dependency array.
#### How to use `useCallback()`
The `useCallback()` hook in React is used to memoize a function instead of memoizing the function result. It is particularly useful when passing events as props to child components to prevent unnecessary re-renders.
`useCallback()` memoizes the function, ensuring it remains the same across re-renders as long as the dependencies haven't changed.
This is especially beneficial when passing functions as props to child components, preventing unnecessary re-renders. It is often used with `React.memo()` to ensure child components do not re-render when unnecessary. Below is an exmple of how to use the `useCallback()` hook:
```javascript
import React, { useState, useCallback } from 'react';
const ParentComponent = () => {
const [count, setCount] = useState(0);
// Define a function that increments the count state
const incrementCount = () => {
setCount(count + 1);
};
// Memoize the incrementCount function using useCallback
const memoizedIncrement = useCallback(incrementCount, [count]);
return (
<div>
<p>Count: {count}</p>
<ChildComponent onIncrement={memoizedIncrement} />
</div>
);
};
const ChildComponent = React.memo(({ onIncrement }) => {
console.log('Child component rendered');
return (
<div>
<button onClick={onIncrement}>Increment Count</button>
</div>
);
});
export default ParentComponent;
```
In the code above, the `ParentComponent` is responsible for managing a state variable named `count` and introduces a function called `incrementCount`, which handles the incrementation of the count. Utilizing the `useCallback` hook, the `incrementCount` function is memoized, guaranteeing its stability across renders unless any of its dependencies, in this case, `count`, undergo changes.
On the other hand, the `ChildComponent` is a component nested within the parent. It receives the memoized `onIncrement` function from the parent as a prop.
To optimize performance and prevent unnecessary re-renders when the props remain constant, the `ChildComponent` is wrapped with `React.memo()`. This ensures that the child component will only re-render when its props, specifically the memoized function, experience changes, contributing to a more efficient rendering process.
==It's important to note that== `==useCallback==` ==should be used sparingly and only for performance-critical parts of your application. Overusing== `==useCallback==` ==can actually lead to worse performance due to the overhead of memoization itself. Always measure the performance impact before and after using== `==useCallback==` ==to ensure it's having the desired effect.==
### Throttling and Debouncing Events
Throttling in React is a technique used to limit the number of times a function or an event handler is invoked. It ensures that the function is called at a specified interval, preventing it from being executed too frequently.
Throttling allows you to control the rate at which the function is called by setting up a minimum time interval between each function invocation. If the function is called multiple times within that interval, only the first invocation is executed, and subsequent invocations are ignored until the interval elapses
Now, let's illustrate throttling with a code example. First, without t==hrottling:==
```javascript
// Without throttling, this function will be called every time the event is triggered
function handleResize() {
console.log('Window resized');
}
window.addEventListener('resize', handleResize);
```
==With throttling, we can limit how often the== `==handleResize==` ==function is called:==
```actionscript
// Throttling function
function throttle(func, delay) {
let lastCall = 0;
return function(...args) {
const now = new Date().getTime();
if (now - lastCall < delay) {
return;
}
lastCall = now;
func(...args);
};
}
// Throttled event handler
const throttledHandleResize = throttle(handleResize, 200);
window.addEventListener('resize', throttledHandleResize)
```
In this example, the `throttle` function wraps `handleResize` and ensures it's not called more often than every 200 milliseconds. If the `resize` event fires more frequently than that, the `handleResize` function will only be executed once every 200 milliseconds, reducing the potential for performance issues caused by rapid, repeated function calls
==Debouncing, on the other hand, is also used to limit the number of times a function or an event handler is invoked. It ensures that the function is called only after a certain period of inactivity. Debouncing allows you to postpone the function call until the user has finished typing or a specific time has elapsed since the last event.==
For example, imagine you have a search input field and want to trigger a search API request only when the user has finished typing for a certain duration, like `300ms`.
With debouncing, the search function will only be invoked after the user stops typing for` 300ms`. If the user continues typing within that interval, the function call will be delayed until the pause occurs. Without debouncing, the function will be called for every keystroke, potentially leading to excessive function calls and unnecessary computation. let's demonstrate with a code example:
```javascript
import React, { useState, useEffect } from 'react';
const SearchComponent = () => {
const [searchTerm, setSearchTerm] = useState('');
// Function to simulate a search API request
const searchAPI = (query) => {
console.log(`Searching for: ${query}`);
// In a real application, you would make an API request here
};
// Debounce function to delay the searchAPI call
const debounce = (func, delay) => {
let timeoutId;
return function (...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func(...args);
}, delay);
};
};
// Debounced search function
const debouncedSearch = debounce(searchAPI, 300);
// useEffect to watch for changes in searchTerm and trigger debouncedSearch
useEffect(() => {
debouncedSearch(searchTerm);
}, [searchTerm, debouncedSearch]);
// Event handler for the search input
const handleSearchChange = (event) => {
setSearchTerm(event.target.value);
};
return (
<div>
<label htmlFor="search">Search:</label>
<input
type="text"
id="search"
value={searchTerm}
onChange={handleSearchChange}
placeholder="Type to search..."
/>
</div>
);
};
export default SearchComponent;
```
With this setup, the `searchAPI` function will only be invoked after the user stops typing for 300ms, preventing excessive API requests and improving the overall performance of the search functionality.
### Code Splitting
Code splitting in React is a technique used to split a large JavaScript bundle into smaller, manageable chunks. It helps improve performance by loading only the necessary code for a specific part of an application rather than loading the entire bundle upfront.
When you develop a new React application, all your JavaScript code is typically bundled together into a single file. This file contains all the components, libraries, and other code required for your application to function. But as your application grows, the bundle size can become quite large, resulting in slow initial load times for your users.
Code splitting ==allows you to divide a single bundle into multiple chunks, which can be loaded selectively based on the current needs of your application. Instead of downloading the entire bundle upfront,== only the necessary code is fetched and executed when a user visits a particular page or triggers a specific action.
Below is a basic example of code splitting:
```javascript
// AsyncComponent.js
import React, { lazy, Suspense } from 'react';
const DynamicComponent = lazy(() => import('./DynamicComponent'));
const AsyncComponent = () => (
<Suspense fallback={<div>Loading...</div>}>
<DynamicComponent />
</Suspense>
);
export default AsyncComponent;
// DynamicComponent.js
import React from 'react';
const DynamicComponent = () => (
<div>
<p>This is a dynamically loaded component!</p>
</div>
);
export default DynamicComponent;
```
==In this example,== `==AsyncComponent==` ==is a component that uses== `==lazy==` ==and== `==Suspense==` ==to perform code splitting. The== `==DynamicComponent==` ==is dynamically imported using the import() syntax.==
When `AsyncComponent` is rendered, React will load `DynamicComponent` only when it is needed, reducing the initial bundle size and improving the application's performance. The fallback prop in Suspense specifies what to render while waiting for the dynamic import to resolve, providing a better user experience during the loading process.
### React Fragments
React Fragments are a feature introduced in [React 16.2](https://legacy.reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html) that allows you to group multiple elements together without adding an additional DOM node. This is particularly useful when you need to return multiple elements from a component's render method, but you don't want to introduce unnecessary DOM elements that could affect the layout or styles of your application.
Imagine you are arranging books on a bookshelf. Each book represents a React component, and the bookshelf represents the DOM.
Normally, if you have multiple books, you might want to group them together under a category label (analogous to a DOM element like a `<div>`). But sometimes you just want to place the books side by side without a label because the label itself doesn't hold any value and only takes up physical space.
React Fragments are like the option to arrange the books without a label, saving space and making the arrangement cleaner.
Here's an example of how to utilize React fragments:
```actionscript
import React from 'react';
function BookShelf() {
return (
<>
<Book title="React for Beginners" />
<Book title="Mastering Redux" />
<Book title="JavaScript Essentials" />
</>
);
}
function Book({ title }) {
return <li>{title}</li>;
}
export default BookShelf;
```
In this example, the `BookShelf` component returns a list of `Book` components without wrapping them in a `<div>` or other unnecessary DOM element. Instead, it uses the `<>` shorthand syntax for React Fragments.
This results in a cleaner DOM structure, which can improve the performance of your React application by reducing the number of elements that the browser has to process and render. Using fragments can also reduce unnecessary markup and contribute to a cleaner and more efficient render tree.
### Web Workers
JavaScript operates as a single-threaded application designed to handle synchronous tasks.
When a web page is being rendered, JavaScript executes multiple tasks, including manipulating DOM elements, managing UI interactions, handling API response data, and enabling CSS animations, all within a single thread. Despite its efficiency in managing these tasks, executing them in a single thread can sometimes lead to performance bottlenecks.
==Web Workers serve as a solution to alleviate the burden on the main thread. They allow the execution of scripts in the background on a separate thread, distinct from the main JavaScript thread.==
This separation enables the handling of computationally intensive tasks, execution of long-running operations, or management of tasks that might otherwise block the main thread. By doing so, Web Workers contribute to maintaining user interface responsiveness and overall application performance.
To use web worker in React, create a new JavaScript file that will contain the code for the worker thread:
```php
// worker.js
self.onmessage = function(event) {
var input = event.data;
var result = performHeavyComputation(input);
postMessage(result);
};
function performHeavyComputation(input) {
// Insert your heavy computation logic here
return input * 2; // Just a placeholder operation
}
```
In your React component, instantiate the Web Worker and establish a communication channel with it:
```javascript
import React, { useEffect, useRef } from 'react';
function MyComponent() {
const workerRef = useRef();
useEffect(() => {
// Initialize the worker
workerRef.current = new Worker('path-to-your-worker-file.js');
// Handle incoming messages from the worker
workerRef.current.onmessage = (event) => {
console.log('Message received from worker:', event.data);
};
// Cleanup the worker when the component unmounts
return () => {
workerRef.current.terminate();
};
}, []);
// Function to send a message to the worker
const sendMessageToWorker = (message) => {
workerRef.current.postMessage(message);
};
// Rest of your component
return (
// ...
);
}
```
In this example, a Web Worker is initialized in the `useEffect` hook and stored in a ref for future use. Messages from the worker are handled with an `onmessage` event listener, and the worker is terminated when the component is unmounted to clean up resources. The `sendMessageToWorker` function demonstrates how to communicate with the worker using `postMessage`
### UseTransition Hook
==The== `==useTransition==` ==hook in React plays a pivotal role in improving the performance of applications by allowing the marking of state updates as non-blocking transitions. This capability enables React to defer rendering for these updates, preventing UI blocking and enhancing overall responsiveness.==
When utilizing `useTransition,` state updates within the `startTransition` function are treated as low-priority transitions, susceptible to interruption by higher-priority state updates. So if a high-priority update occurs during a transition, React may prioritize finishing the high-priority update, interrupting the ongoing transition.
This non-blocking transition mechanism is valuable in preventing UI blocking during intensive operations such as data fetching or large-scale updates. By deferring the rendering of components associated with transition updates, React ensures that the user interface remains responsive even in scenarios where the UI might otherwise become unresponsive.
This example demonstrates the use of `useTransition` in a React component:
```javascript
import React, { useState, useTransition } from 'react';
function MyComponent() {
const [state, setState] = useState(initialState);
const [isPending, startTransition] = useTransition();
function handleClick() {
startTransition(() => {
setState(newState); // This state update is marked as a transition
});
}
return (
<>
{/* Your component JSX */}
<button onClick={handleClick}>Update State</button>
{isPending && <div>Loading...</div>}
</>
);
}
```
This example showcases how React avoids blocking the UI during transitions triggered by user actions, allowing for interruption if higher-priority state updates are detected.
Note that `useTransition` is part of the Concurrent Mode API, introduced in React 18 and later versions. As a powerful tool for altering the default behavior of state updates, make sure you use it with care, considering the specific implications of deferring rendering within the context of your application.
## Conclusion
Optimizing the performance of a React application involves a combination of strategies, from the fundamental understanding of React's diffing algorithm to leveraging built-in features and third-party tools.
By applying these techniques judiciously, you can create applications that are not only visually appealing but also performant, leading to a better overall user experience.
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,192 @@
---
id: a6c66f79-fd38-4d76-b05a-9c5d7dc9119f
title: |
Git Tips 1: Oldies but Goodies
status: ARCHIVED
tags:
- read-later
- dotfiles
- git
date_added: 2024-02-18 11:02:02
url_omnivore: |
https://omnivore.app/me/git-tips-1-oldies-but-goodies-18dbc861eae
url_original: |
https://blog.gitbutler.com/git-tips-1-theres-a-git-config-for-that/
---
# Git Tips 1: Oldies but Goodies
## Highlights
But there is also `--system` (which probably none of you have used) which writes it to a system-wide config file and `--local` (the default) that writes it to `.git/config` in whatever project you're currently in.
[source](https://omnivore.app/me/git-tips-1-oldies-but-goodies-18dbc861eae#4994949d-07aa-4baf-8b39-7b003dcc4487)
---
However, there is a _secret fourth_ place that Git can look. If you add to your global config something that looks like this:
```cs
[includeIf "gitdir:~/projects/oss"]
path = ~/.gitconfig-oss
```
Then Git will look in the `~/.gitconfig-oss` files for values _only if_ the project you are currently working in matches `~/projects/oss` . So, you could have a "work" directory and have work-specific values there (company email address, gpg signing key, etc) and an "oss" directory with values for your open source projects, etc.
[source](https://omnivore.app/me/git-tips-1-oldies-but-goodies-18dbc861eae#400065ab-ea9d-4b03-80c8-aec98b643a27)
---
One thing that is really not great about using blame in GUI tools is that the CLI has much more powerful tooling for finding something closer to the real story behind your code.
[source](https://omnivore.app/me/git-tips-1-oldies-but-goodies-18dbc861eae#60d94f0c-f71c-4e30-83d7-ed9d4ac07265)
---
Finally, if you're rebasing or cherry-picking a lot and you've ever run into the same conflict more than once, you can turn on a feature where Git memorizes the conflict and the resolution to it. If it ever sees that same conflict again, it will _automatically_ re-solve it for you.
You can easily turn it on with the config setting `rerere.enabled` and you can further ask it to automatically stage it for you with `rerere.autoUpdate`
```routeros
$ git config --global rerere.enabled true
$ git config --global rerere.autoUpdate true
```
[source](https://omnivore.app/me/git-tips-1-oldies-but-goodies-18dbc861eae#7e50290a-231d-4e52-9518-2e8ad22503cf)
---
## Original
![Git Tips 1: Oldies but Goodies](https://proxy-prod.omnivore-image-cache.app/0x0,sxYzn8TfPTv6_Cwa-Y2CFodsIFgz-ve4_5ZVswMWgFaU/https://blog.gitbutler.com/content/images/size/w500/2024/02/CleanShot-2024-02-08-at-15.54.15@2x.png)
Do you know some of the cool stuff in Git that's been around for a while? All the magical -L and -C options in the Git world? Let's find out!
For the first in our [short series of Git tips](https://blog.gitbutler.com/git-tips-and-tricks/), I wanted to start with stuff that's been around for a while, but it still seems like a lot of people don't know about or don't know how to use.
None of this is new, but I find them useful and they're arguably a little obscure. I'm just going to cover:
* [Conditional Configs](#conditional-configs)
* [Git Blame and Log with Line Ranges](#git-blame-and-log-with-line-ranges)
* [Git Blame with Following](https://blog.gitbutler.com/git-tips-1-theres-a-git-config-for-that/git-blame-with-following)
* [Word Diff](#word-diff)
* [Resolution Reuse](#reuse-recorded-resolution)
Let's dig in!
## Conditional Configs
Many of you probably know this, but Git has a cool little key/value store called `git config` which will check in three places for values to use when it's running various commands.
Every Git user will have [probably been told](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup?ref=blog.gitbutler.com) to run something like this when they first set up:
```routeros
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
```
That adds the `user.name` value to your `~.gitconfig` file. ==But there is also== `==--system==` ==(which probably none of you have used) which writes it to a system-wide config file and== `==--local==` ==(the default) that writes it to== `==.git/====config==` ==in whatever project you're currently in.==
When Git looks for a value, it will look in that order - local, global, system - for a definition.
==However, there is a== _==secret fourth==_ ==place that Git can look. If you add to your global config something that looks like this:==
```cs
[includeIf "gitdir:~/projects/oss"]
path = ~/.gitconfig-oss
```
==Then Git will look in the== `==~/.gitconfig-oss==` ==files for values== _==only if==_ ==the project you are currently working in matches== `==~====/projects/====oss==` ==. So, you could have a "work" directory and have work-specific values there (company email address, gpg signing key, etc) and an "oss" directory with values for your open source projects, etc.==
But `gitdir` is not the only filter you can use. You can also put _branch name_ specific values as a include filter with `onbranch` or you can only include config files if the project you are currently in has a remote matching a specific URL with `hasconfig:remote.*.url` . So like if you have GitHub org specific keys or something.
Check out [the docs](https://git-scm.com/docs/git-config?ref=blog.gitbutler.com#%5Fincludes) for more.
## Git Blame and Log with Line Ranges
There are a couple of interesting options that you can use with `git blame` that most people don't know about and nearly none of the existing GUIs implement.
One is the line range option, `-L`. A lot of times, if you're running blame on the command line, you just page the whole file and find the part you're looking for. However, if you want to just display a subsection of your file, you can give it a line range, like `git blame -L 28,43 path/to/file`
![](https://proxy-prod.omnivore-image-cache.app/2000x521,s-gI7WBL754ILzJIrAX--1643Ur5JnSBRuJhH1OIoSVk/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-06-at-15.17.13@2x.png)
git blame -L
You can also use a semi-strange `:` syntax to give Git a pattern to find the beginning of a block and only blame that block. So in this same situation, I can get the same result by running `git blame -L :'class LocalFile' gitbutler-ui/src/lib/vbranches/types.ts`
Typically you can use a function name or something for that string.
The _other_ thing you can do to see similar information in a different way, is to run `git log` with similar options. This will give you all the commits filtered to those that last touched this region of the file. So for example, `git log -L28,43:gitbutler-ui/src/lib/vbranches/types.ts` will give you something like this:
![](https://proxy-prod.omnivore-image-cache.app/1330x1554,s1UJYnXDDdzZCHCtQklZ7-TjA6hDYVdPC5VbLP8liK9s/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-06-at-16.42.55@2x.png)
So instead of being ordered by lines, it sort of gathers all the commits that are shown in the blame and then shows you those commits with code that modified that block in each commit. Basically the same data, but in a different format, more like a story of how that code was put together.
## Git Blame with Following
==One thing that is really not great about using blame in GUI tools is that the CLI has much more powerful tooling for finding something closer to the real story behind your code.==
There are many scenarios where this is really valuable. The first is ignoring whitespace changes. Some of the GUIs do that, but not all of them. So if you go and implement a `prettierrc` file, BLAM, now you're the owner of tons of lines of code. The `git blame -w` option will ignore these types of whitespace changes.
The other great option is `-C` which will look for code movement between files in a commit. So if you refactor a function from one file to another, the normal `git blame` will simply show you as the author in the new file, but the `-C` option will follow that movement and show the last person to actually change those lines of code. Either of these scenarios could be what you're looking for, but I would argue that more often it's the latter.
If you want Git to try even harder (look for movement in multiple commits or in _all_ of your commits) you can pass `-C` up to three times.
Also, your GUI _does not_ do this (most likely, I can't speak for all of them).
So, let's look at the VS Code GitLens blame output of the previous example:
![](https://proxy-prod.omnivore-image-cache.app/2000x592,sJ273c2NDlCitPAhifHX1YOXueBGDaERpAceyt8mJCaY/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-06-at-15.17.36@2x.png)
git blame in GitLens VS Code plugin
Ok, looks good. Kiril wrote most of this code it appears. Let's now look at the same block with `git blame -w -C -C -C`
![](https://proxy-prod.omnivore-image-cache.app/2000x502,syC33t00Kd2IdxqHirm_tueemYzBlfSNjnzjwqhanPd4/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-06-at-15.17.01@2x.png)
git blame -C -C -C
Now we can see that Git has followed this hunk of code from file to file over the course of multiple renames.
Also, Kiril only really owns a few lines of code, Mattias actually wrote big hunks of it. If we want to know about those lines, it's much better to ask Mattias rather than Kiril, as our GUI blame would suggest.
## Word Diff
This is incredibly minor, and some GUIs have nice versions of this (I find GitHub's better than what I'm about to show you, since it subtly does both) but if you _ARE_ running `git diff` on the command line and there is a line change where something small changed within it, you can change Git's default format to word-based rather than line based with the `--word-diff` option.
![](https://proxy-prod.omnivore-image-cache.app/1486x404,sqppS5EQzYWWKi-Y-3i2K_-fL090EekLjppG43Mst2qA/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-08.19.47@2x.png)
normal, line-based git diff
![](https://proxy-prod.omnivore-image-cache.app/1428x628,sNHm1bxMfK2e5r2nox_blv7vaKHj-6Lf3FOTYgeOkya8/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-08.19.28@2x.png)
super cool git diff --word-diff
## Reuse Recorded Resolution
==Finally, if you're rebasing or cherry-picking a lot and you've ever run into the same conflict more than once, you can turn on a feature where Git memorizes the conflict and the resolution to it. If it ever sees that same conflict again, it will== _==automatically==_ ==re-solve it for you.==
==You can easily turn it on with the config setting== `==rerere====.enabled==` ==and you can further ask it to automatically stage it for you with== `==rerere.====auto====Update==`
```routeros
$ git config --global rerere.enabled true
$ git config --global rerere.autoUpdate true
```
![](https://proxy-prod.omnivore-image-cache.app/1318x294,sX3LU-meJf_hU5ed2UJyHDxUFbVHUmP8ABem5jqgxwn4/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-08.21.07@2x.png)
a conflict... always remembers
Then, the next time you get a merge conflict that it's seen before, magic!
![](https://proxy-prod.omnivore-image-cache.app/1318x286,sW3jEfpz3Hik-ekQ2xOm_Vujx2Vk8MKKYqniW9WP3wo8/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-08.23.20@2x.png)
automatically fix it the next time
## Up Next
Again, all of this has been in Git for a while, but if you don't know... now you know.
Next up is [New Stuff in Git](https://blog.gitbutler.com/git-tips-2-new-stuff-in-git/).
### Subscribe to new posts.

View file

@ -0,0 +1,208 @@
---
id: 3811e8c9-49ed-47bc-8302-d7dc0529d828
title: |
Git Tips 2: New Stuff in Git
status: ARCHIVED
tags:
- read-later
- dotfiles
- git
date_added: 2024-02-18 11:02:19
url_omnivore: |
https://omnivore.app/me/git-tips-2-new-stuff-in-git-18dbc865f77
url_original: |
https://blog.gitbutler.com/git-tips-2-new-stuff-in-git/
---
# Git Tips 2: New Stuff in Git
## Highlights
So, Git has created a new force pushing option called `--force-with-lease` that will essentially check that what you last pushed is still what's on the server before it will force the new branch update.
[source](https://omnivore.app/me/git-tips-2-new-stuff-in-git-18dbc865f77#303433c7-6c8d-45df-b8ae-729aa598255b)
---
It's pretty easy to do. Just set `gpg.format` to `ssh` and tell it where your signing key is:
```routeros
$ git config gpg.format ssh
$ git config user.signingKey ~/.ssh/id_rsa.pub
```
Now if you run `git commit -S` it will try to sign your commit with this key. If it succeeds and you upload that public key to GitHub here (under "Signing Keys"), then you'll get pretty "verified" badges on your commits:
[source](https://omnivore.app/me/git-tips-2-new-stuff-in-git-18dbc865f77#6870b9f8-0e0c-4a26-8d4e-b0dd630f7260)
---
provides a way to add cronjobs that run daily, hourly and weekly maintenance tasks on your Git repositories.
You can turn it on for your Git repository by simply running:
```crmsh
$ git maintenance start
```
[source](https://omnivore.app/me/git-tips-2-new-stuff-in-git-18dbc865f77#0a2d2271-21f5-46e5-8f83-8fd08a82e25c)
---
This means that every hour it will rebuild your commit graph and do a prefetch (we will cover these concepts in the next post), and once per day it will clean up loose objects and put them in pack-files and also repack the object directory using the `multi-pack-index` feature (read more about that in an incredible blog post from GitHub's Taylor Blau [here](https://github.blog/2021-04-29-scaling-monorepo-maintenance/?ref=blog.gitbutler.com#multi-pack-indexes)).
Basically it will just make lots of things faster in the background all the time automatically.
[source](https://omnivore.app/me/git-tips-2-new-stuff-in-git-18dbc865f77#cdd9aacf-451b-4437-9976-61dcbc1322aa)
---
## Original
![Git Tips 2: New Stuff in Git](https://proxy-prod.omnivore-image-cache.app/0x0,sF_8YxOLhNs5ye8q29KVmP2HYhguriXQ9k9yHwAsrFhg/https://blog.gitbutler.com/content/images/size/w500/2024/02/CleanShot-2024-02-08-at-15.55.24@2x.png)
There are a bunch of new tricks that Git can do that were added in the last few years. How up to date are you?
Next up in our [3 part series](https://blog.gitbutler.com/git-tips-and-tricks/) on "Stuff you may not know about Git", we have **New Stuff**!
Here I'm going to cover 5 relatively new things in Git that you may not have heard about, because _why would you_?
We'll cover:
* [Git Branch Stuff](#some-git-branch-stuff)
* [Safe Force Pushing](#safe-force-pushing)
* [SSH Commit Signing](#ssh-commit-signing)
* [Push Signing](#push-signing)
* [Git Maintenance](#git-maintenance)
Let's dig in!
## Some Git Branch Stuff
This is pretty minor, but one thing that's always bugged me about Git is that I run `git branch` a lot to view what branches I have, but they're in the dumbest possible order (alphabetic) and there are a million of them after a while.
At some point I started naming my branches in a way to partially cope with this. Every branch would be something like `sc-0831-my-thing` meaning that the branch topic was "my thing", it was created on August 31st and the `sc` are my initials so I can group them by whose branch. It's a lot of stupid metadata to try to cram into a branch name just because of how it's listed.
However, now we can ask Git to do two things that help with this. We can ask it to sort by `objectsize`, `authordate`, `committerdate`, `creatordate`, or `taggerdate` with the `--sort` option and we can set it as a default with the `branch.sort` config setting.
So for example, if I want to sort by last commit date descending, I can run:
```routeros
$ git config --global branch.sort -committerdate
```
And now the default will show the branch that I last committed to at the top.
💡
Important note: the `-committerdate` has a leading `-` but __not_ a double dash. It's just a negative. I've seen people mess this up and then things break.
However, now if I have a bunch of branches, that will scroll off the screen. Sad. But now Git also has a way to take a list of branches and try to split it into columns to make better use of the screen real estate. You can do this either with the new `--column` option, or with the `column.ui` setting.
Check it out:
![](https://proxy-prod.omnivore-image-cache.app/2000x1124,sqLOqa3Y2phwi1xtcXNMFJVLI70rNK_SePOKKJItmLlU/https://blog.gitbutler.com/content/images/2024/02/image-1.png)
Nice sorted columns for my branch output
As another sort of funny thing, in order to help with this, Git implemented it's own list to column terminal command that is sort of completely independent of anything else in Git and is it's own command called `git column`.
![](https://proxy-prod.omnivore-image-cache.app/2000x1125,sF46gm3RYU0kuv5FXNGOjwci1KTyAyEyftNPkRV8gZfg/https://blog.gitbutler.com/content/images/2024/02/image-2.png)
Just in case there is anything else you need to convert into columns that isn't Git related.
## Safe Force Pushing
The next interesting thing that Git has added somewhat recently is a way to do much safer forced pushes.
Generally most of us don't love doing forced pushes, because there is always a chance that you're overwriting someone else's commits. Let's take a scenario:
* You commit and push something to GitHub
* Someone else pulls it down, commits something and pushes it back up.
* You amend a commit, rewriting the history, and force push it, not knowing that anyone had based something off your work.
* This effectively removes what the other person had done.
What you really want to do is check to see if anyone else had pushed and only force push if the answer is no. However, there is always a bit of a race condition here because even if you check first, in the second it takes you to then push, something else could have landed from elsewhere in the meantime.
==So, Git has created a new force pushing option called== `==--====force====-====with====-lease==` ==that will essentially check that what you last pushed is still what's on the server before it will force the new branch update.==
![](https://proxy-prod.omnivore-image-cache.app/674x132,s3pd3boc6BtJmq1-zdkMXpkKuEGQno46qKULKU0RWmQM/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-10.15.11@2x.png)
A failed --force-with-lease push
If someone has updated the remote ref (pushed in the meantime), then push now fails with a "stale info" error.
If you're amending and rebasing stuff a lot, it may be worth setting up a nice little alias for this, because it's almost _always_ better than running `--force`
```routeros
$ git config --global alias.fpush push --force-with-lease
```
May the force be with you.
## Commit Signing with SSH
We [wrote about this](https://blog.gitbutler.com/signing-commits-in-git-explained/) a few months ago in mind-numbing detail, because the GitButler client does this automatically for you with the flip of a config setting, but if you want to do this on the command line, read on.
Git has supported signing your commits with GPG for a while, but GPG is often pretty difficult to get working properly and completely understand if you've never used it before. Recently, OpenSSH provided a new way to sign data using your existing SSH key and Git has integrated this as an option to use instead of GPG to do the same thing. Also, importantly, GitHub and GitLab support verifying these signatures if you upload your public signing key to your user account there.
==It's pretty easy to do. Just set== `==gpg====.format==` ==to== `==ssh==` ==and tell it where your signing key is:==
```routeros
$ git config gpg.format ssh
$ git config user.signingKey ~/.ssh/id_rsa.pub
```
==Now if you run== `==git commit -S==` ==it will try to sign your commit with this key. If it succeeds and you upload that public key to GitHub here (under "Signing Keys"), then you'll get pretty "verified" badges on your commits:==
![](https://proxy-prod.omnivore-image-cache.app/2000x500,sKtX9g8YhqvINuvCorwsyVI4voymwk0MnSrd-FI_pCb8/https://blog.gitbutler.com/content/images/2024/02/s_E036A4CDB1CAE14FC00AF40FA13C8C8B49781C4FDF6B604EA9B3BFCD9F34B628_1695546510881_CleanShot-2023-09-24-at-11.08.142x.png)
Stay vigilant.
## Push Signing
I won't go into a ton of detail here because this isn't really widely used, but it might be interesting to some. Git can also now sign _pushes_, not just commits.
Since none of the major Git hosting solutions (GitHub, GitLab, Bitbucket) support this, it's only really possible to do this if you run your own server. However, if you do, you can run `git push --signed` in order to sign the ref update on the server and have the server save a transparency log with verifiable signatures somewhere.
If you're interested in this, there is a very nice [writeup](https://people.kernel.org/monsieuricon/signed-git-pushes?ref=blog.gitbutler.com) by over at kernel.org.
Push it real good.
## Git Maintenance
The final fun new thing I'll cover is `git maintenance`.
The maintenance command was introduced in Git 2.30 I believe. It essentially ==provides a way to add cronjobs that run daily, hourly and weekly maintenance tasks on your Git repositories.==
==You can turn it on for your Git repository by simply running:==
```crmsh
$ git maintenance start
```
This will modify your `.git/config` file to add a `maintenance.strategy` value set to `incremental` which is a shorthand for the following values:
* `gc`: disabled.
* `commit-graph`: hourly.
* `prefetch`: hourly.
* `loose-objects`: daily.
* `incremental-repack`: daily.
==This means that every hour it will rebuild your commit graph and do a prefetch (we will cover these concepts in the next post), and once per day it will clean up loose objects and put them in pack-files and also repack the object directory using the== `==multi-====pack====-====index==` ==feature (read more about that in an incredible blog post from GitHub's Taylor Blau== ==[here](https://github.blog/2021-04-29-scaling-monorepo-maintenance/?ref=blog.gitbutler.com#multi-pack-indexes)====).==
==Basically it will just make lots of things faster in the background all the time automatically.==
Git maintenance will schedule these cron jobs differently depending on the operating system. On Mac it will add some LaunchAgents like this:
![](https://proxy-prod.omnivore-image-cache.app/1950x1180,sDgXunpWspBACKspfJeXdbbBlnTVlZ9qqNhma8sMspeI/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-10.52.26@2x.png)
If you're curious what these plist files look like, it's something like this:
![](https://proxy-prod.omnivore-image-cache.app/2000x1201,sutSoVq9csWlbPbrG3dZPjQ6roru0PmhM-Y5CjVgzgg8/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-10.52.02@2x.png)
You can read more about git maintenance and it's various options [here](https://git-scm.com/docs/git-maintenance?ref=blog.gitbutler.com).
OK, now onto our next post where we cover those commit graph and prefetching topics. Let's get into [Really Big Repositories](https://blog.gitbutler.com/git-tips-3-really-large-repositories/).
### Subscribe to new posts.

View file

@ -0,0 +1,300 @@
---
id: 0f04cdaa-c871-4ba1-a882-7aecf65a2505
title: |
Git Tips 3: Really Large Repositories
status: ARCHIVED
tags:
- read-later
- dotfiles
- git
date_added: 2024-02-18 11:02:27
url_omnivore: |
https://omnivore.app/me/git-tips-3-really-large-repositories-18dbc867c96
url_original: |
https://blog.gitbutler.com/git-tips-3-really-large-repositories/
---
# Git Tips 3: Really Large Repositories
## Highlights
Git has had shallow clones. You could almost always run something like `git clone --depth=1` to get only the last commit and the objects it needs and then `git fetch --unshallow` to get the rest of the history later if needed. But it did break lots of things. You can't `blame`, you can't `log`, etc.
[source](https://omnivore.app/me/git-tips-3-really-large-repositories-18dbc867c96#d319f349-d2ea-4aed-9558-d67e4b708d74)
---
If you want to do a blobless clone, you just pass `--filter=blob:none`
[source](https://omnivore.app/me/git-tips-3-really-large-repositories-18dbc867c96#d296df77-d1f6-4a1b-99c6-9716824f2ee2)
---
If each of those subdirectories was huge, this could be annoying to manage. Instead, we can use sparse checkouts to filter the checkouts to just specified directories.
To do this, we run `git sparse-checkout set [dir1] [dir2] ...`
[source](https://omnivore.app/me/git-tips-3-really-large-repositories-18dbc867c96#d92785cc-9dde-46f8-9764-af2195722289)
---
[Scalar](https://git-scm.com/docs/scalar?ref=blog.gitbutler.com) is mostly just used to clone with the correct defaults and config settings (blobless clone, no checkout by default, setting up maintenance properly, etc).
[source](https://omnivore.app/me/git-tips-3-really-large-repositories-18dbc867c96#96d0ab7b-1bf9-4b10-a08a-3d13c01bf56c)
---
## Original
![Git Tips 3: Really Large Repositories](https://proxy-prod.omnivore-image-cache.app/0x0,siZlz2SPUjb175XwxdyoxP42iDGrPNR_i-XDguj36PyY/https://blog.gitbutler.com/content/images/size/w500/2024/02/CleanShot-2024-02-08-at-15.55.00@2x.png)
Did you know that Git can handle enormous monorepos like Windows? Let's take a look at how.
In our third and final section of our [Git Tips series](https://blog.gitbutler.com/git-tips-and-tricks/), we're going to talk about how well Git now handles **very large** repositories and monorepos.
Do you want to use vanilla Git today to manage a 300GB repo of 3.5M files receiving a push every 20 seconds from 4000 developers without problems? **Read on!**
Here is our blog agenda. Our blogenda.
* [Prefetching](#prefetching)
* [Commit Graph](#commit-graph)
* [Filesystem Monitor](#filesystem-monitor)
* [Partial Cloning](#partial-cloning)
* [Sparse Checkouts](#sparse-checkouts)
* [Scalar](#scalar)
## First, Let's Thank Windows
Before we get started though, the first thing we have to do is thank Microsoft for nearly all of this.
In 2017, Microsoft successfully moved the Windows codebase to Git. Brian Harry wrote a really great blog post about it called [The Largest Git Repo on the Planet](https://devblogs.microsoft.com/bharry/the-largest-git-repo-on-the-planet/?ref=blog.gitbutler.com) that you should read if you're interested, but the size and scope of this repository is astounding.
* **3.5M** files
* for reference, the Linux kernel is about 80k files, or 2% of that
* **300GB** repository (vs \~4.5G Linux kernel)
* **4,000** active developers
* **8,421** pushes per day (on average)
* **4,352** active topic branches
In order to get that to work in any possible way, Microsoft had a lot of work to do. With vanilla Git at that time, a lot of commands (ie, `git status`) would take hours if they ever finished at all. They needed to make every command close to as fast as Source Depot was.
The first solution to this problem was a new project called [VFS for Git](https://github.com/microsoft/VFSForGit?ref=blog.gitbutler.com) which was a virtual filesystem layer that did virtual checkouts and then requested files from a central server on demand.
Eventually they moved more and more of the solutions they developed to the [Scalar](https://github.com/microsoft/scalar?ref=blog.gitbutler.com) project, which got rid of the virtualization layer, and would instead request file contents on checkout rather than on demand.
Then they moved everything, piece by piece, into the [Microsoft Git](https://github.com/microsoft/git?ref=blog.gitbutler.com) fork and then finally every part of _that_ was moved into [core Git](https://git-scm.com/docs/scalar?ref=blog.gitbutler.com).
So, as promised, if you want to use Git out of the box today to manage a 300GB repo of 3.5M files receiving a push every 20 seconds from 4000 developers, you can _100%_ do so.
Let's get into everything they added for us.
## Prefetching
So, in the last blog post I talked about how running `git maintenance` on a repository will run prefetching and maintain your commit graph every hour. Let's cover the first of those. What is "prefetching"?
One of the things that the Windows devs found annoying was that fetches would often be slow because there was _so much_ activity going on all the time. Whenever they would fetch, they have to get _all_ the data since whatever the last time they manually fetched.
So in the cronjob, they added something called "prefetching", which will essentially run a fetch command every hour automatically for you.
However, it does not update your remote references like it normally would, instead it populates a special `refs/prefetch` area of your references.
![](https://proxy-prod.omnivore-image-cache.app/2000x1124,s5PGJtd3NbLb1LIeeq_YWX0VJY09p-71Zf0LwHdEMMsg/https://blog.gitbutler.com/content/images/2024/02/image-3.png)
These references aren't shown normally, even if you run something like `git log --all`, they are quite hidden from you. However, they are used in the remote server negotiation, which means that if you have this turned on, whenever you go to fetch, your computer is never more than 1 hour of pushes behind, data-wise.
Basically it makes manual fetches fast.
![](https://proxy-prod.omnivore-image-cache.app/1596x888,sb4Lbt2QVISxOxom_DRM5UVNMt1lEn4ZkkAm8Cl062eg/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-14.41.05@2x.png)
Joke stolen from Martin Woodward :)
## Commit Graph
The other thing that `git maintenance` does every hour is update your commit graph data. What does that mean exactly?
Well, essentially, it makes walking your commit history faster.
Instead of opening up one commit object at a time to see what it's parent is, then opening up that object to see what it's parent is, etc, the commit graph is basically an index of all that information that can be quickly read in one go. This makes things like `git log --graph` or `git branch --contains` much, much faster. For most repositories this probably isn't a horrible problem, but when you start getting into millions of commits, it makes a huge difference.
Here's a benchmark of some log related subcommands run on the Linux kernel codebase with and without the commit graph data (from the [GitHub blog](https://github.blog/2022-08-30-gits-database-internals-ii-commit-history-queries/?ref=blog.gitbutler.com#the-commit-graph))
| **Command** | **Withoutcommit-graph** | **Withcommit-graph** |
| ------------------------- | ----------------------- | -------------------- |
| git rev-list v5.19 | 6.94s | 0.98s |
| git rev-list v5.0..v5.19 | 2.51s | 0.30s |
| git merge-base v5.0 v5.19 | 2.59s | 0.24s |
Here is a quick test that I did on the same Linux repo running `git log --graph --oneline` before and after writing a commit graph file.
![](https://proxy-prod.omnivore-image-cache.app/2000x1097,sTzCPFXduXYtUdrHYMfcLWmrV9-98RbuoCIsu4c0788Q/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-14.52.44@2x.png)
Again, if you have your `maintenance` cron jobs running, this is just magically done for you constantly, you don't really have to do anything explicit.
## Filesystem Monitor
One of the things that VFS for Git needed was a filesystem monitor so that it could detect when virtual file contents were being requested and fetch them from a central server if needed.
This monitor was eventually utilized to speed up the `git status` command by updating the index based on filesystem modification events rather than running `stat` on every file, every time when you run it.
While the former became unnecessary when the virtualization layer was abandoned, the latter was integrated into Git core. If you want much, much faster `git status` runs for very large working directories, the new Git filesystem monitor is a lifesaver.
Basically you just set these config settings:
```routeros
$ git config core.fsmonitor true
```
What this will do is add a setting that the `git status` command will see when it runs, indicating that it should be using the [fsmonitor-daemon](https://git-scm.com/docs/git-fsmonitor--daemon?ref=blog.gitbutler.com). If this daemon is not running, it will start it.
![](https://proxy-prod.omnivore-image-cache.app/2000x1183,sygera0cWIyNzCE8oYQ1maIUOqQuX7xqwA9VIR7-NzmI/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-14.59.36@2x.png)
fsmonitor on Chromium makes status 20x faster
So, the first time you run `status` after setting the config setting, it won't be much faster. But every time after that it will be massively faster.
Again, there's nothing really to explicitly do after setting the value, things just get faster.
## Partial Cloning
Another big issue with large repositories is clone size. As you probably know, by default Git will fetch everything. You don't even need to have a 300GB repository for this to be a problem. [Linux](https://github.com/torvalds/linux?ref=blog.gitbutler.com) is over 4GB, [Chromium](https://github.com/chromium/chromium?ref=blog.gitbutler.com) is over 20GB. A full Chromium clone can easily take an hour, even over a pretty fast connection.
Now, for a long time ==Git has had shallow clones. You could almost always run something like== `==git== ==clone== ==--depth=========1==` ==to get only the last commit and the objects it needs and then== `==git== ==fetch== ==--unshallow==` ==to get the rest of the history later if needed. But it did break lots of things. You can't== `==blame==`==, you can't== `==log==`==, etc.==
However, now Git has both blobless and treeless clones. So you do get the whole history (all of the commits), but you don't locally have the actual content. Let's ignore the treeless clones for now because it's not generally recommended, but the blobless clone is.
![](https://proxy-prod.omnivore-image-cache.app/2000x841,s5O63kDCQr5bDr0tglWOF_SKPPIWXMui5ZnxgxZCTCTU/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-15.12.29@2x.png)
A full clone of the Linux repository is 4.6G, or (for me) a 20 min process
==If you want to do a blobless clone, you just pass== `==--filter=====blob:none==`
This will change the process a little. It will download all the commits and trees, which in the case of cloning the Linux kernel reduces 4.6G to 1.4G, and it will then do a _second_ object fetch for just the blobs that it needs in order to populate the checkout.
![](https://proxy-prod.omnivore-image-cache.app/2000x949,shA_6-2W1enm5l40LjCQ2iZ15sTdVVB7NVv3Qjmiv-O0/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-15.14.06@2x.png)
So you can see that instead of 20 minutes for the clone, it took me 4.5 minutes. You can also see that it did two fetches, one for the 1.4GBs of commit and tree data, and a second for the 243MB of files it needs for my local checkout.
Now, there are downsides to this too. If you want to run a command that needs data that is not there, Git will have to go back to the server and request those objects. Luckily, it does this on-demand as it needs the objects, but it can make something like `blame` do a bunch of roundtrips.
![](https://proxy-prod.omnivore-image-cache.app/2000x1130,sQnjRfPMnR0N-snkIfA9TVQUCVl8twPR_ReMNUGlvA_o/https://blog.gitbutler.com/content/images/2024/02/CleanShot-2024-02-08-at-15.17.14@2x.png)
round and round we go
In the case of Linux, my tests showed that a normal file blame might take 4 seconds now takes 45 seconds. But that's only the first time you need to do it.
## Sparse Checkouts
The last big thing to look at is not only useful for large repositories, but specifically for monorepos. That is, repositories that contain multiple projects in subdirectories.
For example, at GitButler, our web services are in a monorepo, with each service we run on AWS in a subdirectory.
```reasonml
tree -L 1
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── auth-proxy
├── butler
├── chain
├── check.rb
├── copilot
└── git
6 directories, 4 files
```
==If each of those subdirectories was huge, this could be annoying to manage. Instead, we can use sparse checkouts to filter the checkouts to just specified directories.==
==To do this, we run== `==git== ==sparse-checkout== ==set [dir1] [dir2] ...==`
```smali
git sparse-checkout set butler copilot
tree -L 1
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── butler
├── check.rb
└── copilot
```
So we still have the top level files, but only the two subdirectories that we specified. This is called "cone mode" and tends to be pretty fast. It also makes `status` and related commands faster because there are fewer files to care about. You can also however, set patterns rather than subdirectories, but it's more complicated.
Here's a local test I did with the Chromium repository:
```sql
time git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
real 0m5.931s
git sparse-checkout set build base
time git status
On branch main
Your branch is up to date with 'origin/main'.
You are in a sparse checkout with 2% of tracked files present.
nothing to commit, working tree clean
real 0m0.386s
```
This is without the `fsmonitor` stuff. You can see that `status` went from 6 seconds to run down to 0.3 seconds because there just aren't as many files.
If you're using large monorepos, this means you can do a blobless clone to have a much smaller local database (you can also run `clone --no-checkout` to skip the initial checkout), then do a `sparse-checkout` to filter to the directories you need and everything is massively faster.
## Scalar
Finally, Git now (since Oct 2022, Git 2.38) ships with an _alternative_ command line invocation that wraps some of this stuff.
This command is called `scalar`. Just go ahead and type it:
```fsharp
scalar
usage: scalar [-C <directory>] [-c <key>=<value>] <command> [<options>]
Commands:
clone
list
register
unregister
run
reconfigure
delete
help
version
diagnose
```
==[Scalar](https://git-scm.com/docs/scalar?ref=blog.gitbutler.com)== ==is mostly just used to clone with the correct defaults and config settings (blobless clone, no checkout by default, setting up maintenance properly, etc).==
If you are managing large repositories, cloning with this negates the need to run `git maintenance start` and send the `--no-checkout` command and remember `--filter=tree:0` and whatnot.
Now you're ready to scale! ...-ar.
## Some More Reading
If you want to read about all of this in great detail, GitHub has done an amazing job covering lots of this too:
* [The Commit Graph](https://github.blog/2022-08-30-gits-database-internals-ii-commit-history-queries/?ref=blog.gitbutler.com#the-commit-graph)
* [Sparse checkout](https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/?ref=blog.gitbutler.com)
* [Filesystem Monitor](https://github.blog/2022-06-29-improve-git-monorepo-performance-with-a-file-system-monitor/?ref=blog.gitbutler.com)
* [Sparse index](https://github.blog/2021-11-10-make-your-monorepo-feel-small-with-gits-sparse-index/?ref=blog.gitbutler.com)
* [Partial and shallow clone](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/?ref=blog.gitbutler.com)
* [The Story of Scalar](https://github.blog/2022-10-13-the-story-of-scalar/?ref=blog.gitbutler.com)
There is also a ton more fascinating information on this from [Derrick Stolee](https://stolee.dev/?ref=blog.gitbutler.com), who did a lot of work on these projects.
Ok, that's it for our Git Tips series! Hope you enjoyed it and let us know in Discord if you have any questions or comments, or would like to see us do any other topics in Git land.
Thanks!
### Subscribe to new posts.

View file

@ -0,0 +1,462 @@
---
id: 75f0d58e-d13c-11ee-abe1-23b9fd5ced9a
title: |
How to Use the JavaScript Map and Set Objects Explained with Code Examples
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-02-21 18:39:50
url_omnivore: |
https://omnivore.app/me/how-to-use-the-java-script-map-and-set-objects-explained-with-co-18dcf1d24bb
url_original: |
https://www.freecodecamp.org/news/javascript-map-and-set-objects-explained/
---
# How to Use the JavaScript Map and Set Objects Explained with Code Examples
## Highlights
Under the hood, the `Map` object performs better when you need to add and remove keys, so you might consider using it when your data changes frequently.
Also, the Map object has many useful methods for data manipulation, such as `has()` to see if the Map contains a specific key, `keys()` to get all keys defined in the `Map`, `values` to get all values, and `entries()` to get all key/value pairs.
[source](https://omnivore.app/me/how-to-use-the-java-script-map-and-set-objects-explained-with-co-18dcf1d24bb#9c807b39-b9c0-49de-895e-1d7f6b095ab4)
---
The `Set` object allows you to store a collection of elements, just like an Array. The differences between a `Set` and an array are:
* A `Set` requires all elements to be unique
* A `Set` has fewer methods for data manipulation
[source](https://omnivore.app/me/how-to-use-the-java-script-map-and-set-objects-explained-with-co-18dcf1d24bb#52f87526-14bc-40fb-b821-493da97dd7e3)
---
Aside from the regular methods above, `Set` also has composition methods that you can use to perform various set theory operations such as difference, union, and intersection.
[source](https://omnivore.app/me/how-to-use-the-java-script-map-and-set-objects-explained-with-co-18dcf1d24bb#cb2eebdd-f9f4-4a83-b298-f65c5556f842)
---
## Original
![How to Use the JavaScript Map and Set Objects Explained with Code Examples](https://proxy-prod.omnivore-image-cache.app/1280x720,sp6PB7t-iiwqHUxBcJgrDBxMVwkBEE45zHsnUKE3V87c/https://www.freecodecamp.org/news/content/images/size/w2000/2024/02/javascript-mat-and-set-objects-introduction.png)
Map and Set are two JavaScript data structures you can use to store a collection of values, similar to Objects and Arrays. They are specialized data structures that can help you store and manipulate related values.
In this tutorial, we will see how Map and Set work in detail and when to use them. We will also explore the Set object composition methods that were recently added to the JavaScript standard.
## Table of Contents
* [The Map Object Explained](#the-map-object-explained)
* [How to Create a Map Object](#how-to-create-a-map-object)
* [Map Object Methods and Properties](#map-object-methods-and-properties)
* [Other Ways to Create a Map Object](#other-ways-to-create-a-map-object)
* [Iterate Over Map Object Data](#iterate-over-map-object-data)
* [When to Use the Map Object](#when-to-use-the-map-object)
* [Set Object Explained](#set-object-explained)
* [How to create a Set Object](#how-to-create-a-set-object)
* [Set Object Methods and Properties](#set-object-methods-and-properties)
* [Set Composition Methods](#set-composition-methods)
* [Iterate Over a Set Object](#iterate-over-a-set-object)
* [When to Use the Set Object](#when-to-use-the-set-object)
* [Conclusion](#conclusion)
## The Map Object Explained
The `Map` object stores data in a key/value pair structure, just like an Object. The main differences between a regular object and a `Map` are:
* A `Map` can have any type of data as the key value
* A `Map` maintains the order of data added to the object
### How to Create a Map Object
To create a `Map` object, you can call the `Map()` constructor as follows:
```dart
const myMap = new Map();
```
Create a Map object in JavaScript
The code above creates a new empty `Map` object.
### Map Object Methods and Properties
A `Map` object has the following methods and properties:
* `set(key, value)` Adds a key/value pair to a Map
* `get(key)` Retrieves a value from a Map (returns `undefined` if key doesn't exist)
* `has(key)` Checks if a Map has a specific key
* `delete(key)` Removes a specific key from a Map
* `clear()` Removes all items from a Map
* `keys()` Returns all keys in a Map
* `values()` Returns all values in a Map
* `entries()` Returns all keys and values in a Map
* `size` Returns the number of items in Map
To insert data into the `Map` object, you can use the `set()` method:
```dart
const myMap = new Map();
myMap.set(1, 'Jack');
myMap.set(2, 'Jill');
myMap.set('animal', 'Elephant');
```
Inserting values to the Map object
The code above creates a `Map` object with 3 entries as follows:
```dart
Map(3)
0: {1 => "Jack"}
1: {2 => "Jill"}
2: {"animal" => "Elephant"}
```
The Map object entries
To retrieve a value from the `Map` object, you need to use the `get()` method and pass the key as its argument:
```livecodeserver
console.log(myMap.get(1)); // Jack
console.log(myMap.get('animal')); // Elephant
```
Retrieving Map object values
To see how many key/value pairs a `Map` has, you can access the `size` property:
```arduino
myMap.size; // 3
```
Accessing the Map.size property
To see if a certain key exists in a `Map` object, you can use the `has()` method. See the example below:
```angelscript
myMap.has(1); // true
myMap.has(10); // false
```
Using the Map.has() method
To remove a key/value pair from a `Map` object, you can use the `delete()` method and pass the key of the pair you want to remove as follows:
```awk
myMap.delete(1);
console.log(myMap);
// 0: {2 => "Jill"}
// 1: {"animal" => "Elephant"}
```
Deleting an entry from the Map object
If you want to remove all key/value pairs, you can use the `clear()` method instead:
```arduino
myMap.clear();
console.log(myMap); // Map(0) {size: 0}
```
Clearing a Map object
### Other Ways to Create a Map Object
You can also create a `Map` object from an Array as follows:
```prolog
const myMap = new Map([
[1, 'Jack'],
[2, 'Jill'],
['animal', 'Elephant'],
]);
```
Creating a Map from an Array
When creating a `Map` from an Array, you need to create a two-dimensional array and specify two elements in each array.
The first element will be the key, the second element will be the value. Any extra value in the array will be ignored.
In the example below, the value 'Johnson' from the first array will be ignored by the `Map()` constructor:
```dart
const myMap = new Map([
[1, 'Jack', 'Johnson'], // the value 'Johnson' is ignored
[2, 'Jill'],
['animal', 'Elephant'],
]);
```
Creating a Map from an array with more than two values
Because you can create a `Map` object from an array, you can also create one from an object. You need to transform the object into an array first using the `Object.entries()` method.
The following example shows how to use an object to create a `Map`:
```javascript
const person = {
'name': 'Jack',
'age': 20,
}
const myMap = new Map(Object.entries(person));
console.log(myMap); // Map(2) { 'name' => 'Jack', 'age' => 20 }
```
Creating a Map from an object
### Iterate Over Map Object Data
To iterate over a `Map` object data, you can use either the `forEach()` method or the `for .. of` loop:
```javascript
const myMap = new Map([
[1, 'Jack'],
[2, 'Jill'],
['animal', 'Elephant'],
]);
// iterate using the forEach() method
myMap.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// or using the for .. of loop
for (const [key, value] of myMap) {
console.log(`${key}: ${value}`);
}
```
Both methods give the same output:
```http
1: Jack
2: Jill
animal: Elephant
```
### When to Use the Map Object
You can think of the `Map` object as an upgraded version of the regular Object. It can use any type of data as the key value, while an object can only use string values as keys.
==Under the hood, the== `==Map==` ==object performs better when you need to add and remove keys, so you might consider using it when your data changes frequently.==
==Also, the Map object has many useful methods for data manipulation, such as== `==has====()==` ==to see if the Map contains a specific key,== `==keys====()==` ==to get all keys defined in the== `==Map==`==,== `==values==` ==to get all values, and== `==entries====()==` ==to get all key/value pairs.==
But if you only want to create an object without further manipulation, then you don't need to use the `Map` object.
One example is when you send a network request using the `fetch()` method. You would create an object and convert it into a JSON string, so using a `Map` object won't give any benefit.
## Set Object Explained
==The== `==Set==` ==object allows you to store a collection of elements, just like an Array. The differences between a== `==Set==` ==and an array are:==
* ==A== `==Set==` ==requires all elements to be unique==
* ==A== `==Set==` ==has fewer methods for data manipulation==
### How to Create a Set Object
To create a new `Set` object, you need to call the `Set()` constructor as follows:
```dart
const mySet = new Set();
```
Creating a new Set object
The code above will create a new empty set.
### Set Object Methods and Properties
A `Set` object has the following methods and properties:
* `add(value)` Adds a value to a Set
* `has(value)` Checks if a Set contains a specific value
* `delete(value)` Removes a specific value from a Set
* `clear()` Removes all items from a Set
* `keys()` Returns all values in a Set
* `values()` Returns all values in a Set
* `entries()` Returns all values in a Set as `[value, value]` array
* `size` Returns the number of items in Set
Note that the `keys()` and `values()` methods in a Set object return the same output.
There's also the `entries()` method which returns an array as follows:
```javascript
const mySet = new Set(['Jack', 'Jill', 'John']);
console.log(mySet.entries());
```
Running Set entries() method
Output:
```prolog
[Set Entries] {
[ 'Jack', 'Jack' ],
[ 'Jill', 'Jill' ],
[ 'John', 'John' ]
}
```
Output of Set entries() method
Notice how the values are repeated once in each array above. The `entries()` method is created to make `Set` similar to the `Map` object, but you probably don't need it.
There are extra methods that you can use to interact with another `Set` object. We'll discuss them in the next section.
To add an element to the Set object, you can use the add method:
```processing
const mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(3);
console.log(mySet); // [1, 2, 3]
```
Adding new elements to the Set object
To get all values stored in a `Set`, call the `values()` method:
```pgsql
mySet.values(); // [Set Iterator] { 'Jack', 'Jill', 'John' }
```
Getting all values from a Set object
To check if the `Set` has a specific value, use the `has()` method:
```elixir
mySet.has('Jack'); // true
mySet.has('Michael'); // false
```
Check if a Set has a specific value
To remove a single value, call the `delete()` method. To remove all values, use the `clear()` method:
```less
mySet.delete('Jill');
mySet.clear();
```
Delete a single value or clear all from Set
### Set Composition Methods
==Aside from the regular methods above,== `==Set==` ==also has composition methods that you can use to perform various set theory operations such as difference, union, and intersection.==
The following table is from [MDN Set documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global%5FObjects/Set#set%5Fcomposition):
![set-composition-methods](https://proxy-prod.omnivore-image-cache.app/1585x2050,sPVCo_5Ndwww9ovUzsJnG9IGeZKON-MOiMv_9bax5rNk/https://www.freecodecamp.org/news/content/images/2024/02/set-composition-methods.png)
A List of Set Composition Methods
For example, you can get a set containing the differences between two other sets as follows:
```angelscript
const setA = new Set([1, 2, 3, 4, 5]);
const setB = new Set([4, 5, 6, 7, 8]);
const diffsA = setA.difference(setB); // Set(3) {1, 2, 3}
const diffsB = setB.difference(setA); // Set(3) {6, 7, 8}
```
Example of using the Set difference() method
Here, the `setA.difference(setB)` returns a `Set` containing values unique to the `setA` object.
The opposite values are returned when you run `setB.difference(setA)` method.
Note that these methods are new additions to the JavaScript standard, and as of this writing, only Safari 17 and Chrome 122 support these methods.
Most likely, these methods will be included in Node.js soon.
### Iterate Over a Set Object
To iterate over a `Set` object, you can use either the `forEach()` method or the `for .. of` loop:
```pgsql
const mySet = new Set(['Jack', 'Jill', 'John']);
// iterate using the forEach() method
mySet.forEach(value => {
console.log(value);
});
// or using the for .. of loop
for (const value of mySet) {
console.log(value);
}
```
Output:
```mipsasm
Jack
Jill
John
```
### When to Use the Set Object
You can think of the `Set` object as the alternative version of the regular Array.
Because a `Set` object ignores duplicate values, you can use this object to purge duplicates from an Array, then turn the `Set` object back to an Array:
```angelscript
const myArray = [1, 1, 2, 2, 3, 3];
const uniqueArray = [...new Set(myArray)];
console.log(uniqueArray); // [ 1, 2, 3 ]
```
Creating a unique array with the help of Set
Another reason you may want to use a `Set` is when you need to compose multiple set objects using the composition methods, such as `union()` and `difference()`. These methods are not available in an Array.
## Conclusion
In this article, you've learned how the Map and Set objects work and when to use them in your code.
If you enjoyed this article and want to take your JavaScript skills to the next level, I recommend you check out my new book __Beginning Modern JavaScript_ [here](https://codewithnathan.com/beginning-modern-javascript).
[![beginning-js-cover](https://proxy-prod.omnivore-image-cache.app/2000x1667,s6cLBb9obr-IvLwhkHZ_9YW6u9bvhxbOp3iAu4nsV6tM/https://www.freecodecamp.org/news/content/images/2024/01/beginning-js-cover.png)](https://codewithnathan.com/beginning-modern-javascript)
The book is designed to be easy for beginners and accessible to anyone looking to learn JavaScript. It provides a step-by-step gentle guide that will help you understand how to use JavaScript to create a dynamic web application.
Here's my promise: __You will actually feel like you understand what you're doing with JavaScript._
See you later!
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,598 @@
---
id: 085bfd7c-d52a-11ee-bfc7-b34a261d031c
title: |
How to Learn the Hard Parts of React and Tips to Conquer Them
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-02-26 18:07:53
url_omnivore: |
https://omnivore.app/me/how-to-learn-the-hard-parts-of-react-and-tips-to-conquer-them-18de8db4244
url_original: |
https://www.freecodecamp.org/news/hard-parts-of-react/
---
# How to Learn the Hard Parts of React and Tips to Conquer Them
## Highlights
The first instinct for many developers when faced with creating dynamic lists is to use the index property as the key. It seems like a convenient solution, as the index provides a unique identifier for each element in the array but it isnt the best approach for the following reasons:
* **Non-Persistent**: If the order or number of items changes, React may get confused. For example, if an item is added or removed from the beginning of the list, all the subsequent indices change, causing potential re-rendering issues.
* **Array Mutations**: Operations like sorting or filtering can alter the order of items, breaking the association between the index and the actual item.
* **Performance Concerns**: React relies on keys for efficient updates. Using the index as a key might impact performance when dealing with large lists or frequent updates.
Some of the better alternatives include:
* **Use a Unique ID**: If each item in your array has a unique identifier, such as an `id` property, use that as the key.
[source](https://omnivore.app/me/how-to-learn-the-hard-parts-of-react-and-tips-to-conquer-them-18de8db4244#e912d65e-4c82-41f1-94d4-56c151254c3e)
---
Generate a Unique Key: In cases where items lack a natural unique identifier, consider using a function like `crypto.randomUUID()` to generate a unique key.
[source](https://omnivore.app/me/how-to-learn-the-hard-parts-of-react-and-tips-to-conquer-them-18de8db4244#9074fe2d-d95d-4fc6-af45-be052bb24de5)
---
To ensure your component behaves as expected and follows React's principles, always use the setter function (`setNames`) to update the state.
[source](https://omnivore.app/me/how-to-learn-the-hard-parts-of-react-and-tips-to-conquer-them-18de8db4244#a42adf04-e7ec-4612-a7ea-c179bfce9163)
---
To safeguard your component from unexpected errors, incorporate optional chaining (`?.`) when accessing nested properties in API data.
[source](https://omnivore.app/me/how-to-learn-the-hard-parts-of-react-and-tips-to-conquer-them-18de8db4244#7ef6781d-7b8b-496d-bd2d-2974995be502)
---
* **Put data outside components**: Move things like lists and groups of information outside the main part of a component when possible. This helps avoid extra updates and makes it simpler to handle data without using special functions like `useCallback`.
* **Be careful with `React.memo`**: Using `React.memo` can help your components run better, but it's not always needed. If a component changes a lot with new information, using `React.memo` might not be as helpful. Use it wisely.
* **Create your own custom React hooks**: I also like making my own special tools with custom React hooks. It's a bit advanced, but it helps keep my code neat and organized.
[source](https://omnivore.app/me/how-to-learn-the-hard-parts-of-react-and-tips-to-conquer-them-18de8db4244#eb5d0b4b-a153-4551-a3a4-522a590854b5)
---
## Original
![How to Learn the Hard Parts of React and Tips to Conquer Them](https://proxy-prod.omnivore-image-cache.app/1540x800,s0Sf0yjj2JnhltmKR9CwuUoWXE6WKbqnS0xaYjUco-u4/https://www.freecodecamp.org/news/content/images/size/w2000/2024/02/Article-Cover.png)
Have you started learning React, only to face bugs that made you contemplate a career in goat herding? Don't worry we've all been there.
In this guide, you'll join me on a quest through the quirky wonders of React. I'll help you navigate the perplexing moments, ensuring you never have to ask yourself, "Whats up with React?"
Whether you're a seasoned React adventurer or unearthing the mysteries of virtual DOMs, fear not. I'm here to share the tales of my early struggles, demystify the enigmatic bugs, and pave the way for a smoother journey.
### Prerequisites
* Fundamentals of HTML and CSS
* Fundamentals of ES6 JavaScript and React
## ****What We'll Cover:**
1. [Quick Recap of React Fundamentals](#what-we-ll-cover-)
[Components: The Web Building Blocks](#components-the-web-building-blocks)
[JSX: Where HTML Meets JavaScript](#jsx-where-html-meets-javascript)
[State and Props: The Dynamic Duo](#state-and-props-the-dynamic-duo)
2. [The Good, the Bad, and the Challenging Parts of React](#the-good-the-bad-and-the-challenging-parts-of-react)
[The Good Parts of React](#the-good-parts-of-react)
[The Bad Parts of React](#the-bad-parts-of-react)
[The Challenging Parts of React](#the-challenging-parts-of-react)
[Key Prop Mishaps](#key-prop-mishaps)
[Mutating States Directly](#mutating-states-directly)
[Mysterious Bugs with Conditional Rendering](#mysterious-bugs-with-conditional-rendering)
[Ignoring Dependency Arrays in React Hooks](#ignoring-dependency-arrays-in-react-hooks)
[Neglecting Optional Chaining for API Data](#neglecting-optional-chaining-for-api-data)
[Ignoring React Fragments for Grouping JSX Elements](#ignoring-react-fragments-for-grouping-jsx-elements)
3. [Opinionated Approaches to React](#opinionated-approaches-to-react)
4. [Wrapping Up the Quirky Journey with React](#wrapping-up-the-quirky-journey-with-react)
## Quick Recap of React Fundamentals
The React library revolves around 3 building blocks: Components, JSX, and State & Props.
### Components: The Web Building Blocks
Imagine components as the LEGO bricks of your user interface—a single, reusable piece that contributes to the grand structure. They encapsulate functionality, styling, and behavior, making your UI both modular and scalable.
From a simple button to an elaborate sidebar, components are the heart and soul of React development.
### JSX: Where HTML Meets JavaScript
JSX, or JavaScript XML, may seem like an odd fusion of HTML and JavaScript at first, but its quite straightforward. It's the secret sauce that makes React's syntax so expressive and dynamic.
With JSX, you write your UI components using a syntax that resembles HTML, but underneath, it's pure JavaScript.
### State and Props: The Dynamic Duo
The dynamic duo of state and props bring React pages to life as they add interactivity to your web applications.
#### State: Granting Memory to Components
State provides memory to components, allowing them to remember past events and alter their behavior over time. It's the key to making your UI responsive and dynamic.
Picture a form that remembers the user's input or a counter that increments with each click. That's the magic of state.
#### Props: Enabling Communication
Props (short for properties) facilitate communication between components. They allow parent components to pass data down to their children, creating a seamless flow of information.
Think of props as messengers, ensuring that each component knows its role and receives the necessary information to perform it.
## The Good, the Bad, and the Puzzling Parts of React
Before we delve into the puzzling aspects of React, it's essential to shine a spotlight on the treasures that make React a true hero in your arsenal.
### The Good Parts of React
#### Virtual DOM and its Advantages
The virtual DOM is a revolutionary concept that gives React its speed and efficiency.
When changes occur in your app, React doesn't immediately update the actual DOM. Instead, it works with a lightweight copy, the Virtual DOM, making minimal, lightning-fast adjustments. This not only optimizes performance but also provides a smoother user experience.
```reasonml
ReactDOM.createRoot(document.getElementById("root")).render(
<App />
);
```
This process leverages [React's diffing algorithm](https://legacy.reactjs.org/docs/reconciliation.html) in the Virtual DOM. It identifies the minimal set of changes needed in the actual DOM to reflect the updated state.
![00--Explaing-how-react-updates-the-UI-using-the-virtual-DOM](https://proxy-prod.omnivore-image-cache.app/800x500,sN6hiHQDh5G5Z1y11CUFB0OTNaafhqk2tzE4i9f1vAFA/https://www.freecodecamp.org/news/content/images/2024/02/00--Explaing-how-react-updates-the-UI-using-the-virtual-DOM.png)
Explaining how React updates the UI using the virtual DOM
#### Reusable Components
In React, the guiding principle is reusability. Components, the fundamental building blocks we discussed above, can be crafted and employed across your application. This not only fosters a modular and organized code structure but also frees you from the burden of reinventing the wheel.
```hsp
// Reusable Button Component
const Button = ({ label, onClick }) => (
<button onClick={onClick}>{label}</button>
);
// Usage
<Button label="Click me" onClick={() => console.log("Button Clicked")} />
```
#### One-way Data Binding for a Predictable Flow
React enforces a unidirectional data flow, ensuring predictability and maintainability.
Parent components convey data down to their children through props, and any modifications are overseen by the parent component. This one-way street prevents the chaos with 2-way data binding seen in other frameworks.
```kotlin
const ParentComponent = () => {
const [data, setData] = useState("Hello from Parent!");
return <ChildComponent data={data} />;
};
const ChildComponent = ({ data }) => <div>{data}</div>;
```
### The Bad Parts of React
There are some parts of React that aren't ideal, though. Let's go through them briefly now so you can be aware of them.
#### Steep Learning Curve for Beginners
Starting with React can be tough, especially if you're new to web development. Concepts like JSX, components, and state management might seem like a maze. But don't worry! With some practice and patience, it gets easier, and React becomes more familiar.
#### JSX Might Puzzle You at First
JSX, the special mix of HTML and JavaScript, can be a bit confusing at the beginning. It's like learning a new language that blends the two. But as you get the hang of it, you'll see how it makes your code shorter and clearer.
#### State Management Challenges
Using state in React is powerful, but it can also be tricky. Handling state across lots of different pieces, especially in big projects, can create complex setups and potential problems. Luckily, tools like [Redux](https://redux.js.org/) exist to help manage this complexity.
## The Challenging Parts of React
### Key Prop Mishaps
When building your applications, you may often have repeating elements which show similar information or share the same styles. The logical step would be to loop over them to create a list of elements.
```xquery
function ListComponent() {
const people = [{ name: "Mitchelle" }, { name: "July" }, { name: "David" }];
return (
<ul>
{/ Looping over the people array to create list items /}
{people.map((person) => (
<li>{person.name}</li>
))}
</ul>
);
}
```
Everything seems fine until you notice a warning in your console or, worse, strange behaviour in how your list renders.
![02--The-console-an-error-due-to-missing-key-prop](https://proxy-prod.omnivore-image-cache.app/507x241,szg5e19g4RV8xImWmAIoG9B9jWTUW46xjwi9dZUe0yxg/https://www.freecodecamp.org/news/content/images/2024/02/02--The-console-an-error-due-to-missing-key-prop.png)
The console an error due to missing key prop
React uses keys to update and reorder elements in a list. When you forget to provide a key prop or if the keys are not unique, React gets a bit lost. It's like trying to keep track of items in the array without any specific identifiers things get mixed up, and you might end up with unexpected bugs in your UI.
#### How to solve it
==The first instinct for many developers when faced with creating dynamic lists is to use the index property as the key. It seems like a convenient solution, as the index provides a unique identifier for each element in the array== == but it isnt the best approach for the following reasons:==
* **==Non-Persistent==**==: If the order or number of items changes, React may get confused. For example, if an item is added or removed from the beginning of the list, all the subsequent indices change, causing potential re-rendering issues.==
* **==Array Mutations==**==: Operations like sorting or filtering can alter the order of items, breaking the association between the index and the actual item.==
* **==Performance Concerns==**==: React relies on keys for efficient updates. Using the index as a key might impact performance when dealing with large lists or frequent updates.==
==Some of the better alternatives include:==
* **==Use a Unique ID==**==: If each item in your array has a unique identifier, such as an== `==id==` ==property, use that as the key.==
```clojure
{people.map((person) => (
<li key={person.id}>{person.name}</li>
))}
```
* ==Generate a Unique Key: In cases where items lack a natural unique identifier, consider using a function like== `==crypto====.randomUUID====()==` ==to generate a unique key.==
```clojure
{people.map((person) => (
<li key={crypto.randomUUID()}>{person.name}</li>
))}
```
By choosing one of these alternatives, you provide React with stable and unique keys, helping it manage and update your dynamic lists,
**Note**: You may be thinking “If `crypto.randomUUID` generates a unique ID, (`Math.random()` \* some big number) would work the same, right”?
![Nope](https://proxy-prod.omnivore-image-cache.app/600x352,sXLy_99RHiGL8JMMYJE4TwrOh9N5fiwyxhggWsEqrMDM/https://www.freecodecamp.org/news/content/images/2024/02/Nope.gif)
Nope gif
`Math.random()` could also suffice as a key, but it's a bad idea because the generated keys won't be stable across re-renders, leading to potential performance issues and rendering inconsistencies.
### Mutating States Directly
Imagine you're working on a component that manages an array of names. Rather than using the appropriate setter method to update the state, you decide to directly mutate the state.
```javascript
const MutableStateComponent = () => {
const [names, setNames] = useState(["David", "John", "Steph", "Anthony"]);
const removeLastName = () => {
console.log(names);
// Direct mutation of state using pop()
names.pop();
setNames(names); // This won't trigger a re-render
};
return (
<div>
<p>Names: {names.join(", ")}</p>
<button onClick={removeLastName}>Remove Last Name</button>
</div>
);
};
```
To your surprise, the UI doesn't update as expected, and you find yourself stuck in a scenario where the list of names seems frozen. Make no mistake, the array is getting updated as seen below:
![yey1I5L7W43d8vcNl7kEUZaRHGZw90xZfviK3rhfFHiqwXv3gsCjHqcs9nhgdWoQlbPEGAj2A_7qHcoeRI9xPtsD0JCiPJdzT4MNRrQ91GfUjdwvW4hmlHGE_LtdG49FzO1buO0yT9tzMRtO95MgvYI](https://proxy-prod.omnivore-image-cache.app/600x185,sHZ7BRzMS5mQWhPWL8g4Fy71wvaWXfxrGi1DkSLA2QRg/https://lh7-us.googleusercontent.com/yey1I5L7W43d8vcNl7kEUZaRHGZw90xZfviK3rhfFHiqwXv3gsCjHqcs9nhgdWoQlbPEGAj2A_7qHcoeRI9xPtsD0JCiPJdzT4MNRrQ91GfUjdwvW4hmlHGE_LtdG49FzO1buO0yT9tzMRtO95MgvYI)
Array getting mutated with UI being updated
#### What's the Problem?
React relies on an immutable state for efficient updates, and when you bypass this mechanism, it disrupts the unidirectional data flow.
In this case, using `pop()` mutates the original array in place, and React loses track of the changes. This leads to an inaccurate rendering of the component.
#### How to Solve it
==To ensure your component behaves as expected and follows React's principles, always use the setter function (==`==setNames==`==) to update the state.==
```javascript
const MutableStateComponent = () => {
const [names, setNames] = useState(["David", "John", "Steph", "Anthony"]);
const removeLastName = () => {
// Use setNames to update state
setNames((prevNames) => prevNames.slice(0, -1));
console.log(names);
};
return (
<div>
<p>Names: {names.join(", ")}</p>
<button onClick={removeLastName}>Remove Last Name</button>
</div>
);
};
```
By using `setNames` and creating a new array with the desired changes (in this case, using `slice` to remove the last element), you ensure that React can accurately track and update the state, resulting in the expected UI behavior.
![09--Result-of-Mutating-States-with-the-correct-method](https://proxy-prod.omnivore-image-cache.app/600x166,sSC4S47mv-qIsZHrIUJJJ-RcTuPQbIN2sInkN4pMqPJ0/https://www.freecodecamp.org/news/content/images/2024/02/09--Result-of-Mutating-States-with-the-correct-method.gif)
Result of mutating states with the correct method
### Mysterious Bugs with Conditional Rendering
Conditional rendering, while powerful, can introduce subtle bugs when not handled with care. Understanding common pitfalls, particularly those related to truthy and falsy evaluations, is crucial for preventing mysterious rendering behaviour.
Consider the following example:
```javascript
const IncorrectConditionalComponent = ({ showContent }) => (
{showContent && <div>Show me if true!</div>}
);
```
#### The Bug: Unexpected Rendering with Falsy Values
In this code snippet, if `showContent` happens to be a falsy value, such as `0`, the component will render an unexpected result. Instead of gracefully not rendering the content, it will display `0` on the screen due to the direct inclusion of curly braces.
![Gotcha](https://proxy-prod.omnivore-image-cache.app/500x281,slcS6xZX3T1h2Kyhm2ik9SCftGek8Bv30z5clC0Il8fk/https://www.freecodecamp.org/news/content/images/2024/02/Gotcha.gif)
I gotcha gif
#### What's the Problem?
The issue lies in the mismanagement of truthy and falsy values. The direct use of curly braces creates an object wrapper (`[object Object]`), causing the component to render whatever value is present, even if it's falsy.
#### How to Solve it
To catch rendering bugs related to truthy and falsy values, use a more explicit conditional check.
```javascript
const CorrectConditionalComponent = ({ showContent }) => (
showContent ? <div>Show me if true!</div> : null
);
```
In this corrected version, the ternary operator ensures a clear check for truthiness, preventing unexpected rendering issues. By explicitly handling truthy and falsy values, you build robust components that behave predictably in various scenarios.
### Ignoring Dependency Arrays in React Hooks
Imagine working on a component that relies on an effect to perform some logic when a certain state, let's say `count`, changes. But even though you're incrementing the count, the effect doesn't seem to run, and you're left wondering why your logic isn't taking effect.
```javascript
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount((count) => count + 1);
};
useEffect(() => {
console.log("The current count value is ", count);
}, []);
return (
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
```
![03--testing-the-count-component-without-fixing-the-useEffect-dependency-array](https://proxy-prod.omnivore-image-cache.app/600x207,sclaHzwd3J6Ir6gJjzyGYaoim1IkPzaLN3QTxNHzYMf4/https://www.freecodecamp.org/news/content/images/2024/02/03--testing-the-count-component-without-fixing-the-useEffect-dependency-array.gif)
Testing the count component without fixing the useEffect dependency array
#### What's the Problem?
The issue lies in neglecting the dependency array in your `useEffect`. When you omit the dependencies, React might not recognize that the effect is tied to a specific piece of state, leading to stale data and unexpected behavior.
#### How to Solve it
To get your effect back on track, include the relevant dependencies in the dependency array. It's like setting up triggers you're telling React, "Hey, run this effect whenever these specific pieces of data change."
```coffeescript
useEffect(() => {
console.log("The current count value is ", count);
}, [count]);
```
Which now fires the `useEffect` hook:
![04--testing-the-count-component-after-fixing-the-useEffect-dependency-array](https://proxy-prod.omnivore-image-cache.app/600x162,seLpHSsOeC0rY6uLCrbDj68pQbCzZ-wZ8McJAd7xlxSc/https://www.freecodecamp.org/news/content/images/2024/02/04--testing-the-count-component-after-fixing-the-useEffect-dependency-array.gif)
Testing the count component after fixing the useEffect dependency array
### Neglecting Optional Chaining for API Data
You're working on a component that displays user data fetched from an API. Everything seems fine until you encounter an unexpected runtime error. The culprit? A missing optional chaining operator.
#### What's the Problem?
API responses can be unpredictable, and not all data structures match your expectations. Neglecting optional chaining, especially when accessing deeply nested properties (looking at you Strapi response data 👀) can lead to runtime errors if a property is undefined.
#### How to Solve it
==To safeguard your component from unexpected errors, incorporate optional chaining (==`==?.==`==) when accessing nested properties in API data.==
As an example, say you want to read a deeply nested property (label) from this data:
```dts
const data = {
id: 1,
title: "First Item",
content: "Content for the first item",
category: {
id: 101,
name: "Category A",
description: "Description of Category A",
tags: [
{
id: 1001,
label: "Tag 1",
},
{
id: 1002,
label: "Tag 2",
},
],
},
author: {
id: 201,
name: "John Doe",
email: "john.doe@example.com",
},
};
```
The correct way would be to use optional chaining to retrieve that data:
```ebnf
const firstLabel = data?.category?.tags?.[0]?.label;
```
Rather than accessing those properties directly:
```angelscript
const firstLabel = data.category.tags[0].label;
```
This prevents you from seeing a white screen error and a flooded console if the data structure changes. It's like putting on a safety net if a property is missing, your app won't come crashing down like so:
![05--Error-occuring-when-optional-chaining-isn-t-applied](https://proxy-prod.omnivore-image-cache.app/1588x727,sgwJjdFdMroS9C8ajyVYXPFExl3EaNWv9vbpl-AfLfYk/https://www.freecodecamp.org/news/content/images/2024/02/05--Error-occuring-when-optional-chaining-isn-t-applied.png)
Error occurring when optional chaining isn't applied
### Ignoring React Fragments for Grouping JSX Elements
When working with React components, you may encounter a scenario where you want to return multiple JSX elements from a function, only to be met with a syntax error.
#### What's the Problem?
This is due to a limitation in JavaScript, as it doesn't allow the return of adjacent elements without a common parent.
Consider the following problematic code:
```javascript
function User() {
return <div> David Jaja</div>
<div>Twitter: https://twitter.com/JajaDavid8</div>;
}
```
This code results in an error: “Adjacent JSX elements must be wrapped in an enclosing tag.”
![06--Error-occuring-when-JSX-returns-2-direct-adjacent-elements](https://proxy-prod.omnivore-image-cache.app/1483x544,sfPaIFNuG9axWWmq6yZXVZ-ZwIa9PqA7yMHZZSz0zFAA/https://www.freecodecamp.org/news/content/images/2024/02/06--Error-occuring-when-JSX-returns-2-direct-adjacent-elements.png)
Error occurring when JSX returns 2 direct adjacent elements
#### How to Solve it
I know what you might be thinking—why not simply wrap the elements in a div and move on?
![sponge-bob-bored](https://proxy-prod.omnivore-image-cache.app/320x174,sxPXM63m9c5aUHt7caKrHlLe6GEQ0rRGQxJIX0zxEBg8/https://www.freecodecamp.org/news/content/images/2024/02/sponge-bob-bored.gif)
Spongebob bored gif
While this seems like a quick fix, it introduces a potential downside. By adding a div, you create an unnecessary parent element in the DOM.
This additional markup, though resolving the immediate error, can lead to unintended consequences, such as affecting styles or layout, and may not align with optimal coding practices.
And Im sure you dont want to end up with a "divpocalipse".
![07--Divpocalpse](https://proxy-prod.omnivore-image-cache.app/658x598,stqxWkWd8N7Td4JGVinc5-ysByAEwhC7_RfMt9hhaoHk/https://www.freecodecamp.org/news/content/images/2024/02/07--Divpocalpse.png)
A divpocalpse
To overcome both the syntax error and the unnecessary DOM markup, React introduced an optimized solution: React Fragments.
React Fragments are used to address the need for returning multiple JSX elements without introducing unnecessary parent elements in the DOM.
Here's how you can utilize React Fragments:
```javascript
import React from "react";
function User() {
return (
<React.Fragment>
<div> David Jaja</div>
<div>Twitter: https://twitter.com/JajaDavid8</div>
</React.Fragment>
);
}
```
Or using the shorthand syntax:
```javascript
function User() {
return (
<>
<div> David Jaja</div>
<div>Twitter: https://twitter.com/JajaDavid8</div>
</>
);
}
```
By using React Fragments, you maintain clean and concise JSX code without introducing unnecessary elements to the DOM, enhancing code readability.
![Showing-the-DOM-tree-after-using-fragments-without-any-extra-elements](https://proxy-prod.omnivore-image-cache.app/521x218,sqbUBL83eWVIxHkxByP9ivVd484cYuA_oCvZVMM_V_pw/https://www.freecodecamp.org/news/content/images/2024/02/Showing-the-DOM-tree-after-using-fragments-without-any-extra-elements.png)
Showing the DOM tree after using fragments without any extra elements
## Opinionated Approaches to React
I've found some handy ways to make working with React more enjoyable. Instead of strict rules, think of these as my personal choices to make code easier to read, improve how it works, and make sure it stays in good shape.
1. **==Put data outside components==**==: Move things like lists and groups of information outside the main part of a component when possible. This helps avoid extra updates and makes it simpler to handle data without using special functions like== `==useCallback==`==.==
2. **==Be careful with== `==React====.====memo==`**==: Using== `==React====.====memo==` ==can help your components run better, but it's not always needed. If a component changes a lot with new information, using== `==React====.====memo==` ==might not be as helpful. Use it wisely.==
3. **==Create your own custom React hooks==**==: I also like making my own special tools with custom React hooks. It's a bit advanced, but it helps keep my code neat and organized.==
![but-thats-just-my-opinion-just-what-i-think](https://proxy-prod.omnivore-image-cache.app/498x280,st7PfcgBzDoANQmhoVH50NeoEVnO5TcYT-qsL2rwjg8E/https://www.freecodecamp.org/news/content/images/2024/02/but-thats-just-my-opinion-just-what-i-think.gif)
Just my opinion gif
## Wrapping Up the Quirky Journey with React
React's journey is a blend of smooth sailing and bumpy rides. We've seen the strength of reusable components and virtual DOM and tackled puzzling moments like missing key props and conditional rendering bugs and so on.
As you continue your journey with React, may your code be clean, your components reusable, and your "What's Up with React?" moments turn into "Aha!" revelations. Happy coding! 🚀
### **Contact Information**
Want to connect or contact me? Feel free to hit me up on the following:
* Twitter: [@jajadavid8](https://twitter.com/JajaDavid8)
* LinkedIn: [David Jaja](https://www.linkedin.com/in/david-jaja-8084251b4/)
* Email: Jajadavidjid@gmail.com
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,267 @@
---
id: 39278362-dbfc-11ee-8a2b-139ebfa11748
title: |
How to Build a Basic CMS with Google Sheets and React
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-03-06 14:55:48
url_omnivore: |
https://omnivore.app/me/how-to-build-a-basic-cms-with-google-sheets-and-react-18e158f0d8c
url_original: |
https://www.freecodecamp.org/news/how-to-build-a-basic-cms-with-google-sheets-and-reactjs/
---
# How to Build a Basic CMS with Google Sheets and React
## Highlights
### Step 1: Set Up Your Google Sheets
1. Go to your Google Sheets
2. Open the sheet you want to use or create a new one
3. Click on `Extensions` in the menu
4. Then click on `Apps Script`
In the Apps Script editor, you can write a script to serve as your endpoint. Here's a script that returns the contents of a Google Sheet in JSON format:
```kotlin
function convertRangeToJson(data) {
var jsonArray = [];
// Check if data is empty or doesn't contain enough rows for headers and at least one data row
if (!data || data.length < 2) {
// Return an empty array or a meaningful message as needed
return jsonArray; // or return 'No data available';
}
var headers = data[0];
for (var i = 1, length = data.length; i < length; i++) {
var row = data[i];
var record = {};
for (var j = 0; j < row.length; j++) {
record[headers[j]] = row[j];
}
jsonArray.push(record);
}
return jsonArray;
}
```
Then:
1. Click `File` \> `Save`, and give your project a name
2. Click on `Deploy` \> `New deployment`.
3. Click on `Select type` and choose `Web app`.
4. Fill in the details for your deployment. Under `Execute as`, choose whether the script should run as your account or as the user accessing the web app. Under `Who has access`, choose who can access your web app.
5. Click `Deploy`.
[source](https://omnivore.app/me/how-to-build-a-basic-cms-with-google-sheets-and-react-18e158f0d8c#d5dee3e3-c455-4623-952d-2b11f076c3fa)
---
## Original
![How to Build a Basic CMS with Google Sheets and React](https://proxy-prod.omnivore-image-cache.app/1640x924,siWfmlLH465K-bpxtdWL3BNzIim_TyPG4_WhZ94OLwBk/https://www.freecodecamp.org/news/content/images/size/w2000/2024/03/--1.png)
In today's digital landscape, creating a content management system (CMS) that is both cost-effective and easy to maintain can be difficult, especially if you're operating on a tight budget.
This tutorial will show you a solution that leverages Google Sheets as a makeshift database and React to build the frontend. This will let you effectively bypass the need for a dedicated server or traditional database system.
This approach not only reduces the overhead costs associated with web development, but also simplifies content updates and management. It's an ideal solution if you're looking to launch your own simple CMS without substantial investment.
This solution is suitable for freelancers at the beginning of their career and for clients who cannot invest much in their website.
## Why Google Sheets?
Opting for Google Sheets as the backbone of your CMS comes down to its simplicity, flexibility, and cost-effectiveness.
Traditional web development requires a backend server to process data, a database to store information, and a frontend to display content. But each layer adds complexity and cost.
Google Sheets, on the other hand, acts as a highly accessible and intuitive interface that eliminates the need for a server and a database. It lets your users update content in real-time, much like any CMS, but without the usual setup and maintenance costs. This makes it an excellent choice for individuals, small businesses, or anyone looking to deploy a web application quickly and with minimal expense.
## Getting Started
Before diving into the code, ensure you have Node.js and npm installed on your system. These tools will allow us to create a React application and manage its dependencies.
Let's start with Google Sheets now.
### ==Step 1: Set Up Your Google Sheets==
1. ==Go to your Google Sheets==
2. ==Open the sheet you want to use or create a new one==
3. ==Click on== `==Extensions==` ==in the menu==
4. ==Then click on== `==Apps== ==Script==`
==In the Apps Script editor, you can write a script to serve as your endpoint. Here's a script that returns the contents of a Google Sheet in JSON format:==
```kotlin
function convertRangeToJson(data) {
var jsonArray = [];
// Check if data is empty or doesn't contain enough rows for headers and at least one data row
if (!data || data.length < 2) {
// Return an empty array or a meaningful message as needed
return jsonArray; // or return 'No data available';
}
var headers = data[0];
for (var i = 1, length = data.length; i < length; i++) {
var row = data[i];
var record = {};
for (var j = 0; j < row.length; j++) {
record[headers[j]] = row[j];
}
jsonArray.push(record);
}
return jsonArray;
}
```
==Then:==
1. ==Click== `==File==` ==&gt;== `==Save==`==, and give your project a name==
2. ==Click on== `==Deploy==` ==&gt;== `==New== ==deployment==`==.==
3. ==Click on== `==Select== ==type==` ==and choose== `==Web app==`==.==
4. ==Fill in the details for your deployment. Under== `==Execute== ==as==`==, choose whether the script should run as your account or as the user accessing the web app. Under== `==Who has== ==access==`==, choose who can access your web app.==
5. ==Click== `==Deploy==`==.==
You may be asked to authorize the script to access your Google Sheets. Follow the prompts to do so.
After deploying, you'll be given a URL for your web app. This is your API endpoint.
To give you an idea of what you have done so far, this is your sheet structure:
![Schermata-2024-03-04-alle-16.49.37](https://proxy-prod.omnivore-image-cache.app/2000x526,smPUKAPAEuUJbzcsC9y_OcXJLBnSw4Uxv4SK--sY8BIk/https://www.freecodecamp.org/news/content/images/2024/03/Schermata-2024-03-04-alle-16.49.37.png)
How your sheet should currently look
And this is the JSON you get when you call the endpoint:
![postman_I](https://proxy-prod.omnivore-image-cache.app/2000x994,sR4WRCZpp3k8lz8LREev-BkSixXwiwIQ0OvBZbhT-3o4/https://www.freecodecamp.org/news/content/images/2024/03/postman_I.png)
JSON
### Step 2: Create Your React App
With your Google Sheets API ready, it's time to create the React app that will fetch and display this data.
First, go ahead and create a React app. Run the following command in your terminal to create a new React application:
```dsconfig
npx create-react-app google-sheets-cards
cd google-sheets-cards
npm start
```
You can also [use modern build tools like Vite](https://www.freecodecamp.org/news/get-started-with-vite/) for this purpose, as CRA is no longer the recommended way of building a React app.
Next, create the card component. Inside the `src` directory, create a file named `Card.js`. This component will be responsible for displaying each data record:
```javascript
// src/Card.js
function Card({ title, content }) {
return (
<div className="card">
<h1>{title}</h1>
<p>{content}</p>
</div>
);
}
export default Card;
```
Now it's time to fetch and display your data in App.js. Modify the `App.js` file to include logic for fetching the data from your Google Sheets API and using the Card component to display it:
```javascript
// src/App.js
import React, { useEffect, useState } from 'react';
import Card from './Card';
import './App.css'; // Make sure to create some basic styles for the cards in App.css
function App() {
const [data, setData] = useState([]);
useEffect(() => {
fetch('YOUR_ENDPOINT_URL') // Replace with your actual endpoint URL
.then(response => response.json())
.then(data => setData(data))
.catch(error => console.error('Error fetching data:', error));
}, []);
return (
<div className="App">
<h1>Data from Google Sheets</h1>
<div className="cards-container">
{data.map((item, index) => (
<Card key={index} title={item.Title} content={item.Content} />
))}
</div>
</div>
);
}
export default App;
```
Next, you can style your cards. Go ahead and add the below CSS in `App.css` for basic card styling:
```css
.card {
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
margin: 10px;
padding: 10px;
display: inline-block;
background: #f9f9f9;
}
.cards-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
```
### Step 3: Run Your React App
With everything set up, you can now run your React application and see the data from Google Sheets displayed in your browser. To do this, follow these steps:
First, start the React app. In your terminal, navigate to the root directory of your React app if you're not already there. Run the following command to start the development server:
```coffeescript
npm start
```
This command compiles your React application and opens it in your default web browser. You should see a webpage with a title "Data from Google Sheets", and below that, a series of cards, each displaying a title and content fetched from your Google Sheets data.
Here's, in fact, what we get:
![Schermata-2024-03-04-alle-16.52.22](https://proxy-prod.omnivore-image-cache.app/2000x412,sYriejk47X_q9wHSncPygJqjh7czNfP7109TVVFRq0vY/https://www.freecodecamp.org/news/content/images/2024/03/Schermata-2024-03-04-alle-16.52.22.png)
Data from Google Sheets and Card 1, Card 2, and Card 3 displayed on the screen
Now you can view your data. Each card on the page corresponds to a row in your Google Sheets, with the title and content fields displayed as specified in your Card component. If you make any updates to your Google Sheets data, you can refresh the web page to see the changes reflected immediately.
You can deploy your React app to one of the many services you can find online such as Github Actions or Netlify. This is a simple and effective way to host your frontend application for free with significant performance.
## Conclusion
Congratulations! You've created a dynamic web application that fetches data from a Google Sheet and displays it using React.
This approach offers a flexible and straightforward way to manage your application's content without needing a backend server or database.
Google Sheets serves as an accessible and collaborative platform for managing data, while React allows you to build a responsive and interactive user interface. Together, they provide a powerful combination for creating web applications that can be quickly updated and easily maintained.
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,155 @@
---
id: b342d646-2ec3-4e27-a72d-dac0d46219d3
title: |
How to Do a Digital Detox | Everyday Health
status: ARCHIVED
tags:
- read-later
date_added: 2024-03-11 09:49:55
url_omnivore: |
https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e
url_original: |
https://www.everydayhealth.com/emotional-health/how-to-do-a-digital-detox-without-unplugging-completely/
---
# How to Do a Digital Detox | Everyday Health
## Highlights
“When something is consuming a lot of your thoughts and conditioning your behaviors, and when it is interfering with your life — like your job or schoolwork or your relationships — it may be time to consider cutting back on its use,”
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#e757b03d-61d5-413d-b9b9-47019876445c)
---
cutting back on anything that makes you feel worse or stressed, or that takes away from your life rather than adding to it.
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#07a0c2b4-39f7-43bd-a39c-9f4da9933354)
---
“Theres no magic amount of screen time that is good or bad,”
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#0614f527-dd2d-4377-aac5-e2fce661ef85)
---
Set up time in your calendar or with an alarm on your phone to remind you to go for a walk or to eat lunch away from your desk, Becker says. And remember to leave your phone behind.
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#81332fd1-2e6c-4292-97c1-42077bdaddd9)
---
“If the Facebook app is something that you click on often and find yourself scrolling through for long periods of time, getting rid of the app and having to go through the search browser takes an extra step and allows for a moment to pause and decide if it is a good time to engage in this activity,”
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#3ff32057-315b-4fb7-8a34-8db8528990d8)
---
eliminate the distractions by replacing your smartphone with a simple cell phone that cannot support apps.
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#d64ced03-c9fb-4217-abc0-090512cb6b07)
---
Try powering down before dinner and until the next morning.
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#5cc985b9-75ac-4988-8637-c5d11336e657)
---
Apple iPhone users can set limits with [Screen Time](https://support.apple.com/en-us/HT208982) (find it in your phones settings) and schedule Downtime, when only phone calls or specific apps are allowed and specified apps have a time limit. [Digital Wellbeing](https://play.google.com/store/apps/details?id=com.google.android.apps.wellbeing&hl=en%5FUS&gl=US) works similarly for Google devices.
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#8d60c80d-2d5f-410a-a901-435de882e3c6)
---
setting limits on certain apps doesnt always work. Instead, she suggests removing yourself from device use completely.
[source](https://omnivore.app/me/https-www-everydayhealth-com-emotional-health-how-to-do-a-digita-18e2d8fec8e#7ca00f44-692d-4435-bed2-8d742e634aed)
---
## Original
![cell phone locked-up](https://proxy-prod.omnivore-image-cache.app/1440x810,stHUY_5ZmxmIh30H5cSj2AXoG-1sy9gBdYTEww5cuvmw/https://images.everydayhealth.com/images/emotional-health/how-to-do-a-digital-detox-1440x810.jpg?sfvrsn=cf289190_5)
Your phone doesnt have to be on lockdown for you to preserve your peace of mind.Adobe Stock
Life during the most connected era in human history has many positives — faraway family members are just a FaceTime session away, and the answer to nearly any question that pops into your mind is at your fingertips.
But too much technology — whether its time spent on smartphones, social media, or in front of other digital screens — can have unintended consequences. That may signal the need for a digital [detox](https://www.everydayhealth.com/diet-and-nutrition/diet/detox-cleanses-most-popular-types-what-know/).
“Excessive technology use can take away time from activities such as sleep, exercise, and socializing, which are all important for well-being,” says [Carol Vidal, MD, PhD, MPH](https://www.hopkinsmedicine.org/profiles/details/carolina-vidal), an assistant professor of psychiatry and behavioral sciences at the Johns Hopkins University School of Medicine in Baltimore.
A [research review](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7366948/) noted that frequent technology use has been linked to heightened attention-deficit symptoms, impaired emotional and social intelligence, technology addiction, social isolation, impaired brain development, and disrupted sleep in some cases.
**RELATED:** [**Are the Stresses of Social Media Too Much for Teens and Young Adults?**](https://www.everydayhealth.com/emotional-health/under-pressure/are-the-stresses-of-social-media-too-much-for-teens-and-young-adults/)
Technology is not inherently bad, says [Madeleine George, PhD](https://www.rti.org/expert/madeleine-george), a public health research analyst at RTI International, a nonprofit research institute, in Durham, North Carolina. “Technology and social media can have positive or negative effects, depending on what someone is doing online and who they are.”
Other research suggests, for example, that social media use can help you build and maintain connections when youre more actively interacting with others, but tends to have the opposite effect when people use it more passively, such as when scrolling through an Instagram or Facebook feed without interacting with the content, [according to research](https://journals.sagepub.com/doi/full/10.1177/0963721417730833#%5Fi5%20%5Fi6)_._
Youll know youre overdoing it and may need a digital detox if technology interferes with your work, relationships, mental and physical health, or finances, according to [Brittany Becker](https://thedorm.com/team/brittany-becker/), a licensed mental health counselor based in New York City and the director of the Dorm, a holistic treatment center for mental health.
**RELATED:** [**Are the Virtual Interactions of Social Media Busting or Boosting Your Stress?**](https://www.everydayhealth.com/wellness/united-states-of-stress/social-media-busting-boosting-your-stress/)
Dr. Vidal agrees. ==“When something is consuming a lot of your thoughts and conditioning your behaviors, and when it is interfering with your life — like your job or schoolwork or your relationships — it may be time to consider cutting back on its use,”== Vidal says.
Scaling back through a digital detox may have positive effects.
A [study from 2021](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7717533/) found that students who completed a social media detox reported positive changes to their mood, sleep, and anxiety. And [another study](https://pubmed.ncbi.nlm.nih.gov/31851833/) found that women who quit Instagram reported higher life satisfaction and more positive effects than women who continued using the social media app. (It should be noted that both studies were small, with 68 and 80 participants, respectively.)
## **7 Ways to** Do a Digital Detox **(Without Pulling the Plug Entirely)**
For most people, ditching technology altogether isnt going to happen. “Cutting down seems like a more realistic approach,” Vidal says.
To do this, make a plan, Becker says. Pinpoint your unhealthy habits and then decide which ones you want to change. “I think it is really helpful to get a clear picture of your tech use and review the time spent on your phone,” Becker says. “How that time is divided up with different applications is a great place to start, and then you can identify which areas to begin to limit.”
Dr. George suggests ==cutting back on anything that makes you feel worse or stressed, or that takes away from your life rather than adding to it.== And remember, what constitutes healthy technology use varies from person to person. “Theres no magic amount of screen time that is good or bad,” George says. “You have to find out what works for you and your family.”
Here are seven strategies to help you manage your technology use and experiment with your own personal digital detox.
### **1\. Schedule Time Away From Screens Throughout the Day**
If you work at a computer, its hard to avoid screens, which means its all the more important to prioritize breaking away. ==Set up time in your calendar or with an alarm on your phone to remind you to go for a walk or to eat lunch away from your desk, Becker says. And remember to leave your phone behind.==
### **2\. Take Periodic Breaks From Technology**
Breaks can reduce stress, particularly among heavy users, Vidal says. She says more research is needed on digital abstinence before there can be specific recommendations on what this looks like and how long it should last. But it could mean joining others who are committed to disconnecting through events like those run by [Digital Detox](https://www.digitaldetox.com/) (a company that leads tech-free retreats) or deleting problematic apps from your phone, temporarily or for good.
==“If the Facebook app is something that you click on often and find yourself scrolling through for long periods of time, getting rid of the app and having to go through the search browser takes an extra step and allows for a moment to pause and decide if it is a good time to engage in this activity,”== Becker says.
### **3\. Downgrade Your Phone**
If youre having trouble staying present, ==eliminate the distractions by replacing your smartphone with a simple cell phone that cannot support apps.== “It can absolutely be helpful to downgrade from a smartphone if that is possible,” says [Jennifer Kelman, LCSW](https://www.jenniferkelman.com/bio.html), a social worker based in Boca Raton, Florida. In fact, this is what she uses with her own children. “They have simple call or text features and thats it,” she says.
### **4\. Turn Off Your Phone at a Specific Time**
==Try powering down before dinner and until the next morning.== Apple and Android users can enable do-not-disturb settings that can silence alerts, notifications, and calls. Becker says its a good idea to take advantage of the tools that are built into your devices.
### **5\. Adjust Your Phone Settings to Limit Certain Apps**
==Apple iPhone users can set limits with== ==[Screen Time](https://support.apple.com/en-us/HT208982)== ==(find it in your phones settings) and schedule Downtime, when only phone calls or specific apps are allowed and specified apps have a time limit.== ==[Digital Wellbeing](https://play.google.com/store/apps/details?id=com.google.android.apps.wellbeing&hl=en%5FUS&gl=US)== ==works similarly for Google devices.== People who didnt use these features were more likely to experience problematic smartphone use and worse well-being than those who did use them, according to a [research analysis](https://pubmed.ncbi.nlm.nih.gov/32354288/)_._
**RELATED:** [**How to Recognize When a Self-Care Practice Is No Longer Self-Care**](https://www.everydayhealth.com/self-care/how-to-recognize-when-a-self-care-practice-is-no-longer-self-care/)
### **6\.** **Create No-Phone Areas**
Kelman believes that ==setting limits on certain apps doesnt always work. Instead, she suggests removing yourself from device use completely.== Banning phones and screens from the bedroom, for instance, can keep screens from interfering with your sleep, Becker says. And if you have to go into a different room or part of your home to use a device, it may deter you from mindlessly scrolling.
### **7\. Consider Reaching Out to a Mental Health Professional**
“We are all using technology constantly, and therefore it can be hard to always know the difference between having a problem or not,” Becker says. If your behaviors with or feelings regarding technology or certain apps and sites begin to interfere with your daily functioning, it may be time to seek professional help, Becker says. Kelman adds that if your self-esteem plummets or you find yourself dealing with anxiety or depression, its time to talk to someone.
## Editorial Sources and Fact-Checking
Everyday Health follows strict sourcing guidelines to ensure the accuracy of its content, outlined in our [editorial policy](https://www.everydayhealth.com/editorial-policies/). We use only trustworthy sources, including peer-reviewed studies, board-certified medical experts, patients with lived experience, and information from top institutions.
#### Resources
* Small GW, Lee J, Kaufman A, et al. Brain Health Consequences of Digital Technology Use. [_Dialogues in Clinical Neuroscience_](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7366948/). June 2020.
* Clark JL, Algoe SB, Green MC. Social Network Sites and Well-Being: The Role of Social Connection. [_Current Directions in Psychological Science_](https://journals.sagepub.com/doi/full/10.1177/0963721417730833#%5Fi5%20%5Fi6). February 2018.
* El-Khoury J, Haidar R, Kanj RR, et al. Characteristics of Social Media Detoxification in University Students. [_Libyan Journal of Medicine_](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7717533/). December 2021.
* Fioravanti G, Prostamo A, Casale S. Taking a Short Break From Instagram: The Effects on Subjective Well-Being. [_Cyberpsychology, Behavior, and Social Networking_](https://pubmed.ncbi.nlm.nih.gov/31851833/). February 2020.
* Schmuck D. Does Digital Detox Work? Exploring the Role of Digital Detox Applications for Problematic Smartphone Use and Well-Being of Young Adults Using Multigroup Analysis. [_Cyberpsychology, Behavior, and Social Networking_](https://pubmed.ncbi.nlm.nih.gov/32354288/). August 2020.

View file

@ -0,0 +1,937 @@
---
id: 63939b9e-e8f0-11ee-8320-63f36465eb6d
title: |
How to Create a Great Personal Portfolio Page a Handbook for Beginners
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-03-22 18:40:39
url_omnivore: |
https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11
url_original: |
https://www.freecodecamp.org/news/how-to-create-a-great-personal-portfolio-page-a-step-by-step-guide/
---
# How to Create a Great Personal Portfolio Page a Handbook for Beginners
## Highlights
### Tips for Choosing the Perfect Domain Name
* **Keep It Simple**: Opt for a domain name that is easy to remember and type.
* **Include Keywords**: If possible, incorporate relevant keywords related to your industry or profession.
* **Consider Your Niche**: Ensure your domain name aligns with the type of work showcased on your portfolio.
* **Avoid Numbers and Hyphens**: Numbers and hyphens can be confusing and are often forgotten when typing a domain name.
* **Check Availability**: Verify that the domain name you want is not already taken and is available for purchase. You can use [namecheap.com](https://www.namecheap.com/), [godaddy.com](https://www.godaddy.com/nl-nl) and many other online hosting websites.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#1c688bb9-5b3e-41e4-8529-5902e0533fb7)
---
**Research Design Options**: Explore various design templates on platforms like Envato, ThemeForest, and Figma. These resources offer a wide array of designs suited to different professions, aiding in finding one that matches your vision.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#596a42c0-8fce-4a08-9a50-1278c860e160)
---
Showcase any recognitions, certifications, or contributions to open-source projects.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#478f7449-f350-4fab-8b67-cc05ad413267)
---
#### For Developers Seeking Employment
If your primary goal is to attract potential employers, your portfolio needs to emphasize your technical skills, projects, and the professional value you bring. Here's how to tailor your site:
* **Highlight Relevant Projects**: Showcase a selection of projects that are most relevant to the types of roles you're seeking. Include detailed case studies that walk through your problem-solving process, technologies used, and the outcomes achieved.
* **Professional Narrative**: Use the "About Me" section to narrate your professional journey, emphasizing experiences and skills that align with your career aspirations. Mention any collaborative projects to demonstrate teamwork and communication skills.
* **Testimonials from Colleagues**: Including endorsements from past colleagues, supervisors, or collaborators can add credibility and provide insight into your working style and contributions to a team.
* **Technical Blog**: If you maintain a blog, focus on posts that highlight your expertise, insights into technology trends, and solutions to common problems in your field. This not only showcases your knowledge but also your ability to communicate complex ideas clearly.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#3549ac1f-0104-40fd-8981-85cce3d04184)
---
The tone of your brand voice can vary depending on the context and the platform, but it should always reflect your brand's personality.
Whether it's confident and authoritative, friendly and conversational, or inspirational and aspirational, the tone should be consistent across all channels to maintain brand recognition and loyalty.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#12b06926-57b3-41b5-9e1b-492f82c163fe)
---
Incorporate feedback from previous clients or colleagues to highlight your skills and professionalism. Testimonials lend authenticity and foster trust in your portfolio.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#75d7bf6c-2a2a-44fb-a958-0c595a4a77ca)
---
Showcase your standout projects with comprehensive case studies. These narratives offer a deep dive into your creative process, problem-solving abilities, and the impact of your work.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#efeda449-8965-46a0-8884-c9fadb8f0f07)
---
A blog section can serve as a platform for sharing your expertise, industry insights, or personal reflections. It reflects your dedication to your craft and ensures your site remains vibrant with new content.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#c2a0e123-fd91-4e08-8509-55877613c299)
---
Offer a look into your creative journey through behind-the-scenes content like sketches, mood boards, or early designs. This transparency into your process can fascinate visitors and add depth to your work presentation.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#65a1c40b-4c6b-4d07-b581-5e8335064bf4)
---
Highlight any accolades or recognitions you've received. Showcasing your achievements adds prestige to your portfolio and distinguishes you from your peers.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#9a595a7c-8027-497f-89e5-f02166883e35)
---
For those whose work involves data, adding infographics or visualizations can compellingly present complex information. This not only showcases your ability to simplify intricate data but also your creative approach to visual communication.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#f421ea17-4988-4bf0-a817-18d653f3beae)
---
### Home Page: The Gateway to Your Professional Universe
The home page serves as the initial welcome to your professional domain, providing a brief yet impactful overview of your identity and offerings. This first impression is vital, setting the tone for the visitor's experience on your site.
![image-101](https://proxy-prod.omnivore-image-cache.app/1468x917,s3q8eO-xelF9-X-CYPdsvtfxGJOtzIMna5j9kcAB158w/https://www.freecodecamp.org/news/content/images/2024/03/image-101.png)
My home page
Your home page should emphasize:
* **Engaging Introduction**: Introduce yourself with a quick mention of your professional designation and expertise.
* **Visual Elements**: Incorporate captivating visuals or a portfolio reel to immediately draw attention to your work.
* **Navigation Tips**: Direct visitors smoothly to different site sections with clear navigation aids.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#4b08a99c-131f-4d34-b7ff-fb992c2851ad)
---
### Portfolio Section: A Display of Your Expertise
This core section is where you showcase your finest work. Organizing this area thoughtfully ensures that visitors can easily navigate through your projects. You should include:
* **Organization by Category**: Group projects by theme, type, or sector for straightforward browsing.
![image-93](https://proxy-prod.omnivore-image-cache.app/1430x932,sm8Xc0-1Mt_0zU4bra5QIqpbB1CbHie3vIJsCbQ9N8lM/https://www.freecodecamp.org/news/content/images/2024/03/image-93.png)
Projects organized by category on my personal portfolio page - Python, Statistics, Machine Learning, and NLP
* **Project Summaries**: Provide a concise description of each project, outlining your role, the methodology, and the results.
![image-94](https://proxy-prod.omnivore-image-cache.app/1450x753,sXU_bGfvLDSeR86OFH8ha87Onokvo-YgWxyu1rZNLSNs/https://www.freecodecamp.org/news/content/images/2024/03/image-94.png)
Example project summary on my portfolio
* **High-Resolution Media**: Present your work with high-quality images or videos to fully convey its quality.
![image-95](https://proxy-prod.omnivore-image-cache.app/1458x914,szuRqwh4X_p_Lf9lNnlC1qEGrhGM1sK0chdZiwfpyXH8/https://www.freecodecamp.org/news/content/images/2024/03/image-95.png)
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#50fc8ae9-03ea-4158-b0e9-9ab7baa63555)
---
### About Me Page: Your Professional Narrative
This page allows you to forge a deeper connection with your audience by sharing your story, ambitions, and what makes you unique. It should cover:
* **Professional Background**: Share your career path, educational achievements, and significant milestones.
![image-97](https://proxy-prod.omnivore-image-cache.app/1452x773,sjB_AuG9eMME61y1f5xTWPeW40BYAPN4EyG3fNsX_q0w/https://www.freecodecamp.org/news/content/images/2024/03/image-97.png)
Some of my personal milestones
* **Skills and Expertise**: Spotlight the abilities that distinguish you in your field.
![image-96](https://proxy-prod.omnivore-image-cache.app/1449x699,ssJDqK7Fbp1W9PwyzQjAo8yqz-014s0RG7ekDqwMo7uo/https://www.freecodecamp.org/news/content/images/2024/03/image-96.png)
A page on my portfolio showing my "digital DNA" - the skills I'd like to showcase
* **Personal Insights**: Offering a peek into your personal hobbies or interests can make you more approachable and relatable.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#26922385-6eda-4cc1-9885-70a965d69303)
---
### Contact Information: Simplifying Communication
For potential collaborations, its essential to make reaching out as simple as possible. Your contact page should include:
* **Various Contact Methods**: Provide a contact form, email, and possibly a phone number for easy communication.
![image-99](https://proxy-prod.omnivore-image-cache.app/1451x855,sP3g3ley_Uhu0duZbckP0jOEC35DJl1rw8IBcEEMfn4k/https://www.freecodecamp.org/news/content/images/2024/03/image-99.png)
My contact information page on my personal portfolio site
* **Social Media Profiles**: Guide visitors to your professional social media pages.
* **Geographic Details**: If applicable, mention your location or time zone.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#82e27144-7f5b-4906-ba60-cd5b785a3797)
---
### Do's for a Captivating Homepage
* **Be Concise**: Ensure your message is clear and to the point.
* **Use Endorsement Logos**: Incorporate logos of companies you've appeared on to build trust.
* **Display Technical Stack Logos**: Show the technologies you're proficient in using their logos.
* **Showcase a Case Study Gallery**: Highlight your best work in an easily navigable gallery.
* **Include a Dynamic Header**: Use an engaging hero section to make a strong first impression.
* **Highlight Recent Work**: Give visitors a glimpse of your latest projects to show you're active and relevant.
* **Use Testimonials Strategically**: Place client testimonials where they'll have the most impact, showcasing your reliability and skill.
### Don'ts for Your Homepage
* **Avoid Random Placement**: Structure your content logically don't place information haphazardly.
* **Steer Clear of Long Paragraphs**: Keep your homepage breezy and easy to read with short, impactful statements.
* **Don't Overwhelm with Content**: Your homepage isn't the place to squeeze in every detail of your portfolio.
* **Avoid Image Neglect**: Images are crucial for visual engagement, so don't omit them.
* **Resist Clutter**: Keep the design clean and focused to improve user experience.
* **Avoid Technical Jargon**: Use language that's accessible to all visitors, not just industry insiders.
* **Skip the Hard Sell**: Present your skills and achievements without being overly aggressive.
[source](https://omnivore.app/me/how-to-create-a-great-personal-portfolio-page-a-handbook-for-beg-18e6a73ea11#111959c1-8fee-47cb-a0e6-9088462bf6ac)
---
## Original
![How to Create a Great Personal Portfolio Page a Handbook for Beginners](https://proxy-prod.omnivore-image-cache.app/1280x720,sEagJT3mw15_lRdem2144h-RqnDE5JTJZSZ2rPP_Logg/https://www.freecodecamp.org/news/content/images/size/w2000/2024/03/How-to-Create-a-Great-Personal-Portfolio-Page-Cover--1-.png)
As a developer, you'll want to create a digital space that mirrors your unique skills and persona. And a stellar personal portfolio website can help you make your mark in the digital universe.
Imagine a space that not only highlights your finest achievements but also attracts potential clients and makes a memorable impact on every visitor.
This guide will help you navigate creating an outstanding personal portfolio. We'll dissect the process from choosing an eye-catching layout to crafting content that tells your story. It'll all be aimed at building a page that resonates with who you are and the value you bring.
But the journey doesn't end here. Diving deeper, you'll learn more strategies and insights to help you elevate your portfolio beyond the ordinary. Are you ready? Let's step into the realm of crafting a portfolio that's not just seen but remembered.
## Table Of Contents
1. [The Importance of a Personal Portfolio Website](#why-is-a-personal-portfolio-website-important)
2. [How to Choose the Right Domain Name](#how-to-choose-the-right-domain-name)
3. [How to Design Your Portfolio Site](#how-to-design-your-portfolio-site)
4. [How to Pick the Right Tools](#how-to-pick-the-right-tools)
5. [How to Showcase Your Best Work](#how-to-showcase-your-best-work)
6. [How to Craft Your Brand Story and Unique Voice](#how-to-craft-your-brand-story-and-unique-voice)
7. [How to Add Additional Content](#how-to-add-additional-content)
8. [Essential Pages for Your Portfolio](#what-pages-you-need-in-your-portfolio)
9. [How to Organize the Home Page](#how-to-organize-the-home-page)
10. [How to Keep Your Portfolio Fresh](#how-to-keep-your-portfolio-fresh)
11. [Conclusion](#11-conclusion)
### Short Summary
1. Building a great personal portfolio page is crucial for showcasing your skills and personality in the digital realm.
2. This step-by-step guide will help you overcome common challenges like starting, structuring, and designing your portfolio effectively.
3. Learn how to choose the right domain, design your site, showcase your best work, and craft a unique voice to make a lasting impression.
4. Discover the essential elements, additional content options, social media strategies, and SEO techniques to maximize your portfolio's impact.
![image-56](https://proxy-prod.omnivore-image-cache.app/1792x1024,sirF1uD9HJwN1iCPcQ7O2LA81HvSafx6_saIKQbZeB2A/https://www.freecodecamp.org/news/content/images/2024/03/image-56.png)
Set against Doha's futuristic skyline, this image symbolizes the critical role of a personal portfolio in distinguishing yourself in the tech landscape - [lunartech.ai](https://lunartech.ai/)
## Why is a Personal Portfolio Website Important?
Your portfolio, much like a shop's facade or what you wear, communicates your personal style and standards, offering a reflection of your professional identity.
The structure of your website, the projects you spotlight, and the narrative you weave about your journey play a pivotal role in this representation.
While some have navigated their way to impressive careers without a digital footprint, these days it's become more and more important to have a solid personal portfolio. This is particularly true for tech professionals—ranging from software engineers to data scientists and AI experts.
This digital domain gives you a place to show what sets you apart, embodying the core of your unique value proposition. Without this platform, you leave your professional narrative to chance, permitting others to assemble a fragmented view of your persona.
Not having an online personal portfolio could well dictate whether you secure your dream position and successfully establish a strong personal brand, versus fading into the background. In the digital-first era we navigate, a personal portfolio transcends mere benefit—it emerges as an [essential instrument for personal branding](https://www.freecodecamp.org/news/personal-branding-for-devs-handbook/).
### How a Personal Portfolio Helps You
For engineers seeking to carve out a distinctive identity in the tech landscape, the quest to showcase what makes you unique is paramount. While GitHub serves as a testament to your technical abilities, it often speaks a language too specialized for a broader audience.
Similarly, YouTube offers a platform for personality-driven exposure, but the prospect of speaking to a camera for hours may not align with your preferred mode of expression. Herein lies the unparalleled value of a personal portfolio page: it stands as one of the most effective mediums to represent yourself.
When you're creating your personal portfolio, it's crucial to demonstrate your expertise and establish your credibility. This demands clear and concise communication, directly engaging potential clients or employers, showcasing your skills, and fostering an online presence.
These are not mere suggestions but critical measures for contemporary professionals. By crafting a portfolio that not only displays your work but propels your career forward, you assert a distinctive presence in the competitive realm of technology, ensuring your unique contributions are both seen and valued.
![image-58](https://proxy-prod.omnivore-image-cache.app/1792x1024,sqocV4piUnzrNwSgMN56QSau9hrq2wUy5oIlqB9zRld8/https://www.freecodecamp.org/news/content/images/2024/03/image-58.png)
Choose the Right Domain Name - [lunartech.ai](https://lunartech.ai/)
## How to Choose the Right Domain Name
When setting up your personal portfolio website, selecting the perfect domain name is a crucial decision that can impact your online presence significantly.
Your domain name is essentially your online identity, so it's important to choose wisely to make a lasting impression on your visitors and potential clients.
![image-73](https://proxy-prod.omnivore-image-cache.app/1061x567,sl3UFOlIXKcvUZ7OjhW3oRj-0CURFTCb7FRTRUnM_1Z0/https://www.freecodecamp.org/news/content/images/2024/03/image-73.png)
Choosing my domain name - vaheaslanyan.com
For my personal portfolio page, I like to keep it simple: firstname+lastname.com or just firstname.com. So for me it is: [vaheaslanyan.com](http://vaheaslanyan.com/). (My firstname + lastname.com)
### Other examples are
1. **JohnDoe.com**: This is the most direct approach, using both your first and last name. It's professional and clear for anyone looking for your work.
2. **AlexJohnson.dev**: For those in the tech industry, using a domain extension like .dev can highlight your area of expertise.
3. **MichaelRoberts.design**: Similar to the .dev extension, using .design can be a great choice for professionals in fields like graphic design, UX/UI, or related areas.
4. **Elena.co**: If your first name is unique enough, or if you prefer a shorter URL, you might use just your first name with a less common extension like .co.
5. **MaxCreates.com**: If "Max" is your nickname and you're in a creative industry, this domain clearly indicates what you do and who you are.
![image-74](https://proxy-prod.omnivore-image-cache.app/602x805,sbI0AY6T3-r85iG8q_2UT_nAooExTnYqNJ2Sbc4VcLAw/https://www.freecodecamp.org/news/content/images/2024/03/image-74.png)
My name coming up in Google search results
### Importance of a Domain Name
Your domain name is the first thing users see when they land on your website, so it should be memorable, easy to spell, and reflect your brand identity.
Here's why it's critical:
* **It Reflects Your Brand**: A well-chosen domain name can effectively convey your unique voice and what you have to offer. If it is your project portfolio website, then something that reflects your name or nickname is a great way to accomplish this.
* **It Improves Search Engine Ranking**: Having relevant keywords in your domain name can positively impact your website's SEO.
* **It Attracts Potential Clients**: A professional and catchy domain name can pique the interest of potential clients and make your website stand out.
### ==Tips for Choosing the Perfect Domain Name==
* **==Keep It Simple==**==: Opt for a domain name that is easy to remember and type.==
* **==Include Keywords==**==: If possible, incorporate relevant keywords related to your industry or profession.==
* **==Consider Your Niche==**==: Ensure your domain name aligns with the type of work showcased on your portfolio.==
* **==Avoid Numbers and Hyphens==**==: Numbers and hyphens can be confusing and are often forgotten when typing a domain name.==
* **==Check Availability==**==: Verify that the domain name you want is not already taken and is available for purchase. You can use== ==[namecheap.com](https://www.namecheap.com/)====,== ==[godaddy.com](https://www.godaddy.com/nl-nl)== ==and many other online hosting websites.==
![image-59](https://proxy-prod.omnivore-image-cache.app/1792x1024,sfR_6mj13IOtCt_px7eQ9cyMOy6cmPFAyw1tv2zjEEoo/https://www.freecodecamp.org/news/content/images/2024/03/image-59.png)
Here's a visual representation capturing a web designer in their workspace -[ lunartech.ai](https://lunartech.ai/)
## How to Design Your Portfolio Site
When selecting a design for your portfolio website, its important that the theme reflects your professional brand. For example, lawyers typically want a theme that suggests reliability and authority, while educators might choose a Learning Management System (LMS) to share courses.
To find the right design, websites like Envato, ThemeForest, and Figma templates are useful. It's helpful to plan what you want on each page before deciding on a design.
Here's how to approach this process:
**Understand Your Brand**: First, define what your brand represents and the impression you want to make. Whether your style is modern and sleek or more traditional and professional, your website's design should align with this.
![image-75](https://proxy-prod.omnivore-image-cache.app/1494x929,sVEfTnugco6jTctlcH9RYkpQBvkMZr1z8lvzYcqVuc5Y/https://www.freecodecamp.org/news/content/images/2024/03/image-75.png)
My personal portfolio homepage
**==Research Design Options==**==: Explore various design templates on platforms like Envato, ThemeForest, and Figma. These resources offer a wide array of designs suited to different professions, aiding in finding one that matches your vision.==
![image-76](https://proxy-prod.omnivore-image-cache.app/1447x936,swhVjfoKHTKGAgTJRzlqYXarOSU1D-L8A-JXHMerqNx0/https://www.freecodecamp.org/news/content/images/2024/03/image-76.png)
Different site design options
**Functionality and Features Needs**: Consider the features essential for showcasing your work effectively. For a digital artist, high-resolution galleries might be key, while a developer might need support for embedding code snippets.
![image-77](https://proxy-prod.omnivore-image-cache.app/1453x933,sC8fYnZdJRArqnPQZPmXH4hE9oJAmLwqIWJN7MntBRr8/https://www.freecodecamp.org/news/content/images/2024/03/image-77.png)
Press releases on my site
**Sketch Your Layouts**: Draft a basic layout for each page of your website before committing to a design. This helps visualize how the design will accommodate your content.
![image-78](https://proxy-prod.omnivore-image-cache.app/1200x609,srgwgSJ2N1Bq-StTTOTB0iw_aeB6_giOrj3O7o3goMHw/https://www.freecodecamp.org/news/content/images/2024/03/image-78.png)
Example wireframes for creating a personal portfolio
**Prioritize Simplicity and User Experience**: A design that's easy to navigate and not overly complicated will keep the focus on your portfolio and provide a better experience for your visitors.
![image-79](https://proxy-prod.omnivore-image-cache.app/1600x1200,sKQXUVvTtUXswOhIO154SoPtTfdgu0_hjcaJFN3_p5Vw/https://www.freecodecamp.org/news/content/images/2024/03/image-79.png)
An example of a simple website design
**Ensure Compatibility and Responsiveness**: The design should look good and function well across all devices and browsers. Responsiveness ensures your website adapts to any screen size.
![image-80](https://proxy-prod.omnivore-image-cache.app/720x720,sKehidmYdrmiZEqi3hGoq_2LWVaDCcS7lGjXLH33W4h4/https://www.freecodecamp.org/news/content/images/2024/03/image-80.png)
An example of a responsive site that looks good on both desktop and mobile
**Customization Flexibility**: Look for a design that offers customization. Being able to adjust elements like colors, fonts, and layout means you can tailor the design to fit your brand perfectly.
![image-81](https://proxy-prod.omnivore-image-cache.app/931x580,sqtUUH638YAty00HUCK0ZMMg65dyfkJH0-9u_6BMhD9s/https://www.freecodecamp.org/news/content/images/2024/03/image-81.png)
An example of a flexible design
**Test and Gather Feedback**: If possible, test the design with some of your content and ask for feedback from colleagues or mentors. Their insights can help you gauge the design's effectiveness in presenting your work.
By carefully choosing a design that represents your professional brand, you create a strong foundation for a portfolio website that effectively showcases your skills and communicates your unique value to visitors.
![image-60](https://proxy-prod.omnivore-image-cache.app/1792x1024,swSuSeeO6sFLuL0KUopfd3PWWkfoDIxIPFQOM0BWS-o4/https://www.freecodecamp.org/news/content/images/2024/03/image-60.png)
Here's the visual representation capturing a tech professional in their early morning coding session - [lunartech.ai](https://lunartech.ai/)
Choosing the right tools to build your portfolio involves understanding your needs, evaluating available options, and selecting solutions that align with your skills and goals.
This chapter guides you through this process, from deciding between coding your own site vs using a no-code platform to selecting the perfect hosting provider.
### Understand Your Needs
First, it's important to identify your field: are you in the tech industry, or are you in some other line of work?
Your field of work significantly influences your choice of portfolio tools. Tech professionals might lean towards custom-coded sites to showcase their coding prowess, while those in non-tech fields may prefer no-code builders for their convenience and ease of use.
Next, you'll want to evaluate your skills to decide how to actually create the site. Do you want to code your own portfolio, or choose a no-code solution?
Assess your skills honestly. If you're comfortable with coding, a custom-built site might be the best way to showcase your technical abilities. For those without coding skills or a desire to learn, no-code platforms offer a practical and efficient alternative.
Then you'll want to set your website goals and objectives. Define what you want your portfolio to achieve. Are you looking to attract freelance clients, land a full-time job, or simply showcase your work? Your goals can influence the choice of platform, design, and content of your portfolio.
### Options for Tech Professionals
Coding your own portfolio from scratch offers complete control over design and functionality, allowing you to create a unique and personalized online presence. It also showcases what you can do with code.
#### Benefits of Custom Coding
* Customization: Tailor every aspect of your site to fit your personal brand.
* Skill Demonstration: Showcase your coding ability to potential employers or clients.
#### Recommended Technologies and Frameworks
* **HTML, CSS, and JavaScript Basics**: The foundation of web development, essential for any custom-built portfolio.
* **Advanced Frameworks**: Utilize React, Angular, or Vue to create dynamic and responsive sites.
#### Hosting Solutions for Coders
* **GitHub Pages**: A free option for hosting simple, static sites.
* **Netlify and Vercel**: Provide more flexibility and support for dynamic sites built with advanced frameworks.
### No-Code Solutions for Non-Tech Professionals
No-code platforms have democratized web design, enabling anyone to create beautiful, functional websites without writing a single line of code.
#### Comparing Popular No-Code Platforms
* **WordPress**: Versatile and widely used, with extensive themes and plugins.
* **Webflow**: Offers unparalleled customization and flexibility without requiring coding knowledge.
* **Squarespace**: Known for its ease of use and stunning, design-forward templates.
### How to Choose the Right Hosting Option
Your hosting provider impacts your site's loading speed, uptime, and overall user experience, making it a crucial factor in your portfolio's success.
#### Some Common Hosting Providers
* **Namecheap**: Offers affordable, reliable hosting with excellent customer support.
* **Alternative Options**: Explore other reputable providers like Bluehost and SiteGround based on your specific needs.
Choosing the right tools for your personal portfolio requires a thoughtful evaluation of your needs, skills, and goals. Whether through custom coding or no-code platforms, the perfect portfolio is within reach.
By carefully selecting the right tools and platforms, you can create a portfolio that not only showcases your work but also helps you achieve your career aspirations.
![image-61](https://proxy-prod.omnivore-image-cache.app/1792x1024,sVZBOvutqlAhsU-wpcRWTWpkxE14VIOnEr88JFQ8W9GE/https://www.freecodecamp.org/news/content/images/2024/03/image-61.png)
Here's a visual representation capturing a software engineer as they organize their portfolio - [lunartech.ai](https://lunartech.ai/)
## How to Showcase Your Best Work
When setting up your portfolio page, it's essential to showcase projects that reflect your current focus in software engineering, data science, AI, or whatever area of tech you call home.
Select projects that are recent and demonstrate your skills and interests in these areas, ensuring your portfolio aligns with the professional direction you're aiming for.
### Categorize Your Projects
Divide your projects into categories like software development, data analysis, or artificial intelligence to help visitors navigate your portfolio more easily.
![image-82](https://proxy-prod.omnivore-image-cache.app/1453x839,sAMWRM0laO9WYBvqBfoFmBPjjIy251OUc5Eq-nEJ5M_M/https://www.freecodecamp.org/news/content/images/2024/03/image-82.png)
The project section on my personal portfolio site with clear sections for different topics
This organization allows you to display a broad skill set, making it clear you're well-versed in multiple aspects of tech. It also helps visitors quickly find projects that align with their specific interests or needs.
### Provide Detailed Project Descriptions
For each project, write a brief description that outlines the project's goals, your role in its development, and the technology used. Highlight any unique challenges you encountered and how you overcame them, showcasing your problem-solving skills.
![image-86](https://proxy-prod.omnivore-image-cache.app/1458x911,se4tQkcZ3aNxiloifazgzTlnrPgsiYNSt8HP1J7nR25o/https://www.freecodecamp.org/news/content/images/2024/03/image-86.png)
Example of some project descriptions listing the challenge, goal, technologies used, etc.
These descriptions give context to your work and help visitors understand the depth of your technical expertise and creativity.
### Use High-Quality Visuals and Code Snippets
Incorporate clear screenshots of your projects or UI designs, and consider including code snippets to illustrate the quality of your coding practices.
![image-85](https://proxy-prod.omnivore-image-cache.app/1447x930,s92Q4n9P6JEJuKUbTee3KrF6_ykxjK7XlCudnNeI2wUg/https://www.freecodecamp.org/news/content/images/2024/03/image-85.png)
A high quality visual
Visuals help convey the complexity and functionality of your projects, while code snippets can give fellow tech professionals insight into your technical approach. Together, they provide a comprehensive view of your capabilities.
### Include Client or Collaborator Testimonials
Testimonials from clients, colleagues, or collaborators can add credibility to your portfolio. Positive feedback on your technical skills, work ethic, and ability to deliver solutions can significantly enhance your professional image.
![image-87](https://proxy-prod.omnivore-image-cache.app/1437x845,sjIIzA_Otixhxooev5nZyDOxbip2m0DnCtKFJ2pGeSac/https://www.freecodecamp.org/news/content/images/2024/03/image-87.png)
Examples from my testimonials page
These testimonials act as a form of social proof, validating your expertise in your field.
### Highlight Achievements and Contributions
==Showcase any recognitions, certifications, or contributions to open-source projects.==
For example, if you've received a "Developer of the Month" award from a well-known tech community, obtained a certification in Advanced Machine Learning from a reputable online platform, or contributed to open-source projects on GitHub like TensorFlow or Apache Spark, make sure these are prominently featured.
![image-88](https://proxy-prod.omnivore-image-cache.app/1457x614,sLU6Hmb1gTinmZu_DuI2adPm_Li_VQAxvn52T6dugVSg/https://www.freecodecamp.org/news/content/images/2024/03/image-88.png)
Some of my own milestones throughout my career
Highlighting such achievements, like winning a hackathon or being part of a team that developed a widely used software tool, showcases your commitment and active engagement in the tech community.
It also positions you as a dedicated and accomplished professional, underlining your contributions and achievements within the fields of software engineering, data science, and AI.
### Feature Interactive Demos
Where possible, include interactive demos of your projects or links to live sites where visitors can see your work in action. This not only makes your portfolio more engaging but also lets visitors experience the usability and functionality of your creations firsthand.
Interactive demos can be particularly compelling for projects in AI and data science, where results and data visualizations play a crucial role.
To effectively include interactive demos or links to live sites in your portfolio, consider these approaches:
1. **Embed Project Videos**: Create short video demonstrations of your projects and embed them directly into your portfolio. These videos can guide viewers through the functionality and features of your creations, providing a dynamic way to showcase your work.
2. **Use GitHub Pages**: For software engineering projects, deploy your web applications or tools on [GitHub Pages](https://pages.github.com/), providing a direct link in your portfolio. This free hosting service allows you to present live versions of your projects, making them accessible to anyone.
3. **Interactive Data Visualization Tools**: For data science projects, utilize tools like [Tableau Public](https://public.tableau.com/app/discover) or [D3.js](https://d3js.org/) to create interactive visualizations of your data analyses. Embed these visualizations in your portfolio to let visitors interact with the data, understand your analytical skills, and appreciate the insights you've uncovered.
4. **Host on Cloud Platforms**: Use cloud platforms like [Heroku](https://www.heroku.com/) or [Netlify](https://www.netlify.com/) to deploy your projects and include the live links in your portfolio. These platforms support a wide range of programming languages and frameworks, making them suitable for showcasing both frontend and backend projects.
5. **Demo Notebooks for AI Models**: Share Jupyter notebooks via platforms like GitHub or NBViewer that demonstrate the workings of your AI models. These notebooks can include code, visualizations, and explanations, offering a comprehensive view of your project's development process and results.
6. **Create an Interactive Portfolio Section**: Design a specific area of your portfolio dedicated to interactive demos. This section can include thumbnails or icons representing each project, which visitors can click on to explore the demo or live site.
7. **Use Code Sandboxes**: For smaller projects or code snippets, use online code editors like [CodePen](https://codepen.io/) or [JSFiddle](https://jsfiddle.net/) to create live previews. These platforms allow you to write HTML, CSS, and JavaScript in the browser and share interactive versions of your work.
By incorporating these methods, you can make your portfolio more engaging and provide potential employers or clients with a hands-on understanding of your projects' usability, functionality, and the innovative solutions you bring to the table in software engineering, data science, and AI.
### Regularly Update Your Portfolio
Keep adding new projects and updating your portfolio to reflect your latest work and ongoing learning in the tech field. This demonstrates your commitment to staying current with technological advancements and your continuous professional development. An up-to-date portfolio shows you're actively involved in your field and passionate about your work.
By tailoring your portfolio with these considerations in mind, you ensure it effectively showcases your expertise in software engineering, data science, and AI. This approach not only highlights your technical skills but also your adaptability and ongoing growth in these rapidly evolving fields.
![image-62](https://proxy-prod.omnivore-image-cache.app/1792x1024,seq-58wdwa5SAC8TnbGwAEFyrg2GSDcIIB9zzjPKMZ5k/https://www.freecodecamp.org/news/content/images/2024/03/image-62.png)
A marketing team brainstorming session - [lunartech.ai](https://lunartech.ai/)
## **How to Craft Your Brand Story and Unique Voice**
Crafting your brand's voice is a vital aspect of the brand's identity, serving as the embodiment of its personality across all forms of communication. A well-defined brand voice not only distinguishes a brand in a crowded market but also establishes a consistent and relatable presence that resonates with its target audience.
This chapter delves into the intricate process of sculpting your brand's unique voice and narrative, ensuring it aligns with its core values, mission, and the expectations of its audience.
### **Understanding Your Brand's Core**
The journey to crafting your brand's voice begins with a deep dive into its essence. This involves clarifying your brand's mission, values, and the unique proposition it offers to its audience.
A brand voice that is in harmony with these core aspects will not only be authentic but also compelling to your target audience.
### **Identify Your Audience**
Understanding and identifying your target audience as a developer is pivotal to creating a personal portfolio website that resonates with the right people, whether they are potential employers, clients, students for your courses, or collaborators. Here's how to refine your approach based on who you're speaking to most often:
#### For Educators and Course Creators
If analytics or feedback suggests that a significant portion of your visitors (like the 90% in the example) are potential students interested in your courses, your portfolio should position you as a subject matter expert and a capable educator. Here's how:
* **Showcase Educational Content**: Highlight courses you've created, workshops you've conducted, and any educational materials you offer. Use clear, engaging descriptions and include student testimonials to underscore the value of your courses.
* **Demonstrate Expertise**: Include a detailed "About Me" section that outlines your credentials, experience, and any awards or recognitions you've received in your field. This helps build trust and establish your authority.
* **Provide Free Resources**: Offering free tutorials, blog posts, or downloadable resources can be a great way to showcase your knowledge and teaching style, encouraging visitors to engage with your paid courses.
* **Engage with Interactive Demos**: Use interactive elements or demos related to your courses to engage visitors and give them a taste of what you offer, making your site and courses more memorable.
#### ==For Developers Seeking Employment==
==If your primary goal is to attract potential employers, your portfolio needs to emphasize your technical skills, projects, and the professional value you bring. Here's how to tailor your site:==
* **==Highlight Relevant Projects==**==: Showcase a selection of projects that are most relevant to the types of roles you're seeking. Include detailed case studies that walk through your problem-solving process, technologies used, and the outcomes achieved.==
* **==Professional Narrative==**==: Use the "About Me" section to narrate your professional journey, emphasizing experiences and skills that align with your career aspirations. Mention any collaborative projects to demonstrate teamwork and communication skills.==
* **==Testimonials from Colleagues==**==: Including endorsements from past colleagues, supervisors, or collaborators can add credibility and provide insight into your working style and contributions to a team.==
* **==Technical Blog==**==: If you maintain a blog, focus on posts that highlight your expertise, insights into technology trends, and solutions to common problems in your field. This not only showcases your knowledge but also your ability to communicate complex ideas clearly.==
### General Tips for Identifying Your Audience
* **Survey Your Visitors**: Simple surveys or feedback forms on your website can provide direct insights into who your visitors are and what they're looking for.
* **Analyze Website Analytics**: Use tools like Google Analytics to understand the demographics, interests, and behavior of your site's visitors. Look for patterns in the pages visited, the content engaged with, and the referral sources.
* **Social Media Insights**: If you use social media to share your work or insights, platforms like Twitter, LinkedIn, and Instagram provide analytics that can help you understand your followers' profiles and preferences.
* **Competitor Analysis**: Look at the portfolios of peers in your field. Notice who their target audience seems to be and how they engage with them. This can offer clues about your own audience.
Identifying and understanding your target audience allows you to craft a portfolio that speaks directly to their needs and interests. Whether you're teaching, seeking employment, or offering freelance services, a focused approach ensures that your portfolio resonates with the right people, making it a powerful tool in achieving your professional goals.
### **Craft Your Brand Narrative**
Once you have a clear understanding of your brand's core and its audience, the next step is to weave your brand narrative.
This narrative should tell the story of your brand—where it comes from, what it stands for, and where it is headed.
The narrative becomes the foundation upon which your brand voice is built, ensuring that every message you convey is coherent and aligned with your brand's story.
### **Be Aware of the Tone of Your Voice**
==The tone of your brand voice can vary depending on the context and the platform, but it should always reflect your brand's personality.==
==Whether it's confident and authoritative, friendly and conversational, or inspirational and aspirational, the tone should be consistent across all channels to maintain brand recognition and loyalty.==
### **Consistency Is Key**
Maintaining consistency in your brand voice across all platforms and touchpoints is crucial. This consistency helps in building trust and credibility with your audience. It ensures that no matter where or how your audience encounters your brand, they receive the same experience and message.
### **Evolve Your Voice**
While consistency is essential, it's also important to allow your brand voice to evolve with your audience and the market. Stay open to feedback and be willing to adjust your voice as needed to ensure it remains relevant and engaging to your audience.
Crafting your brand story and unique voice is not a one-time effort but an ongoing process of refinement and evolution.
By staying true to your brand's core, understanding your audience, and being consistent yet flexible in your approach, you can create a brand voice that not only defines your brand's identity but also builds lasting connections with your audience.
![image-63](https://proxy-prod.omnivore-image-cache.app/1792x1024,s91WPC2v95W5Cj4TyTmYG-OLTGGjNWWxEaYqtSH-T0t0/https://www.freecodecamp.org/news/content/images/2024/03/image-63.png)
A web designer enhancing their portfolio website with a variety of content to showcase their capabilities - [lunartech.ai](https://lunartech.ai/)
## How to Add Additional Content
Enhancing your personal portfolio website with a variety of content not only enriches the visitor's experience but also showcases the breadth of your capabilities. Here are some key additions that can transform your site:
### Client Testimonials and Peer Reviews
==Incorporate feedback from previous clients or colleagues to highlight your skills and professionalism. Testimonials lend authenticity and foster trust in your portfolio.==
**Example:** a section titled "What People Are Saying" can feature a carousel of quotes from past clients, such as: "Alex transformed our brand's vision into reality with exceptional design and attention to detail. Working with them was a game-changer!" Jamie, Brand Manager
### Detailed Case Studies
==Showcase your standout projects with comprehensive case studies. These narratives offer a deep dive into your creative process, problem-solving abilities, and the impact of your work.==
**Example:** a page dedicated to a rebranding project for a local café, including the challenge ("Revitalizing a beloved local brand"), the process (from initial sketches to final design choices), and the impact (increased customer engagement and sales).
### Blog Insights
==A blog section can serve as a platform for sharing your expertise, industry insights, or personal reflections. It reflects your dedication to your craft and ensures your site remains vibrant with new content.==
**Example:** a series of posts under "Design Insights," with entries like "The Future of Web Design: Trends to Watch" or "My Creative Process: From Concept to Completion," providing readers with valuable knowledge and a peek into your creative world.
### Behind-the-Scenes Glimpses
==Offer a look into your creative journey through behind-the-scenes content like sketches, mood boards, or early designs. This transparency into your process can fascinate visitors and add depth to your work presentation.==
**Example:** a gallery called "The Making of a Logo," featuring early sketches, revisions, and commentary on the thought process behind each stage, culminating in the final design.
### Engaging Interactive Elements
Incorporate dynamic features such as sliders, animations, or interactive galleries. These elements can make your portfolio more engaging and leave a lasting impression on visitors.
**Example:** an interactive gallery for a photography portfolio, where visitors can filter images by theme or color. Hovering over an image reveals the project name and details, while clicking enlarges the photo with a detailed caption.
### Awards and Honors
==Highlight any accolades or recognitions you've received. Showcasing your achievements adds prestige to your portfolio and distinguishes you from your peers.==
**Example:** a "Recognition" section displaying badges or trophies from design competitions, accompanied by a brief description of the award and the project that won it, such as "Winner of the 2023 Design Innovation Award for the Eco-Friendly Packaging Series."
### Video Demonstrations
Embedding video content, whether project walkthroughs or client feedback, can provide an immersive experience. Videos add a dynamic layer to your presentation, making your work more relatable and memorable.
**Example:** a video walkthrough of a mobile app design process, starting from wireframes to the finished product, with voiceover explaining design choices, challenges overcome, and user feedback incorporated into the final version.
### Infographics and Data Visualizations
==For those whose work involves data, adding infographics or visualizations can compellingly present complex information. This not only showcases your ability to simplify intricate data but also your creative approach to visual communication.==
**Example:** an infographic titled "The Impact of Good Design on User Engagement," showcasing statistics on user retention, satisfaction, and conversion rates before and after a website redesign, highlighting your ability to drive results through design.
Diversifying the content on your personal portfolio website with additions like testimonials, in-depth case studies, and interactive elements enriches your online presence. Such enhancements not only amplify the appeal and credibility of your portfolio but also demonstrate your comprehensive skill set and creativity.
![image-65](https://proxy-prod.omnivore-image-cache.app/1792x1024,suJhldaH1LyVXvrFJIdMr3n4PcCA7-s3JhSwVkRUhtWc/https://www.freecodecamp.org/news/content/images/2024/03/image-65.png)
A web developer planning for personal portfolio website - [lunartech.ai](https://lunartech.ai/)
## What Pages You Need in Your Portfolio
To make your personal portfolio website truly unforgettable, paying close attention to its structure and content is paramount.
The goal is to showcase not just your work and abilities, but to establish a holistic online platform that mirrors your professional identity. Integrating specific essential pages is critical for a detailed presentation of your competencies to prospective employers or clients.
Heres a detailed guide on the essential pages that are fundamental to a standout personal portfolio:
### ==Home Page: The Gateway to Your Professional Universe==
==The home page serves as the initial welcome to your professional domain, providing a brief yet impactful overview of your identity and offerings. This first impression is vital, setting the tone for the visitor's experience on your site.==
![image-101](https://proxy-prod.omnivore-image-cache.app/1468x917,s3q8eO-xelF9-X-CYPdsvtfxGJOtzIMna5j9kcAB158w/https://www.freecodecamp.org/news/content/images/2024/03/image-101.png)
==My home page==
==Your home page should emphasize:==
* **==Engaging Introduction==**==: Introduce yourself with a quick mention of your professional designation and expertise.==
* **==Visual Elements==**==: Incorporate captivating visuals or a portfolio reel to immediately draw attention to your work.==
* **==Navigation Tips==**==: Direct visitors smoothly to different site sections with clear navigation aids.==
### ==Portfolio Section: A Display of Your Expertise==
==This core section is where you showcase your finest work. Organizing this area thoughtfully ensures that visitors can easily navigate through your projects. You should include:==
* **==Organization by Category==**==: Group projects by theme, type, or sector for straightforward browsing.==
![image-93](https://proxy-prod.omnivore-image-cache.app/1430x932,sm8Xc0-1Mt_0zU4bra5QIqpbB1CbHie3vIJsCbQ9N8lM/https://www.freecodecamp.org/news/content/images/2024/03/image-93.png)
==Projects organized by category on my personal portfolio page - Python, Statistics, Machine Learning, and NLP==
* **==Project Summaries==**==: Provide a concise description of each project, outlining your role, the methodology, and the results.==
![image-94](https://proxy-prod.omnivore-image-cache.app/1450x753,sXU_bGfvLDSeR86OFH8ha87Onokvo-YgWxyu1rZNLSNs/https://www.freecodecamp.org/news/content/images/2024/03/image-94.png)
==Example project summary on my portfolio==
* **==High-Resolution Media==**==: Present your work with high-quality images or videos to fully convey its quality.==
![image-95](https://proxy-prod.omnivore-image-cache.app/1458x914,szuRqwh4X_p_Lf9lNnlC1qEGrhGM1sK0chdZiwfpyXH8/https://www.freecodecamp.org/news/content/images/2024/03/image-95.png)
### ==About Me Page: Your Professional Narrative==
==This page allows you to forge a deeper connection with your audience by sharing your story, ambitions, and what makes you unique. It should cover:==
* **==Professional Background==**==: Share your career path, educational achievements, and significant milestones.==
![image-97](https://proxy-prod.omnivore-image-cache.app/1452x773,sjB_AuG9eMME61y1f5xTWPeW40BYAPN4EyG3fNsX_q0w/https://www.freecodecamp.org/news/content/images/2024/03/image-97.png)
==Some of my personal milestones==
* **==Skills and Expertise==**==: Spotlight the abilities that distinguish you in your field.==
![image-96](https://proxy-prod.omnivore-image-cache.app/1449x699,ssJDqK7Fbp1W9PwyzQjAo8yqz-014s0RG7ekDqwMo7uo/https://www.freecodecamp.org/news/content/images/2024/03/image-96.png)
==A page on my portfolio showing my "digital DNA" - the skills I'd like to showcase==
* **==Personal Insights==**==: Offering a peek into your personal hobbies or interests can make you more approachable and relatable.==
### Services Offered: How You Can Assist Clients
If your portfolio is meant to attract freelance or consulting work, clearly detail the services you provide. This section should convey:
* **Services List**: Enumerate the services you offer, such as design, consulting, or writing.
![image-98](https://proxy-prod.omnivore-image-cache.app/1453x948,sDzclqRqt7UqBvOdZ3xnyum0JaJoZOdYg8Vp0AZ8yyo4/https://www.freecodecamp.org/news/content/images/2024/03/image-98.png)
A section on my site describing the courses I offer/topics I teach about
* **Unique Advantages**: Describe what sets your services apart from the competition.
* **Workflow Description**: Outline your process from the initial contact to project completion, offering potential clients a glimpse into your working style.
### ==Contact Information: Simplifying Communication==
==For potential collaborations, its essential to make reaching out as simple as possible. Your contact page should include:==
* **==Various Contact Methods==**==: Provide a contact form, email, and possibly a phone number for easy communication.==
![image-99](https://proxy-prod.omnivore-image-cache.app/1451x855,sP3g3ley_Uhu0duZbckP0jOEC35DJl1rw8IBcEEMfn4k/https://www.freecodecamp.org/news/content/images/2024/03/image-99.png)
==My contact information page on my personal portfolio site==
* **==Social Media Profiles==**==: Guide visitors to your professional social media pages.==
* **==Geographic Details==**==: If applicable, mention your location or time zone.==
### Client Testimonials: Evidence of Your Expertise
Testimonials from previous clients or colleagues act as a strong endorsement of your skills and dependability. Consider featuring:
* **Client Feedback**: Include concise, meaningful quotes from clients about their satisfaction with your work.
![image-100](https://proxy-prod.omnivore-image-cache.app/1459x921,szS8qnjs7QrgRUXtX_ZhUrrmBf2k65YUd8-9imN2Vq3M/https://www.freecodecamp.org/news/content/images/2024/03/image-100.png)
Some of my client's testimonials
* **Project Links**: Optionally, connect these testimonials to specific projects they refer to.
* **Client Images or Logos**: Adding photos or logos of the client's company can add credibility to each testimonial.
Incorporating these key pages into your personal portfolio website not only effectively showcases your skills but also offers a complete picture of your professional sphere.
By meticulously designing each section, you can cultivate a digital presence that draws in potential clients or employers, showcases your proficiency, and distinguishes you in your industry.
![image-67](https://proxy-prod.omnivore-image-cache.app/1792x1024,sbGFwPKaR_Qg3k5u-KTPlv51uqRHUrexDYYEDdKTaRNU/https://www.freecodecamp.org/news/content/images/2024/03/image-67.png)
This illustration emphasizes a modern and inviting atmosphere, designed to pique the curiosity of visitors and encourage exploration of the portfolio. - [lunartech.ai](https://lunartech.ai/)
## How to Organize the Home Page
Now let's talk about how to strategically organize the homepage of your personal portfolio website. The essence of the homepage is to succinctly represent you and ignite the curiosity of visitors to delve into your portfolio page. Essential sections include:
### 1\. Navigation Bar
A well-designed navigation bar is your visitor's roadmap to your website. It should be intuitive and straightforward, guiding them through your site with ease.
![image-102](https://proxy-prod.omnivore-image-cache.app/1455x84,srzf7NRoupmzDty-rUR77udILXV7AVXyIZva65nt0gw8/https://www.freecodecamp.org/news/content/images/2024/03/image-102.png)
Navigation section of my site
Include links to your portfolio, about page, services, and contact information. Ensure it's accessible from every page, providing a seamless browsing experience.
Your header hero acts as the first impression and the hook that draws visitors in. This section should feature a striking, high-quality image or a dynamic slider that represents your work or persona.
Accompany this visual with a bold, concise statement about who you are and what you do. This is your chance to make an impact, so choose words and images that resonate with your professional identity and goals.
![image-103](https://proxy-prod.omnivore-image-cache.app/1468x917,sqlQmfDBrxeJ3BVHvUZH3QQzLmWDbW2tjCUne_LhARf8/https://www.freecodecamp.org/news/content/images/2024/03/image-103.png)
Homepage displaying the header hero image on my site
My hero image has my name in large print, and informs viewers that I specialize in compter science, data science, and AI.
### 3\. Your Skills
Highlighting your skills is crucial in showcasing your competencies to potential clients or employers.
Create a visually engaging section where you list your primary skills, perhaps using icons or progress bars for a more dynamic presentation. Focus on the skills that set you apart and are most relevant to the work you want to attract.
![image-109](https://proxy-prod.omnivore-image-cache.app/1443x734,s5OkphOEHm9JmkpeKUzXuL8pRH6ZI6KnITgFXexspeOg/https://www.freecodecamp.org/news/content/images/2024/03/image-109.png)
Some of my skills listed on my site
On my site, I emphasize that I've had experience managing teams, optimizing performance, and building AI-driven products, for example.
### 4\. Your Case Studies
Case studies are powerful testimonials of your work history and success stories. Dedicate a section to showcase selected projects that highlight your problem-solving skills, creativity, and the value youve brought to previous engagements.
For each case study, provide context, your role, challenges, solutions, and results. Including impactful visuals or links to the projects can greatly enhance this section.
### 5\. Your Milestones
This section is a timeline or a list of significant achievements, awards, recognitions, or other milestones in your career. It's a narrative of your professional journey and successes.
Presenting this information in a chronological timeline or a visually engaging infographic can help tell your story compellingly and succinctly.
You can list achievements such as starting a company, graduating from a degree program, reaching a certain number of followers on social media, and so on.
### 6\. Testimonials (What others say about you)
Testimonials from past clients, colleagues, or employers lend credibility and trust to your professional image. Select quotes that reflect your work ethic, impact, and personality.
Displaying these testimonials with the name, title, and, if possible, a photo of the person providing them adds authenticity and a personal touch.
### 7\. Technical Skills
In addition to your general skills, it's important to specifically highlight your technical skills. This section should detail the tools, technologies, software, and programming languages you are proficient in.
Using logos or icons of these technologies can make this section more visually appealing and easier to scan for visitors who are quickly trying to gauge your technical capabilities.
![image-104](https://proxy-prod.omnivore-image-cache.app/1448x848,scNyxmSjE2Pgi1bzoHfdbTinITeGAgipws6w_Yk24quc/https://www.freecodecamp.org/news/content/images/2024/03/image-104.png)
My "digital DNA"
For example, my "digital DNA" is made up of C++, Java, JavaScript, Python, React, and other popular technologies.
Beyond these, your homepage doesn't require additional content. It's vital to capture the visitor's attention quickly with compelling visuals and effective copywriting, given the short window to make an impact.
### ==Do's for a Captivating Homepage==
* **==Be Concise==**==: Ensure your message is clear and to the point.==
* **==Use Endorsement Logos==**==: Incorporate logos of companies you've appeared on to build trust.==
* **==Display Technical Stack Logos==**==: Show the technologies you're proficient in using their logos.==
* **==Showcase a Case Study Gallery==**==: Highlight your best work in an easily navigable gallery.==
* **==Include a Dynamic Header==**==: Use an engaging hero section to make a strong first impression.==
* **==Highlight Recent Work==**==: Give visitors a glimpse of your latest projects to show you're active and relevant.==
* **==Use Testimonials Strategically==**==: Place client testimonials where they'll have the most impact, showcasing your reliability and skill.==
### ==Don'ts for Your Homepage==
* **==Avoid Random Placement==**==: Structure your content logically don't place information haphazardly.==
* **==Steer Clear of Long Paragraphs==**==: Keep your homepage breezy and easy to read with short, impactful statements.==
* **==Don't Overwhelm with Content==**==: Your homepage isn't the place to squeeze in every detail of your portfolio.==
* **==Avoid Image Neglect==**==: Images are crucial for visual engagement, so don't omit them.==
* **==Resist Clutter==**==: Keep the design clean and focused to improve user experience.==
* **==Avoid Technical Jargon==**==: Use language that's accessible to all visitors, not just industry insiders.==
* **==Skip the Hard Sell==**==: Present your skills and achievements without being overly aggressive.==
Effective organization of your homepage is key to creating a memorable and professional personal portfolio website.
By following these guidelines, you ensure that your homepage not only accurately represents your professional persona but also encourages further exploration of your portfolio, opening up new opportunities for engagement and collaboration.
![image-68](https://proxy-prod.omnivore-image-cache.app/1792x1024,seP8EM8SXRG6hspNPrz0erpEhohZ2tm5l77ABJalD69s/https://www.freecodecamp.org/news/content/images/2024/03/image-68.png)
Here's a visual representation of a designer actively updating their online portfolio, highlighting their commitment to showcasing evolving skills and staying current. - <https://lunartech.ai/>
## How to Keep Your Portfolio Fresh
Keeping your portfolio updated is crucial for reflecting your evolving skills, expertise, and experiences. An engaging and current portfolio not only captivates potential clients and visitors but also illustrates your dedication to your profession. Here are strategies to ensure your portfolio remains fresh and appealing:
### Continuously Update with New Work
Regularly add your latest and greatest projects to your portfolio. This demonstrates your active involvement in your field and your commitment to quality and innovation. It's a way to showcase your growth and adaptability over time.
### Revamp Your Portfolio's Design
Periodically rejuvenating the design of your portfolio website can keep it looking modern and fresh. An updated design can better engage visitors and reflect your ability to stay in tune with the latest trends and technologies in design.
### Showcase Testimonials and Recognitions
Incorporate new testimonials from clients or colleagues, as well as any recent awards or honors you've received. This external validation of your work adds credibility and can significantly influence potential clients' perceptions of your expertise.
### Maintain an Active Blog
A blog can be a dynamic component of your portfolio, offering insights into your work process, industry observations, or detailed project breakdowns. Regular posts keep your site content fresh and can help establish you as a thought leader in your field.
Use social media platforms to highlight recent projects, achievements, and updates from your portfolio. A robust social media presence can extend your reach, attract a broader audience, and keep your work in the spotlight.
### Incorporate Interactive Elements
Adding interactive elements, such as animations or interactive galleries, can refresh the user experience on your site. These elements can make your portfolio more memorable and engaging.
### Feedback Loop
Invite feedback on your work and website from peers and mentors. Implementing constructive feedback can improve your portfolio's effectiveness and demonstrate your commitment to excellence and continuous improvement.
### Diversify Your Content
Show a range of projects and skills, including collaborative works, to display the breadth of your capabilities. This diversity can attract a wider array of clients interested in different aspects of your expertise.
### Stay Relevant with Trends
Keep abreast of the latest trends in your industry and incorporate them into your work and portfolio presentation. This shows that you are forward-thinking and capable of adapting to change.
By employing these strategies, you can ensure that your portfolio remains an accurate, engaging representation of your professional journey and capabilities. Regular updates and a proactive approach to showcasing your achievements can significantly enhance your portfolio's appeal, making it a powerful tool for attracting new opportunities and clients.
## Conclusion
When it comes to crafting a standout personal portfolio page, remember that simplicity and showcasing your best work are key. By following the step-by-step guide outlined in this blog, you can create a compelling portfolio that effectively highlights your skills and talents.
Start by organizing your projects in a clean and visually appealing layout. Use high-quality images and concise descriptions to provide visitors with a clear understanding of your work. Remember, your portfolio is a reflection of you and your brand.
Don't forget to include a call to action that prompts visitors to take the next step, whether it's contacting you for collaborations or viewing more of your work. Engage your audience with a clear message and encourage them to explore further. Ready to elevate your online presence? Take the first step and build that portfolio.
### ****Resources**
Kickstart your journey in technology with our specialized program that dives into Artificial Intelligence (AI) and machine learning. This initiative is crafted to build your programming expertise, supplemented with dedicated mentorship and career guidance to pave your way in the tech industry.
### Propel your career forward with this curated list of resources, focused on tangible outcomes:
* [How to Enter Gen AI in 2024:](https://downloads.tatevaslanyan.com/six-figure-data-science-ebook) This guide breaks down the essentials of emerging AI technologies and prepares you for future trends.
* [Land Your Software Engineering Internship:](https://join.lunartech.ai/software-engineering-internship) This resource provides step-by-step instructions for finding and landing a valuable internship in software engineering, giving you a competitive edge.
* [Machine Learning Fundamentals eBook:](https://join.lunartech.ai/machine-learning-fundamentals--3f64f) Begin your exploration of machine learning with this eBook, which provides a concise overview of its core principles and techniques.
For access to these resources and detailed information about our program, visit [LunarTech's ](https://lunartech.ai/)website. Embark on your tech career path with the right tools and support from [LunarTech](https://lunartech.ai/).
### ****Connect with Me:**
* [Follow me on LinkedIn for a ton of Free Resources in CS, ML and AI](https://ca.linkedin.com/in/vahe-aslanyan)
* [Visit my Personal Website](https://vaheaslanyan.com/)
* Subscribe to my [The Data Science and AI Newsletter](https://tatevaslanyan.substack.com/)
### ****About the Author**
I'm Vahe Aslanyan, specializing in the world of computer science, data science, and artificial intelligence. Explore my work at [vaheaslanyan.com](https://www.vaheaslanyan.com/). My expertise encompasses robust full-stack development and the strategic enhancement of AI products, with a focus on inventive problem-solving.
[Vahe Aslanyan - Crafting Code, Shaping FuturesDive into Vahe Aslanyans digital world, where each endeavor offers new insights and every hurdle paves the way for growth.Crafting Code, Shaping Futures![Ntarl3h](https://proxy-prod.omnivore-image-cache.app/896x896,sG8IE-beCANKZXtyz_6GNcDfHh1eMevmJCfWKnqBm7_M/https://i.imgur.com/Ntarl3h.png)](https://www.vaheaslanyan.com/)
I've consistently aimed to revolutionize technical education, striving to set a new, universal standard. As we wrap up this handbook, I want to say a big thank you for spending time with it. Sharing what I've learned has made me think more about my work. I hope what we've gone through together helps you move forward in tech.
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,725 @@
---
id: f2f6b3b5-b35c-49bf-ab94-61559888fe81
title: |
noboilerplate/scripts/27-coping-mechanisms.md at main · 0atman/noboilerplate
status: ARCHIVED
tags:
- read-later
date_added: 2024-03-25 17:12:00
url_omnivore: |
https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294
url_original: |
https://github.com/0atman/noboilerplate/blob/main/scripts/27-coping-mechanisms.md
---
# noboilerplate/scripts/27-coping-mechanisms.md at main · 0atman/noboilerplate
## Highlights
If something comes to mind, or someone tells you something important, YOU MUST WRITE IT DOWN in a trusted system
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#901e24a0-6646-4f53-9233-fa3a627f1289)
---
This theory is called Active Externalism.
---
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#1f3cdbf9-2b58-4a65-9f83-c055ecff679d)
---
Put EVENTS on your calendar.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#0ae3ba38-15fe-4264-85b9-a355e502dc1c)
---
Events are not tasks that have a due date - those things should go in a task management system.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#c091f165-7a83-42d6-bb28-7979d4d243c9)
---
If it can be done before the due date, it's a task, not an event.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#f8d8cb12-333a-44d4-82e5-124c2347f084)
---
Carry earplugs
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#ea1eceab-55f2-4482-bad4-fcc08ad1f565)
---
What you're going to do is, at the first hint of confusion or misunderstanding, say "I'm sorry, I don't understand" and let them try again.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#87395a65-15a8-439b-a946-257d5e715d34)
---
You need context in communication like you're talking to a deep space probe Ask for what you need, which is for context to be included in what people ask of you.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#c2ce3a46-c55a-48b6-b60d-b030d551ffce)
---
All relevant information must be inside the message.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#259b5f32-a40a-4252-a9ea-346987131a80)
---
Use a Note-Taking System
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#f0f29fde-8f78-43a8-aa02-c58d5f25225c)
---
This is important, Past Tris. Don't. Open. Your. Browser.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#5bc8f767-dc93-4f00-8723-dbb16e62af1b)
---
The first coping mechanism in this framework is eat the frog, which means to do the least pleasant or hardest task first.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#b5408b52-072f-498d-9520-f42856d150dd)
---
There's a good but boring book called Triggers by Marshall Goldsmith, that I recommend you read, or ideally get someone to summarise it for you.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#e9fe7791-4063-4aa6-9c9e-641d506560ae)
---
Pay attention to people who seem like they know what they are talking about and figure out what makes them so good at explaining their thoughts.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#96ab7872-b330-4a81-a5fe-0d6191720a0f)
---
Study, imitate and practice.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#378de782-f5e4-4fe3-baa0-4836b3a896bd)
---
Save your energy by focusing on the positives
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#e79fffb1-82c5-4955-8964-cb780627117d)
---
Notice the negatives, but feel the positives.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#45a4b54b-2ed2-40f1-b6cf-215f963e0014)
---
You have to FOCUS.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#706cd560-3e18-4abf-b45c-19b220a270d8)
---
## 15\. Just do a bit
[](#15-just-do-a-bit)
> You put one word after another until its done. It's that easy, and that hard.
— Neil Gaiman
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#e41df1e5-9e90-4c91-809f-d2ae6e11c04d)
---
I trick my brain into doing this with Timers.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#52577fa3-2e0f-4f1d-af34-7d69308e3e15)
---
## 17\. humanize organize mechanize
[](#17-humanize-organize-mechanize)
notes: This is how I build systems, both in my life and professionally.
**Humanise**
Do everything manually, on paper if needed, for many iterations.
**Organise**
Notice the patterns that are creeping into your methods.
**Mechanise**
Automate those patterns in a system, either by writing checklists, flowcharts or software.
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#26170aa1-0968-4106-819c-d090079d8379)
---
## One thing at a time
[](#one-thing-at-a-time)
## most important thing first
[](#most-important-thing-first)
## Start now
[source](https://omnivore.app/me/noboilerplate-scripts-27-coping-mechanisms-md-at-main-0-atman-no-18e773dc294#cc6de1c2-538f-4cd2-b994-db98ed8bcdac)
---
## Original
<style> :root {--r-code-font: "FiraCode Nerd Font";} .reveal .hljs {min-height: 50%;} </style>
%%
f7f7f7 background slide colour
* title formatting
%%
!\[\[tri-hex-moon-white-transparent.png|300\]\]
## Hacking your brain
[](#hacking-your-brain)
### With elaborate coping mechanisms
[](#with-elaborate-coping-mechanisms)
notes: %%
* Tell them what you're going to tell them
* Tell them
* Tell them what you told them %% Hi friends my name is Tris and this is No Boilerplate, focusing on fast, technical videos.
Some people seem to have life figured out don't they.
I don't, I'm learning every day, but I do have some EXTREMELY elaborate coping mechanisms that make me productive, easier in social situations, and happier, i think, in life.
Today I'm going to share them with you in the form of an open letter to my past self.
Bear in mind that I am not an expert in anything really, certainly not the human brain. I can't even edit video, and I'm not very good at Rust.
However I have managed to become highly productive with these coping mechanisms, and perhaps some of them will work for you.
---
## Public Domain Videos
[](#public-domain-videos)
[github.com/0atman/noboilerplate/](https://github.com/0atman/noboilerplate/)
notes: Everything you see in this video from the script to the images are part of a markdown document available on github under a public domain license.
---
!\[\[newspaper-youtuber.jpg\]\]
notes:
Hello past Tris, it's me, Future Tris. Stop spending all of my money!
I have some important things to tell you that will make your life easier. I wish I had learned these earlier, so I'm going to give you a head start.
Also buy apple stock, don't sell those bitcoins in 2015, and you can break up with her, it's ok, you'll both be fine.
---
## 1\. Declare bankruptcy on your memory
[](#1-declare-bankruptcy-on-your-memory)
notes:
Tris, we've given it a good go, you and I, haven't we.
You will learn, as so many have done before you, that your brain is for HAVING ideas, not STORING ideas.
That advice is probably valid for anyone, but it's ESPECIALLY valid for you and I.
At this point in your life, you still think you can remember things like everyone else, I imagine? You can't. And maybe they can't either. The sooner you realise this, the sooner you can build systems to easily replace this missing ability. And I'll help you there.
---
## 2\. Carry a notebook
[](#2-carry-a-notebook)
!\[\[field-notes.png|700\]\]
notes:
When are you, about 2005? ew. So, no smartphone (you're gonna hate them) get a nice pocketable notebook. Field Notes are fine, but pricey If you can bear to have a notebook that doesn't have a ruler printed in the back, you can buy cheap alternatives for a dollar.
Or a pound. Look, we all talk in dollars now, get used to it.
==If something comes to mind, or someone tells you something important, YOU MUST WRITE IT DOWN in a trusted system==
---
## Active Externalism
[](#active-externalism)
> I'm not writing it down to remember later, I'm writing it down to remember NOW.
notes:
A lot of the memory techniques I'm going to talk about change your understanding of your mind from something that is exclusively inside your head, to something that can be augmented by paper, pencil, and digital methods
==This theory is called Active Externalism.==
---
## 3\. Calendars
[](#3-calendars)
## are GREAT
[](#are-great)
notes:
I think you have a google account in 2005, you and I are early adopters, which is always exciting if not relaxing.
==Put EVENTS on your calendar.==
Events are things you can miss if you forget them and sit at home all weekend watching South Park while all your friends have fun. Oh, that oddly-specific example hasn't happened to you yet? It will. Remember to use a calendar.
==Events are not tasks that have a due date - those things should go in a task management system.==
==If it can be done before the due date, it's a task, not an event.==
---
## 4\. Getting Things Done (GTD)
[](#4-getting-things-done-gtd)
notes:
There are a lot of task management systems, even in your time. The one that fits the shape of our brain best is David Allen's GTD.
GTD has tasks split into projects like many others, but the differentiating factor that makes it work for us is that tasks also have a Context tag, like 'laptop', 'home', 'work', or whatever you want.
The reason this works for us is that when you are physically IN a certain context, you can filter out all the rubbish that by definition you CAN'T do at the moment.
Task systems that don't do this filtering create more undue distractions.
---
## 5\. ==Carry earplugs==
[](#5-carry-earplugs)
notes:
OK sorry you had to find out like this in front of 100,000 of our closest friends, but you, my dude, have autism.
Right? Makes sense now I say it out loud doesn't it? It's no biggie, a lot of folks do.
You know how you don't like pubs, clubs, stadia and other noisy places? Surprise! That's called sensory overload, and is an Autism symptom.
wear earplugs to relieve this symptom.
There's a lot of earplug options, from the classic foam cylinders to mouldable wax. I've heard that wax ear plugs can get stuck in there, so don't use those, I like the ones that look like rounded foam earbuds, very comfy.
---
## 6\. In the face of ambiguity,
[](#6-in-the-face-of-ambiguity)
## refuse the temptation
[](#refuse-the-temptation)
## to guess
[](#to-guess)
python -c "import this" | grep ambiguity
In the face of ambiguity, refuse the temptation to guess.
notes:
OK, so while we're talking about Autism, let's talk about all those misunderstandings that happen when you talk to people.
Neurotypical people have a lot more bandwidth available in their communications than you or I do. They take into consideration body language, tone, vocal hesitations, and extrapolate enormous amounts of information when talking.
AND THEY EXPECT YOU TO DO THE SAME.
You're not going to do that, nor should you have to.
==What you're going to do is, at the first hint of confusion or misunderstanding, say "I'm sorry, I don't understand" and let them try again.==
If they continue to give you incomplete confusing information, you are going to say again, patiently, "I don't understand", don't worry they won't mind repeating themselves, they all love talking, it'll help them too, trust me.
And if on the third utterance they still don't make sense, you say "I'm sorry, I don't think YOU understand". Because half the time they DON'T, and it's not your responsibility to teach them how to communicate.
---
!\[\[white-logo.png|400\]\] notes:
==You need context in communication like you're talking to a deep space probe
Ask for what you need, which is for context to be included in what people ask of you.==
==All relevant information must be inside the message.==
It's a long way back home.
Let me take a break from my open letter for a moment.
Friends, I hope to not only teach myself, I'm hoping to teach and help everyone.
---
!\[\[lt-shuttle-screenshot.png\]\]
Watch on YouTube or at [LostTerminal.com](https://lostterminal.com/)
notes: In addition to this no boilerplate video, I've put together 12 seasons so far of my scifi, hopepunk, mental health story podcast, Lost Terminal, and thousands of lovely people tune in each week.
It's very reasonable for an AI to have difficulty understanding other people's emotions, or struggle with his own, and framing this as an AI challenge allows me to talk about autism in a safe environment. In later seasons, my research has allowed me to branch out into other mental health and LGBT issues too, all with the same AI lens.
I'd love for you to watch or listen to the first season, I've linked it here, and at the end of the video, or in the description.
back to the letter
---
## 7\. ==Use a Note-Taking System==
[](#7-use-a-note-taking-system)
notes:
Tris, There are many note-taking systems available, even in 2005, and the one feature you should look for in any of them is the ability to link between pages. Yes, hyperlinks. This is the whole point of the web and is its killer feature.
You can use a wiki for this, there are several available, but you can also use Markdown.
---
## 8\. Plain Text
[](#8-plain-text)
## lasts forever
[](#lasts-forever)
notes:
If Your brain is going to be external to your head, it should be in plain text. Not a propitiatory database hidden inside some app waiting for the company to go out of business.
As an example, my show Lost Terminal is set in the future some time after the environmental collapse, and in the story, the survivors STILL HAVE plain text digital records. You know what they don't have? iCloud.
My brain is stored in plain text, marked up with Markdown, inside Obsidian.
---
!\[\[obsidian-hopepunk.png\]\]
[obsidian.md](http://obsidian.md/) (not sponsored, other editors available)
notes:
Every wiki page I read, every blog, every article, if it could be relevant to my work, I copy and paste into my brain, for later linking and extraction.
This is a simple screenshot of the wikipedia article on Hopepunk, the cosy, safe genre that Lost Terminal sits in.
But through the plugin system, Obsidian, and therefore my brain, can be as complex as it needs to be.
---
!\[\[obsidian-lt-12.png\]\]
notes:
Here is the workspace I use for writing Lost Terminal. We've got widgets written in a few lines of javascript embedded on the page, and in the side panes.
In the morning, I open this up, set a timer, and write my word count before opening my browser.
==This is important, Past Tris.
Don't. Open. Your. Browser.==
---
## 9\. Eat the frog
[](#9-eat-the-frog)
notes:
Like a lot of other people discovered in 2020, you also have ADHD.
What happened in 2020 to cause this? I'll just say that a LOT of people's work routines were disrupted and they were expected to be much more autonomous then before, exposing the underlying problem.
Don't worry about it, you've got a while till it happens.
So the frameworks that people realised they needed to be productive, you're going to build for yourself.
==The first coping mechanism in this framework is eat the frog, which means to do the least pleasant or hardest task first.==
Don't let it loom over you while you do other easy things on your task list like laundry or shopping.
Do the hardest thing first.
---
## 10\. Build habits
[](#10-build-habits)
## Then chain them together
[](#then-chain-them-together)
> wake → water → yoga → write → shower
notes:
==There's a good but boring book called Triggers by Marshall Goldsmith, that I recommend you read, or ideally get someone to summarise it for you.==
Pay attention to what is making you do thing, its trigger, like a location, a song, a person or a thought. Then build a feedback loop to improve and chain these triggers together.
---
## 1.017 \= 1.07
[](#1017--107)
#### but
[](#but)
## 1.01365 \= 37.78
[](#101365--3778)
notes:
tiny daily change adds up cumulatively over time.
You won't see it at first, but if you, for example, write 400 words every single day, in a year you'll have 4 whole seasons of a podcast, or many novels, or video scripts, or whatever it is you want to do.
If you spend you time bouncing between 3 apps, you'll end the year with nothing.
---
## 11\. Public speaking is important
[](#11-public-speaking-is-important)
notes:
I'm very good at public speaking NOW, so it all works out eventually, but that is because I PRACTISED a lot.
Yes that thing mum and dad asked us to do for the piano and we never did.
At university you are going to realise public speaking is going to be
1. a problem and
2. mandatory in the wider world.
==Pay attention to people who seem like they know what they are talking about and figure out what makes them so good at explaining their thoughts.==Don't bother with persuasion or rhetoric, we're not here for that, we're here to talk to people clearly and precisely.
==Study, imitate and practice.==
---
## 12.
[](#12)
## Imitate
[](#imitate)
## imitate
[](#imitate-1)
## imitate
[](#imitate-2)
notes:
Pay attention to how people act, then do what they do.
This works as well in a sprint planning meeting as it does on the dance floor.
---
## 13\. Negative emotions are not very useful
[](#13-negative-emotions-are-not-very-useful)
notes:
I don't know why neurotypical people romanticise jealousy as protectiveness, anger as passion, greed as ambition, but you don't need to learn these emotions. And if you have learned them, you certainly don't need to practice them. In fact, do the opposite.==Save your energy by focusing on the positives==, there's a lot to be happy about in our life, we're extremely fortunate!
HOWEVER negative emotions are not ENTIRELY un-useful!
Remember that girl I mentioned earlier? You'll stay with her because you're minimising the negative emotions you're feeling. That's not good.
You're not a robot, I know, but throuhg practice you can choose what to feel, and what to notice.==Notice the negatives, but feel the positives.==
==You have to FOCUS.==
---
## 14.
[](#14)
## _F o c u s_
[](#f-o-c-u-s)
notes:
there's dozens of new programming languages per year, just choose one and try it. There's lots of games to play, don't scroll your steam library, just choose one and play it. There's an infinite amount of news available to read, use rss feeds, and filters, not firehose scrolling and read important things deeply.
---
## ==15. Just do a bit==
[](#15-just-do-a-bit)
> ==You put one word after another until its done. It's that easy, and that hard.==
==— Neil Gaiman==
notes:
The plural of word is sentence, the plural of sentence is paragraph and the plural of paragraph means you're done and can go back to playing video games.
It's like a reverse Zenos's paradox, just put one word in front of the other and you'll get there.
==I trick my brain into doing this with Timers.==
---
## 16\. Timers
[](#16-timers)
## are GREAT
[](#are-great-1)
notes:
I run my life on timers, and you should too. I'm writing this with a timer running, in 14 minutes I'll have a break and a cup of tea.
Then after that I'll do a bit more.
---
!\[\[napchart-pomodoro.png\]\]
notes:
There's a light system for organising your timers called the Pomodoro Technique
The default recommendations are to set a timer for 20 minutes, work as fast as you can, then when the timer goes off, set another for 5 minutes and have a break.
This ends up, tricking us into HOURS of high-quality, focussed work!
Here's an example schedule, some work in the morning, a lot of work in the afternoon, and a bit before bed.
I know you go to bed late, Past Tris, so I tweaked this just for you.
Would you believe me that these days I get up early and love it? No, probably I wouldn't have believed me either.
---
## ==17. humanize organize mechanize==
[](#17-humanize-organize-mechanize)
==notes:
This is how I build systems, both in my life and professionally.==
**==Humanise==**
==Do everything manually, on paper if needed, for many iterations.==
**==Organise==**
==Notice the patterns that are creeping into your methods.==
**==Mechanise==**
==Automate those patterns in a system, either by writing checklists, flowcharts or software.==
---
!\[\[27-coping-mechanisms 2023-06-07 15.21.56.excalidraw\]\]
notes:
Here's a trivial algorithm I set up for myself. I don't know why I need to drink so much water, but every body is different I suppose! In addition to waking up and drinking 500ml before breakfast, this little system works for me, at the first sign of a headache.
---
## 18.
[](#18)
## ==One thing at a time==
[](#one-thing-at-a-time)
## ==most important thing first==
[](#most-important-thing-first)
## ==Start now==
[](#start-now)
notes: Really that's what all my advice comes down to, past Tris. Choose what you want to do and do it.
Keep at it champ, I'm proud of you, it all works out in the end!
---
!\[\[tri-hex-moon-white-transparent.png|300\]\]
## Thank you
[](#thank-you)
notes:
## OUTRO
[](#outro)
If you would like to support my channel, get early ad-free and tracking-free videos and vip discord access head to patreon.com/noboilerplate.
If you're interested in transhumanism and hopepunk stories, please check out my sci-fi podcast, Lost Terminal.
Or if urban fantasy is more your bag, do listen to a strange and beautiful podcast I produce called Modem Prometheus.
Transcripts and compile-checked markdown sourcecode are available on github, links in the description, and corrections are in the pinned ERRATA comment.
Thank you so much for watching, talk to you on Discord.
println!("That's all folks!");
}

View file

@ -0,0 +1,832 @@
---
id: 7484046e-a123-4c02-a67a-1822184aed23
title: |
noboilerplate/scripts/35-adhd-a-left-handed-brain.md at main · 0atman/noboilerplate
status: ARCHIVED
tags:
- read-later
date_added: 2024-03-25 17:37:48
url_omnivore: |
https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a
url_original: |
https://github.com/0atman/noboilerplate/blob/main/scripts/35-adhd-a-left-handed-brain.md
---
# noboilerplate/scripts/35-adhd-a-left-handed-brain.md at main · 0atman/noboilerplate
## Notes
Another examples:
- Hyperfixation and the struggle to let go of the thing I'm doing, even if it meant to have problems with other tasks/people
- The procastination to start doing something
- The craving for "multitasking", which is more searching for dopamine in distraction while working.
- The meltdowns and struggles when I loose the structure in life: coronavirus lockdowns and the meldown in the institude, when I'm on vacations, now that I don' have a job
- The search of dopamine on other places in class.
- The hurry of doing stuff
## Highlights
* They're not intentionally disruptive in class, they're choosing dopamine-rewarding behaviours.
* They're not greedy when eating, they're choosing dopamine-rewarding behaviours
* They're not unable to listen to you when you talk to them, they're choosing dopamine-rewarding behaviours
* They are not constantly distracted, they're constantly engaging in dopamine-rewarding behaviour, just as evolution has taught us all to do.
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#4d4650e0-de8d-4038-87de-030d07d5b550)
---
I no longer could get by on smarts, everyone's smart here
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#d5939abe-d36f-4fcd-b709-883d979d1237)
---
Web development might be the best job in the world, it certainly was the best job for me: It's naturally structured, with the work often agreed upon by the team, and divided up into byte-sized tasks. ^2f688b
The prevailing organisation system, scrum, had clear goals and structure that really worked for me, at least at first, it was like solving a puzzle or playing a video game, but every day. ^b121ff
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#be183259-2e7d-4ff0-bba2-4ce1ef8e7b88)
---
If you, like many folks,
* wake up to an alarm,
* commute to your job for 8 or 9am,
* do whatever work your boss tells you to do,
* commute home and eat and then sleep,
* only to do it all over again the next day.
You might never notice you have ADHD.
Symptoms like executive dysfunction and inattention might not affect you in the 9-to-5 grind. ^183e58
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#b594529e-a544-4475-8996-3880700e369a)
---
Right when I needed to be self-directed, to decide for myself what to spend each day doing.
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#e5c4e121-b329-4c65-9534-a3d98fa50305)
---
not whatever random thoughts popped into my mind
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#e4454351-e4ee-4e0b-89ba-3aca2f501018)
---
Though illegal drugs famously can boost dopamine, so can caffeine and chocolate.
[source](https://omnivore.app/me/noboilerplate-scripts-35-adhd-a-left-handed-brain-md-at-main-0-a-18e77555f9a#670219c7-995d-4877-80f6-b6de27776e27)
---
## Original
<style> :root {--r-code-font: "FiraCode Nerd Font";} .reveal .hljs {min-height: 50%;} </style>
## ADHD: A Left-handed Brain
[](#adhd-a-left-handed-brain)
## (in A Right-handed World)
[](#in-a-right-handed-world)
---
!\[\[logo-head-half-digital.png|300\]\]
## In a Right-
handed World
[](#in-a-right-handed-world-1)
notes:
Hi friends my name is Tris and this is No Boilerplate, focusing on fast, technical videos.
This video is about ADHD.
Despite not being left-handed, I do have a great deal of empathy for our left-handed cousins because of my ADHD.
A surprising number of left-handed people are ambidextrous, they are equally skilled with either hand.
This makes a lot of sense, in our world there are many manual interfaces that are explicitly right-handed, from scissors, to mice, to industrial machines.
Some tools, like scissors, you can get a left-handed version of, of course. You can fill your house with physical coping mechanisms that help you function. But when you walk out into the world, you will find that nearly everything isn't designed for you.
It's not fair, but
* if you are left-handed, you must learn to be ambidextrous.
* And if you have ADHD, you must learn to cope in a neurotypical world.
---
!\[\[cc-logo.png\]\]
## Public Domain Videos
[](#public-domain-videos)
<https://github.com/0atman/noboilerplate/>
notes: Everything you see in this video: script, links, and images are part of a markdown document available freely on github under a public domain licence.
---
!\[\[tris-fake-wikipedia-contents.png|600\]\] (My very real Wikipedia page)
notes:
As I mentioned in my coping mechanisms video, I have ADHD.
I was diagnosed in school in the early 90s, and have recently started taking medication after an adult diagnosis.
---
## I Am not a Doctor
[](#i-am-not-a-doctor)
### I'm Hoping that Hearing My Story Could Be Helpful for Folks
[](#im-hoping-that-hearing-my-story-could-be-helpful-for-folks)
notes:
#todo
* screenshot this slide My adhd has profoundly shaped my life as a child and through to adulthood.
I made this video to tell you my story, but also to share everything that I've learned along the way.
---
!\[\[becca-champ-headshot.png|300\]\]
[patreon.com/rebeccachampuk](https://www.patreon.com/rebeccachampuk/)
notes:
In addition to drawing upon my own experience of ADHD, I must thank my friend Rebecca Champ, who is currently researching better treatment of ADHD in adults as part of her PhD.
This video has been much improved by her involvement, do check out her Patreon where she posts about ADHD and her cutting-edge research.
Let's start with the big question:
---
## Why Does it Seem Like
[](#why-does-it-seem-like)
## Everyone Has ADHD
[](#everyone-has-adhd)
## These Days?
[](#these-days)
notes:
Why Does it Seem Like Everyone Has ADHD These Days?
I think it's partly just the slow march of medical and diagnostic progress:
The same proportion of the population have ADHD who have always had ADHD, but because we're able to diagnose and treat it so much better than even a decade or two ago, people are more aware of it.
---
!\[\[left-handedness-graph.png\]\]
notes:
## Left Handed Analogy
[](#left-handed-analogy)
It feels to me similar to the suppression of left-handedness in many countries around the turn of the last century, where children were forced to write with their right hand, despite more than a tenth of them favouring the left.
This sinister practice died out in the 50s and the graph has been flat ever since, likely showing the true proportion of actual lefties.
It's important to note that the number of naturally left-handed people didn't actually increase, the number of people learning to be left dominant increased because _we stopped persecuting them_
---
#### The Number Hasn't Increased
[](#the-number-hasnt-increased)
## We just Stopped
[](#we-just-stopped)
## Persecuting Them
[](#persecuting-them)
(maybe this explains other trends...)
[![|200](https://proxy-prod.omnivore-image-cache.app/0x0,s-DI0-b-dOyhJ8rf1_FfhM8rbJ5IMjmQWoU8HvZsNqu8/https://camo.githubusercontent.com/a5559bf8874fbc651ac1cdc6b96301f3f5724f88860cd26f9cb9e91bfdd0598c/68747470733a2f2f7777772e7072696465666c6167732e6f72672f7374617469632f7365617263682f646174612f696d672f70726f67726573735f70726964655f666c61672e737667)](https://camo.githubusercontent.com/a5559bf8874fbc651ac1cdc6b96301f3f5724f88860cd26f9cb9e91bfdd0598c/68747470733a2f2f7777772e7072696465666c6167732e6f72672f7374617469632f7365617263682f646174612f696d672f70726f67726573735f70726964655f666c61672e737667)
notes:
This attitude shift for both left-handedness and ADHD is huge. And perhaps you can think of a few others that fit this pattern too.
Instead of "Here's Timmy, he's a troublemaker" it's "Here's Timmy, he has ADHD"
One of those comments is judgemental, and one of them is constructive.
---
## My Experience
[](#my-experience)
## Childhood
[](#childhood)
notes:
I am extremely lucky. You can kind of reverse-engineer that from the knowledge that I'm a YouTuber. A lot of things had to align for us to be talking today.
As a child I had extremely severe ADHD, then called ADD, as well as Dyslexia, plus the wildcard of Autism. What a winning hand!
But in addition to those three interesting cards that fate dealt me, I had an ace. Or, two, up my sleeve:
---
!\[\[superman-and-wonderwoman.png\]\]
(artist's impression)
notes:
Both my parents, in addition to being wonderful supportive people, taught in primary school.
This experience meant that when their first-born son wasn't making eye contact as early as he should, and seemed more disruptive and distracted among other children, they took FAST action.
And it saved my life.
---
_"Tristram spends most of his time organising his desk and looking around at what other students are doing. This doesn't affect his work **because he doesn't do any**."_
### — My Childhood Report
[](#-my-childhood-report)
notes:
My parents got me to a childhood psychologist who observed me in class, noting hilariously, that (quote)
After the diagnosis of ADHD, my parents lined up all the help I needed, fighting council budgets in our small rural school.
I didn't learn foreign languages as a teenager, I left my friends in these subjects and took lessons in the special education department, and had a dedicated Ancillary teacher to keep me on task in every lesson.
I needed all this guidance to help align my left-handed ADHD brain into the right-handed Neurotypical world that was not set up for people like me.
What's astonishing is that despite attending a state school, this was all provided for me for free.
When I ask my parents how they managed it, they say that they simply would not take no for an answer.
How lucky am I?
---
## So What is ADHD?
[](#so-what-is-adhd)
notes:
If you have a broken leg, there's a clear underlying condition that explains your symptoms. But with mental health, you can't always see the source of the problems.
ADHD, like many mental health conditions, is a classification of groups of symptoms that respond to common treatment, rather than a fixed underlying cause.
There are many hypothesised causes of ADHD, and the most dominant model is a Dopamine imbalance.
---
## Dopamine Imbalance
[](#dopamine-imbalance)
notes:
Dopamine is my favourite brain chemical, and yours too. It is part of the reward system in the brain. Dopamine encourages us to do activities that the brain thinks are good for us.
Our brains give us a huge dopamine hit in anticipation of positive primal activities: eating fatty foods, exercise, sex, entertainment, and so on.
But it also rewards us with a smaller amount of dopamine for doing more cerebral activities:
* Cleaning your house,
* getting an early start on that paper that is due next month
* daily practising art and music, or
* raking up leaves in the yard
In short, non-urgent tasks that you could just ignore. Until you can't.
When we are children, our dopamine system, and understanding of the world, is not developed yet. Our parents and teachers have to persuade us into doing non-primal but important tasks.
Because we are rewarded by our parents and teachers for doing a Good Job in these endeavours, our brain, and dopamine system, learns this, and we start to build autonomous positive habits for ourselves.
But what if this system works in an atypical way?
---
## The ADHD Child
[](#the-adhd-child)
notes:
Imagine a child, like a young Tris, who doesn't get enough dopamine from doing good tasks.
Even before they can speak, they are learning through constant chemical feedback that when they eat a lot, they get loads of dopamine - they feel good. Same with running around and playing, loads of dopamine there. FANTASTIC!
But sitting quietly because mummy told us to? No dopamine. No positive chemical re-enforcement.
And this is a powerful teacher.
We are slaves to our brain chemistry, Dopamine especially, and children especially.
So by the time the ADHD child goes to school, there is a marked difference in behaviour, and they ALL might be because of an atypical dopamine system:
* ==They're not intentionally disruptive in class, they're choosing dopamine-rewarding behaviours.==
* ==They're not greedy when eating, they're choosing dopamine-rewarding behaviours==
* ==They're not unable to listen to you when you talk to them, they're choosing dopamine-rewarding behaviours==
* ==They are not constantly distracted, they're constantly engaging in dopamine-rewarding behaviour, just as evolution has taught us all to do.==
The problem is: The system is not working in the same way as the other children.
---
## Graduation
[](#graduation)
notes:
With all this support, both in-school and outside, by the time I was 16, I was awarded "Most Improved" in our graduation ceremony, an award I felt was somewhat of a back-handed complement! And two years later. I was off to University.
How did I get to university? To paraphrase Dave Lister, from Red Dwarf:
---
!\[\[lister-milkshake.png|800\]\]
— Dave Lister (AKA Lister of Smeg, Cloister the Stupid, Sebastian Doyle, Skipper, Cinzano Bianco, Spanners)
notes:
> The normal way you get into University. The same old, usual, normal, boring way you get in. I failed my exams and applied.
But now I was on my own, no-one could tell me to pay attention in class, they couldn't even force me out of bed to go to class.
And self-direction is a nightmare for someone with ADHD.
---
## University Experimentation
[](#university-experimentation)
notes:
Starting university, in 2004, I had access to broadband internet for the first time - imagine that!
This allowed me to easily research ways to organise myself, what I would later come to know as _coping mechanisms_.
At this stage, I thought I was cured. I had that 'most improved' award, after all. I was making eye contact like a champ, and my university grades were good.
However, I knew that I was only scraping by. I was legendarily forgetful, missing both social and school appointments regularly.
I started researching as much as I could, reading early Lifehacker articles and blog posts. I started building more coping mechanisms.
* I had built enough of them for school, but not university
* ==I no longer could get by on smarts, everyone's smart here==
* But with the ADHD diagnosis, I was able to use the university's systems set up for people like me to just about get by.
* By the end of university, fresh coping mechanisms in hand, I once again thought I was cured, and I began my career as a web developer.
---
## Professional Life
[](#professional-life)
notes:
==Web development might be the best job in the world, it certainly was the best job for me:
It's naturally structured, with the work often agreed upon by the team, and divided up into byte-sized tasks.==
==The prevailing organisation system, scrum, had clear goals and structure that really worked for me, at least at first, it was like solving a puzzle or playing a video game, but every day.==
And they were paying me to do it!
I became senior very quickly, then team lead and everything was looking up.
However, what I was experiencing was masking, not pure victory as I thought. And it happens to millions of people:
---
## ADHD Doesn't Present Strongly in a Structured & Deadline-Filled Environment
[](#adhd-doesnt-present-strongly-in-a-structured--deadline-filled-environment)
notes:
==If you, like many folks,==
* ==wake up to an alarm,==
* ==commute to your job for 8 or 9am,==
* ==do whatever work your boss tells you to do,==
* ==commute home and eat and then sleep,==
* ==only to do it all over again the next day.==
==You might never notice you have ADHD.==
==Symptoms like executive dysfunction and inattention might not affect you in the 9-to-5 grind.==
But guess what happened in 2020.
---
## THANKS CORONA
[](#thanks-corona)
## I Hate it
[](#i-hate-it)
notes:
Suddenly, your boss begged you NOT to come into the office, working from home became mandatory. And even after the lockdowns lifted, we discovered that in many cases, we didn't need the offices at all.
It suddenly seemed like insanity to go from your home, where you have an internet connection and a computer, to sit in a noisy office where you have an internet connection and a computer.
The collective dillusion of the Victorian workhouse was shattered by the coronavirus lockdowns.
The world experimented, just briefly, with pausing infinite growth and grind:
* Smog lifted in Beijing and Delhi,
* Venice's canals ran clear, and
* Working from home became the new standard.
But this new-found autonomy, freedom, and self-direction was like a tsunami tide, first withdrawing and exposing all the rocks that were so carefully covered, and then returning, crashing down with the realisation that millions of people can't work outside the old frameworks.
---
## Let the Past Die
[](#let-the-past-die)
## Kill it if You Have to
[](#kill-it-if-you-have-to)
notes:
The solution isn't to pack the people back into the workhouse again. We're past that, for all the sabre-rattling of CEOs to get back to the office, that boat has sailed. The leases on the offices have been given up, and white-collar worker's eyes have opened to the fact that they were being tricked into giving away hours of their life commuting for literally no reason.
And the free market, darling of the very CEOs who demand the return to work, has seized upon this efficiency, and will not let it go.
---
## 2020
[](#2020)
notes:
In 2020 I survived the apocalypse, literally and figuratively, though many people did not. Both figuratively and literally.
Wfh did not seem to affect my ADHD like it did for so many others. I think this was because I was already working in an asynchronous highly structured way, my structure came from systems (like JIRA and Trello and scrum), not the physical office, and so didn't affect me much.
The change for me came 2 years later:
---
## Self-Employment
[](#self-employment)
### Or
[](#or)
## Rust Ruined Everything
[](#rust-ruined-everything)
#### (In The Nicest Way)
[](#in-the-nicest-way)
notes:
* THIS is where it fell apart for me, when I went full-time on this channel.
* I created my first rust video (link) to show to a few colleagues who couldn't make my in-person unhinged sermon about this incredible language I'd found.
* I uploaded, sent the link to them, and it got 10 views and I thought nothing of it.
* 2 weeks later, my email stopped loading one sleepy Sunday because I received so many comments overnight.
* The algorithm gods had chosen me, and I started writing more videos.
* After a whirlwind 6 months, I went full time on this channel, supported by my generous patrons.
* I can't thank you enough, by the way
---
!\[\[patreon.png|200\]\]
notes:
It's just me running this channel, and I'm so grateful to everyone for supporting me on this wild adventure.
If you'd like to see and give feedback on my videos up to a week early, as well as get discord perks, and even your name in the credits, it would be very kind of you to check my Patreon.
I'm also offering a limited number of mentoring slots. If you'd like 1:1 tuition on Rust, Personal organisation, creative production, Web tech, or anything that I talk about in my videos, do sign up and let's chat!
Back to my story:
---
## Executive Dysfunction
[](#executive-dysfunction)
notes:
* But again, my ADHD caught up with me.
* ==Right when I needed to be self-directed, to decide for myself what to spend each day doing.==
* I found that I had a problem, and I needed more help.
---
## So how Do We Fix This Dopamine Imbalance?
[](#so-how-do-we-fix-this-dopamine-imbalance)
notes:
If the common cause of ADHD might be so simple, can we just take a dopamine supplement and solve this all?
Surprisingly, for mental health, yes, that's almost exactly what you can do. The medicine is simple, with few side-effects, and if you live in a developed country, available for free, but you must be diagnosed by a specialist.
---
## Adult Diagnosis
[](#adult-diagnosis)
For my UK friends, I went with [ADHD-360.com](https://www.adhd-360.com/)
(not sponsored, obviously)
notes:
By this time it was September 2023, there was almost nowhere you could get an ADHD diagnosis, and those that were still accepting patients had multi-year waiting lists.
After exhaustive research, I found a provider that was still accepting patients. They did this with a clever little hack of being extremely expensive.
After sleeping on it, I decided that I might be repaid many times for my investment, and took the plunge.
The next week I was diagnosed and had medication.
---
## Medication
[](#medication)
notes:
ADHD medication can work wonders if you are being affected by the same dopamine imbalance as affects me.
* They START you on medication for ADHD before much else.
* Which is weird because in other conditions medication is usually the last resort.
* You typically try therapy and CBT before antidepressants, for example.
* But ADHD meds are GOOD.
---
## ADHD Meds
[](#adhd-meds)
## Are GOOD
[](#are-good)
notes:
#todo
* re-take and re-record this slide
The path onto ADHD meds can run a lot smoother than when you first start taking other similarly wonderful, life-saving medicines. It is easier to find the right ADHD drug for you, there are fewer side effects, and you don't have to take them for long periods of time to let them build up slowly, unlike (say) antidepressants.
As there is no pill for autism yet, ADHD is my first personal experience with daily medication.
Some of my friends take antidepressants, and it sounds tough. Worth it, let me be clear, but tough at first, before they start working for you.
This is nothing like my experience with ADHD meds.
---
## Properties of ADHD Stimulants
[](#properties-of-adhd-stimulants)
* No dependence/withdrawal
* Lower the dose some days to suit you
* Start and stop whenever suits you
* Treatment holidays encouraged
* Side effects are very slight
notes:
* There's no withdrawal symptoms apart from your ADHD symptoms returning
* Some days you don't need a full dose. It is safe to dial your dose up and down, after initial titration (the week or two at the start where you and your doctor are figuring out the right dose for you).
* Some days, perhaps lazy Saturdays, you can skip the meds altogether, and take a break to watch cartoons on the sofa all day.
* Treatment holidays every year or so are encouraged because with the space the meds gave you, you might have built enough coping mechanisms to function well enough, like I did until this year. If so, you can stop taking them, or reduce their frequency.
* Though your doctor will talk to you about your specific medication's side effects, for me, I only experienced two:
* Headache for the first few days,
* and euphoria.
The headache was due to dehydration. I felt like in the first week as I was getting used to them, I needed to drink a little more than usual, perhaps a litre more per day. But after a few more weeks that settled down.
The second side effect, euphoria, was very funny.
---
## ADHD Medication Made Me Feel Fantastic
[](#adhd-medication-made-me-feel-fantastic)
notes:
I noticed I was feeling really positive, energized and happy, and I also noticed the word 'euphoria' in the side effects list for what I was taking.
Though I knew that the medication was so low dose that this probably wasn't some chemical high, it did make me wonder!
I mentioned it at my monthly catchup call with my specialist, as we made sure the medication and dose were working for me.
He laughed and confirmed that I wasn't getting high, but nonetheless, it was a common side-effect of taking ADHD medicine.
---
## Imagine
[](#imagine)
## Being in Control of Your Life
[](#being-in-control-of-your-life)
notes:
The happiness I was feeling was that I could finally focus!
To retrain my behaviour from desperately seeking dopamine in distractions, to quietly working on what I want to do:
* Long hours of script writing for these videos, or
* Long hours of focussed music composition, or
* Long hours of quality chats with friends, where I actually talk about what I intend to talk about, ==not whatever random thoughts popped into my mind==
I wish this quiet focus for everyone with ADHD, but getting diagnosed is not just difficult because of the medical system overheads.
A big problem is the stigma about seeing your doctor in the first place.
---
!\[\[south-park-drug-free-treatment.png\]\]
'Drug-free ADD treatment' in S4E3 of _South Park_, 2000
notes:
Treatment of ADHD, or ADD as it was known when I was first diagnosed in the 90s, is plagued by stigma, still.
When I was growing up, most media portrayed ADHD kids as loud troublemakers or inattentive slow-wits. The medicines are in the amphetamine family, a word that is more often associated with ravers, not doctors, despite it being an enormous category of common medicines that all do very different things in the brain.
---
## If Your Body Doesn't Make the Chemicals You Want
[](#if-your-body-doesnt-make-the-chemicals-you-want)
## Store Bought is Fine
[](#store-bought-is-fine)
notes:
We now know better, and we have really excellent treatment options.
My medication is one-a-day, slow-release, and with such a small dose that I barely notice a difference when I'm taking it. I have to look back on my day and think "yeah, that was a good day, I got a lot of stuff done!" before I notice.
There are many medicine options to choose from if you don't like the first one you and your doctor try out.
If it's half as affective with you as it has been for me, it'll still be incredible.
---
## Lessons Learned
[](#lessons-learned)
* This is all very new
* Drugs are good
* Deadlines are good
* Checklists are good
* Study your Triggers and Habits
* Then improve them
* Routines are good
* Breaks are important
notes:
ADHD is a modern diagnosis of a challenge that people have been dealing with as long as there have been people. The diagnosis has been available to Boys for the longest, but girls and women and adult men are now finally allowed to have ADHD, as a little treat.
It was only in 1994 that the first conference to discuss gender differences in ADHD was held. And the Adult diagnosis was only agreed-upon and formalised in 2013.
---
## "Attention Deficit Hyperactivity Disorder"
[](#attention-deficit-hyperactivity-disorder)
notes:
The name is still a problem, and names have power. "Attention Deficit Hyperactivity Disorder"
It sounds very judgemental, doesn't it? As someone with Autism, I don't have a deficit of social skills, or whatever. The name is non-judgemental.
Our understanding is still evolving, and even the dominant Dopamine model I described today is subject to criticism and new research.
(check out Rebecca Champ's published work for details there)
---
## ADHD and Societal Problems
[](#adhd-and-societal-problems)
notes:
It's possible we evolved these ADHD behaviours because of wider population benefits. It might have been bad for the individual, but in pre-historic times, perhaps good for the whole to have a mix of neurotypical and neurodivergent folks.
We're past that now, we don't have to take one for the team any more!
There is a troubling trend that ADHD behaviours are dramatically over-represented in prison populations. Perhaps spiralling dopamine-rewarding behaviours can get out of hand in some people, or, simply, that if you don't fit in to neurotypical society, you can fall out of it.
==Though illegal drugs famously can boost dopamine, so can caffeine and chocolate.== You don't have to look very far for behaviours that increase dopamine that are not always good for you.
When getting a diagnosis, even for the newly-recognised adult ADHD, pre-existing childhood symptoms are essential to find for the medical professional because otherwise it could represent a recent, new condition, and that could be an emergency.
Don't let this historical requirement put you off. If you have ADHD today, you very likely had it as a child. Your doctor will help you.
---
!\[\[coping-video-thumb-build-habits.png\]\]
_"[Hack Your Brain With Elaborate Coping Mechanisms](https://www.youtube.com/watch?v=XUZ9VATeF%5F4)"_
notes:
I couldn't fit all my advice in this script today: I talked about 18 of my elaborate coping mechanisms in a previous video, pinned here and linked in the description, do watch that for more detail on what I do to manage my life day-to-day.
If some of what I've said has struck a chord in you, talk to your doctor.
I was very fortunate to be able to pay for a quicker diagnosis than many of my friends.
But even if I couldn't afford that, my advice to my past self would be the same as to anyone: The wait is worth it, start the ball rolling today.
---
!\[\[tri-hex-moon-white-transparent.png|300\]\]
## Thank You
[](#thank-you)
notes:
## OUTRO
[](#outro)
If you would like to support my channel, get early ad-free and tracking-free videos, vip discord access or 1:1 mentoring, head to patreon.com/noboilerplate.
If you're interested in transhumanism and hopepunk stories, please check out my weekly sci-fi podcast, Lost Terminal.
Or if urban fantasy is more your bag, do listen to a strange and beautiful podcast I produce every full moon called Modem Prometheus.
Transcripts and compile-checked markdown sourcecode are available on github, links in the description, and corrections are in the pinned ERRATA comment.
Thank you so much for watching, talk to you on Discord. \`\`

View file

@ -0,0 +1,166 @@
---
id: 7ec51414-ec16-11ee-9d24-0f20db024fdd
title: |
How Do Open Source Software Lifecycles Work?
status: ARCHIVED
tags:
- read-later
- RSS
date_added: 2024-03-26 14:01:50
url_omnivore: |
https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba
url_original: |
https://www.freecodecamp.org/news/understanding-open-source-software-lifecycles/
---
# How Do Open Source Software Lifecycles Work?
## Highlights
* There's the **alpha release** an initial version of software that is typically not feature-complete and is not intended for use by the general public. It is used for testing and internal use only.
* A **beta release** is a pre-release version of software that is feature-complete but may still have bugs or other issues. It is released to a limited audience for testing and feedback before the final release.
* Next will be a **release candidate**, which is a version of software that is considered stable and ready for release, pending final testing and bug fixes.
* And finally you'll produce a **general availability release** as the final version of software that's released to the general public.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#e773fb30-19c5-435e-b694-3dc361102961)
---
Major releases are typically used for significant changes or new features that are not backward compatible with previous versions. Major releases are usually announced to users and customers with a lot of fanfare, as they represent a significant milestone in the development of the software.
Minor releases, on the other hand, are used for smaller changes or new features that are backward compatible with previous versions. Minor releases are typically released more frequently and are intended to provide users with incremental improvements to the software.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#a3fc7d71-2005-47d8-ae20-ad8ba83d0096)
---
Backward compatibility is the ability of a newer version of software or system to work with files, data, and other components created in an older version of that software or system. This means that users can upgrade to the newer version without losing access to their existing data or files.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#a2e6d179-5650-4258-aeca-c97135d5cbd1)
---
Feature freeze is a stage in the software development process where no new features are added to the product or project. It is typically implemented as a deadline by which all new features must be completed and approved before the release of the software product.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#8f0133c9-d2fd-4bd5-ad62-6e5bbb42fd39)
---
A roadmap is a high-level strategic document that outlines the goals, objectives, and timeline for a software product's development. It provides a visual representation of the product development plan, outlining key milestones and the expected timeline for completion.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#15a5ff9c-9ba1-423a-9ee3-a4e9359ee251)
---
A changelog is a document that lists the changes made to a software product over time, including bug fixes, new features, and other updates. Changelogs allow developers and other stakeholders to understand what's been updated and when.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#49c22f66-4cae-4b35-9830-8ca179e57c1c)
---
Long term support refers to a software version that is designated for longer-term support and maintenance, typically for a period of several years. During this time, the software vendor provides ongoing support, including bug fixes, security updates, and other maintenance activities.
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#44327f2b-0570-483f-9aa4-d73ba0a88d18)
---
end-of-life refers to a point in time when a software version is no longer supported by the vendor. This means that the vendor will no longer provide
[source](https://omnivore.app/me/how-do-open-source-software-lifecycles-work-18e7f16d0ba#88586f0a-919d-4ce9-b50a-dc2c4176950e)
---
## Original
![How Do Open Source Software Lifecycles Work?](https://proxy-prod.omnivore-image-cache.app/1920x1280,s-HVVQVq9sV72IFFJobNBLtXawXLtTdb-1jZAS2Krqz8/https://www.freecodecamp.org/news/content/images/size/w2000/2024/03/danial-igdery-FCHlYvR5gJI-unsplash.jpg)
Software projects follow identifiable milestones as they move towards a successful completion. If you want to give your project the best chances of success, it's important to understand what those milestones mean and how they're defined.
This article comes from my Complete LPI Open Source Essentials Exam Study Guide [Udemy course](https://www.udemy.com/course/complete-lpi-open-source-essentials-exam-study-guide/?referralCode=05B999CE18EF4D6E243C) and [book](https://www.amazon.com/dp/B0CK3Q8DCF). You can also [view the video version](https://youtu.be/eZ%5F4DLVxs7Q).
## What are Software Releases?
There are several types of software releases and some related versioning methods used to keep track of software changes and to communicate them to users. We'll start with releases.
* ==There's the== **==alpha release==** == an initial version of software that is typically not feature-complete and is not intended for use by the general public. It is used for testing and internal use only.==
* ==A== **==beta release==** ==is a pre-release version of software that is feature-complete but may still have bugs or other issues. It is released to a limited audience for testing and feedback before the final release.==
* ==Next will be a== **==release candidate==**==, which is a version of software that is considered stable and ready for release, pending final testing and bug fixes.==
* ==And finally you'll produce a== **==general availability release==** ==as the final version of software that's released to the general public.==
## What is Software Versioning?
Software versioning (sometimes known as semantic versioning) is the practice of assigning unique version numbers to different releases of software.
Here's a useful example:
```angelscript
vmlinuz-5.19.0-40-generic
```
In some approaches, the first number in the version number ("5" in this case) is the major version. A major version change indicates significant changes or new features that are not backward compatible with previous versions.
The second number ("19") is the minor version. A minor version change indicates new features or functionality that are backward compatible with previous versions.
The third number in the version number ("0") is the patch version. A patch version change indicates bug fixes or minor changes that are backward compatible with previous versions.
Why distinguish between major and minor releases? ==Major releases are typically used for significant changes or new features that are not backward compatible with previous versions. Major releases are usually announced to users and customers with a lot of fanfare, as they represent a significant milestone in the development of the software.==
==Minor releases, on the other hand, are used for smaller changes or new features that are backward compatible with previous versions. Minor releases are typically released more frequently and are intended to provide users with incremental improvements to the software.==
## What Does Backward Compatibility Mean?
==Backward compatibility is the ability of a newer version of software or system to work with files, data, and other components created in an older version of that software or system. This means that users can upgrade to the newer version without losing access to their existing data or files.==
For example, let's assume a user has created a document in an older version of a word processing program. If the newer version of the program is backward compatible, the user can open and edit the same document without any issues. This is because the newer version of the program is designed to read and interpret the file format used in the older version.
However, if the newer version of the program is not backward compatible, the user may not be able to open or edit the file created in the older version without first converting or re-creating it in the newer version. This can be a significant inconvenience for users and can lead to compatibility issues and data loss.
Here are some more quick but important definitions.
## Feature Freeze
==Feature freeze is a stage in the software development process where no new features are added to the product or project. It is typically implemented as a deadline by which all new features must be completed and approved before the release of the software product.==
The primary goal of a feature freeze is to stabilize the software product in preparation for release. By setting a feature freeze deadline, developers can focus on completing and testing existing features rather than introducing new ones. This allows time for rigorous testing and bug fixing, improving the overall quality and reliability of the software product.
## Roadmaps
==A roadmap is a high-level strategic document that outlines the goals, objectives, and timeline for a software product's development. It provides a visual representation of the product development plan, outlining key milestones and the expected timeline for completion.==
Roadmaps are useful for communicating the overall direction of a software product to stakeholders, including developers, product managers, investors, and customers.
## Milestones
Milestones are specific, measurable achievements that mark progress towards the completion of a software product. They're typically set at regular intervals throughout the development process and are used to track progress and ensure that the project stays on schedule.
Examples of milestones might include the completion of a specific feature, the successful completion of a testing phase, or the release of a beta version of the software product.
## Changelog
==A changelog is a document that lists the changes made to a software product over time, including bug fixes, new features, and other updates. Changelogs allow developers and other stakeholders to understand what's been updated and when.==
Changelogs are particularly useful for software products that are updated frequently or have a large number of contributors.
## Long Term Support (LTS)
==Long term support refers to a software version that is designated for longer-term support and maintenance, typically for a period of several years. During this time, the software vendor provides ongoing support, including bug fixes, security updates, and other maintenance activities.==
LTS versions are often used in enterprise environments where stability and reliability are critical. In April of each even year, for example, Canonical will release an LTS version of Ubuntu. These versions are normally supported for four or five years.
## End of Life (EOL)
On the other hand, ==end-of-life refers to a point in time when a software version is no longer supported by the vendor. This means that the vendor will no longer provide== updates or fixes for the software, and any security vulnerabilities or bugs that are discovered will not be addressed. This can leave users with unsupported software that may be prone to security risks and other issues.
When a software product reaches its end-of-life, it is typically retired, and users are encouraged to upgrade to a newer version or switch to a different product. The EOL process is often gradual, with the vendor providing advance notice and guidance to users to help them migrate to a new version or product.
## Conclusion
You've seen how it's important to understand the stages through which successful software projects will move. And this isn't just theoretical, because this knowledge gives you the tools to track your progress and quickly identify when things are going off rails.
__This article comes from my [_Complete LPI Open Source Essentials Study Guide course](https://www.udemy.com/course/complete-lpi-open-source-essentials-exam-study-guide/?referralCode=05B999CE18EF4D6E243C)_. And there's much more technology goodness available at [bootstrap-it.com](https://bootstrap-it.com/)_
---
---
Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

View file

@ -0,0 +1,307 @@
---
id: 04745848-2b0d-482d-802c-8872ac9043dd
title: |
The Complete Guide to Time Blocking
status: ARCHIVED
tags:
- read-later
date_added: 2024-03-27 20:34:53
url_omnivore: |
https://omnivore.app/me/https-todoist-com-productivity-methods-time-blocking-18bbc432143
url_original: |
https://todoist.com/productivity-methods/time-blocking
---
# The Complete Guide to Time Blocking
## Highlights
Time blocking is a time management method that asks you to divide your day into blocks of time. Each block is dedicated to accomplishing a specific task or group of tasks, and only those specific tasks. Instead of keeping an open-ended to-do list of things youll get to as you can, youll start each day with a concrete schedule outlining what youll work on and when.
[source](https://omnivore.app/me/https-todoist-com-productivity-methods-time-blocking-18bbc432143#6ca022ff-400a-4f70-8031-1a3caa0e7246)
---
With days that are time blocked in advance, you wont have to constantly make choices about what to focus on.
[source](https://omnivore.app/me/https-todoist-com-productivity-methods-time-blocking-18bbc432143#21fb5ecc-b00e-4f14-8d60-84eec666e8a9)
---
Task batching is when you group similar (usually smaller) tasks together and schedule specific time blocks to complete all at once. By tackling similar tasks in a group, youll limit the amount of context switching you have to do throughout your day, saving precious time and mental energy.
[source](https://omnivore.app/me/https-todoist-com-productivity-methods-time-blocking-18bbc432143#ce3acd05-a296-4204-acfe-e0822f8a83d2)
---
Instead of setting aside time blocks for each area of responsibility each day, day theming dedicates a full day each week to each responsibility.
[source](https://omnivore.app/me/https-todoist-com-productivity-methods-time-blocking-18bbc432143#5d5543a9-0d8d-42ed-aa24-4ecfeb07d6ac)
---
time boxing asks you to limit how much time you'll dedicate to a specific task.
> [!note]
> Is _"I'm gonna finish this in X time"_, instead of _"I'm gonna work on this for X time"_
[source](https://omnivore.app/me/https-todoist-com-productivity-methods-time-blocking-18bbc432143#e342c6ce-607b-4482-af54-4ffbf81ab7ab)
---
## Original
* Why is time blocking so effective?
* But will time blocking work with my job?
* Some common time blocking missteps and how to avoid them
* Time blocking with Todoist
> "A 40 hour time-blocked work week, I estimate, produces the same amount of output as a 60+ hour work week pursued without structure."
>
> — Cal Newport, Author of _Deep Work_
If there's one thing that can be said about the modern workplace, it's this: If you don't control your schedule, it will control you.
How do you balance the necessary evils of meetings, email, team chat, and "busy work" with focused time for the things you truly care about? Since becoming a digital hermit isnt an option for most of us, we need concrete strategies to help us focus in a world designed to distract us.
Thats where time blocking comes in.
We've made a companion [video for time blocking](https://youtu.be/FLxt4Sbpud4) because everyone learns differently and we know some of you prefer to watch instead of read. Check out that video below, or continue reading for a deeper dive.
Time blocking (and its close cousins, time boxing, task batching, and day theming) is a simple yet effective way to take back control of your time.
Try time blocking if you...
* Juggle many different projects/responsibilities (Jack Dorsey used day theming to run two major companies at the same time)
* Spend too much time in “reactive mode,” responding to emails and messages
* Find their day chopped up by meetings
* Battle constant interruptions throughout the day
* Struggle to find the time and mental space for big-picture thinking
This guide will give you an overview of what time blocking, task batching, and day theming are; how a combination of these strategies can help you reclaim your schedule, and the best way to use your calendar and task manager to start time blocking yourself.
![Time blocking](https://proxy-prod.omnivore-image-cache.app/889x778,s6BxNxs-MVDCgQSPZIjsWUhkIywtESq7BMTMIm-FHXzg/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F4TX4sf646bho3bNtnOKLFr%2Fafcd4912bdc83f1eb6ed2709ad2acf92%2FTime_blocking.png)
==Time blocking is a time management method that asks you to divide your day into blocks of time. Each block is dedicated to accomplishing a specific task or group of tasks, and only those specific tasks. Instead of keeping an open-ended to-do list of things youll get to as you can, youll start each day with a concrete schedule outlining what youll work on and when.==
The key to this method is prioritizing your task list in advance — a dedicated weekly review is a must. Take stock of whats coming up for the week ahead, and make a rough sketch of your time blocks for each day. At the [end of every workday](https://doist.com/blog/end-work-day/?itm%5Fcampaign=time%5Fblocking&itm%5Fmedium=referral&itm%5Fsource=productivity%5Fmethods%5Fguides), review any tasks you didnt finish — as well as any new tasks that have come in — and adjust your time blocks for the rest of the week accordingly.
==With days that are time blocked in advance, you wont have to constantly make choices about what to focus on.== All you need to do is follow your time blocked schedule. If you get off-task or distracted, simply look at your schedule and get back to whichever task you blocked off time for.
## Time blocking variations
Time blocking has a few close but distinct cousins that are worth considering: task batching, day theming, and time boxing.
| **Method** | **What is it?** | **Example** |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| Time Blocking | Dividing the day into blocks of time with each block dedicated to accomplishing a specific task or activity and only that specific task or activity. | "I will write every day from 9am to 11am." |
| Task Batching | "I will answer all of my emails at 3pm." | |
| Day Theming | "Every Monday, I will focus on content creation. Every Tuesday, I will focus on content promotion. Every Wednesday, I will focus on research and ideation. Etc." | |
| Time Boxing | "I will write 1,000 words between 9am and 11am tomorrow." | |
### Task batching
==Task batching is when you group similar (usually smaller) tasks together and schedule specific time blocks to complete all at once. By tackling similar tasks in a group, youll limit the amount of context switching you have to do throughout your day, saving precious time and mental energy.== For example, scheduling two 20-minute blocks to process email during the day is more efficient than checking your inbox every 15 minutes.
![graphic-of-common-task-batches-2](https://proxy-prod.omnivore-image-cache.app/335x371,s8qmSYqArxryH7WevOHaUxSJy-RGRYAkHsnzGvPQeZmk/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F1O5V6na7e2xj0eZFbJq8eg%2F08012da9eb9e8f01adb28e79133ce78f%2Fgraphic-of-common-task-batches-2.png)
Time blocking pairs well with task batching because it saves you from scheduling every individual task on your calendar. Just block off chunks of time each day or week for when you want to complete a certain batch of activities, e.g., email, invoicing, workouts, meetings, writing, coding, deep work, errands, meal prep.
### Day theming
Day theming is a more extreme version of task batching for people who have a lot of areas of responsibility competing for their attention. For example, an entrepreneur often has to pay attention to marketing, sales, product development, customer support, and HR all at the same time. ==Instead of setting aside time blocks for each area of responsibility each day, day theming dedicates a full day each week to each responsibility.==
Mike Vardy, founder of [Productivityist](https://productivityist.com/theming-days-made-better-dad/), uses day theming to set his overarching focus for each day. Here's how he themes his week:
![Day theming calendar](https://proxy-prod.omnivore-image-cache.app/796x528,sXTPWbymjfNat8qmFzmjGD9zA-vJR_zKNIvGRfW7PKs8/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F3GY01DriGE1FVysm50UhgC%2Fe288d008a0533a098ef9d7098fb0eea1%2FDay_theming_calendar.png)
Dedicating each day to a single theme creates a reliable work pattern and further limits the cognitive load of context switching. Vardy explains that theming offers mental clarity that allows him to focus on his family:
> “Knowing what the day means to me allows me to get the things I need and want to accomplish without seeing undetermined ought to do items on a to do list. As a result, I have less decision fatigue and even have more energy when I spend time with my kids.”
### Time boxing
Time blocking and time boxing are often confused as being synonymous, but there's an important difference. Time blocking asks you to set aside certain chunks of time to focus on a given task or activity. For example, "I will work on a first draft of my blog post from 9am to 11 am tomorrow."
In contrast, ==time boxing asks you to limit how much time you'll dedicate to a specific task.== Here's a time boxed version of the time blocking example above: "I will finish a first draft of my blog post tomorrow between 9am and 11am."
This self-imposed "time box" forces you to work efficiently because you have a limited amount of time in which to complete the task. It can be a fun way to challenge yourself and gamify your productivity.
## Why is time blocking so effective?
This technique seems simple on the surface, but has profound impacts on your capacity to get things done:
### It promotes focused “deep work”
Cal Newport, author of [Deep Work: Rules for Focused Success in a Distracted World](https://www.amazon.com/Deep-Work-Focused-Success-Distracted/dp/1455586692/ref=asc%5Fdf%5F1455586692/?tag=hyprod-20&linkCode=df0&hvadid=312741934517&hvpos=1o1&hvnetw=g&hvrand=7753978193869239626&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9019660&hvtargid=pla-421604508630&psc=1&tag=&ref=&adgrpid=64940825031&hvpone=&hvptwo=&hvadid=312741934517&hvpos=1o1&hvnetw=g&hvrand=7753978193869239626&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9019660&hvtargid=pla-421604508630), is a [big proponent of time blocking](http://www.calnewport.com/blog/2013/12/21/deep-habits-the-importance-of-planning-every-minute-of-your-work-day/). He dedicates 20 minutes every evening to scheduling out the next work day:
> “Sometimes people ask why I bother with such a detailed level of planning. My answer is simple: it generates a massive amount of productivity. A 40 hour time-blocked work week, I estimate, produces the same amount of output as a 60+ hour work week pursued without structure.”
When you schedule a chunk of time to work on a single project, problem, or task, you bring all of your mental resources to bear on one thing rather than spreading your attention thin across several tasks. The more you “single task”, the more you build the mental muscles required for deep work, and the easier it becomes to stay focused.
![Cal-Newport-Timeblocking](https://proxy-prod.omnivore-image-cache.app/0x0,sL0foP6CXOnzwGck9Mt7Dl8djLkht-jBbrRvXR64JM90/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F3pEKXsWWG82IeGEdSqsGpF%2F1f9f881506f65d730bb4fda89ef59294%2FCal-Newport-Timeblocking.jpg)
### It helps you knock out “shallow work” more efficiently
Shallow work is the busy work thats [urgent but not important](https://todoist.com/productivity-methods/eisenhower-matrix) to achieving your long-term goals — think paperwork or responding to (most) emails. When you time box shallow work, youre setting clear limits on how much time youll dedicate to it. Plus, grouping similar tasks together reduces the cost of context switching. By batching all of your shallow tasks together in a dedicated time block or two, youll be able to power through them more efficiently and protect the rest of your workday for higher-impact work.
![shallow vs deep work](https://proxy-prod.omnivore-image-cache.app/660x395,sW1x5ZNSfbqw3HU-Ga3zwk6CU-q4agXcb2Zdg57bs6O0/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F2S6Dbyy5SDMLqPSDjQD98P%2Fd8b9ac1970a61f371dcf10832828cd11%2Fshallow_vs_deep_work.png)
### It makes you aware of how you spend your time
Most people are bad at time management. We are [terrible at estimating](https://en.wikipedia.org/wiki/Planning%5Ffallacy) how much time tasks will take, and we have a tendency to [overcommit our future selves](https://doist.com/blog/neuroscience-achieving-long-term-goals/?itm%5Fcampaign=time%5Fblocking&itm%5Fmedium=referral&itm%5Fsource=productivity%5Fmethods%5Fguides). Time blocking forces you to confront your current priorities and commitments and get intentional about how you spend your finite time. For each new commitment you let into your life, youre forced to find physical space on your calendar. As a result, the opportunity cost of saying “yes” becomes more concrete, and it becomes much easier to [say “no](https://doist.com/blog/how-to-say-no/?itm%5Fcampaign=time%5Fblocking&itm%5Fmedium=referral&itm%5Fsource=productivity%5Fmethods%5Fguides).”
### It counteracts perfectionism
Fuzzy timelines are a perfectionists worst enemy. Theres always something to be tweaked and improved. It can be difficult to know when an open-ended project is finished, especially if you are aiming for perfection. At some point, you need to be able to say “good enough” and move on. Time boxing can help by imposing time limits on your projects. If you often prolong tasks by trying to get everything just right, set a strict time box for finishing the task and stick to it.
### It helps you follow through on your goals
In the article “[Beyond good intentions: Prompting people to make plans improves follow-through on important tasks](https://scholar.harvard.edu/files/todd%5Frogers/files/beyond%5Fgood%5Fintentions%5F-%5Fprompting%5Fpeople.pdf)” researchers Dr. Todd Rogers and Dr. Katherine L. Milkman review several studies supporting the idea that “concrete plans help people follow through on their intentions.”
From following an exercise regimen to scheduling a flu shot, people were more likely to act on their intentions when they wrote down a specific place, date, and time for the activity. Yet most people rely on vague intentions rather than concrete plans:
> “Paradoxically, people frequently underplan when they begin with strong intentions. They mistakenly believe that their strong intentions are enough to propel them to perform desired behaviors, and that belief keeps them from using strategies that could help translate intentions into actions.”
The takeaway: When you schedule your tasks and goals, youre more likely to follow through. Time blocking forces you to make concrete plans that ensure youre working toward your goals every day. As William Faulkner famously quipped:
> “I only write when inspiration strikes. Fortunately, it strikes at nine every morning.”
## But will time blocking work with my job?
One of the biggest criticisms of time blocking is that it doesnt account for reactive jobs where its impossible to anticipate what will come in at any given moment. Is time blocking really a realistic strategy for a customer support specialist whose job is to respond to tickets? Or an account manager who needs to be available to respond to client requests?
Wed argue yes — asserting even a small amount of control over your schedule can be helpful no matter your job. Cal Newport put it this way:
> “Periods of open-ended reactivity can be blocked off like any other type of obligation. Even if youre blocking most of your day for reactive work, for example, the fact that youre controlling your schedule will allow you to dedicate some small blocks (perhaps at the schedule periphery) to deeper pursuits.”
When your workday is run by external forces, its easy to lose sight of your own goals. Time blocking can help you gain a greater sense of control over even the most unpredictable of schedules.
## Some common time blocking missteps and how to avoid them
While time blocking is pretty straightforward in theory, it can be hard to stick to in practice. Here are some tips to help you apply the method successfully (and not become a slave to your calendar in the process):
### Underestimating your time
Youll get better at estimating how long tasks take over time, but until youve honed your instincts, err on the side of blocking off too much time for tasks rather than too little. Pad your schedule with extra time to complete and transition between tasks. You can even create “conditional blocks” of time you can tap into if you fall behind.
Try these tools
Improve your sense of how long you actually spend on tasks with time trackers like [RescueTime](https://www.rescuetime.com/ref/1403570) or [Toggl](https://toggl.com/).
### Being too rigid
Things will come up and ruin your plans. But remember that your plan is a guide to help focus your attention on whats important, not a binding contract.
Even productivity expert Cal Newport edits his plans throughout the day by crossing out original time blocks and filling them with updated plans as circumstances demand:
![Cal-Newport-Time-Blocks-Revised](https://proxy-prod.omnivore-image-cache.app/0x131,szGnOUJr0cfs5SlyDoEr6jW8AALaZg8e52e8CKgILOEc/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F5lLjQJcgkg8qVx5Xeb3n7n%2F4827b4f45d3b08b5ceab342297d1d6e3%2FCal-Newport-Time-Blocks-Revised.png)
Newport deals with changes in his schedule by seeing it as a game:
> “This type of planning, to me, is like a chess game, with blocks of work getting spread and sorted in such a way that projects big and small all seem to click into completion with (just enough) time to spare.”
See your time blocks as a flexible way to challenge yourself, not strict tools to punish yourself when you fall short.
### Overscheduling your leisure time
Though [Elon Musk and Bill Gates](https://www.businessinsider.com/bill-gates-elon-musk-scheduling-habit-2017-8) have been said to schedule their days down to 5-minute increments, overscheduling your leisure time can be a self-defeating exercise. [Studies](https://www.washingtonpost.com/news/inspired-life/wp/2018/07/31/want-to-be-happier-stop-scheduling-your-free-time/?noredirect=on&utm%5Fterm=.c7b6c4e1f8d1) have shown that scheduling leisure activities has a “unique dampening effect” on the overall enjoyment of the activity.
Instead, you can block out time to disconnect and relax without a set plan for how youll spend that time. It will give you the flexibility to decide more spontaneously what you want to do-- call friends to grab a drink? Check out that new Xbox game? Read? Whatever you decide, just remember to keep at least some of your free time free.
## Time blocking with Todoist
You can implement time blocking with any tool, but in this section, we'll focus on how to use Todoist alongside your favorite calendar app — or even good, old-fashioned pen and paper. We'll cover how to implement three different time blocking variations: task batching, day theming, and scheduling individual tasks.
### Task batching variation
Strict time blocking — dedicating a time block to each individual task — can be tedious and hard to maintain over time. We recommend combining time blocking and task batching for a more streamlined system. Instead of one time block per individual task, youll assign a time block for each category of task you batch together. Heres how that looks in practice:
First, decide on which broad categories of work need to be reflected in your daily or weekly schedule. For example, a freelance writer might have the following category list:
* Email
* Work admin
* Sales
* Meetings
* Research
* Writing
* Professional Development
* Yoga
* Meal prep
* Personal admin
* Reading
* Free time
Now, sit down with your favorite calendar app or paper planner and create time blocks for the coming week that reflect the times youll work on each category. Make sure all of your priorities and commitments are given enough space on your calendar. If you struggle to find room, you may need to start cutting down on your commitments. The end result will look something like this:
![timeboxed-schedule-digital](https://proxy-prod.omnivore-image-cache.app/1011x651,sLnma6jNLOFm1XIBK8vXZRs-guc6dnbrFDN2HMfjitpA/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F4zcjeR2aU8qoUWJjH6sfnN%2F0e2f618327e24522bf1b66cde2da4884%2Ftimeboxed-schedule-digital.png)
If you find it difficult to stick to your digital schedule, we recommend planning your day out on paper. A paper schedule forces you to start fresh each day and makes it easy to scribble things out and adapt as the day goes on. Plus, it's also easier to keep your paper schedule open on your desk as a visible reminder of what you had planned to focus on.
![timeboxed-schedule-paper](https://proxy-prod.omnivore-image-cache.app/736x0,sQUkv3c8VWCfC9ZG4f5xbPKlF1OWRLS0QzaW2XAQ3h34/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F29KfBuT5SqW4J874B0okcW%2F5c4bc349f39fda42337651b51b5468c1%2Ftimeboxed-schedule-paper.jpg)
If you work at a company with shared calendars, you may find it helpful to publicly block off time for “Deep Work” to keep a sufficient chunk of the day meeting free. Khoi Vinh, a [Principal Designer at Adobe](https://doist.com/blog/how-khoi-vinh-gets-things-done/?itm%5Fcampaign=time%5Fblocking&itm%5Fmedium=referral&itm%5Fsource=productivity%5Fmethods%5Fguides), uses this strategy at his office:
> “I look for blocks of time on my calendar that I can cordon off for “deep work”. Sometimes Ill move around meetings to create longer contiguous blocks, and then Ill create a meeting called “Do Not Book” or, if I suspect someone will ignore that, Ill name it something like “Collaboration Session” or “Research Review.” You have to get crafty.”
![Khoi-Vinh-Calendar](https://proxy-prod.omnivore-image-cache.app/586x0,szULiMUKB4MLKb_BbL-Orrblo1EA4D2ROTNGQY-ki_4I/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F7JwW7XFwrrMdexDS8d90lF%2F17fd55e2b39cd8c90c4ccb772c9b854a%2FKhoi-Vinh-Calendar.png)
You now have time blocks for each category, but you still need to know which specific task — or group of tasks — to work on when the time comes. Thats where a task manager like Todoist comes in.
[Create a Todoist label](https://get.todoist.help/hc/en-us/articles/360000029000-How-to-best-use-labels?utm%5Fsource=dots%5Fblog&utm%5Fmedium=referral&utm%5Fcampaign=time%5Fblocking) for each batched category you came up with in step one, then review all of your current tasks and assign the appropriate label to each one.
![label-list](https://proxy-prod.omnivore-image-cache.app/288x0,s4bIuOHPtwRITgGNRNqUpTn6CjurIlPEZM2akKSBrPG4/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F7wVXAknY2k9wUhVN6Yrjqr%2F7163d48729268566a43c8c97bd540a44%2Flabel-list.png)
![quick-add-label](https://proxy-prod.omnivore-image-cache.app/614x113,sAcMuIO37ZTnC_G7uXj7De26_bVwZJaXn0AVH6Ob7s_k/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F7wdN788BxQiA7Kpnzj5hE4%2F841ab2e35d050d0bd808b977e56539be%2Fquick-add-label.jpg)
Now, when you come to a time block, all you have to do is pull up the corresponding label list and choose from the relevant tasks. Tasks with dates will automatically be sorted at the top so youll know when something is due soon and needs your attention first.
![label-task-list](https://proxy-prod.omnivore-image-cache.app/659x295,sCpzNph_SdxhY5GzAxvTouss7UtkZJbALRMZHAxTZLZ0/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F5Cgbof55vOgCR33eqL1BVt%2Fddd3cdcb6f1fe1059c8ba19f2d693d44%2Flabel-task-list.png)
Todoist Tip
You can also [create a new filter](https://get.todoist.help/hc/en-us/articles/205248842-Filters?itm%5Fcampaign=time%5Fblocking&itm%5Fmedium=referral&itm%5Fsource=productivity%5Fmethods%5Fguides) with a query like “@personal\_admin & next 7 days” to see just the tasks due in the upcoming week with that specific label.
To make sure nothing slips through the cracks, every task should have a label. However, youll likely find that not every category needs to be tracked in Todoist. For example, you may want to keep track of your meetings or exercise classes in your calendar rather than in your task manager. And as we said before, you dont want to overprogram your free time. Experiment with your setup to figure out what makes sense for your specific circumstances.
### Day theming variation
If you try time blocking and still feel too scattered and unfocused, you may want to try out day theming. We recommend this [free Skillshare course](https://www.skillshare.com/classes/Productivity-Habits-That-Stick-Using-Time-Theming/1216959000) by Mike Vardy. He walks you through setting up a day theming system, including detailed examples using both paper and Todoist.
### Scheduling time blocks for individual tasks
Of course, if you want to keep a more granular schedule, you can always create separate time blocks for each task. The easiest way to do that with Todoist is via the [2-way integration with Google Calendar](https://get.todoist.help/hc/en-us/articles/115003128085-How-can-I-use-Todoist-with-Google-Calendar?itm%5Fcampaign=time%5Fblocking&itm%5Fmedium=referral&itm%5Fsource=productivity%5Fmethods%5Fguides).
When setting up the integration:
* Create a new calendar for just your Todoist tasks so you can toggle them on and off inside your calendar as you need.
* Choose to sync your entire Todoist account or create separate calendars for each of your Todoist projects.
* Choose to sync tasks with just a due date in addition to tasks with a due date and time.
Any Todoist task with a date and time will automatically appear as an event in your new Todoist calendar. Any task with a date but no time will appear as a day-long event.
During your [weekly review](https://todoist.com/productivity-methods/weekly-review), give each task you want to accomplish a date and/or start time by typing something like “Monday at noon” or “Every Friday at 9am” into the task field. Todoist will automatically recognize and highlight the date and set it when you save the task.
![data-recognition-quick-add-mobile-1](https://proxy-prod.omnivore-image-cache.app/1400x1400,sNCOYE-2aKU-iRNYPL8pqZGpLQSh-K9rX8q_zevBh49A/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F3kwyryMNi7QzPQnuUXz4i6%2Fe2c4766c304c00f2a11b4cf4968e4c1d%2Fdata-recognition-quick-add-mobile-1.png)
Now, when you open your daily or weekly view in your calendar, youll see each of your tasks scheduled as separate events (aka your time blocks). You can extend, shorten, edit, and move your time blocks inside your calendar. Any changes you make in Google Calendar will automatically sync back to your Todoist (and vice versa).
![Google Calendar Todoist](https://proxy-prod.omnivore-image-cache.app/716x370,spaJTpolGkh7hI4yeOH7gPd_DWeYA2f2SJxBhqtzHoKE/https://res.cloudinary.com/imagist/image/fetch/q_auto,f_auto,c_scale,w_2624/https%3A%2F%2Fimages.ctfassets.net%2Fdm4oa8qtogq0%2F44d3NscP3Qdbez3mugjmin%2F6705fb7ea2e3f1d41e2b19166472be8a%2FGoogle_Calendar_Todoist.png)
---
Scheduling your days and weeks in advance can seem like a waste of precious time you could be using to actually get things done. But when you arent controlling your calendar, its easy to let distractions take over. By front-loading your decision-making on what to work on for the day or week, youll be saving time and mental energy when it comes to actually getting to work.
Give time blocking and task batching a try for a week and see how it feels to take back control over your time and attention.
Todoist Tip
If you have a Pro or Business plan, you can supercharge your time blocking with [task durations](https://todoist.com/help/articles/whats-new#reclaim-your-schedule-with-task-durations-aug-30). Simply:
* Select your Due Date, then Time, to set the start time and duration of your task. This forms your time block.
* You can also add a tasks duration via Todoists natural language recognition by typing “for” followed by the length of time you think the task will take. (e.g., “Team meeting today 4pm for 45min” or “Write first draft 9am for 2 hours 30 minutes”.)
* If youve connected your Todoist to a calendar app, the task duration will sync to your calendar automatically (and, on Google Calendar, vice versa with 2-way sync so you can update your tasks from your calendar).
Laura Scroggs
[Laura](https://laurascroggs.wordpress.com/) is a freelance writer, PhD candidate, and pug mom living in Minneapolis, MN.

View file

@ -0,0 +1,91 @@
---
id: 228a5a0a-eded-11ee-9840-8b8ae5e4b6f0
title: |
Let's Save the (Git) Trees
status: ARCHIVED
tags:
- read-later
- Newsletter
date_added: 2024-03-29 13:55:23
url_omnivore: |
https://omnivore.app/me/let-s-save-the-git-trees-18e8b23331a
url_original: |
https://omnivore.app/no_url?q=b542dc42-874d-446c-84a7-6c02bf819f29
---
# Let's Save the (Git) Trees
## Highlights
We start using something called **interactive rebase** on our feature branches. Its really just a way to clean up our commit history before we merge it into the main branch. This might change the history, but since its just on our own feature branches, it doesnt mess up anything for everyone else.
[source](https://omnivore.app/me/let-s-save-the-git-trees-18e8b23331a#0f14f09a-7965-46bd-bc32-d4eede7e821c)
---
Heres a quick guide on how to do it:
1. **Start on Your Feature Branch:**`git checkout -b my-feature`
2. **Grab the Latest Main Branch Updates Without Switching:**`git fetch origin main:main` (using `main:main` is a trick to fetch remote main changes to the local copy without switching back and forth)
3. **Interactive Rebase Time:**`git rebase main --interactive` \- This lets us pick and choose which commits to keep or squash, change the commits you want to `s` to make sure git squashes them into the parent commit, while keeping the changes.
4. **Safely Update the Remote Branch:**`git push --force-with-lease` \- This flag makes sure we dont accidentally overwrite anyone elses work.
5. **Prepare to Merge:**`git checkout main`
6. **Merge Without Extra Commits:**`git merge --ff-only -` \- Keeps our history straight by avoiding merge commits.
7. **Push it Up:**`git push` \- And were done!
[source](https://omnivore.app/me/let-s-save-the-git-trees-18e8b23331a#abe6a553-9d96-4f41-aba2-73ad21e3e86a)
---
## Original
Hi friends,
You know how companies use merge commits when working on projects?
Just go to one of your work projects and checkout the history of the main branch. It may look tidy (or not) but its bad for the environment (the real-world one 😉)
![](https://proxy-prod.omnivore-image-cache.app/736x0,sn6ke9p9cjtm0zRALZCJRPzmHZdOxUQdTT0Px1KRIPF8/https://embed.filekitcdn.com/e/9nyiJQ9d9Gw31fuefbZ9U7/4fPPnSnnwR4NjuHxwiBW7a/email)
Lots of merge commits
While thats pretty standard, it actually makes things messy.
Every time we do this, it stops us from keeping our commit history nice and clean all the way through from development to production.
Heres why thats a bit of a problem: if weve already **built and tested** a commit, **installing dependencies** in the process and **storing** all its details, theres really no need to go through all that again.
Its like doing the same work twice, which wastes time and resources, which translate to environmental effects that compound and another financial waste if thats not enough.
Plus, a cleaner git history makes it easier for us to figure out issues. It helps us use tools like `git bisect` much more effectively to find bugs. But well talk more about that another time.
So, whats the solution?
==We start using something called== **==interactive rebase==** ==on our feature branches. Its really just a way to clean up our commit history before we merge it into the main branch. This might change the history, but since its just on our own feature branches, it doesnt mess up anything for everyone else.==
![](https://proxy-prod.omnivore-image-cache.app/800x0,s741uz372LXRlTbpdIp7thFQOHpb2HEwyoZVuS7eHYHU/https://embed.filekitcdn.com/e/9nyiJQ9d9Gw31fuefbZ9U7/gPjnSdTmfGoapQrSBNky7e/email)
Rebasing 3 commits into one with interactive rebase
==Heres a quick guide on how to do it:==
1. **==Start on Your Feature Branch:==**`==git checkout -b== ==my====-feature==`
2. **==Grab the Latest Main Branch Updates Without Switching:==**`==git== ==fetch== ==origin== ==main====:main==` ==(using== `==main:====main==` ==is a trick to fetch remote main changes to the local copy without switching back and forth)==
3. **==Interactive Rebase Time:==**`==git rebase main== ==--interactive==` ==- This lets us pick and choose which commits to keep or squash, change the commits you want to== `==s==` ==to make sure git squashes them into the parent commit, while keeping the changes.==
4. **==Safely Update the Remote Branch:==**`==git push --====force====-====with====-lease==` ==- This flag makes sure we dont accidentally overwrite anyone elses work.==
5. **==Prepare to Merge:==**`==git checkout main==`
6. **==Merge Without Extra Commits:==**`==git== ==merge== ==--ff-====only== ==-==` ==- Keeps our history straight by avoiding merge commits.==
7. **==Push it Up:==**`==git== ==push==` ==- And were done!==
By making this part of what we do every day, our git trees will stay clean and easy to work with.
Hope you find this helpful! Always happy to hear your thoughts or answer any questions.
Enjoy your weekend!
_**Whenever youre ready, heres how I can help you**_
* [Follow me on X / Twitter](https://click.convertkit-mail2.com/qduo9vo0l2f7h7pwe7eulhnpxowkk/wnh2hghw84rpw8h7/aHR0cHM6Ly90d2l0dGVyLmNvbS9kZXZvcHN0b29sYm94) for the occasional tips and tricks on better workflows
* [Building a Second Brain with Neovim in Under 90 Minutes ](https://click.convertkit-mail2.com/qduo9vo0l2f7h7pwe7eulhnpxowkk/reh8hoh0n7qr0ka2/aHR0cHM6Ly9sZWFybi5vbWVyeHguY29tL2NvdXJzZXMvc2Vjb25kLWJyYWluLW5lb3ZpbQ==)My first course, discussing the basics of building a second brain using the PARA and CODE methods, combined with Obsidian and Neovim as an editor. Join 200+ enrolled students here
[![Built with ConvertKit](https://proxy-prod.omnivore-image-cache.app/190x36,suXlFZIrn56v5wQ2wJrgXmN-MetSTl33uHiVXRY6NE5Y/https://cdn.convertkit.com/assets/light-built-with-badge.png)](https://click.convertkit-mail2.com/qduo9vo0l2f7h7pwe7eulhnpxowkk/08hwh9hdqxm5dvul/aHR0cHM6Ly9jb252ZXJ0a2l0LmNvbS9mZWF0dXJlcy9lbWFpbC1tYXJrZXRpbmc%5FdXRtX2NhbXBhaWduPXBvd2VyZWRieSZ1dG1fY29udGVudD1lbWFpbCZ1dG1fbWVkaXVtPXJlZmVycmFsJnV0bV9zb3VyY2U9ZHluYW1pYw==)

View file

@ -0,0 +1,239 @@
---
id: 3f72e613-eb8e-446b-93b5-fdb275a781c0
title: |
Unix sockets, the basics in Rust - Emmanuel Bosquet
status: ARCHIVED
tags:
- read-later
date_added: 2024-04-18 20:15:21
url_omnivore: |
https://omnivore.app/me/unix-sockets-the-basics-in-rust-emmanuel-bosquet-18ef3b52a37
url_original: |
https://emmanuelbosquet.com/2022/whatsaunixsocket/
---
# Unix sockets, the basics in Rust - Emmanuel Bosquet
## Notes
This will be useful someday...
when I want to try to build my own TCP server or something like that
## Original
## Contents
* [What is a unix socket?](#what-is-a-unix-socket)
* [Create a socket, server side](#create-a-socket-server-side)
* [Waiting for connections, server side](#waiting-for-connections-server-side)
* [Connecting to the socket, client side](#connecting-to-the-socket-client-side)
* [Writing on the socket, client side](#writing-on-the-socket-client-side)
* [Reading from the socket, server side](#reading-from-the-socket-server-side)
* [Launch the whole thing!](#launch-the-whole-thing)
* [Respond to a message, server side](#respond-to-a-message-server-side)
* [Listen to responses, client side](#listen-to-responses-client-side)
* [Launch the whole thing, again!](#launch-the-whole-thing-again)
* [Browse the code](#browse-the-code)
I found myself wondering about unix sockets while working on [Sōzu](https://github.com/sozu-proxy/sozu), a reverse proxy written in Rust. A bunch of Sōzu issues led me to[dig into Sōzu channels](https://github.com/Keksoj/stream%5Fstuff%5Fon%5Fa%5Fsozu%5Fchannel), which themselves make use of[Metal I/O s implementation of unix sockets](https://tokio-rs.github.io/mio/doc/mio/net/struct.UnixListener.html).
Here are the questions, summed up:
* what are unix sockets?
* how can we create them in Rust?
* how do we use them to stream data?
So here we go.
It is _not_ a web socket like `127.0.0.1:8080`.
You may have heard that in unix,[everything is a file](https://www.youtube.com/watch?v=dDwXnB6XeiA). Unix sockets seem to be a good example of this principle. They are empty files of sorts, only there to be written to, and read from.
Sockets are a core feature of unix. In fact, if you type
```ebnf
man unix
```
in your terminal, you should land on an ancient man page:
| 1 2 3 4 5 | UNIX(7) Linux Programmer's Manual UNIX(7) NAME unix - sockets for local interprocess communication |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
that explains how sockets are declared in C in the kernel, how they are created with the `AF_UNIX` system call, and many more thing that go far beyond my limited understanding.
Creating a socket is not as easy as creating just any file, using, say, `touch`. They are tools available in the command line, but most of the time, sockets are created and used by processes, not by users. Looking up how to create one will land you on a tutorial in C, or in python. So lets see how to do it in Rust.
The Rust standard library has a [std::os::unix module](https://doc.rust-lang.org/std/os/unix/index.html)to interact with unix processes, unix files, and so on. Within it, we want to look at the `net` module, named that way because unix sockets are used to do networking between processes.
The `std::os::unix::net` module contains, among other things:
* [UnixListener](https://doc.rust-lang.org/std/os/unix/net/struct.UnixListener.html)
* [UnixStream](https://doc.rust-lang.org/std/os/unix/net/struct.UnixStream.html)
Both those entities are unsafe wrappers of the `libc` library to perform the very same unix system calls you would write in C. They both wrap a unix file descriptor, but they are distinct in order to separate higher-level concerns.
* `UnixListener` is used to create sockets, (`libc::bind()` and `libc::listen()`)
* `UnixStream` is there to connect to a socket (`libc::connect()`), to read from it and write on it.
Lets use those.[Install Rust and Cargo](https://www.rust-lang.org/tools/install),[Learn the basics of Rust](https://doc.rust-lang.org/book/), and then do:
```haxe
cargo new unix_sockets
```
Add this to `Cargo.toml` (makes error propagation easier):
| 1 2 | \# Cargo.toml anyhow \= "^1.0.42" |
| --- | --------------------------------- |
In the `src` directory, create a `bin` directory, in which you will create a `server.rs` file.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | // src/bin/server.rs use std::os::unix::net::{UnixListener, UnixStream}; use anyhow::Context; fn main() -> anyhow::Result<()> { let socket\_path = "mysocket"; let unix\_listener = UnixListener::bind(socket\_path).context("Could not create the unix socket")?; Ok(()) } |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Then do
```routeros
cargo run --bin server
```
Which should run smoothly, and then do `ls -l` in your directory, you should have a line like this:
```routeros
srwxr-xr-x 1 emmanuel users 0 Jan 7 13:08 mysocket
```
The `s` stands for _socket_. Congratulations!
Do one more `cargo run --bin server` and you have a neat, self-explanatory OS error:
| 1 2 3 4 | Error: Could not create the unix socket Caused by: Address already in use (os error 98) |
| ------- | ------------------------------------------------------------------------------------------- |
I guess well have to destroy it and recreate it each time.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // src/bin/server.rs use std::os::unix::net::{UnixListener, UnixStream}; use anyhow::Context; fn main() -> anyhow::Result<()> { let socket\_path = "mysocket"; // copy-paste this and don't think about it anymore // it will be hidden from there on if std::fs::metadata(socket\_path).is\_ok() { println!("A socket is already present. Deleting..."); std::fs::remove\_file(socket\_path).with\_context(\|| { format!("could not delete previous socket at {:?}", socket\_path) })?; } let unix\_listener = UnixListener::bind(socket\_path).context("Could not create the unix socket")?; Ok(()) } |
| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
The `UnixListener` struct has an `accept()` method that waits for other processes to connect to the socket. Once a connections comes, `accept()` returns a tuple containing a `UnixStream` and a `SocketAddr`.
As mentioned above, `UnixStream` implements `Read` and `Write`. We will handle this stream to:
* read what another process will send through the socket
* write responses on the socket
Add the loop and the `handle_stream` function to the server code:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // src/bin/server.rs use std::os::unix::net::{UnixListener, UnixStream}; fn main() -> anyhow::Result<()> { let socket\_path = "mysocket"; let unix\_listener = UnixListener::bind(socket\_path).context("Could not create the unix socket")?; // put the server logic in a loop to accept several connections loop { let (mut unix\_stream, socket\_address) = unix\_listener .accept() .context("Failed at accepting a connection on the unix listener")?; handle\_stream(unix\_stream)?; } Ok(()) } fn handle\_stream(mut stream: UnixStream) -> anyhow::Result<()> { // to be filled Ok(()) } |
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Remove the existing socket and run the code:
```routeros
cargo run --bin server
```
it should hang. Perfect! The server is waiting for connections!
The client process wants to connect to an existing socket, read and write from it.
Next to `server.rs`, create the `client.rs` file. The client will merely consist of a `UnixStream`:
| 1 2 3 4 5 6 7 8 9 10 11 12 | // src/bin/client.rs use std::os::unix::net::{UnixListener, UnixStream}; use anyhow::Context; fn main() -> anyhow::Result<()> { let socket\_path = "mysocket"; let mut unix\_stream = UnixStream::connect(socket\_path).context("Could not create stream")?; Ok(()) |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
We need to import the `Read` and `Write` traits.
| 1 2 | // src/bin/client.rs use std::io::{Read, Write}; |
| --- | ------------------------------------------------ |
And now we can write onto the stream. Below the `unix_stream` declaration, add the write logic:
| 1 2 3 | unix\_stream .write(b"Hello?") // we write bytes, &\[u8\] .context("Failed at writing onto the unix stream")?; |
| ----- | ---------------------------------------------------------------------------------------------------------------------------- |
Be sure to import `Read` and `Write` in `server.rs`:
| 1 2 | // src/bin/server.rs use std::io::{Read, Write}; |
| --- | ------------------------------------------------ |
Now lets fill the `handle_stream` function with ordinary read logic:
| 1 2 3 4 5 6 7 8 9 10 | // src/bin/server.rs fn handle\_stream(mut unix\_stream: UnixStream) -> anyhow::Result<()> { let mut message = String::new(); unix\_stream .read\_to\_string(&mut message) .context("Failed at reading the unix stream")?; println!("{}", message); Ok(()) } |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Make sure you have the server running in a terminal:
```routeros
cargo run --bin server
```
And in a separate terminal, run the client:
```routeros
cargo run --bin client
```
If all is well, the hello message should display on the server side.
Lets answer something every time the server receives anything.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // src/bin/server.rs fn handle\_stream(mut unix\_stream: UnixStream) -> anyhow::Result<()> { let mut message = String::new(); unix\_stream .read\_to\_string(&mut message) .context("Failed at reading the unix stream")?; println!("We received this message: {}\\nReplying...", message); unix\_stream .write(b"I hear you!") .context("Failed at writing onto the unix stream")?; Ok(()) } |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Introducing the same reading logic we used on the server **will not work**. Why? After writing on a stream, we need to shut down the writing, if we want to read from it.
Lets segregate the write and read logic into distinct functions. Oh, and we pass mutable references (`&mut`) of the unix stream to the function, because… Rust. Dont worry about it.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // src/bin/client.rs use std::io::{Read, Write}; use std::os::unix::net::{UnixListener, UnixStream}; use anyhow::Context; fn main() -> anyhow::Result<()> { let socket\_path = "mysocket"; let mut unix\_stream = UnixStream::connect(socket\_path).context("Could not create stream")?; write\_request\_and\_shutdown(&mut unix\_stream)?; read\_from\_stream(&mut unix\_stream)?; Ok(()) } |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
The `shutdown()` method takes a `Shutdown` enum we would otherwise use on TCP streams. Write below the main function:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | fn write\_request\_and\_shutdown(unix\_stream: &mut UnixStream) -> anyhow::Result<()> { unix\_stream .write(b"Hello?") .context("Failed at writing onto the unix stream")?; println!("We sent a request"); println!("Shutting down writing on the stream, waiting for response..."); unix\_stream .shutdown(std::net::Shutdown::Write) .context("Could not shutdown writing on the stream")?; Ok(()) } |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
The stream is now clean to be read from.
| 1 2 3 4 5 6 7 8 9 | fn read\_from\_stream(unix\_stream: &mut UnixStream) -> anyhow::Result<()> { let mut response = String::new(); unix\_stream .read\_to\_string(&mut response) .context("Failed at reading the unix stream")?; println!("We received this response: {}", response); Ok(()) } |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Have the server running in a terminal:
```routeros
cargo run --bin server
```
And in a separate terminal, run the client:
```routeros
cargo run --bin client
```
If all is well,
* the hello message should display on the server side
* the “I hear you” response should display on the client side
You can run the client as many times as you want, since the server runs in a loop.
This tutorial comes with a [github repository](https://github.com/Keksoj/unix%5Fsockets%5Fbasics)that contains the above code.
Feel free to write an issue for any comment, criticism, or complaint you may have. Fork and do pull requests as you please.
This blog post is a sum-up of what I learned trying to understand unix sockets while working on Sōzu. A more elaborate version of the code is available[in this other repo](https://github.com/Keksoj/unix%5Fsocket%5Fbased%5Fserver%5Fclient), with additional features:
* a `UnixListener`\-wrapping library with a glorious `SocketBuilder` helper (permissions! blocking/nonblocking!)
* a `Message` module with serializable `Request` and `Response` structs. The Response has a status that is either `Ok`, `Error` or `Processing`
* a client loop that continues reading the stream as long as responses come with a `Processing` status, to stops only at `Ok` or `Error`
All this happened thanks to my employer, [Clever Cloud](https://clever-cloud.com/), who allows me to learn my job in the best possible conditions. Much gratitude.

View file

@ -0,0 +1,50 @@
---
id: fafb2eae-5872-4b07-8e3e-a215337ff70f
title: |
Bullet Journal in 5 Minutes a Day (for busy people)
status: ARCHIVED
tags:
- read-later
date_added: 2024-05-10 23:57:58
url_omnivore: |
https://omnivore.app/me/https-www-youtube-com-watch-v-t-op-4-hr-l-sc-4-18f65cce78b
url_original: |
https://www.youtube.com/watch?v=T_Op4hrLSc4
---
# Bullet Journal in 5 Minutes a Day (for Busy people)
## Notes
KISS
In the morning:
- Write down what needs to be done in the day in a simple bullet list, ~5 actions
- Check previous day log
Daily logging:
- When switching contexts, write down what you did and what are you gonna do next
- When the action is completed, cross it off
- Single sentences
- Only write down what's noteworthy
Types of bullets:
- ` • `: actions
- ` - `: Notes, ideas & thoughts
- ` = `: Moods, mental & physical feelings
- ` ˚ `: Events
Reflection:
- Update the bullets
- Decided what to do with the uncompleted actions
- Write down final thoughts
## Original
[Bullet Journal in 5 Minutes a Day (for busy people)](https://www.youtube.com/watch?v=T%5FOp4hrLSc4)
By [Bullet Journal](https://www.youtube.com/@bulletjournal)

View file

@ -0,0 +1,40 @@
---
id: e121c5da-aeed-412d-9d37-97c6fb5009a1
title: |
Simbología de diagrama de flujo | Lucidchart
status: ARCHIVED
tags:
- read-later
date_added: 2024-05-13 09:28:34
url_omnivore: |
https://omnivore.app/me/simbologia-de-diagrama-de-flujo-lucidchart-18f72240313
url_original: |
https://www.lucidchart.com/pages/es/simbolos-comunes-de-los-diagramas-de-flujo
---
# Simbología de diagrama de flujo | Lucidchart
## Notes
keep
## Original
Muchos de estos símbolos de diagramas de flujo adicionales se utilizan para trazar un diagrama de flujo de proceso de negocios para aplicaciones, flujo de usuarios, procesamiento de datos, etc.
| Símbolo de diagrama de flujo | Nombre | Descripción |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![Símbolo de base de datos](https://proxy-prod.omnivore-image-cache.app/0x0,sDYnAKXUJzR7XAJo3ClK51kmmOHLnVLsPeVACb_Wtt24/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/stored_data_symbol-60x60.PNG) | Símbolo de base de datos | Representa los datos alojados en un servicio de almacenamiento que probablemente permitirá buscar y filtrar por usuarios. |
| ![Símbolo de cinta de papel](https://proxy-prod.omnivore-image-cache.app/0x0,sWJCvkjPULSkr7DjRHHwiG2-TQA_vjv_WAgO3ToTmuQg/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/paper-tape-flowchart-symbol.png) | Símbolo de cinta de papel | Símbolo obsoleto rara vez empleado en las prácticas o los flujos de proceso modernos. No obstante, se podría usar este símbolo cuando se trazan procesos o métodos de ingreso en computadoras y máquinas CNC mucho más antiguas. |
| ![Símbolo de suma o unión](https://proxy-prod.omnivore-image-cache.app/0x0,sekVzVKPqnVmmRz4Pa0qo0h9STUexy1R7EmXq13hdcYI/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/summing_junction_symbol-60x37.PNG) | Símbolo de suma o unión | Suma las entradas de varias rutas que convergen. |
| ![Símbolo de proceso predefinido](https://proxy-prod.omnivore-image-cache.app/0x0,sdzikKiL6rI6sRORMdrc7VfP6ah4GjPuMLNOPLe_wSRY/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/predefined_process_symbol-60x45.PNG) | Símbolo de proceso predefinido | Indica un proceso u operación complicado que es bien conocido o definido en otro lado. |
| ![Símbolo de almacenamiento interno](https://proxy-prod.omnivore-image-cache.app/0x0,s5M4qDJMHhUJJtU5_-qWCxLtsju6t8brZ5B8sMNboGXo/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/internal-storage-flowchart-symbol.png) | Símbolo de almacenamiento interno | Empleada comúnmente para trazar los diseños de software, esta figura indica los datos almacenados en la memoria interna. |
| ![Símbolo de entrada manual](https://proxy-prod.omnivore-image-cache.app/0x0,s9tEBbe54JbnFZxYZq_kklRZ1IeB3L3ihQPgTdY12q5M/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/manual_input_symbol-60x45.PNG) | Símbolo de entrada manual | Representa la entrada manual de datos en un campo o paso del proceso, por lo general a través del teclado o de un dispositivo. Por ejemplo, en el proceso de inicio de sesión cuando se le pide al usuario que ingrese los datos manualmente. |
| ![símbolo de operación manual](https://proxy-prod.omnivore-image-cache.app/0x0,syz7IKdBGnivkapcOxbNr3z_YF7sgY-0jlZKT74-BMEM/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/manual_operation_symbol-60x46.PNG) | Símbolo de operación manual | Indica un paso que se debe realizar de forma manual, no automáticamente. |
| ![Símbolo de fusión](https://proxy-prod.omnivore-image-cache.app/0x0,sXnpD4b3_co3HXh2ggFH6B1DpyYxFkLX9IxPvyrx0_uc/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/merge_symbol-60x46.PNG) | Símbolo de fusión | Combina múltiples caminos en uno solo. |
| ![Símbolo de documentos múltiples](https://proxy-prod.omnivore-image-cache.app/0x0,sntceaLsb63H4VLPZrM-CIqIN7t_hiVhyRi-3mskTzxI/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/multiple_documents_symbol-60x46.PNG) | Símbolo de documentos múltiples | Representa documentos o informes múltiples. |
| ![Símbolo de preparación](https://proxy-prod.omnivore-image-cache.app/0x0,s-JBMotqmPFPN-5r6Nbb3eh0AZgY10UTyOZPZFQPiTZo/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/flowchart-symbols-meaning-explained/preparation_symbol-60x46.PNG) | Símbolo de preparación | Diferencia entre los pasos que preparan para el trabajo y los pasos que realmente hacen el trabajo. Ayuda a introducir la configuración en otro paso dentro del mismo proceso. |
| ![Símbolo de datos almacenados](https://proxy-prod.omnivore-image-cache.app/0x0,sKqObrAQ7W--g-rGmGOv3-ji5vPcwyi4Y2ioc_NJk96k/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/stored-data-symbol.png) | Símbolo de datos almacenados | Esta figura, también conocida como símbolo de "almacenamiento de datos", representa dónde se almacenan los datos en un proceso. |
| ![Símbolo de retraso](https://proxy-prod.omnivore-image-cache.app/0x0,sB3YWNOWsiUZANQ61nxtgfkCztz2Ww2hm02W0ylayZrQ/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/delay-flowchart-symbol.png) | Símbolo de retraso | Representa un segmento de retraso en un proceso. Puede ser útil para indicar la duración exacta del retraso dentro de la figura. |
| ![Símbolo "or"](https://proxy-prod.omnivore-image-cache.app/0x0,swpjMwPe57mlnp6tiC7X-5eO5exLAyQo0HU09-t_t75w/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/or-flowchart-symbol.png) | Símbolo "or" | Tal como se describe, esta figura indica que el flujo del proceso de negocio continúa en dos o más caminos. |
| ![Símbolo de pantalla](https://proxy-prod.omnivore-image-cache.app/0x0,sClQjqJF3phAvd5KrnGbRgs25EOtE1dxR37gvz_XIzPo/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/display-flowchart-symbol.png) | Símbolo de pantalla | Esta figura es útil para indicar dónde se mostrará la información dentro de un flujo de proceso. |
| ![símbolo de disco rígido](https://proxy-prod.omnivore-image-cache.app/0x0,sFr4yPuyGTUzW-gIZOay1rylVsAKq-WgIhh-pSHkhPwg/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/examples/hard-disk-flowchart-symbol.png) | Símbolo de disco rígido | Indica dónde están almacenados los datos dentro del disco rígido, también conocido como almacenamiento de acceso directo. |

View file

@ -0,0 +1,267 @@
---
id: 52e165c4-8ef3-4036-a5ea-6d8cebd148a4
title: |
¿Qué es un diagrama de flujo? | Lucidchart
status: ARCHIVED
tags:
- read-later
date_added: 2024-05-13 09:27:16
url_omnivore: |
https://omnivore.app/me/que-es-un-diagrama-de-flujo-lucidchart-18f7222d3b7
url_original: |
https://www.lucidchart.com/pages/es/que-es-un-diagrama-de-flujo
---
# ¿Qué es un diagrama de flujo? | Lucidchart
## Highlights
Un diagrama de flujo es un diagrama que describe un proceso, sistema o algoritmo informático.
[source](https://omnivore.app/me/que-es-un-diagrama-de-flujo-lucidchart-18f7222d3b7#811b888b-84ca-4575-87b9-7b329885bdb4)
---
Puedes usar un diagrama de flujo para explicar detalladamente la lógica detrás de un programa antes de empezar a codificar el proceso automatizado.
[source](https://omnivore.app/me/que-es-un-diagrama-de-flujo-lucidchart-18f7222d3b7#a732a8de-c335-4f4b-b107-e0804c35d826)
---
## Cómo planificar y dibujar un diagrama de flujo básico
1. #### Define tu propósito y alcance.
. ¿Qué deseas lograr? ¿Estás considerando las cosas correctas con un punto inicial y final apropiados para alcanzar ese propósito? Realiza una investigación lo suficientemente detallada, pero lo suficientemente simple a la hora de crear tus diagramas para comunicarte con tu audiencia.
2. #### Identifica las tareas en orden cronológico.
Esto puede involucrar las conversaciones con los participantes, la observación de un proceso o la revisión de cualquier documentación existente. Puedes escribir los pasos en forma de notas o comenzar con un diagrama en versión borrador.
3. #### Organízalos por tipo y figura correspondiente,
como procesos, decisiones, datos, entradas o salidas.
4. #### Crea tu diagrama,
ya sea dibujándolo a mano o usando un programa como Lucidchart.
5. #### Confirma tu diagrama de flujo,
verificando todos los pasos con las personas que participan en el proceso. Observa el proceso para asegurarte de no dejar de lado nada que sea importante para tu propósito.
[source](https://omnivore.app/me/que-es-un-diagrama-de-flujo-lucidchart-18f7222d3b7#10b651cf-aaa2-46dc-9261-12b625bfd701)
---
## Original
[![Go to Lucidchart homepage](https://proxy-prod.omnivore-image-cache.app/0x0,s7j_cAWbKS99TL7huk4tqFyliMLjGwGHPG7mSHVkXXls/https://cdn-cashy-static-assets.lucidchart.com/lucid/logos/lucidchart.svg)](https://www.lucidchart.com/pages/es)
![](https://proxy-prod.omnivore-image-cache.app/0x0,sIvTTJnMTWP_8pdmsgPpp86f953LNyu1qmumkWNcpQrc/https://corporate-assets.lucid.co/chart/d7b7309e-a57b-4bc6-ae54-ae3ec75cfa7c.svg)
## ¿Cuáles son tus necesidades de creación de diagramas de flujo?
[No tengo experiencia en diagramas de flujo y quiero aprender más.](#discoveryTop)
---
## Índice
* [Más recomendaciones para los diagramas de flujo](#section%5F0)
* [¿Qué es un diagrama de flujo?](#section%5F1)
* [Historia](#section%5F2)
* [Símbolos de diagramas de flujo](#section%5F3)
* [Diagramas de flujo para algoritmos/programación informática ](#section%5F4)
* [Cómo se usan los diagramas de flujo en muchos otros campos](#section%5F5)
* [Tipos de diagramas de flujo](#section%5F6)
* [Cómo planificar y dibujar un diagrama de flujo básico ](#section%5F7)
Esta guía completa brinda todo lo que debes saber sobre los diagramas de flujo, incluidas definiciones, historia, casos de uso, símbolos, recomendaciones y más.
10 minutos de lectura
¿Deseas crear un diagrama de flujo por tu cuenta? Prueba Lucidchart. Es rápido, sencillo y totalmente gratis.
## Más recomendaciones para los diagramas de flujo
* Ten a tu audiencia en mente y orienta los detalles de tu diagrama hacia ella. La comunicación clara es un objetivo fundamental en los diagramas de flujo.
* Si el proceso que estás representando involucra distintos equipos o departamentos, considera usar un diagrama de carriles para definir claramente las responsabilidades y transferencias.
* Usa conectores dentro o fuera de la página para "editar" tu diagrama y lograr que fluya de forma lógica. Esto te puede permitir separar el diagrama en distintas páginas y que continúe siendo fluido.
==Un diagrama de flujo es un diagrama que describe un proceso, sistema o algoritmo informático.== Se usan ampliamente en numerosos campos para documentar, estudiar, planificar, mejorar y comunicar procesos que suelen ser complejos en diagramas claros y fáciles de comprender. Los diagramas de flujo emplean rectángulos, óvalos, diamantes y otras numerosas figuras para definir el tipo de paso, junto con flechas conectoras que establecen el flujo y la secuencia. Pueden variar desde diagramas simples y dibujados a mano hasta diagramas exhaustivos creados por computadora que describen múltiples pasos y rutas. Si tomamos en cuenta todas las diversas figuras de los diagramas de flujo, son uno de los diagramas más comunes del mundo, usados por personas con y sin conocimiento técnico en una variedad de campos. Los diagramas de flujo a veces se denominan con nombres más especializados, como "diagrama de flujo de procesos", "mapa de procesos", "diagrama de flujo funcional", "mapa de procesos de negocios", "notación y modelado de procesos de negocio (BPMN)" o "diagrama de flujo de procesos (PFD)". Están relacionados con otros diagramas populares, como los diagramas de [flujo de datos](https://www.lucidchart.com/pages/es/diagrama-de-flujo-de-datos) (DFD) y los diagramas de actividad de lenguaje unificado de modelado (UML).
![diagrama de flujo de algoritmo](https://proxy-prod.omnivore-image-cache.app/0x0,s6asco7-c0he44IseGjhWlTPyCVPZ4oabpsndoR3M3Uo/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/seo/flowchart/discovery/algorithm-flowchart.svg)
![Diagrama de flujo de procesos de ventas](https://proxy-prod.omnivore-image-cache.app/0x0,sQbLL0c2tw8DJzjJ2hw5GWVwDYICjcmUqUfTV4bIUz3s/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/seo/flowchart/discovery/sales-process-flowchart.svg)
## Historia
El uso de los diagramas de flujo para documentar procesos de negocios se inició entre las décadas de 1920 y 1930\. En 1921, los ingenieros industriales Frank y Lillian Gilbreth presentaron el "diagrama de flujo de procesos" en la Sociedad Americana de Ingenieros Mecánicos (ASME American Society of Mechanical Engineers). A principios de la década de 1930, el ingeniero industrial Allan H. Morgensen empleó las herramientas de Gilbreth para presentar conferencias sobre cómo aumentar la eficiencia en el trabajo a personas de negocios en su empresa. En la década de 1940, dos estudiantes de Morgensen, Art Spinanger y Ben S. Graham, difundieron los métodos más ampliamente. Spinanger introdujo los métodos de simplificación del trabajo en Procter & Gamble. Graham, director de Standard Register Industrial, adaptó los diagramas de flujo de procesos al procesamiento de información. En 1947, ASME adoptó un sistema de símbolos para los diagramas de flujo de procesos derivado del trabajo original de Gilbreth.
Además, a fines de la década de 1940, Herman Goldstine y John Van Neumann usaron diagramas de flujo para desarrollar programas informáticos. Pronto la creación de diagramas se volvió cada vez más popular para los programas informáticos y algoritmos de todo tipo. Los diagramas de flujo se continúan usando para la programación hoy en día. Sin embargo, el pseudocódigo, una combinación de palabras y lenguaje de codificación pensado para lectura humana, a menudo se usa para representar niveles más específicos de detalle y para tener una versión más cercana al producto final.
En Japón, Kaoru Ishikawa (1915-1989), una personalidad clave en las iniciativas de calidad en manufactura, afirmó que los diagramas de flujo eran una de las herramientas fundamentales en el área de control de calidad, junto a otras complementarias, como el histograma, la ficha de control y el diagrama de causa-efecto, también llamado Diagrama de Ishikawa.
## Símbolos de diagramas de flujo
¿Deseas crear un diagrama de flujo por tu cuenta? Prueba Lucidchart. Es rápido, sencillo y totalmente gratis.
[Genera un diagrama de flujo](https://lucid.app/es/pricing/lucidchart?anonId=0.e632479b18f721b8479&sessionDate=2024-05-13T13%3A19%3A17.116Z&sessionId=0.48b7148618f721b847c)
## Diagramas de flujo para algoritmos/programación informática
Como una representación visual del flujo de datos, los diagramas de flujo son útiles para escribir un programa o algoritmo y explicárselo a otros o colaborar con otros en el mismo. ==Puedes usar un diagrama de flujo para explicar detalladamente la lógica detrás de un programa antes de empezar a codificar el proceso automatizado.== Puede ayudar a organizar una perspectiva general y ofrecer una guía cuando llega el momento de codificar. Más específicamente, los diagramas de flujo pueden:
* Demostrar cómo el código está organizado.
* Visualizar la ejecución de un código dentro de un programa.
* Mostrar la estructura de un sitio web o aplicación.
* Comprender cómo los usuarios navegan por un sitio web o programa.
A menudo, los programadores pueden escribir un pseudocódigo, una combinación de lenguaje natural y lenguaje informático que puede ser leído por personas. Esto puede permitir más detalle que el diagrama de flujo y servir como reemplazo del diagrama de flujo o como el próximo paso del código mismo.
Los diagramas relacionados que se emplean en el software informático incluyen:
* Lenguaje unificado de modelado (UML): este es el lenguaje de propósito general usado en la ingeniería de software para el modelado.
* Diagramas Nassi-Shneiderman (NSD): usados para la programación informática estructurada. Llevan el nombre de sus creadores: Isaac Nassi y Ben Shneiderman, quienes los desarrollaron en 1972 en la Universidad Estatal de Nueva York en Stony Brook. También se denominan "estructogramas".
* Diagramas DRAKON: DRAKON es un lenguaje de programación visual de algoritmos empleado para crear diagramas de flujo.
![diagrama de flujo de base de datos](https://proxy-prod.omnivore-image-cache.app/0x0,sHnejHiynP9mk0hn1T_8tXMW6WHfTBYYtW7nZp1LyILM/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/seo/flowchart/discovery/database-flowchart.svg)
## Cómo se usan los diagramas de flujo en muchos otros campos
Más allá de la programación informática, los diagramas de flujo pueden tener muchos usos en diversos campos.
#### En cualquier campo pueden:
* Documentar y analizar un proceso.
* Estandarizar un proceso para obtener eficiencia y calidad.
* Comunicar un proceso para capacitar a otros sectores de la organización o lograr el entendimiento de su parte.
* Identificar cuellos de botellas, redundancias y pasos innecesarios en un proceso y mejorarlo.
#### Educación:
* Planificar los requisitos académicos y las tareas del curso.
* Crear una presentación oral o un plan de clase.
* Organizar un proyecto grupal o individual.
* Mostrar un proceso civil o legal, como el registro de votantes.
* Planificar y estructurar la escritura creativa, como poesía o poesía lírica.
* Demostrar el desarrollo de un personaje en la literatura y el cine.
* Representar el flujo de algoritmos o acertijos lógicos.
* Comprender un proceso científico, como el ciclo de Krebs.
* Dibujar un proceso anatómico, como la digestión.
* Trazar síntomas y tratamientos para enfermedades o trastornos.
* Comunicar hipótesis y teorías, como la pirámide de Maslow o jerarquía de las necesidades humanas.
#### Ventas y marketing:
* Trazar el flujo de una encuesta.
* Dibujar un proceso de ventas.
* Planificar estrategias de investigación.
* Mostrar flujos de registro.
* Difundir políticas de comunicación, como un plan de R.R. P.P. de emergencia.
![diagrama de flujo de registro de usuarios](https://proxy-prod.omnivore-image-cache.app/0x0,somtyZz8kZwYyXHcHozHWbHP3Yxy5NWykChX-3R6Gj4k/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/seo/flowchart/discovery/user-flowchart.svg)
#### Negocios:
* Comprender procesos de pedidos y compras.
* Representar la rutina diaria o las tareas de un empleado.
* Comprender las rutas que toman los usuarios en un sitio web o en una tienda.
* Desarrollar un plan de negocio o un plan de desarrollo de un producto.
* Documentar un proceso en preparación para una auditoría, incluido el cumplimiento normativo, por ejemplo, en virtud de la Ley Sarbanes-Oxley.
* Documentar un proceso en preparación para una venta o consolidación.
![diagrama de flujo de negocios](https://proxy-prod.omnivore-image-cache.app/0x0,sQjzfoMCWEldD8ZUzl7-BaHppNCRWLxDuTfe3_BD7TcE/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/seo/flowchart/discovery/business-flowchart.svg)
#### Manufactura:
* Indicar la composición química o física de un producto.
* Ilustrar el proceso de manufactura de principio a fin.
* Descubrir y resolver ineficiencias en un proceso de manufactura o adquisición.
#### Ingeniería:
* Representar flujos de proceso o de sistema.
* Diseñar y actualizar procesos químicos y de planta.
* Evaluar el ciclo de vida de una estructura.
* Diagramar un flujo de ingeniería inversa.
* Demostrar la fase de prototipo y diseño de una estructura o producto nuevos.
## Tipos de diagramas de flujo
Distintos autores describen numerosos tipos de diagramas de flujo en diferentes términos. Estas personas incluyen a expertos publicados, como Alan B. Sterneckert, Andrew Veronis, Marilyn Bohl y Mark A. Fryman.
Sterneckert, en su libro escrito en 2003 _Critical Incident Management_, mencionó cuatro tipos de diagramas de flujo populares, enmarcados en el concepto de controles de flujos en vez del flujo en sí mismo:
* #### Diagramas de flujo de documentos:
Estos "tienen el propósito de mostrar los controles existentes en el flujo de documentos a través de los componentes de un sistema. (...) El diagrama se lee de izquierda a derecha y detalla el flujo de documentos a través de numerosas unidades de negocio".
* #### Diagramas de flujo de datos:
Estos indican "los controles que rigen los flujos de datos en un sistema. (...) Los diagramas de flujo de datos se usan principalmente para mostrar los canales donde se transmiten los datos a través del sistema en lugar de cómo se controla el flujo".
* #### Diagramas de flujo de sistemas:
Estos "indican el flujo de datos que pasa hacia los componentes principales de un sistema, o a través de ellos, tales como entrada de datos, programas, medios de almacenamiento, procesadores y redes de comunicación".
* #### Diagramas de flujo de programas:
Estos muestran "los controles ubicados internamente en un programa dentro de un sistema".
Veronis , en su libro escrito en 1978, _Microprocessors: Design and Applications_, describió tres tipos de diagramas de flujo en función del alcance y nivel de detalle:
* #### Diagrama de flujo de sistema:
identifica los dispositivos que se emplearán.
* #### Diagrama de flujo general:
vista general.
* #### Diagrama de flujo detallado:
más detalles.
Bohl, en su libro escrito en 1978 llamado A Guide for Programmers, enumera solo dos:
* #### Diagrama de flujo de sistemas.
* #### Diagrama de flujo de programas.
But Fryman, en su libro escrito en 2001 titulado _Quality and Process Improvement_, distinguió los tipos de muchas maneras, más desde una perspectiva orientada a los negocios que a la informática:
* #### Diagrama de flujo de decisiones.
* #### Diagrama de flujo lógico.
* #### Diagrama de flujo de sistemas.
* #### Diagrama de flujo de productos.
* #### Diagrama de flujo de procesos.
Otros tipos de diagramas de flujo definidos por otros incluyen:
* #### Diagrama de carriles, también conocido como "diagrama de flujo de carriles":
detalla los roles de cada participante en procesos que se realizan entre equipos.
* #### Diagrama de flujo de trabajo:
documenta flujos de trabajo, a menudo involucra tareas, documentos e información en las oficinas.
* #### Diagrama de cadena de procesos impulsada por eventos (EPC):
documenta o planifica un proceso de negocio.
* #### Diagrama de flujo de lenguaje de descripción y especificación (SDL):
realiza un lluvia de ideas sobre los algoritmos informáticos mediante tres componentes básicos: proceso, bloqueo y definición de sistema.
![carril](https://proxy-prod.omnivore-image-cache.app/0x0,sD8IS9nWnvOzFongZbBCTYK8aIPBDx4hariuuZYg_itM/https://d2slcw3kip6qmk.cloudfront.net/marketing/pages/chart/seo/flowchart/discovery/swim-lane-flowchart.svg)
Estos diagramas relacionados también se piensan, a veces, como tipos de diagramas de flujo:
* #### Diagrama de flujo de datos (DFD):
traza el flujo de información de cualquier sistema o proceso.
* #### Diagrama de flujo de procesos (PFD), también conocido como "gráfico de flujo de procesos":
ilustra las relaciones entre los principales componentes de una planta industrial.
* #### Modelo y notación de procesos de negocio (BPMN 2.0):
modela los pasos de un proceso de negocio planificado.
## ==Cómo planificar y dibujar un diagrama de flujo básico==
1. #### ==Define tu propósito y alcance.==
==. ¿Qué deseas lograr? ¿Estás considerando las cosas correctas con un punto inicial y final apropiados para alcanzar ese propósito? Realiza una investigación lo suficientemente detallada, pero lo suficientemente simple a la hora de crear tus diagramas para comunicarte con tu audiencia.==
2. #### ==Identifica las tareas en orden cronológico.==
==Esto puede involucrar las conversaciones con los participantes, la observación de un proceso o la revisión de cualquier documentación existente. Puedes escribir los pasos en forma de notas o comenzar con un diagrama en versión borrador.==
3. #### ==Organízalos por tipo y figura correspondiente,==
==como procesos, decisiones, datos, entradas o salidas.==
4. #### ==Crea tu diagrama,==
==ya sea dibujándolo a mano o usando un programa como Lucidchart.==
5. #### ==Confirma tu diagrama de flujo,==
==verificando todos los pasos con las personas que participan en el proceso. Observa el proceso para asegurarte de no dejar de lado nada que sea importante para tu propósito.==
---
## Recursos útiles
* [Plantilla de diagrama de flujo para Word](https://www.lucidchart.com/pages/es/plantilla-de-diagrama-de-flujo-para-word)
* [Cómo hacer un diagrama de flujo en Excel](https://www.lucidchart.com/pages/es/como-hacer-un-diagrama-de-flujo-en-excel)
* [Simbología de diagrama de flujo](https://www.lucidchart.com/pages/es/simbolos-comunes-de-los-diagramas-de-flujo)
* [Cómo hacer un diagrama de flujo](https://www.lucidchart.com/pages/es/como-hacer-un-diagrama-de-flujo)
* [Cómo crear un diagrama de flujo en PowerPoint](https://www.lucidchart.com/pages/es/hacer-un-diagrama-de-flujo-en-powerpoint)
* [Cómo crear un diagrama de flujo en Word](https://www.lucidchart.com/pages/es/como-hacer-un-diagrama-de-flujo-en-word)
Crear diagramas de flujo en Lucidchart es fácil e intuitivo. Simplemente debes arrastrar las figuras en el lienzo y dibujar las líneas que las conectan. Si no sabes bien por dónde empezar, echa un vistazo a nuestro tutorial sobre recomendaciones acerca de [cómo dibujar un diagrama de flujo](https://www.lucidchart.com/pages/es/como-hacer-un-diagrama-de-flujo).
¿Deseas crear un diagrama de flujo por tu cuenta? Prueba Lucidchart. Es rápido, sencillo y totalmente gratis.

View file

@ -0,0 +1,124 @@
---
id: 796f6a6c-b7d5-4139-9601-460023ba0db6
title: |
Maintaining Balance for Open Source Maintainers | Open Source Guides
status: ARCHIVED
tags:
- read-later
date_added: 2024-06-24 09:59:10
url_omnivore: |
https://omnivore.app/me/maintaining-balance-for-open-source-maintainers-open-source-guid-1904a8b1fc4
url_original: |
https://opensource.guide/maintaining-balance-for-open-source-maintainers/
---
# Maintaining Balance for Open Source Maintainers | Open Source Guides
## Highlights
* **Lack of positive feedback:** Users are far more likely to reach out when they have a complaint. If everything works great, they tend to stay silent. It can be discouraging to see a growing list of issues without the positive feedback showing how your contributions are making a difference.
* **Not saying no:** It can be easy to take on more responsibilities than you should on an open source project. Whether its from users, contributors, or other maintainers we cant always live up to their expectations.
* **Working alone:** Being a maintainer can be incredibly lonely. Even if you work with a group of maintainers, the past few years have been difficult for convening distributed teams in-person.
* **Not enough time or resources:** This is especially true for volunteer maintainers who have to sacrifice their free time to work on a project.
* **Conflicting demands:** Open source is full of groups with different motivations, which can be difficult to navigate. If youre paid to do open source, your employers interests can sometimes be at odds with the community.
[source](https://omnivore.app/me/maintaining-balance-for-open-source-maintainers-open-source-guid-1904a8b1fc4#dae1e4e1-4910-4dc6-ab2f-a6e0f407d489)
---
* **Lean on the community:** Delegation and finding contributors can alleviate the workload. Having multiple points of contact for a project can help you take a break without worrying. Connect with other maintainers and the wider communityin groups like the [Maintainer Community](http://maintainers.github.com/). This can be a great resource for peer support and learning.
You can also look for ways to engage with the user community, so you can regularly hear feedback and understand the impact of your open source work.
* **Explore funding:** Whether youre looking for some pizza money, or trying to go full time open source, there are many resources to help! As a first step, consider turning on [GitHub Sponsors](https://github.com/sponsors) to allow others to sponsor your open source work. If youre thinking about making the jump to full-time, apply for the next round of [GitHub Accelerator](http://accelerator.github.com/).
[source](https://omnivore.app/me/maintaining-balance-for-open-source-maintainers-open-source-guid-1904a8b1fc4#e30a0308-0d0f-4aea-a66a-a8087992fc2b)
---
* **Use tools:** Explore tools like [GitHub Copilot](https://github.com/features/copilot/) and [GitHub Actions](https://github.com/features/actions) to automate mundane tasks and free up your time for more meaningful contributions.
* **Rest and recharge:** Make time for your hobbies and interests outside of open source. Take weekends off to unwind and rejuvenateand set your [GitHub status](https://docs.github.com/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#setting-a-status) to reflect your availability! A good nights sleep can make a big difference in your ability to sustain your efforts long-term.
If you find certain aspects of your project particularly enjoyable, try to structure your work so you can experience it throughout your day.
* **Set boundaries:** You cant say yes to every request. This can be as simple as saying, “I cant get to that right now and I do not have plans to in the future,” or listing out what youre interested in doing and not doing in the README. For instance, you could say: “I only merge PRs which have clearly listed reasons why they were made,” or, “I only review issues on alternate Thursdays from 6 -7 pm.”This sets expectations for others, and gives you something to point to at other times to help de-escalate demands from contributors or users on your time.
[source](https://omnivore.app/me/maintaining-balance-for-open-source-maintainers-open-source-guid-1904a8b1fc4#9288f579-7a9f-4135-8933-86266d8baa39)
---
## Original
Tips for self-care and avoiding burnout as a maintainer.
![Maintaining Balance for Open Source Maintainers](https://proxy-prod.omnivore-image-cache.app/0x0,sSBF-x8lO3uOZnLYKVwv3wcsNwef_wLE7Hfa7nydrUZY/https://opensource.guide/assets/images/illos/balance.svg)
As an open source project grows in popularity, it becomes important to set clear boundaries to help you maintain balance to stay refreshed and productive for the long run.
To gain insights into the experiences of maintainers and their strategies for finding balance, we ran a workshop with 40 members of the [Maintainer Community](http://maintainers.github.com/), allowing us to learn from their firsthand experiences with burnout in open source and the practices that have helped them maintain balance in their work. This is where the concept of personal ecology comes into play.
So, what is personal ecology? As [described by the Rockwood Leadership Institute](https://rockwoodleadership.org/nonprofit-four-day-workweek-can-take-care-still-change-world/#:~:text=personal%20ecology%3A%20maintaining%20balance%2C%20pacing%20and%20efficiency%20to%20sustain%20your%20energy%20over%20a%20lifetime%20of%20activism), it involves “**maintaining balance, pacing, and efficiency to sustain our energy over a lifetime**.” This framed our conversations, helping maintainers recognize their actions and contributions as parts of a larger ecosystem that evolves over time. Burnout, a syndrome resulting from chronic workplace stress as [defined by the WHO](https://icd.who.int/browse11/l-m/en#/http://id.who.int/icd/entity/129180281), is not uncommon among maintainers. This often leads to a loss of motivation, an inability to focus, and a lack of empathy for the contributors and community you work with.
By embracing the concept of personal ecology, maintainers can proactively avoid burnout, prioritize self-care, and uphold a sense of balance to do their best work.
## [](#tips-for-self-care-and-avoiding-burnout-as-a-maintainer)Tips for Self-Care and Avoiding Burnout as a Maintainer:
### [](#identify-your-motivations-for-working-in-open-source)Identify your motivations for working in open source
Take time to reflect on what parts of open source maintenance energizes you. Understanding your motivations can help you prioritize the work in a way that keeps you engaged and ready for new challenges. Whether its the positive feedback from users, the joy of collaborating and socializing with the community, or the satisfaction of diving into the code, recognizing your motivations can help guide your focus.
### [](#reflect-on-what-causes-you-to-get-out-of-balance-and-stressed-out)Reflect on what causes you to get out of balance and stressed out
Its important to understand what causes us to get burned out. Here are a few common themes we saw among open source maintainers:
* **==Lack of positive feedback:==** ==Users are far more likely to reach out when they have a complaint. If everything works great, they tend to stay silent. It can be discouraging to see a growing list of issues without the positive feedback showing how your contributions are making a difference.==
* **==Not saying no:==** ==It can be easy to take on more responsibilities than you should on an open source project. Whether its from users, contributors, or other maintainers we cant always live up to their expectations.==
* **==Working alone:==** ==Being a maintainer can be incredibly lonely. Even if you work with a group of maintainers, the past few years have been difficult for convening distributed teams in-person.==
* **==Not enough time or resources:==** ==This is especially true for volunteer maintainers who have to sacrifice their free time to work on a project.==
* **==Conflicting demands:==** ==Open source is full of groups with different motivations, which can be difficult to navigate. If youre paid to do open source, your employers interests can sometimes be at odds with the community.==
### [](#watch-out-for-signs-of-burnout)Watch out for signs of burnout
Can you keep up your pace for 10 weeks? 10 months? 10 years?
There are tools like the [Burnout Checklist](https://governingopen.com/resources/signs-of-burnout-checklist.html) from [@shaunagm](https://github.com/shaunagm) that can help you reflect on your current pace and see if there are any adjustments you can make. Some maintainers also use wearable technology to track metrics like sleep quality and heart rate variability (both linked to stress).
### [](#what-would-you-need-to-continue-sustaining-yourself-and-your-community)What would you need to continue sustaining yourself and your community?
This will look different for each maintainer, and will change depending on your phase of life and other external factors. But here are a few themes we heard:
* **Lean on the community:** Delegation and finding contributors can alleviate the workload. Having multiple points of contact for a project can help you take a break without worrying. Connect with other maintainers and the wider communityin groups like the [Maintainer Community](http://maintainers.github.com/). This can be a great resource for peer support and learning.
You can also look for ways to engage with the user community, so you can regularly hear feedback and understand the impact of your open source work.
* **Explore funding:** Whether youre looking for some pizza money, or trying to go full time open source, there are many resources to help! As a first step, consider turning on [GitHub Sponsors](https://github.com/sponsors) to allow others to sponsor your open source work. If youre thinking about making the jump to full-time, apply for the next round of [GitHub Accelerator](http://accelerator.github.com/).
* **Use tools:** Explore tools like [GitHub Copilot](https://github.com/features/copilot/) and [GitHub Actions](https://github.com/features/actions) to automate mundane tasks and free up your time for more meaningful contributions.
* **Rest and recharge:** Make time for your hobbies and interests outside of open source. Take weekends off to unwind and rejuvenateand set your [GitHub status](https://docs.github.com/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#setting-a-status) to reflect your availability! A good nights sleep can make a big difference in your ability to sustain your efforts long-term.
If you find certain aspects of your project particularly enjoyable, try to structure your work so you can experience it throughout your day.
* **Set boundaries:** You cant say yes to every request. This can be as simple as saying, “I cant get to that right now and I do not have plans to in the future,” or listing out what youre interested in doing and not doing in the README. For instance, you could say: “I only merge PRs which have clearly listed reasons why they were made,” or, “I only review issues on alternate Thursdays from 6 -7 pm.”This sets expectations for others, and gives you something to point to at other times to help de-escalate demands from contributors or users on your time.
Learn to be firm in shutting down toxic behavior and negative interactions. Its okay to not give energy to things you dont care about.
Remember, personal ecology is an ongoing practice that will evolve as you progress in your open source journey. By prioritizing self-care and maintaining a sense of balance, you can contribute to the open source community effectively and sustainably, ensuring both your well-being and the success of your projects for the long run.
## [](#additional-resources)Additional Resources
* [Maintainer Community](http://maintainers.github.com/)
* [The social contract of open source](https://snarky.ca/the-social-contract-of-open-source/), Brett Cannon
* [Uncurled](https://daniel.haxx.se/uncurled/), Daniel Stenberg
* [How to deal with toxic people](https://www.youtube.com/watch?v=7lIpP3GEyXs), Gina Häußge
* [SustainOSS](https://sustainoss.org/)
* [Rockwood Art of Leadership](https://rockwoodleadership.org/art-of-leadership/)
* [Saying No](https://docs.google.com/document/d/1esQQBJXQi1x%5F-1AcRVPiCRAEQYO4Qlvali0ylCvKa%5Fs/edit?pli=1#:~:text=Saying%20No%20%7C%20Mike%20McQuaid), Mike McQuaid
* [Governing Open](https://docs.google.com/document/d/1esQQBJXQi1x%5F-1AcRVPiCRAEQYO4Qlvali0ylCvKa%5Fs/edit?pli=1#:~:text=a%20mixed%20list.-,Governance%20of%20Open%20Source%20Software,-governingopen.com)
* Workshop agenda was remixed from [Mozillas Movement Building from Home](https://docs.google.com/document/d/1esQQBJXQi1x%5F-1AcRVPiCRAEQYO4Qlvali0ylCvKa%5Fs/edit?pli=1#:~:text=a%20mixed%20list.-,It%E2%80%99s%20a%20wrap%3A%20Movement%2DBuilding%20from%20Home,-foundation.mozilla.org) series
## [](#contributors)Contributors
Many thanks to all the maintainers who shared their experiences and tips with us for this guide!
This guide was written by [@abbycabs](https://github.com/abbycabs) with contributions from:
[@agnostic-apollo](https://github.com/agnostic-apollo) [@AndreaGriffiths11](https://github.com/AndreaGriffiths11) [@antfu](https://github.com/antfu) [@anthonyronda](https://github.com/anthonyronda) [@CBID2](https://github.com/CBID2) [@Cli4d](https://github.com/Cli4d) [@confused-Techie](https://github.com/confused-Techie) [@danielroe](https://github.com/danielroe) [@Dexters-Hub](https://github.com/Dexters-Hub) [@eddiejaoude](https://github.com/eddiejaoude) [@Eugeny](https://github.com/Eugeny) [@ferki](https://github.com/ferki) [@gabek](https://github.com/gabek) [@geromegrignon](https://github.com/geromegrignon) [@hynek](https://github.com/hynek) [@IvanSanchez](https://github.com/IvanSanchez) [@karasowles](https://github.com/karasowles) [@KoolTheba](https://github.com/KoolTheba) [@leereilly](https://github.com/leereilly) [@ljharb](https://github.com/ljharb) [@nightlark](https://github.com/nightlark) [@plarson3427](https://github.com/plarson3427) [@Pradumnasaraf](https://github.com/Pradumnasaraf) [@RichardLitt](https://github.com/RichardLitt) [@rrousselGit](https://github.com/rrousselGit) [@sansyrox](https://github.com/sansyrox) [@schlessera](https://github.com/schlessera) [@shyim](https://github.com/shyim) [@smashah](https://github.com/smashah) [@ssalbdivad](https://github.com/ssalbdivad) [@The-Compiler](https://github.com/The-Compiler) [@thehale](https://github.com/thehale) [@thisisnic](https://github.com/thisisnic) [@tudoramariei](https://github.com/tudoramariei) [@UlisesGascon](https://github.com/UlisesGascon) [@waldyrious](https://github.com/waldyrious) \+ many others!
![squirrel illustration](https://proxy-prod.omnivore-image-cache.app/0x0,sHBiaMeno9-ZUiAtzunnM5HaUVr3c6Z5EOmsVrWbla1E/https://opensource.guide/assets/images/illos/squirrel.svg)
### Contribute
Want to make a suggestion? This content is open source. Help us improve it.
[ Contribute](https://github.com/github/opensource.guide/blob/main/%5Farticles/maintaining-balance-for-open-source-maintainers.md)

View file

@ -0,0 +1,3 @@
# void
Zettlelkasten

View file

@ -0,0 +1,64 @@
# 10 Practical Time Management Tips for When Everything Is a Priority
![rw-book-cover](https://rebelsguidetopm.com/wp-content/uploads/2016/04/GGtPM-Pin-5.png)
## Metadata
- Author: [[Elizabeth Harrin]]
- Full Title: 10 Practical Time Management Tips for When Everything Is a Priority
- Category: #articles
- URL: https://rebelsguidetopm.com/time-management-tips/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=10%20Practical%20Time%20Management%20Tips%20for%20When%20Everything%20Is%20a%20Priority
> [!note]
> **Background:** I aim to enhance my personal organization within my projects to manage tasks more effectively and make better use of my time.
> **Top 3 Important Takeaways:**
> 🗂️ **Establish Clear Priorities:** Understand the distinction between urgent and important tasks. Use tools like the Eisenhower Matrix to identify and focus on high urgency and high importance tasks, ensuring that you also allocate time for important but less urgent tasks to avoid last-minute stress.
> 📅 **Create a Structured Schedule:** Develop a detailed weekly plan that includes your priorities, meetings, and commitments. Dedicate specific time blocks each day to work on tasks that align with your goals, helping you stay organized and productive throughout the week.
> ✉️ **Implement an Email Management Strategy:** Design a system to manage your emails effectively, reducing inbox clutter and stress. This will allow you to quickly find important messages and maintain organization, especially when dealing with multiple priorities.
> [!tldr]
> This article offers practical time management tips for increasing productivity when everything feels like a priority. The tips include scheduling your time, understanding the difference between urgent and important tasks, and knowing when you are most productive. By following these tips, you can better prioritize tasks and manage your workload effectively.
## Highlights
I am most productive and get the most out of my time when my time is planned. [View Highlight](https://read.readwise.io/read/01j98zjaq5c6j0kah92r2s5pwf))
This is how I schedule my time:
• I work out my priorities for the week.
• I look at what meetings and other commitments I have.
• I split my priorities across the week, blocking out time each day to do something that gets me closer to having achieved my goals by Friday. [View Highlight](https://read.readwise.io/read/01j98zkq45h9f9e2hw0afrc21y))
Not everything that is urgent is important.
And not everything that is important is urgent. ... Important means something that:
• has high significance
• other people believe is a good use of your time
• will help you or the organization reach your goals. ... Urgent tasks are things that have to happen now.
Tasks that are high urgency and high importance should take most of your time in the day.
However, ideally, youll also be spending time on the highly important but less urgent tasks too. Plan these in your calendar for the coming weeks so they dont become a source of panic. [View Highlight](https://read.readwise.io/read/01j98ztb77ncd7d5zw6v15m6s4))
> [!note]
> The Eisenhower Matrix of TickTick was usefull for this
Task priority can change over time [View Highlight](https://read.readwise.io/read/01j990cbt2hveke2849wjwqnst))
You can only block out time on your calendar if you know what your priorities are. Understanding what is urgent and important will help you spot priority tasks. [View Highlight](https://read.readwise.io/read/01j990h9rp0c19yamjw766kw6j))
**the answer is never: everything is a priority.**
Thats just lazy thinking. Some things will be more priority than others. [View Highlight](https://read.readwise.io/read/01j990jd7zq69xc6fgkeskrtxg))
A great time management tip for teams is to [delegate](https://rebelsguidetopm.com/how-to-delegate-tasks-with-more-confidence-and-less-stress/) to each other. [View Highlight](https://read.readwise.io/read/01j99197wtqzqvx6fbsfvbppsw))
Dont forget that “managing” also takes time. [View Highlight](https://read.readwise.io/read/01j9918rgtz371s7h6j9shv54t))
Have different To Do lists. Know what you need to achieve this year, quarter, month, week and day. [View Highlight](https://read.readwise.io/read/01j9919h30698gxszd9733vcp1))
Learn when you are at your most productive and use that to your advantage. Schedule your frogs for the time when you are sharpest. [View Highlight](https://read.readwise.io/read/01j991bs54wa52q66hp3kf12k8))
Remember to build some slack into your calendar as well. You cant work every evening and still function at full capacity during the day. Have some downtime, whatever that looks like for you! [View Highlight](https://read.readwise.io/read/01j991e4nzd98gzr6yee0yger9))
Having a strategy for dealing with email is important because when everything is a priority you have to be able to find messages and stay organized. For me, having thousands of mails in my inbox is a source of stress. [View Highlight](https://read.readwise.io/read/01j991gt8fq6bvjbw40zbpcdvp))
Integrating your schedules will help you see all the key milestones at once. ... At its simplest, make a milestone planner and use that to see which months are going to be your busy times.
Keep talking to your stakeholders and clients about their expectations, and keep communication channels open with your team as well. Managing expectations on all sides goes a long way to keeping the peace. [View Highlight](https://read.readwise.io/read/01j991pdc0apq5bn06k3w9b3hs))
Try to be flexible and adapt to whats required this week (or today). And let your positive attitude rub off on your team. [View Highlight](https://read.readwise.io/read/01j991rcc7xk5rqgw10e32f3ws))

View file

@ -0,0 +1,41 @@
# 11 Life-Changing Journaling Tips for Beginners
![rw-book-cover](https://www.simplyfiercely.com/wp-content/uploads/2021/05/11-Life-Changing-Journaling-Tips-For-Beginners-Feature-Image.jpg)
## Metadata
- Author: [[Jennifer]]
- Full Title: 11 Life-Changing Journaling Tips for Beginners
- Category: #articles
- URL: https://www.simplyfiercely.com/journaling-tips/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=11%20Life-Changing%20Journaling%20Tips%20for%20Beginners
> [!tldr]
> Journaling is a powerful tool for self-discovery and personal growth. To help beginners get started, the author shares 11 tips, like using prompts and writing honestly. The key is to enjoy the process and make journaling a regular habit.
## Highlights
1. Keep a list of go-to prompts ... They can be very helpful if youre just starting because they give you a place to begin.
write as though youre talking to someone else.
You can write to:
• Your future self
• Your younger self
• To someone who is no longer with us
• To someone who has hurt your feelings
• To someone you admire
• To someone who needs your help [View Highlight](https://read.readwise.io/read/01j862h864h4mhyv3vqy6xvve3))
If youre working from a list of journaling prompts, using a guided journal, or experimenting with a new journaling method, and something doesnt feel right for you—then its OK to stop. [View Highlight](https://read.readwise.io/read/01j862kcsaxk8909cdb69f3dpe)) ^05df43
Remember that the point of a prompt is to get your thoughts flowing freely, not necessarily to answer or address that specific question or statement. [View Highlight](https://read.readwise.io/read/01j862kvny6qx7bt3eykq0z8zm)) ^ce92d8
But heres the thing: too much inspiration can often lead to paralysis. [View Highlight](https://read.readwise.io/read/01j862ppxd79psqff22tjz21z1))
cover the first page with a big scribble! A friend of mine recommends doing this as a way to break the ice [View Highlight](https://read.readwise.io/read/01j862r1djv5s1px2z8f233efa))
Freewriting is a form of journaling where you write everything down without stopping, editing or even correcting grammar until your mind feels empty. [View Highlight](https://read.readwise.io/read/01j862t96pgsrqk03vdvpcj643)) ^ffddd6
Keep this in mind at the start of your journey as you may feel pressure to journal the “right way”. When it comes to journaling, there is no right way. Its your space to explore how you see fit. Dont overthink it—just keep writing! [View Highlight](https://read.readwise.io/read/01j862vd6rrf591ccavj9s1f5b))
To get the full benefits of journaling, you have to be honest. Open up and be vulnerable—its one of the few genuinely private spaces you have (unless you choose to share your journal with someone). The more honest you are, the closer youll get to your truth. [View Highlight](https://read.readwise.io/read/01j862vy4n84vzqznh9t62t0qx)) ^4d6f9f
Whenever you have a thought or feel strong emotions, write them down. [View Highlight](https://read.readwise.io/read/01j862ww1v0j1ebb9rfkd1ww7e))

View file

@ -0,0 +1,19 @@
# 17-Year-Old Student Exposes Germany's 'Secret' Pirate Site Blocklist
![rw-book-cover](https://news.ycombinator.com/favicon.ico)
## Metadata
- Author: [[isaacfrond]]
- Full Title: 17-Year-Old Student Exposes Germany's 'Secret' Pirate Site Blocklist
- Category: #articles
- URL: https://torrentfreak.com/17-year-old-student-exposes-germanys-secret-pirate-site-blocklist-240822/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=17-Year-Old%20Student%20Exposes%20Germany%27s%20%27Secret%27%20Pirate%20Site%20Blocklist
> [!tldr]
> A 17-year-old student in Germany has created a website to reveal the blocked pirate sites that major internet providers do not disclose. This initiative aims to increase transparency and address concerns about censorship related to copyright enforcement. The site, CUIIliste.de, lists 275 blocked domains, allowing users to see which sites are restricted.
## Highlights
watchdog [View Highlight](https://read.readwise.io/read/01j64wj1fy8b0dyhcdsjgv4vta))
> [!note]
> Watchdog: A term used to describe an individual or organization that monitors and oversees the actions of others, often to ensure accountability, transparency, and adherence to laws or regulations. Watchdogs play a critical role in various fields, including journalism, government, and environmental protection, by investigating misconduct, exposing corruption, and advocating for the public interest. Their function is essential in promoting ethical standards and fostering public trust in institutions.
> In the context of Isaac Frond's article, the term "watchdog" refers to individuals or organizations that monitor and ensure accountability regarding governmental or institutional actions, particularly in relation to transparency and rights. The lack of public knowledge about the blocked pirate sites in Germany has led to frustration among journalists and advocates, highlighting the need for oversight. The 17-year-old student, along with his friends, embodies this watchdog role by exposing the secretive blocklist, thereby promoting transparency and challenging potential overreach in copyright enforcement.

View file

@ -0,0 +1,30 @@
# 3 Simple Hacks to Stay Up-to-Date as a Developer
![rw-book-cover](https://i.ytimg.com/vi/AIUw82G-jKE/maxresdefault.jpg)
## Metadata
- Author: [[Bran van der Meer]]
- Full Title: 3 Simple Hacks to Stay Up-to-Date as a Developer
- Category: #articles
- Document Tags: [[star]]
- URL: https://www.youtube.com/watch?v=AIUw82G-jKE
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=3%20Simple%20Hacks%20to%20Stay%20Up-to-Date%20as%20a%20Developer
## Highlights
there's just too much you have to filter somehow you have to find the right news aggregators for your topic [View Highlight](https://read.readwise.io/read/01j6ye17qj6mqt3hvcv776vd0t))
social media is it's itself an
aggregator of content of course and you can even argue that daily doev which I just showed is social media I recommend to follow specific creators that you like and if you don't have anybody you like yet then you can try and find those people from now on whenever you go to conferences you can pay attention who the speaker is whenever you're reading books or reading articles look up the author see if they have a Blog see if they publish other things [View Highlight](https://read.readwise.io/read/01j6ye8bktbvyjv1763jf4333z))
try and go to at least one conference a year [View Highlight](https://read.readwise.io/read/01j6yebe0q7bq1gdgmf4zzw6xa))
I like conferences because they have a
tendency to burst your filter bubble [View Highlight](https://read.readwise.io/read/01j6yeckqdxp8na7meb3m1fz14))
you're looking for a job a Meetup is often a chance to meet a company that's very local that's very close to where you live and you get a chance to meet them outside of the normal hiring process which can also be an advantage [View Highlight](https://read.readwise.io/read/01j6yees1azkpzgsabf3r546av))
calm any fear you may have fear fear of becoming
irrelevant [View Highlight](https://read.readwise.io/read/01j6yefnrc19pj2f04dq6p6h7g))
what I do is once a year I read a lot of vacancies I don't think about applying for another job I'm not actually applying for another job I am just purely looking at what companies are looking for [View Highlight](https://read.readwise.io/read/01j6yeg5yy6m8g2tpgd4xj5gv6))

View file

@ -0,0 +1,8 @@
---
New highlights added at 2024-09-15 3:42 PM
People are highly visual but can get overwhelmed by too many graphics. Liferay takes a direct approach to educating users by using images only when it matters, such as in screenshots of actual elements. By limiting the unnecessary items in your design system documentation, you can ensure the important things get communicated. [View Highlight](https://read.readwise.io/read/01j7tw12yxcgpsp883nsvscf1t))
IBM shows that if you want to ensure that everyone can use your product, you need to start that process with your design system.
And when you do, dont just state your intent. Educate your team on the accessibility challenges different people face and teach them proven best practices that can make a noticeable difference for millions of people worldwide. [View Highlight](https://read.readwise.io/read/01j7twa6wgtnehe050h7br44r7))

View file

@ -0,0 +1,69 @@
# 6 Morning Journal Prompts That Will Transform Your Day
![rw-book-cover](https://www.simplyfiercely.com/wp-content/uploads/2021/06/6-Morning-Journal-Prompts-That-Will-Transform-Your-Day-Feature-Image.jpg)
## Metadata
- Author: [[Jennifer]]
- Full Title: 6 Morning Journal Prompts That Will Transform Your Day
- Category: #articles
- Document Tags: [[journaling]] [[notetaking]]
- URL: https://www.simplyfiercely.com/morning-journal-prompts/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=6%20Morning%20Journal%20Prompts%20That%20Will%20Transform%20Your%20Day
> [!tldr]
> Morning journaling can help you start your day with clarity and purpose by processing your thoughts and emotions. Using specific prompts can guide your reflections and help you feel more focused and less overwhelmed. Establishing a morning journaling routine can make your mornings more enjoyable and productive.
## Highlights
1. How do I want to feel when I go to bed tonight?
**Use when: You feel stuck, unsure, or even a bit lost.** [View Highlight](https://read.readwise.io/read/01j8588c42w7v68v76cjzak02x)) [[journaling/prompt]] ^80fb8d
To do this, start by imagining that youre in bed at the end of the day and youre about to close your eyes. Take a deep breath and then exhale. How do you want to feel at that moment? [View Highlight](https://read.readwise.io/read/01j858a7fzcsje3ptx8evpnh7g))
instead of saying *happy,* you could write down that you want to feel *accomplished* or *connected*. [View Highlight](https://read.readwise.io/read/01j858ajbqht1382hc75spg314))
take things a step further by brainstorming simple actions that will support you. [View Highlight](https://read.readwise.io/read/01j858b7frqbr2kpzck52rsvdr))
2. What season of life am I in?
**Use when: Youre feeling overwhelmed by your to-do list.** [View Highlight](https://read.readwise.io/read/01j858cvvbjkzh75jvzbet09xa)) ^44f8db
think about your own life and ask yourself, “What season am I in?”
• Are you in a season of caring for others?
• A season of resting while you heal from physical or emotional trauma?
• A season of growth in your career or professional life? [View Highlight](https://read.readwise.io/read/01j858g53d4y95edq9ca2265kx))
Living a balanced life means knowing when to drop some things and when to pick up others *depending on what season youre in right now*. It gives you permission to focus on what you need most and clarity to choose a few [things to let go of](https://www.simplyfiercely.com/things-to-let-go-of/) (for a while, at least). [View Highlight](https://read.readwise.io/read/01j858j3yzdcjpmrd72zrssfrj))
Acknowledging lifes seasonality and where you are in that rhythm can, with practice, release you from the guilt that comes with wanting to do it all. [View Highlight](https://read.readwise.io/read/01j858kpwq5d6xnb80721zj64z))
**Journaling Tip:** When working through this journal prompt, ask yourself if you need rest, if you need to work, if you need to spend time with family or friends, or if you need to be alone right now. [View Highlight](https://read.readwise.io/read/01j858m1vvj4nfkwn9g433he6d))
3. Today I am excited to…
**Use when: You need a pick-me-up.** [View Highlight](https://read.readwise.io/read/01j858mgv14bedfggjwgza7exg)) [[journaling/prompt]] ^656f82
youre generally feeling a little low [View Highlight](https://read.readwise.io/read/01j858sve44psj3r6zvyahhekb))
We are hard-wired to focus more on the negative things in life than the positive things. So how can we overcome this?
By putting extra attention on the positive in the morning and throughout the day as well. [View Highlight](https://read.readwise.io/read/01j858thnp6y7cam9rbg2098zf))
**Journaling Tip:** If youre struggling to feel excited, try getting your senses involved. Imagine a warm cup of coffee pressed between your palms, the sound of the birds on your way to work, the sun shining on your skin—and see if it doesnt change the way you feel. [View Highlight](https://read.readwise.io/read/01j858s0zxdjg1jfa6yhqf5j4c))
4. Today I get to…
**Use when: Youre feeling burdened or resentful.** [View Highlight](https://read.readwise.io/read/01j858y4e0kv537bhhck4vs0em)) [[journaling/prompt]] ^e92888
think about things that you have to do today … and see if you can reframe your thoughts about the situation. [View Highlight](https://read.readwise.io/read/01j8591gse70tyvt73pah1aaw1))
**Journaling Tip:** Dont forget to acknowledge if you are currently living out a past goal or dream! [View Highlight](https://read.readwise.io/read/01j8594bw1hq0kssgpszr0wqxq))
5. I am challenged by…
**Use when: Youre struggling.** [View Highlight](https://read.readwise.io/read/01j85c3n5raa1jpnkww72tg06n)) [[journaling/prompt]] ^44a1a6
By making your challenges the focus of your morning journal prompt, youre eating the frog but in a more mindful way. When you write about what challenges you, it is helpful to explore why and how you will overcome the challenge—but you should also write out what it will mean to you or your life. [View Highlight](https://read.readwise.io/read/01j85c8z3kjz86gjm4t6sybshm))
If those words dont ring true to your situation, you may need to re-evaluate whether the challenge fits with your values and goals. [View Highlight](https://read.readwise.io/read/01j85cngfe6j4f1bp4cy1q88nh))
6. Write it all out
**Use When: You dont know what to do next.** [View Highlight](https://read.readwise.io/read/01j85dnb9vnavm92sfq8cvjfds)) [[journaling/prompt]] ^b6b0bd
The idea behind free-writing is just as it sounds—you simply write out all of your thoughts without editing until there is nothing left. [View Highlight](https://read.readwise.io/read/01j85dpk39fpze0r24wkwas9kt))
I find that its powerful because it allows your brain to unload without expectations. Its a bit like ranting to a friend after a long day—sometimes you just need to get things off your chest, and then you can move on. [View Highlight](https://read.readwise.io/read/01j85dqa7hcqt5k4h4pc161dwc))

View file

@ -0,0 +1,59 @@
# 7 Intentional Questions To Ask Yourself Every Day
![rw-book-cover](https://www.simplyfiercely.com/wp-content/uploads/2018/02/Questions-to-Ask-Yourself-Feature-Image.jpg)
## Metadata
- Author: [[Jennifer]]
- Full Title: 7 Intentional Questions To Ask Yourself Every Day
- Category: #articles
- Document Tags: [[journaling]]
- URL: https://www.simplyfiercely.com/7-questions-to-inspire-intentional-living/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=7%20Intentional%20Questions%20To%20Ask%20Yourself%20Every%20Day
> [!tldr]
> Regular self-reflection is essential for living a meaningful and purposeful life. Asking yourself seven intentional questions each day can help clarify your priorities and decisions. By taking time to reflect, you can ensure your actions align with what truly matters to you.
## Highlights
I thought I was too busy for something as trivial as “self-reflection” but now I know its one of the most valuable things I can do with my time, and for you as well. [View Highlight](https://read.readwise.io/read/01j85trb36ydy64sbw670rqy75)) ^029f29
1. Why am I doing this?
This is a deceptively simple yet very powerful question to ask yourself. I think too often we assume we know why we do what we do, but when we carve out time to sit and reflect, the truth can surprise us. [View Highlight](https://read.readwise.io/read/01j85ttaxs6xp6dyt426kv53re)) [[journaling/prompt]] ^78caa2
It might save you ten minutes on a Monday morning, or ten years spent chasing a goal you dont even really want. [View Highlight](https://read.readwise.io/read/01j85txf1x20mpd5dtfsex667w))
2. Who am I doing this for? [View Highlight](https://read.readwise.io/read/01j85x45h66bevcpas8kb7jn36)) [[journaling/prompt]] ^0ea258
This is a good question to ask yourself regularly when you feel your priorities are out of alignment. It can help shine a light on where you need stronger [personal boundaries](https://www.simplyfiercely.com/personal-boundaries/). [View Highlight](https://read.readwise.io/read/01j85x6nevt1a156g7tvrkar7w))
But I should also point out that self-reflection isnt about judging yourself or others. Instead, its about honesty; knowing why you do what you do and who you do things for, so you can [make intentional decisions about how to invest your time, money and energy](https://www.simplyfiercely.com/intentional-time-money-energy/). [View Highlight](https://read.readwise.io/read/01j85x70r7rxh41qz1tcm196qs))
3. Is there a simpler way? [View Highlight](https://read.readwise.io/read/01j85xafyt9wnwf26pf711mjd2)) [[journaling/prompt]] ^3b92eb
Taking just five minutes to ask the question and look for a simpler way has saved me countless hours throughout my life. (And Ill also admit that sometimes it happens in reverse —Id spend hours doing something and then realise I made it harder than need be!) [View Highlight](https://read.readwise.io/read/01j85xe88z59xav5x5n16yee9k))
4. How does this add value to my life? [View Highlight](https://read.readwise.io/read/01j85xqetvfmrkt17gwaxx8ssh)) [[journaling/prompt]] ^de9f88
We trade away our precious lives in little moments ... we often spend our *lives* on things that give us little value in return.
if you cant quickly explain in very specific terms how something is adding value to your life, then odds are it isnt. [View Highlight](https://read.readwise.io/read/01j85xtzjn34ra2xt29zyevsw4))
5. What am I giving up? [View Highlight](https://read.readwise.io/read/01j85y3wdwgy2mbpkh1pygyevt)) [[journaling/prompt]] ^8419b3
you put a name to the tradeoffs associated with any decision [View Highlight](https://read.readwise.io/read/01j85y5pfvpjm9mzm49bgc4kya))
Whenever you decide to do or buy something, make sure you think about what youre giving up to make it happen. [View Highlight](https://read.readwise.io/read/01j85y6bt9wgrec4r2520b5ja7))
6. How does this make me feel? [View Highlight](https://read.readwise.io/read/01j85y8kck7ckzazkgdaphdfjm)) [[journaling/prompt]]
If youre doing something that makes you feel sad, anxious, or angry its important to understand why. Are you doing something that goes against your core values? Or do you need more rest and support? [View Highlight](https://read.readwise.io/read/01j85ya9vvam560p585n9eyhn6))
Or when you feel more positive emotions—why? What can you learn from your feelings and how can you apply what you learn in your everyday life? How can you be intentional about creating the life you want? [View Highlight](https://read.readwise.io/read/01j85yak4qe3qzhdqnnp65nr74))
7. Am I being honest with myself? [View Highlight](https://read.readwise.io/read/01j85yapckfm2deazf2qfdadx8)) [[journaling/prompt]] ^b44977
Finally, its important to check that youre being honest with yourself, because if youre not, none of your other answers really matter. [View Highlight](https://read.readwise.io/read/01j85ye7w6zca1hjwcaqxmp2zt))
---
New highlights added at 2024-10-13 4:11 PM
Everything in life has a tradeoff. [View Highlight](https://read.readwise.io/read/01j8j1xm6rfcw66sjf6nz1xf47))

View file

@ -0,0 +1,88 @@
# 7 Mindful Journaling Prompts to Calm an Anxious Mind
![rw-book-cover](https://www.simplyfiercely.com/wp-content/uploads/2020/12/7-Mindful-Journaling-Prompts-to-Calm-An-Anxious-Mind-Feature-Image.jpg)
## Metadata
- Author: [[Jennifer Burger]]
- Full Title: 7 Mindful Journaling Prompts to Calm an Anxious Mind
- Category: #articles
- URL: https://www.simplyfiercely.com/mindful-journal-prompts/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=7%20Mindful%20Journaling%20Prompts%20to%20Calm%20an%20Anxious%20Mind
> [!tldr]
> Journaling can help calm an anxious mind by bringing awareness to the present and allowing you to explore your feelings without judgment. Mindful journaling prompts provide a structured way to reflect on your thoughts and fears, making it easier to cope with anxiety. Whether you're new to journaling or have experience, these prompts can help you find peace and clarity in stressful times.
## Highlights
mindful journaling is intended to bring more of your awareness to the present moment. Simply put, its the act of conscious writing. It can be particularly helpful for anyone that struggles with meditation because you go to the extra step of taking the thoughts from your mind and making them tangible by writing them down. [View Highlight](https://read.readwise.io/read/01j83kfe31tcya0gkqbfcfw71c))
Mindful journaling can help to ease anxiety by allowing you to uncover the root cause of your stress. After all, one of the [benefits of journaling](https://www.simplyfiercely.com/benefits-of-journaling/) is that its a reflective process. It helps you organise your thoughts, and because theyre written down, you have the chance to reflect on them too. [View Highlight](https://read.readwise.io/read/01j83kjtp3t9x64bmgtwkter90))
In the words of Eckhart Tolle, “As soon as you honour the present moment, all unhappiness and struggle dissolve, and life begins to flow with joy and ease.” [View Highlight](https://read.readwise.io/read/01j83m70htvhxtfjfvhb68qsvx))
If youre new to journaling, you might be hit with writers block. Remember, any new behaviour or practice can take getting used to. [View Highlight](https://read.readwise.io/read/01j83m8kymfctpxjqyw29vq3wh))
[Be intentional](https://www.simplyfiercely.com/be-intentional/) about creating time to write your feelings out. Turn it into a ritual by making yourself a warm drink, lighting a candle, or choosing a nice spot to write in. This might help you create a [daily routine](https://www.simplyfiercely.com/daily-routines/) in the future. [View Highlight](https://read.readwise.io/read/01j83m93tv468vmfpmrafmfg5j))
Prompt: What Am I Feeling Right Now?
**Use when: You feel like you need to empty a racing brain.** [View Highlight](https://read.readwise.io/read/01j83ncpgpa765e7ma2yk8264x)) [[journaling/prompt]] ^69db00
Once you start writing, dont stop until you feel there is nothing else to write. This means you should write *everything* down, even if you begin to veer away from the prompt. Dont pay any mind to spelling mistakes, your handwriting and dont edit what ends up on the page. Just write it all out. [View Highlight](https://read.readwise.io/read/01j83nhv221bsrfd0r2fyv08vj))
Prompt: What Am I Afraid Of?
**Use when: You are overcome with worry.** [View Highlight](https://read.readwise.io/read/01j83njt22m4rmjdrv55g4c356)) [[journaling/prompt]] ^beb82a
To journal through your fears, start by writing them out one at a time. Ask yourself what are the worse case scenarios, how they might affect you, and what you would do. Ask yourself how likely it is to happen, why you think it might happen, whether its occurrence would be positive or negative and why. [View Highlight](https://read.readwise.io/read/01j83qra9bkp4fzk2vrzhm0erf))
The anticipation of something is usually much worse than when it actually occurs. This is because before something happens, we cant do anything about it. By journaling through our fears, were doing something proactive and preemptive, which can help us work through our fears rather than letting them fester. [View Highlight](https://read.readwise.io/read/01j83sq982ymg9stz6mxbf4776))
Prompt: Write A Letter That Youll Never Send
**Use when: The thought of someone is making you anxious.** [View Highlight](https://read.readwise.io/read/01j83sqq9zcr1aahr612jqkh2x)) [[journaling/prompt]] ^c261c4
Address the letter to the person you need or want to talk to and say everything you want to say. This prompt will help you organise your thoughts and feelings about this person. You can also be as honest as you need because youre never going to send the letter. [View Highlight](https://read.readwise.io/read/01j83sspweq1e87w1cgb2r1dzd))
If you enjoy letter writing, you could also try a love letter. Write to your younger self (*or your future self!*) and practice being your own best friend. After all, self-love and compassion are also powerful tools for combating chronic anxiety. [View Highlight](https://read.readwise.io/read/01j83stt71p8h0kjdmf24mhpat)) [[journaling/prompt]]
Prompt: Where Am I Right Now?
**Use when: You need to feel grounded.** [View Highlight](https://read.readwise.io/read/01j83svpn19zb9t7k0rch206pr)) [[journaling/prompt]] ^27b8e0
The 5-4-3-2-1 coping technique for anxiety attacks is all about bringing your attention back to the now. ... In your journal, write the following:
• Five things that you see
• Four things that you can touch
• Three things that you can hear
• Two things that you can smell
• One thing that you can taste
Prompt: Why Do I Feel Unwell?
**Use when: Youre feeling agitated, stressed or anxious for no apparent reason.** [View Highlight](https://read.readwise.io/read/01j83syhvp6jy0mvk0q32qhx8a)) [[journaling/prompt]] ^3608de
When Im [so overwhelmed that I cant think](https://www.simplyfiercely.com/overwhelmed-by-life/) about how to care for myself, I turn to my journal. I start with the line *I feel unwell because…* and let my thoughts flow. Answering this question leads me to discover what I need (whether it be rest, connection, or creative expression). By delving into why I feel unwell, I learn what I can do about it, which improves how I care for myself. [View Highlight](https://read.readwise.io/read/01j83t1ryr94dwp6syd3c051ga))
Prompt: How Can This Moment Inform My Future
**Use when: You feel like youve made a mistake.** [View Highlight](https://read.readwise.io/read/01j83t2c2z79vpc1r0kfpmxz6k)) [[journaling/prompt]] ^a59479
Taking time to acknowledge our mistakes, understand why they occurred, and think about how we can make better choices in the future is healthy. [View Highlight](https://read.readwise.io/read/01j83t889905a6az7md4d70z3x))
Mistakes are inevitable and mindfully working through them helps us accept them as part of life and let go of perfectionism. [View Highlight](https://read.readwise.io/read/01j83t97qhrr5fxj9nttkbke0n))
Prompt: I Am Lucky To…
**Use when: You are feeling negative.** [View Highlight](https://read.readwise.io/read/01j83t9evy5zxg8m3qf6r5gkw1)) [[journaling/prompt]] ^fc98ae
Gratitude is one of the healthiest emotions to sit with. It has the power to shift your mindset from scarcity to abundance, which can be helpful when youre feeling stressed or just plain having a bad day. [View Highlight](https://read.readwise.io/read/01j83xxb6jwrvvdrg4a7wmvb5n))
try reflecting on:
• a favourite memory
• your own strengths
• song lyrics or a list of favourite songs
• your greatest lessons
• your biggest supporter
• how you overcame a negative experience in the past [View Highlight](https://read.readwise.io/read/01j83xvwfvcc5tjc4an2a92671))
---
New highlights added at 2024-09-23 7:15 PM
The 5-4-3-2-1 coping technique for anxiety attacks is all about bringing your attention back to the now. ... In your journal, write the following:
• Five things that you see
• Four things that you can touch
• Three things that you can hear
• Two things that you can smell
• One thing that you can taste

View file

@ -0,0 +1,34 @@
# 8 Principles for a Secure Cloud Environment
![rw-book-cover](https://readwise-assets.s3.amazonaws.com/static/images/article4.6bc1851654a0.png)
## Metadata
- Author: [[omerxx@gmail.com]]
- Full Title: 8 Principles for a Secure Cloud Environment
- Category: #articles
- URL: https://omnivore.app/aleidk/8-principles-for-a-secure-cloud-environment-18f1fa5c54d
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=8%20Principles%20for%20a%20Secure%20Cloud%20Environment
> [!tldr]
> On July 15th, 2019, I messed up bad. Real bad. I wanted to finish a project quickly, and show a quick POC to a customer I was working with. To make a long story short, I pushed a container, to a public repo, containing admin credentials to an AWS account.
## Highlights
CISO BS. [View Highlight](https://read.readwise.io/read/01j58cb911jv15qjeccffqxbv1))
> [!note]
> In "8 Principles For a Secure Cloud Environment," the term "CISO" refers to the Chief Information Security Officer, a role responsible for overseeing and ensuring the security of an organization's information and systems. The author implies that some principles may be perceived as excessive or overly cautious, often dismissed as "CISO BS," yet emphasizes their importance based on personal experiences with security incidents. Ultimately, the mention of CISO highlights the necessity of adopting robust security practices to mitigate risks in cloud environments, regardless of differing opinions on their complexity.
Key resources should only be placed in private subnets, effectively isolating them from direct internet access and reducing vulnerability. [View Highlight](https://read.readwise.io/read/01j58ch8xmresvx0x8mty8h37s))
The sharing of SSH keys is a common security pitfall. [View Highlight](https://read.readwise.io/read/01j58ckd7mgrh2b6f6dzmzstz9))
Utilize a dedicated secret manager to securely store and handle access to these sensitive elements, ensuring theyre encrypted and accessible only to those who truly need them. [View Highlight](https://read.readwise.io/read/01j58cm13bxanfd7bxg5th88j4))
Implement a routine where every merge commit is scanned for secret leaks and vulnerabilities using tools like [gitleaks](https://click.convertkit-mail2.com/xmuvr2v7d6h6hr6eg6pc5h03owzllbn/dpheh0h0dwroe6hm/aHR0cHM6Ly9naXRodWIuY29tL2dpdGxlYWtzL2dpdGxlYWtz). Establish strict policies to halt deployments if issues are found in the codebase or in the container images during CI. Dont have a CI in place yet? 1. Do it! 2. Run these locally before EVERY push. [View Highlight](https://read.readwise.io/read/01j58cn5zg2y5dkd0m9emzevtw))
Move away from traditional firewall-based security for accessing internal systems remotely. Instead, adopt a VPN or, ideally, a Zero Trust framework [View Highlight](https://read.readwise.io/read/01j58cq5q1j7w0xcm19cynt6j7))
Regularly reviewing your cloud bills can help you identify unused or forgotten resources and even expose potential security threats. [View Highlight](https://read.readwise.io/read/01j58dr7eagpfs41b1g7cp42fr))
Deploying a WAF can provide a critical defense layer against numerous web-based threats. The default set of rules can cover 80% of randomly sent malicious query attempts which you can then tweak over time to block additional potentially harmful requests. [View Highlight](https://read.readwise.io/read/01j58drvb7t9633re0pfwc567x))
consider deploying containers that lack any form of shell environment. Building your containers with containers starting with `FROM: scratch` ensures that only the essential application binaries are running, thereby hardening your containers against simple intrusion attempts. [View Highlight](https://read.readwise.io/read/01j58dsmfdt50cgke4skb9d4vf))

View file

@ -0,0 +1,17 @@
# A Cyberspace Inquisition #2: Impressions
![rw-book-cover](https://www.adamsdesk.com/assets/img/posts/cyberspace-wormhole.webp)
## Metadata
- Author: [[Adam Douglas]]
- Full Title: A Cyberspace Inquisition #2: Impressions
- Category: #articles
- URL: https://www.adamsdesk.com/posts/a-cyberspace-inquisition-2/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=A%20Cyberspace%20Inquisition%20%232%3A%20Impressions
> [!tldr]
> Navigate cyberspace with me and discover unique content that leave you with impressions and trigger your own inner curiosity to explore and innovate.
## Highlights
(https://sudhir.io/the-big-little-guide-to-message-queues/)
If you have every [View Highlight](https://read.readwise.io/read/01j59rfbd66tv18q7vdpc0brt3))

View file

@ -0,0 +1,35 @@
# A Successful Git Branching Model
![rw-book-cover](http://nvie.com/img/git-model@2x.png)
## Metadata
- Author: [[Vincent Driessen]]
- Full Title: A Successful Git Branching Model
- Category: #articles
- URL: https://nvie.com/posts/a-successful-git-branching-model/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=A%20Successful%20Git%20Branching%20Model
> [!tldr]
> The Git branching model, git-flow, is widely used but can be seen as overly rigid by some teams. It is beneficial for versioned software and managing multiple versions. Git has revolutionized how developers handle branching and merging in version control.
## Highlights
If your team is doing continuous delivery of software, I would suggest to adopt a much simpler workflow (like [GitHub flow](https://guides.github.com/introduction/flow/)) instead of trying to shoehorn git-flow into your team.
If, however, you are building software that is explicitly versioned, or if you need to support multiple versions of your software in the wild, then git-flow may still be as good of a fit to your team as it has been to people in the last 10 years. [View Highlight](https://read.readwise.io/read/01j548q3y82vb6tgpcxkff732r))
We consider `origin/master` to be the main branch where the source code of `HEAD` always reflects a *production-ready* state. [View Highlight](https://read.readwise.io/read/01j548s6wn5tww0q86agt4mc3b))
We consider `origin/develop` to be the main branch where the source code of `HEAD` always reflects a state with the latest delivered development changes for the next release. Some would call this the “integration branch”. This is where any automatic nightly builds are built from. [View Highlight](https://read.readwise.io/read/01j548sbx0chxzjqhbdxbfkd34))
Next to the main branches `master` and `develop`, our development model uses a variety of supporting branches to aid parallel development between team members, ease tracking of features, prepare for production releases and to assist in quickly fixing live production problems. Unlike the main branches, these branches always have a limited life time, since they will be removed eventually.
The different types of branches we may use are:
• Feature branches
• Release branches
• Hotfix branches [View Highlight](https://read.readwise.io/read/01j548v29py8ken2hnj4kqn7d4))
Feature branches (or sometimes called topic branches) are used to develop new features for the upcoming or a distant future release. When starting development of a feature, the target release in which this feature will be incorporated may well be unknown at that point. The essence of a feature branch is that it exists as long as the feature is in development, but will eventually be merged back into `develop` (to definitely add the new feature to the upcoming release) or discarded (in case of a disappointing experiment). [View Highlight](https://read.readwise.io/read/01j548xe9jrd2c98pd2kch582r))
The `--no-ff` flag causes the merge to always create a new commit object, even if the merge could be performed with a fast-forward. This avoids losing information about the historical existence of a feature branch and groups together all commits that together added the feature. Compare: [View Highlight](https://read.readwise.io/read/01j548z6jfdzegbyxqcbw9qzg8))
Release branches support preparation of a new production release. __They allow for last-minute dotting of is and crossing ts. Furthermore, they allow for minor bug fixes and preparing meta-data for a release__ (version number, build dates, etc.). By doing all of this work on a release branch, the `develop` branch is cleared to receive features for the next big release. [View Highlight](https://read.readwise.io/read/01j54919d0891s3web647x0zkt))
Hotfix branches are very much like release branches in that they are also meant to prepare for a new production release, albeit unplanned. __They arise from the necessity to act immediately upon an undesired state of a live production version__. When a critical bug in a production version must be resolved immediately, a hotfix branch may be branched off from the corresponding tag on the master branch that marks the production version. [View Highlight](https://read.readwise.io/read/01j5498mt0tq7m5y0gk06rst3t))

View file

@ -0,0 +1,35 @@
# A guide to design tokens
![rw-book-cover](https://s3.amazonaws.com/www-inside-design/uploads/2021/06/design-tokens-7-1-810x810.png)
## Metadata
- Author: [[invisionapp.com]]
- Full Title: A guide to design tokens
- Category: #articles
- Document Tags: [[design]] [[dev]]
- URL: https://www.invisionapp.com/inside-design/design-tokens/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=A%20guide%20to%20design%20tokens
> [!tldr]
> Design tokens help ensure consistency across different platforms by managing design properties from a single source. They are defined pairs of code and visual properties, like colors and spacing, that can be easily deployed. By using design tokens, teams can streamline updates and maintain a cohesive brand identity without confusion.
## Highlights
if you established a new data layer on top of your existing design elements ... and managed them from a single place, you could use a system to consistently scale it to all platforms.
Essentially, a design token is a design decision: a pairing of the same code and visual properties—design elements you use over and over again in your products—packaged in a format thats deployable across all platforms. [View Highlight](https://read.readwise.io/read/01j7gb6cqqmf343z3g33y56jkb))
Each token will be given **a name** that corresponds to a certain design decision/option and the defined **value.** [View Highlight](https://read.readwise.io/read/01j7gbesf4pcyz7va8f288kq2j))
are an abstraction layer that makes them **platform-agnostic**. [View Highlight](https://read.readwise.io/read/01j7gbf531ycxc49212f6p6f1r))
Before any coding is implemented in DSM or your SSoT, designers and developers must agree on:
• What should be a token
• How those tokens will be used
• How those tokens will be named [View Highlight](https://read.readwise.io/read/01j7gbjas3kb8h0szhxkkj6rss))
For ease of use, its recommended to use Category/Type/Item (CTI) naming conventions to define tokens in a hierarchical tree structure of options and decisions. [View Highlight](https://read.readwise.io/read/01j7gbmfh2rzgrx74f36r0f8s6))
> [!note]
> This seems like a good way to categorize pretty much anything
Alias tokens create a hierarchy of options and decisions to control the scope, or intent, of changes. So lets say you wanted to just change the background color on the buttons. You can create an alias token that reads as an inheritance from the global token as such:
Using the earlier alias example color.background.button.primary the category would be color. Moving down the tree the type would be background, followed by button as the item. [View Highlight](https://read.readwise.io/read/01j7gbshpy8mqhasnve88440mw))

View file

@ -0,0 +1,24 @@
# ACID Databases Atomicity, Consistency, Isolation & Durability Explained
![rw-book-cover](https://www.freecodecamp.org/news/content/images/2024/01/cover-fcc.png)
## Metadata
- Author: [[Daniel Adetunji]]
- Full Title: ACID Databases Atomicity, Consistency, Isolation & Durability Explained
- Category: #articles
- URL: https://www.freecodecamp.org/news/acid-databases-explained/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=ACID%20Databases%20%E2%80%93%20Atomicity%2C%20Consistency%2C%20Isolation%20%26%20Durability%20Explained
> [!tldr]
> ACID (Atomicity, Consistency, Isolation, and Durability) is a set of guarantees provided by database management systems (DBMS). While most popular DBMS offer ACID guarantees, the implementation can vary. Atomicity ensures that all parts of a transaction are completed or none at all. Consistency, or referential integrity, ensures data accuracy and reliability. Isolation guarantees that concurrent transactions do not interfere with each other. Durability ensures that changes made by committed transactions are not lost. These properties are important for maintaining data integrity and fault tolerance in a DBMS.
## Highlights
Consistency in the context of ACID means *consistency in data*, which is defined by the creator of the database. The technical term for consistency in data is called referential integrity. __Referential integrity is a method of ensuring that relationships between tables remain consistent__. It's usually enforced through the use of **foreign keys**. [View Highlight](https://read.readwise.io/read/01j549yzv6a3s4x73cc7qj06rg))
Isolation is a guarantee that concurrently running transactions should not interfere with each other. Concurrency here refers to two or more transactions trying to modify or read the same database record(s) at the same time. [View Highlight](https://read.readwise.io/read/01j54a1g3dka9smm3v4ct09v4d))
In this example, read committed isolation ensures that Marie is not prematurely excluded from buying the burger just because someone else said they wanted it. __Only committed transactions can be read__. Therefore, the burger is available to be ordered as long as no one has paid for it. [View Highlight](https://read.readwise.io/read/01j54a6t2df5kjvy8q4tyhkwas))
A repeatable read guarantees that if a transaction reads a row of data, any subsequent reads of that same row of data within the same transaction will yield the same result, regardless of changes made by other transactions. This consistency is maintained throughout the duration of the transaction. [View Highlight](https://read.readwise.io/read/01j54a7baf7scbgptfwf5a5hgf))
Durability is a guarantee that changes made by a committed transaction must not be lost. All committed transactions must be persisted on durable, non-volatile storage, that is on disk. This ensures that any committed transactions are protected even if the database crashes. [View Highlight](https://read.readwise.io/read/01j54aa01whthekb1jegqsx42w))

View file

@ -0,0 +1,25 @@
# APCA in a Nutshell
![rw-book-cover](https://git.myndex.com/images/APCAresourcesTheWorldIsReading.png)
## Metadata
- Author: [[APCA]]
- Full Title: APCA in a Nutshell
- Category: #articles
- Document Tags: [[design]]
- URL: https://git.apcacontrast.com/documentation/APCA_in_a_Nutshell#use-case--size-ranges
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=APCA%20in%20a%20Nutshell
> [!tldr]
> The Accessible Perceptual Contrast Algorithm (APCA) is a new method for measuring color contrast and improving readability on screens. It provides a more accurate way to assess contrast than the existing WCAG guidelines, focusing on user needs and different text sizes. APCA includes various levels of contrast to help designers create more accessible content, especially for body text and large elements.
## Highlights
Use-Case & Size Ranges
These general levels are appropriate for use by themselves, without the need to reference a lookup table. APCA reports contrast as an Lc value (lightness contrast) from **Lc 0** to **Lc 105+**. For accessibility, consider Lc 15 the point of invisibility for many users, and Lc 90 as preferred for body text.
**Lc 90** • Preferred level for fluent text and columns of body text with a font no smaller than 18px/weight 300 or 14px/weight 400 (normal), or non-body text with a font no smaller than 12px/400. Also a recommended minimum for extremely thin fonts with a minimum of 24px at weight 200. Lc 90 is a *suggested maximum* for **very large and bold fonts** (greater than 36px bold), and large areas of color. Small fonts do not have a maximum.
**Lc 75** • The *minimum* level for columns of body text with a font no smaller than 24px/300 weight, 18px/400, 16px/500 and 14px/700. This level may be used with non-body text with a font no smaller than 15px/400. Also, Lc 75 should be considered a minimum for larger for any larger text where readability is important.
**Lc 60** • The *minimum* level recommended for content text that is not body, column, or block text. In other words, text you want people to read. The minimums: no smaller than 48px/200, 36px/300, 24px normal weight (400), 21px/500, 18px/600, 16px/700 (bold). These values based on the reference font Helvetica. To use these sizes as body text, add Lc 15.
**Lc 45** • The *minimum* for larger, heavier text (36px normal weight or 24px bold) such as headlines, and large text that should be fluently readable but is not body text. This is also the minimum for pictograms with fine details, or smaller outline icons.
**Lc 30** • The *absolute minimum* for any text not listed above, including text considered as “spot readable”. This includes placeholder text and disabled element text, and some non-content like a copyright bug. This is also the minimum for large/solid semantic & understandable non-text elements such as “mostly solid” icons or pictograms. Generally no less than 5.5px solid in its smallest dimension.
**Lc 15** • The *absolute minimum* for any non-semantic non-text that needs to be *discernible*, and is no less than 5px (solid) in its smallest dimension. This may include dividers, and in *some* cases large buttons or thick focus-visible outlines, but does *not* include fine details which have a higher minimum. **Designers should treat anything below this level as invisible**, as it will not be visible for many users. This minimum level should be avoided for any items important to the use, understanding, or interaction of the site.
These define the basic minimum levels, what you might think of as AA in the old WCAG 2. For the equivelent to AAA, simply increase the contrast values by Lc 15. [View Highlight](https://read.readwise.io/read/01j80shgn3ccehc3qxw0at9gsz))

View file

@ -0,0 +1,32 @@
# All You Need Is Data and Functions
![rw-book-cover](https://readwise-assets.s3.amazonaws.com/static/images/article1.be68295a7e40.png)
## Metadata
- Author: [[mckayla.blog]]
- Full Title: All You Need Is Data and Functions
- Category: #articles
- Document Tags: [[dev]] [[star]]
- URL: https://mckayla.blog/posts/all-you-need-is-data-and-functions.html
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=All%20You%20Need%20Is%20Data%20and%20Functions
> [!note]
> **Background:** I would like to implement the ideas from "All you need is data and functions" by mckayla.blog in my programming project.
> ### Key Takeaways:
> 🛠️ **Emphasize Type Over Traits:** Instead of relying on traits, create a data-type that encapsulates the desired behavior. Then, implement a conversion function to transform your data-type into the trait-type when needed.
> 🔄 **Utilize Implicit Conversions:** Understand that trait-types allow for implicit conversions, which can simplify your code. This means the language can handle the transformation from your data-type to the trait-type automatically, reducing boilerplate and improving readability.
> 📜 **Represent Traits with Types:** Recognize that traits can be viewed as types themselves. For example, a Display trait can be represented by a String type alongside a function that converts your original type into a String, enabling clearer and more direct handling of type-specific logic.
> ---
> 1. How does the omission of traits in Gleam influence the way developers approach generic programming compared to languages like Rust?
> 2. In what ways might the simplicity of Gleam's design, focusing on data and functions, lead to both advantages and disadvantages in software development?
> 3. How does Gleam's approach to immutability and function-based programming compare with the mutable state and trait systems commonly found in other languages?
> [!tldr]
> The document explores the concept of traits in programming languages, using the example of the Gleam language. Traits are compared to types and functions, emphasizing how traits can be represented and achieved through types and functions. The discussion covers examples from Rust and Gleam to illustrate how traits can be replaced by types and functions in a language like Gleam, where simplicity and low concept count are valued. The document concludes that data and functions can effectively replace the need for traits, particularly in languages like Gleam.
## Highlights
**traits are just types**. Our `Display` trait in this example, can be represented by the `String` type, and a function which converts from our original type to a `String`. [View Highlight](https://read.readwise.io/read/01j6axgxbj76x7jbz4zsc45tdv))
The biggest difference between most trait/interface systems and trait-types is that the language is essentially doing implicit conversions for you, from your data-type to the trait-type. [View Highlight](https://read.readwise.io/read/01j6ccvpskph772e8r479esbq4))
Instead of a trait, just make a type that implements the generic behavior you want, and then write a function to convert your data-type into your trait-type. If you need some data-type specific logic, then pass around functions as necessary (usually from your conversion function). [View Highlight](https://read.readwise.io/read/01j6ccz00s0t2aydshas3xw962))

View file

@ -0,0 +1,41 @@
# Best Practices for Maintainers
![rw-book-cover](https://opensource.guide/assets/images/cards/best-practices.png)
## Metadata
- Author: [[Open Source Guides]]
- Full Title: Best Practices for Maintainers
- Category: #articles
- Document Tags: [[dev]]
- URL: https://opensource.guide/best-practices/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Best%20Practices%20for%20Maintainers
> [!tldr]
> Maintaining a popular open source project involves more than just coding; it requires effective communication and managing contributions. It's important to set clear expectations for your time and the types of contributions you accept, while also being kind and responsive to contributors. Taking breaks and prioritizing your own happiness is essential for the long-term success of the project.
## Highlights
Written and enforced fairly, however, good rules empower maintainers. They prevent you from getting dragged into doing things you dont want to do. [View Highlight](https://read.readwise.io/read/01j59endsw1rpkb9tf8m8qawvj))
Dont forget to document your interactions, too. Wherever you can, keep communication about your project public. If somebody tries to contact you privately to discuss a feature request or support need, politely direct them to a public communication channel, such as a mailing list or issue tracker. [View Highlight](https://read.readwise.io/read/01j59eq13dn3wga93d01tnfqmy))
Having everything written down, however, helps depersonalize situations when you do need to enforce your rules.
Saying no isnt fun, but *“Your contribution doesnt match this projects criteria”* feels less personal than *“I dont like your contribution”*. [View Highlight](https://read.readwise.io/read/01j59eskv2qw7f8cfrkz5g3rvt))
The key to handling support for large-scale open source projects is to keep issues moving. Try to avoid having issues stall. If youre an iOS developer you know how frustrating it can be to submit radars. You might hear back 2 years later, and are told to try again with the latest version of iOS. [View Highlight](https://read.readwise.io/read/01j59ezaxynf5z61amr95w7x7m))
I cater to the 80% use case. If you are one of the unicorns, please fork my work. I wont get offended! My public projects are almost always meant to solve the most common problems; I try to make it easy to go deeper by either forking my work or extending it. [View Highlight](https://read.readwise.io/read/01j59ftzzkh4m5fkbbgse1qs8y))
Its almost inevitable that once a project becomes big, maintainers have to become a lot more conservative about how they introduce new code. You become good at saying “no”, but a lot of people have legitimate needs. So, instead you end up converting your tool into a platform. [View Highlight](https://read.readwise.io/read/01j59fw4nd6sjdfxwtxgbn89zy))
I believe that tests are necessary for all code that people work on. If the code was fully and perfectly correct, it wouldnt need changes we only write code when something is wrong, whether thats “It crashes” or “It lacks such-and-such a feature”. And regardless of the changes youre making, tests are essential for catching any regressions you might accidentally introduce. [View Highlight](https://read.readwise.io/read/01j59fyszkgtfzj58msft420j5))
There are a [variety of tools available](https://github.com/showcases/tools-for-open-source) to help automate some aspects of maintenance work. A few examples:
• [semantic-release](https://github.com/semantic-release/semantic-release) automates your releases
• [mention-bot](https://github.com/facebook/mention-bot) mentions potential reviewers for pull requests
• [Danger](https://github.com/danger/danger) helps automate code review
• [no-response](https://github.com/probot/no-response) closes issues where the author hasnt responded to a request for more information
• [dependabot](https://github.com/dependabot) checks your dependency files every day for outdated requirements and opens individual pull requests for any it finds [View Highlight](https://read.readwise.io/read/01j59g05hnrn42hj1ey8s0cjhe))
Burnout is a real and pervasive issue in open source work, especially among maintainers. As a maintainer, your happiness is a non-negotiable requirement for the survival of any open source project. [View Highlight](https://read.readwise.io/read/01j59g44y47gfp6bexny1cf077))
In maintaining WP-CLI, Ive discovered I need to make myself happy first, and set clear boundaries on my involvement. The best balance Ive found is 2-5 hours per week, as a part of my normal work schedule. This keeps my involvement a passion, and from feeling too much like work. Because I prioritize the issues Im working on, I can make regular progress on what I think is most important. [View Highlight](https://read.readwise.io/read/01j59g63w7h9j6krg5wpjh40ap))

View file

@ -0,0 +1,39 @@
# Building a Second Brain - Tags
![rw-book-cover](https://m.media-amazon.com/images/I/71jhK9zsKEL.jpg)
## Metadata
- Author: [[Tiago Forte]]
- Full Title: Building a Second Brain - Tags
- Category: #articles
- Document Tags: [[notetaking]] [[productivity]]
- URL: https://readwise.io/reader/document_raw_content/2217137
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Building%20a%20Second%20Brain%20-%20Tags
> [!tldr]
> Creating a universal tagging system for notes is impractical and can lead to frustration. Instead, tags should be used to track the progress and purpose of notes, focusing on actionable use cases. Start small with simple organization methods and apply tags retroactively as needed to maintain clarity and motivation.
## Highlights
The goal of all these endeavors was to create a system of classification known as a “taxonomy” that every piece of knowledge could be placed into. [View Highlight](https://read.readwise.io/read/01j6hh4c8747s1xrb59f93826q))
Like Pandoras Box, once we begin to apply tags it can be incredibly tempting to start labeling each and every note ... Building a Second Brain: Chapter 11 | buildingasecondbrain.com understand what we are trying to use our notes to accomplish to avoid the trap of “tagging for the sake of tagging.”
There are three practical approaches to tagging you can use as your Second Brain grows and matures. Each one follows the principle of actionability and answers an important question about the purpose of a given note: 1. Create personalized tags for your use cases. (How will my notes be used?) 2. Use tags to track the progress of notes. (How are my notes currently being used?) 3. Tag notes retroactively and only as needed. (How have my notes been used?) [View Highlight](https://read.readwise.io/read/01j6hhjytn42dbdcgskyjrr74q))
if you already know how your notes are likely to be used such as for citations in a paper [Source], as evidence in a trial [Evidence], or as slides in a presentation [Slides] it can be helpful to tag your notes according to those use cases. [View Highlight](https://read.readwise.io/read/01j6hhp4pghcnk2r4z4r95n287))
Ask yourself, “What are the most common use cases for the content I capture?” Here are a couple common examples: • Tagging according to the final product a note will be used in: [Presentation], [Essay], [Report], [Website], [Project plan], [Meeting agenda], or [Budget]
• Tagging according to the kind of information a note contains: [Arguments], [Theories], [Frameworks], [Evidence], [Claim], [Counterpoint], or [Question] [View Highlight](https://read.readwise.io/read/01j6hhwgwga3a4t0bm9p3t12y6))
tags to track the progress of their notes: • Tagging according to its role in a project: [Meeting notes], [Timeline], [Budget], [Decision], [Action], [Idea], or [Objective]
• Tagging according to the current stage of their workflow: [Planned], [In process], [Waiting for approval], [Reviewed], [Approved], [On hold], or [Finished] [View Highlight](https://read.readwise.io/read/01j6hj21kk7kmc7c4f40hg3004))
These kinds of tags arent about the contents of a note. They are about its context specifically, the context in which it is being used. Since [View Highlight](https://read.readwise.io/read/01j6hj2t79v8mg6rey564bm350))
We didnt want to move her existing notes from their respective PARA folders, but we did want to be able to see all the notes related to “writing job descriptions” or “reviewing applications” in one place with a quick search. This is the perfect situation for tags: when you want a different way of “viewing” your notes, without having to [View Highlight](https://read.readwise.io/read/01j6hj859j9vyq735n7t634791))
Building a Second Brain: Chapter 11 | buildingasecondbrain.com undertake a massive reorganization of your entire system. [View Highlight](https://read.readwise.io/read/01j6hj84vq0hfy5rtaxw7nk0wa))
Instead of applying tags when you first capture content, I recommend applying them when its time to use it. Often, the ideal moment is when you are getting ready to start a new project. When you apply tags with a specific use case in mind, the tags you come up with will be far more concrete and actionable. And you will have the motivation to do the work of adding them because of the immediate needs of the project you are taking on. [View Highlight](https://read.readwise.io/read/01j6hjb00pwcgt92e9ek7ad2p7))
using tags in this way means its perfectly fine to skip adding tags altogether if you dont feel like it. ... This eliminates the frustrating experience of trying to force yourself to think of a tag for a note, even when nothing comes to mind, because you fear that otherwise it will be lost forever. Even if no tags are applied, the note will always be right in the folder where you left it.

View file

@ -0,0 +1,38 @@
# Caching vs Content Delivery Networks What's the Difference?
![rw-book-cover](https://www.freecodecamp.org/news/content/images/2024/02/Conducting-Research-Projects-Educational-Presentation-in-Pink-and-Yellow-Colorful-Line-Style-1.jpg)
## Metadata
- Author: [[anamika.ahmed.792]]
- Full Title: Caching vs Content Delivery Networks What's the Difference?
- Category: #articles
- URL: https://www.freecodecamp.org/news/caching-vs-content-delivery-network/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Caching%20vs%20Content%20Delivery%20Networks%20%E2%80%93%20What%27s%20the%20Difference%3F
> [!tldr]
> In the world of network optimization, Content Delivery Networks (CDNs) and caching are essential for enhancing website performance and user experience. Caching involves temporarily storing frequently accessed data to reduce response times, while CDNs use a network of servers to deliver web content more efficiently. Both methods aim to improve performance, optimize resource utilization, and enhance user experience. Caching is ideal for frequently accessed static content, while CDNs excel at delivering content globally, especially dynamic content and media. Combining caching and CDNs can offer optimal results, particularly for websites with a mix of static and dynamic content.
## Highlights
Caching is a technique used to store copies of frequently accessed data temporarily. The cached data can be anything from web pages and images to database query results. When a user requests cached content, the server retrieves it from the cache instead of generating it anew, significantly reducing response times. [View Highlight](https://read.readwise.io/read/01j5rvjkrkd34kjh984axnab87))
What to Consider When Implementing a Cache SystemDecide When to Use a Cache:
• A cache is best for frequently read but infrequently modified data.
• Cache servers are not suitable for storing critical data as they use volatile memory.
• Important data should be stored in persistent data stores to prevent loss in case of cache server restarts. [View Highlight](https://read.readwise.io/read/01j5rvj1mdcbaqnj0e9n2vnw3v))
In technical terms, a CDN is a network of servers distributed across various locations globally. Its primary purpose is to deliver web content, such as images, videos, scripts, and stylesheets to users more efficiently by reducing the physical distance between the server and the user. [View Highlight](https://read.readwise.io/read/01j5rvrwx5kh2fpqwfpnvxeqd9))
What to Consider When Implementing a CDN
**Cost Management**: CDNs charge for data transfers. Its wise to cache frequently accessed content, but not everything.
**Cache Expiry**: Set appropriate cache expiry times. Too long, and content might be stale. Too short, and it strains origin servers.
**CDN Fallback**: Plan for CDN failures. Ensure your website can switch to fetching resources directly from the origin if needed.
**Invalidating Files**: You can remove files from the CDN before they expire using various methods provided by CDN vendors. [View Highlight](https://read.readwise.io/read/01j5rvvgawfs37758cbyyz9g69))
In fact, studies show that CDNs can ****reduce video startup time by up to 50%****, making a significant difference in user satisfaction. [View Highlight](https://read.readwise.io/read/01j5rvxqm29rk1kwr36j6m9nmp))
Caching is ideal for frequently accessed content that doesn't change frequently. This includes static assets like images, CSS files, and JavaScript libraries.
It's particularly effective for websites with a substantial user base accessing similar content, such as news websites, blogs, and e-commerce platforms. [View Highlight](https://read.readwise.io/read/01j5rw4q49kh725b3er30axw9q)) [[dev]] [[favorite]]
CDNs are invaluable for delivering content to a global audience, especially when geographical distance between users and origin servers leads to latency issues.
They are well-suited for serving dynamic content, streaming media, and handling sudden spikes in traffic.
CDNs also excel in scenarios where content needs to be delivered reliably and consistently across diverse geographic regions, ensuring optimal user experience regardless of location. [View Highlight](https://read.readwise.io/read/01j5rw5x54n9bs6qg1mygc0vd9))

View file

@ -0,0 +1,37 @@
# Code-Splitting for Libraries—bundling for NPM With Rollup 1.0
![rw-book-cover](https://miro.medium.com/v2/resize:fit:1200/1*BZ4p60HENosEjyZfQgjsRQ.jpeg)
## Metadata
- Author: [[Lukas Taegert]]
- Full Title: Code-Splitting for Libraries—bundling for NPM With Rollup 1.0
- Category: #articles
- Document Tags: [[dev]] [[dev/javascript]]
- URL: https://levelup.gitconnected.com/code-splitting-for-libraries-bundling-for-npm-with-rollup-1-0-2522c7437697
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Code-Splitting%20for%20Libraries%E2%80%94bundling%20for%20NPM%20With%20Rollup%201.0
> [!tldr]
> Rollup 1.0 introduces code-splitting as a key feature for bundling JavaScript libraries. The article explains how to create an efficient library called "fancy-case" that allows users to import specific utility functions while offering multiple formats for different environments. It highlights the benefits of using ES modules and provides guidance on configuring Rollup for optimal performance.
## Highlights
CommonJS module for Node
This is probably the most important target. This allows Node users and legacy bundlers to import your library as a [CommonJS module](http://wiki.commonjs.org/wiki/Modules/1.1.1) via [View Highlight](https://read.readwise.io/read/01j864mhazhr25k1zh6ngzn2x8))
Single bundle to be used in a script tag
The “traditional way” of distributing JavaScript may still be interesting for small, hand-crafted sites with minimal setup. The bundle creates a global variable via which its exports can be accessed. [View Highlight](https://read.readwise.io/read/01j864mcsdtwp63pehyqf3cex6))
AMD module to be used with an AMD loader
There are still quite a few [AMD/RequireJS](https://requirejs.org/) based projects out there. We can distribute a file that can itself be used as a dependency of an AMD module. [View Highlight](https://read.readwise.io/read/01j864mvbta1gpk2n5rptm0m5z))
ES module for modern bundlers
[ECMAScript modules](http://exploringjs.com/es6/ch_modules.html) are now the official, standardized JavaScript module format. [View Highlight](https://read.readwise.io/read/01j864n23372ch1nkz5xrxwqp2))
Direct imports for CJS or ESM consumers
An emerging new pattern especially for libraries with many independent utility functions is to allow users to import independent parts of the library from separate files. Node users could write
const upper = require(**'fancy-case/cjs/upper'**);
console.log(upper('some Text'));
while ESM consumers could write
import upper from **'fancy-case/esm/upper'**;
console.log(upper('some Text')); [View Highlight](https://read.readwise.io/read/01j864p33y06v43pdzwxrgksxg))
Rollup supports a special output format called a [“Universal Module Definition”](https://github.com/umdjs/umd), which simultaneously supports the CJS, script tag, and ESM use cases. To create it, add a new file called `rollup.config.js` to the root of your project [View Highlight](https://read.readwise.io/read/01j864rhxg10v4kb7fnf2a869x))

View file

@ -0,0 +1,21 @@
# Coding and ADHD - ADHD Brains
![rw-book-cover](https://res.cloudinary.com/practicaldev/image/fetch/s--BliSrKEI--/c_imagga_scale,f_auto,fl_progressive,h_500,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ri1ahc6zfstekngl1ejg.png)
## Metadata
- Author: [[DEV Community 👩‍💻👨‍💻]]
- Full Title: Coding and ADHD - ADHD Brains
- Category: #articles
- URL: https://dev.to/abbeyperini/coding-and-adhd-adhd-brains-im1
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Coding%20and%20ADHD%20-%20ADHD%20Brains
> [!tldr]
> The author shares their experience of having ADHD and how it affects their coding abilities. They describe struggles with focus and attention but also highlight the excitement and stimulation coding provides. The piece will explore strategies for managing ADHD challenges in programming while acknowledging the potential benefits of ADHD in a development role.
## Highlights
Rather than "Attention-Deficit," it should be called something like "Attention-Regulation" or "Executive Function" / Hyperactivity Disorder. [View Highlight](https://read.readwise.io/read/01j9ynfj6cn6zz3nf53v9t6g6z))
novelty [View Highlight](https://read.readwise.io/read/01j9ynk79n34t53r0qkb6de9w1))
> [!note]
> Novelty: The quality of being new, original, or unusual, often evoking interest or excitement. In psychology and marketing, novelty is associated with the human desire for variety and stimulation, influencing behavior and preferences. Novelty can enhance experiences, making them more memorable and enjoyable, as well as motivating individuals to seek out new products, ideas, or experiences. In various contexts, such as art, technology, and consumer goods, novelty plays a key role in innovation and cultural trends.
> In the context of "Coding and ADHD - ADHD Brains," the term "novelty" refers to the appeal of new and interesting challenges that stimulate the brains of individuals with ADHD. This drive for novelty helps such individuals engage deeply with coding, as they are often drawn to the constant learning and problem-solving that comes with tackling new tasks. The pursuit of novel experiences can lead to significant achievements, but it also contributes to a tendency to start many projects without finishing them.

View file

@ -0,0 +1,20 @@
# Currying - Writing Sophisticated Functional Code
![rw-book-cover](https://i.ytimg.com/vi/Q01LEKKrTmA/maxresdefault.jpg)
## Metadata
- Author: [[Coding with Yalco]]
- Full Title: Currying - Writing Sophisticated Functional Code
- Category: #articles
- URL: https://www.youtube.com/watch?v=Q01LEKKrTmA
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Currying%20-%20Writing%20Sophisticated%20Functional%20Code
> [!tldr]
> #FunctionalProgramming #Coding #Programming
In this video, we look at one of the representative techniques of functional programming, currying. Currying is a coding method that breaks down tasks that should be performed at once into multiple stages. To explain this, we use a function that makes a sandwich as an example, where a traditional function handles the three ingredients (bread, meat, vegetables) of a sandwich all at once, but Currying divides this process into each ingredient, or argument. This allows for the execution of functions in divided stages. By doing this, one advantage is that the original process can be diversely branched into multiple stages and branches for each ingredient. This video provides a detailed code example and explanation of this. In the next video, we're going to look at monads, one of the most challenging topics in functional programming.
## Highlights
Currying is a coding method that  allows you to break down tasks that   used to be done at once into multiple steps [View Highlight](https://read.readwise.io/read/01j9rca7zb81g8vzbx7n2xj22e))
A function created with  Currying executes like this.  As you can see, it gets executed  individually as many times as the number   of arguments the original function had. [View Highlight](https://read.readwise.io/read/01j9rcc05k5d11mf16szvrs8y3))

View file

@ -0,0 +1,22 @@
# Dependency Injection, the Best Pattern
![rw-book-cover](https://i.ytimg.com/vi/J1f5b4vcxCQ/maxresdefault.jpg)
## Metadata
- Author: [[CodeAesthetic]]
- Full Title: Dependency Injection, the Best Pattern
- Category: #articles
- URL: https://www.youtube.com/watch?v=J1f5b4vcxCQ
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Dependency%20Injection%2C%20the%20Best%20Pattern
> [!tldr]
> The text explains how to use dependency injection to build an attachment service that uploads files. By creating an interface for storage and injecting it into the request handler, the code becomes simpler and less error-prone. This approach also allows for easy testing with mock implementations.
## Highlights
have a piece of code which uses another piece of code, and instead of using that code directly, it's passed in instead. [View Highlight](https://read.readwise.io/read/01j8b4fbn7xc4day63pshpds1t))
Injection basically just lets us pick and choose from our compatible puzzle pieces and then slot them in when we need them. [View Highlight](https://read.readwise.io/read/01j8b51ysp8pj6g1sk4cc94qzp))
We can use injection to inject fake or mock implementations instead, which basically means we can slice and dice up our architecture to isolate sections of code during testing. [View Highlight](https://read.readwise.io/read/01j8b54d9xcz7p57m37apc92xm))
A natural side effect of having nice code is that it's easy to test without needing to hack around the code structure. If you find yourself asking, how can I test a private method? Or I need to set some internal variable in order to test. That's a signal that you maybe need to pull some stuff out, that you need to isolate some part of it by separating it and injecting it instead. [View Highlight](https://read.readwise.io/read/01j8b57129cky28vhfsq2fd38y))

View file

@ -0,0 +1,31 @@
# Design Systems 101: What Is a Design System?
![rw-book-cover](https://cdn.sanity.io/images/599r6htc/localized/f88e32e02cb892585c56edd61a160822fd134a5e-1200x630.png?w=1200&q=70&fit=max&auto=format)
## Metadata
- Author: [[Figma]]
- Full Title: Design Systems 101: What Is a Design System?
- Category: #articles
- Document Tags: [[design]]
- URL: https://www.figma.com/blog/design-systems-101-what-is-a-design-system/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Design%20Systems%20101%3A%20What%20Is%20a%20Design%20System%3F
> [!tldr]
> A design system is a collection of standards and components that ensures consistency and efficiency in digital products. It helps designers work faster by providing reusable elements, allowing them to focus on more complex challenges. Implementing a design system can improve collaboration and streamline workflows across teams, making the design process smoother.
## Highlights
a design system is a set of building blocks and standards that help keep the look and feel of products and experiences consistent. [View Highlight](https://read.readwise.io/read/01j7gbyb49nhm0t495h8wwakph))
While both are integral to design systems, component libraries focus on UI elements like buttons and input fields, whereas pattern libraries address broader design solutions like navigation flows or data display. [View Highlight](https://read.readwise.io/read/01j7gc0j368sfxwsseakv52kky))
While often used interchangeably, design systems are more holistic, including coding standards and usability, while a style guide is a subset focusing primarily on visual elements like colors, typography, and imagery. [View Highlight](https://read.readwise.io/read/01j7gc2ge1rj1tzkkmz150837e))
> [!note]
> Holistic: An approach that considers the entirety of a system or concept rather than focusing on individual components in isolation. In various fields, including medicine, education, and design, holistic perspectives emphasize the interconnectedness and interdependence of elements, advocating for comprehensive solutions that address the whole rather than just parts. This methodology often leads to more effective and sustainable outcomes by recognizing how components influence one another within a larger context.
> ---
> Styles guides focus only on visuals meanwhile design systems care about usability as a whole
Design systems support designers by solving for repeatable patterns and freeing them up to solve other challenges. [View Highlight](https://read.readwise.io/read/01j7gd50z8w8q8x5qc40hmx2yk))
![](https://cdn.sanity.io/images/599r6htc/regionalized/876225f41a3f420c161b8b2dc62aa018f88fb73a-1080x864.png?w=390&q=75&fit=max&auto=format&dpr=2) [View Highlight](https://read.readwise.io/read/01j7gdbmnzscxkqtkbjndqecaa))
![](https://cdn.sanity.io/images/599r6htc/regionalized/8843a69171ad6e0d84aa973d3505d6d5045e2b1c-2063x1419.png?w=804&q=75&fit=max&auto=format&dpr=2) [View Highlight](https://read.readwise.io/read/01j7gdbt1d0mvvc58jfhg57t03))

View file

@ -0,0 +1,22 @@
# Developer With ADHD? Youre Not Alone.
![rw-book-cover](https://stackoverflow.blog/wp-content/uploads/2017/03/cropped-SO_Logo_glyph-use-this-one-smaller-32x32.jpg)
## Metadata
- Author: [[Eira May]]
- Full Title: Developer With ADHD? Youre Not Alone.
- Category: #articles
- URL: https://stackoverflow.blog/2023/12/26/developer-with-adhd-youre-not-alone/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Developer%20With%20ADHD%3F%20You%E2%80%99re%20Not%20Alone.
> [!tldr]
> There is a connection between programming and ADHD, as many developers with ADHD feel that their job is a perfect fit for how they think and approach problems. Coding provides the kind of stimulation that ADHD brains crave, and it rewards a state of hyperfocus, which is a symptom of ADHD. However, ADHD can also present challenges such as inattentive mistakes and missed deadlines. It is important to have an open dialogue about ADHD and other forms of neurodiversity in order to combat stigma and create psychologically safe environments in the tech industry.
## Highlights
Many developers with ADHD feel their job is a perfect fit for how they think and approach problems. “Coding can give ADHD brains exactly the kind of stimulation they crave,” [explains](https://dev.to/abbeyperini/coding-and-adhd-adhd-brains-im1) full-stack developer Abbey Perini. “Not only is coding a creative endeavor that involves constantly learning new things, but also once one problem is solved, theres always a brand new one to try.” [View Highlight](https://read.readwise.io/read/01j6pxdgk8q9zpq1a1dmjf050g))
coding can reward and encourage a state of [hyperfocus](https://health.clevelandclinic.org/hyperfocus-and-adhd/): a frequently cited symptom of ADHD that developer [Neil Peterson](https://adapthd.com/topics/coping-strategies/programming-with-adhd-the-good-the-bad-and-the-hyperfocus/) calls “a state of laser-like concentration in which distractions and even a sense of passing time seem to fade away.” Its easy to draw parallels between hyperfocus and the [flow state](https://stackoverflow.blog/2022/09/14/what-science-says-about-flow-state/), a distraction-free groove in which programmers, writers, musicians, artists, and other creators produce their best work (occasionally while forgetting to eat). [View Highlight](https://read.readwise.io/read/01j6pxkb2v38syn1hs3tw6exyk))
ADHD can make people more vulnerable to inattentive mistakes, missed deadlines, or unfinished projects. A perennial question on Reddit is [some variation](https://www.reddit.com/r/learnprogramming/comments/kftc4g/any_programmers_with_adhd/) of “Programmers with ADHD, how do you stay on track?” [View Highlight](https://read.readwise.io/read/01j6pxt1ppawyk5bfb7yqbb4cs))
> [!note]
> Inattentive mistakes: Errors that occur when an individual fails to fully focus on a task, often resulting in oversights or miscalculations. These mistakes can stem from distractions, fatigue, or cognitive overload, and are frequently associated with conditions such as Attention Deficit Hyperactivity Disorder (ADHD). Inattentive mistakes may manifest as missed deadlines, incomplete work, or simple errors in judgment, highlighting the importance of attention and concentration in effective task management.

View file

@ -0,0 +1,17 @@
# Embedded Rust Setup Explained
![rw-book-cover](https://i.ytimg.com/vi/TOAynddiu5M/maxresdefault.jpg)
## Metadata
- Author: [[The Rusty Bits]]
- Full Title: Embedded Rust Setup Explained
- Category: #articles
- URL: https://www.youtube.com/watch?v=TOAynddiu5M
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Embedded%20Rust%20Setup%20Explained
> [!tldr]
> The video explains how to set up an environment for embedded software development using Rust. It covers installing the Rust toolchain, configuring VS Code, and compiling code for microcontrollers. The tutorial also discusses debugging techniques and tools needed for embedded Rust projects.
## Highlights
to specify a different Target in Rust C is through a Target triple this is composed of a core and sub architecture an
optional vendor and or operating system and an environment or AB [View Highlight](https://read.readwise.io/read/01j7qyvme91v6h3mqqva4s9nm6))

View file

@ -0,0 +1,23 @@
# Five Terminal Applications I Can't Live Without
![rw-book-cover](https://readwise-assets.s3.amazonaws.com/static/images/article1.be68295a7e40.png)
## Metadata
- Author: [[DevOps Toolbox]]
- Full Title: Five Terminal Applications I Can't Live Without
- Category: #articles
- Document Tags: [[cli-tools]]
- URL: https://omnivore.app/aleidk/five-terminal-applications-i-can-t-live-without-19137768dab
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Five%20Terminal%20Applications%20I%20Can%27t%20Live%20Without
> [!tldr]
> We all love the terminal. But what if I told you that some of the most powerful security tools are slo available, right at your fingertips, within your familiar terminal?
## Highlights
[age](https://click.convertkit-mail2.com/5qulodl26mb7hv6oe4vf6h94xo444tn/qvh8h7hrpoermrbl/aHR0cHM6Ly9naXRodWIuY29tL0ZpbG9Tb3R0aWxlL2FnZQ==) is a simple, modern file encryption tool thats perfect for quickly securing sensitive data. Whether youre using keys or passwords, age makes file encryption a breeze. [View Highlight](https://read.readwise.io/read/01j544wrjfxa9s9bfvp3nww6hh)) [[cli-tools]]
[sshs](https://click.convertkit-mail2.com/5qulodl26mb7hv6oe4vf6h94xo444tn/g3hnh5h3w6g38mhr/aHR0cHM6Ly9naXRodWIuY29tL3F1YW50dW1zaGVlcC9zc2hz) is a terminal user interface for SSH that takes the pain out of managing multiple server connections. It picks up your SSH config and presents your servers in a neat, easy-to-navigate list. [View Highlight](https://read.readwise.io/read/01j544yqsb0j8442d97546tgyy)) [[cli-tools]]
[atac](https://click.convertkit-mail2.com/5qulodl26mb7hv6oe4vf6h94xo444tn/9qhzhnhprz4pvzc9/aHR0cHM6Ly9naXRodWIuY29tL0p1bGllbi1jcHNuL0FUQUM=) (Arguably a terminal API client) brings the power of Postman to your command line. Its perfect for testing and debugging API endpoints without leaving your terminal. [View Highlight](https://read.readwise.io/read/01j544zs5250tst193evsrth2c)) [[cli-tools]]
[portal](https://click.convertkit-mail2.com/5qulodl26mb7hv6oe4vf6h94xo444tn/48hvhehr86wrdwtx/aHR0cHM6Ly9naXRodWIuY29tL1NwYXRpdW1Qb3J0YWUvcG9ydGFs) is a sleek file transfer utility that works in your terminal. It makes sending files between computers secure and straightforward. [View Highlight](https://read.readwise.io/read/01j5450tnt3tjstzyn3tzs4xyx)) [[cli-tools]]

View file

@ -0,0 +1,69 @@
# GitHub - SanderMertens/ecs-faq: Frequently asked questions about Entity Component Systems
![rw-book-cover](https://opengraph.githubassets.com/9f38bac900ccebd3e7025142dc959fe140bdc3ea93f156cb20fc5c1cf7f5b193/SanderMertens/ecs-faq)
## Metadata
- Author: [[https://github.com/SanderMertens/]]
- Full Title: GitHub - SanderMertens/ecs-faq: Frequently asked questions about Entity Component Systems
- Category: #articles
- Document Tags: [[dev]] [[dev/design-patterns]]
- URL: https://github.com/SanderMertens/ecs-faq
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=GitHub%20-%20SanderMertens/ecs-faq%3A%20Frequently%20asked%20questions%20about%20Entity%20Component%20Systems
> [!tldr]
> ECS promotes code reusability by separating data from behavior through entities, components, and systems. ECS is a design pattern that can be implemented in various ways with different tradeoffs. Reading existing ECS resources and experimenting with different approaches can help understand and implement ECS applications effectively.
## Highlights
EC frameworks, as typically found in game engines, are similar to ECS in that they allow for the creation of entities and the composition of components. However, in an EC framework, components are classes that contain both data and behavior, and behavior is executed directly on the component. [View Highlight](https://read.readwise.io/read/01j91jpa60m0gseet7h0ve558p))
users have reported that once ECS "clicked", it made it easier to write, reuse and scale code. [View Highlight](https://read.readwise.io/read/01j91jreb2rx3n0s4kjegsf23p))
Because of its small set of concepts and rules, building a functional ECS is not hard. There are many benefits to building your own, like the freedom to add new features, and only building features that you really need. [View Highlight](https://read.readwise.io/read/01j91jvvay1c66e7124rbpvff6))
Things that ECS implementations are generally good at are querying and iterating sets of entities linearly, or dynamically changing components at runtime. Things that ECS implementations are generally not good at are queries or operations that require highly specialized data structures, such as binary trees or spatial structures. [View Highlight](https://read.readwise.io/read/01j91jx0jh2wn8xrhmzvycyf1w))
The reason for this is that behavior in an ECS is matched with a set of components, vs. for example being tightly coupled with a class in OOP. [View Highlight](https://read.readwise.io/read/01j91jzyev2345b36sy6aphze1))
new systems can be introduced at any stage of development, and will automatically get matched with any existing and new entities that have the right components. [View Highlight](https://read.readwise.io/read/01j91k0jc5vdz6zfysrwvfqezc))
This promotes a design where systems are developed as single-responsibility, small units of functionality that can be easily deployed across different projects. [View Highlight](https://read.readwise.io/read/01j91k0ypypatnzt77n85sdrer))
Designing an ECS application starts with creating the components (data structures) that contain the game data. Important things to take into account are:
• How many instances of the data will exist
• How often is data accessed
• How often is the data mutated
• When does data need to be accessed/mutated
• Which data is accessed/mutated together
• What is the cardinality of the data [View Highlight](https://read.readwise.io/read/01j91k30n38vyb492he5vej8b2))
It is good practice to design components and systems to have a single responsibility. This makes them easier to reuse across projects, and makes it easier to refactor code. [View Highlight](https://read.readwise.io/read/01j91k34bzgxsycjdsfxfj4jm1))
An archetype ECS stores entities in tables, where components are columns and entities are rows. Archetype implementations are fast to query and iterate. [View Highlight](https://read.readwise.io/read/01j91k41g8wnx5ahhg34x2jkn5))
A sparse set based ECS stores each component in its own sparse set which is has the entity id as key. Sparse set implementations allow for fast add/remove operations. [View Highlight](https://read.readwise.io/read/01j91k4e2nj4wk4x8qm0rcw1ea))
A bitset-based ECS stores components in arrays where the entity id is used as index, and uses a bitset to indicate if an entity has a specific component. [View Highlight](https://read.readwise.io/read/01j91k5v49vx19nff799nzy3ty))
A reactive ECS uses signals resulting from entity mutations to keep track of which entities match systems/queries. [View Highlight](https://read.readwise.io/read/01j91k649x535px14rzf4r5a85))
ECS ("Entity Component System") describes a design approach which promotes code reusability by separating data from behavior. [View Highlight](https://read.readwise.io/read/01j91htdgbpsyzgr1b0ddfa0ac))
ECS has the following characteristics:
• It has entities, which are unique identifiers
• It has components, which are plain datatypes without behavior
• Entities can contain zero or more components
• Entities can change components dynamically
• It has systems, which are functions matched with entities that have a certain set of components. [View Highlight](https://read.readwise.io/read/01j91hvjdef0xbq6p44wgq4jrj))
A framework that lets you add "things" to entities, with a way to query for entities that have some things but not other things, is generally considered to be an ECS. [View Highlight](https://read.readwise.io/read/01j91hx4zdbfka8v3x211xs198))
• ECS can typically support larger numbers of game objects
• ECS code tends to be more reusable
• ECS code is easier to extend with new features
• ECS allows for a more dynamic coding style [View Highlight](https://read.readwise.io/read/01j91hxszmzjc3mtrcwrg3m53x))
While ECS and OOP overlap, there are differences that impact how applications are designed:
• Inheritance is a 1st class citizen in OOP, composition is a 1st class citizen in ECS.
• OOP encourages encapsulation of data, ECS encourages exposed POD (plain old data) objects.
• OOP colocates data with behavior, ECS separates data from behavior.
• OOP Object instances are of a single static type, ECS entities can have multiple, dynamically changing components [View Highlight](https://read.readwise.io/read/01j91hzkqsfw0qdfg2e282zp3v))

View file

@ -0,0 +1,16 @@
# HTMX: 3 IRL Use Cases
![rw-book-cover](https://i.ytimg.com/vi/sTzF57GE4-k/maxresdefault.jpg)
## Metadata
- Author: [[ThePrimeTime]]
- Full Title: HTMX: 3 IRL Use Cases
- Category: #articles
- URL: https://www.youtube.com/watch?v=sTzF57GE4-k
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=HTMX%3A%203%20IRL%20Use%20Cases
> [!tldr]
> HTMX is a simple tool that can make web development easier by keeping things straightforward. It allows developers to build dynamic web applications without relying heavily on JavaScript frameworks. Many tasks can be achieved with just a few lines of code, making it a valuable addition to a developer's toolkit.
## Highlights
if you started web dev after 2015 it is hard to see how to do a site without anything other than client-side Frameworks [View Highlight](https://read.readwise.io/read/01j5tc1j7ke8vs2vmcs34c07kn))

View file

@ -0,0 +1,26 @@
# How Do You Program for 8h in a Row?
![rw-book-cover](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa68add58-ed53-40af-972e-222f936aa4bd_512x312.png)
## Metadata
- Author: [[Bite Code!]]
- Full Title: How Do You Program for 8h in a Row?
- Category: #articles
- Document Tags: [[dev]] [[productivity]]
- URL: https://www.bitecode.dev/p/how-do-you-program-for-8h-in-a-row
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20Do%20You%20Program%20for%208h%20in%20a%20Row%3F
> [!tldr]
> Most programmers can't work for 8 hours straight every day without feeling burnt out. It's important to focus on your own coding goals and productivity rather than comparing yourself to others. Finding a balance that works for you will lead to a happier and more sustainable coding experience.
## Highlights
Unless you are going to deny John von Neumann and Usain Bolt have existed, you have to accept the idea some individuals are able to produce results you cant. [View Highlight](https://read.readwise.io/read/01j5ve0w5gwghcgzxsyvvhmwqt))
Here I am with the damn spectrum again. But its a curve, yall, of course, its a spectrum. You dont have 10x and 1x, you have 0.3x, 5x, 1.479878x (and -2x because aggressive imbeciles are also part of our reality)... [View Highlight](https://read.readwise.io/read/01j5ve777bthcmj83k6k7cec5f))
> [!note]
> Aquí estoy de nuevo con el maldito espectro. Pero es una curva, amigos, por supuesto, es un espectro. No tienes 10x y 1x, tienes 0.3x, 5x, 1.479878x (y -2x porque los imbéciles agresivos también son parte de nuestra realidad)...
> lol xd
you will have to adapt your rhythm, and the size of the task you are going for, plus manage expectations, yours and others, to be a happy coder [View Highlight](https://read.readwise.io/read/01j5veddky3z4g488sy5bcd4a2)) [[favorite]]
Figure out what you can do, and find the load that fits you. If you like it, you may attempt to outgrow this by giving yourself more challenges or even putting yourself in an extremely hard situation. However, remember that life, often in the form of customers, bosses and DDOS, will bring that to you anyway. [View Highlight](https://read.readwise.io/read/01j5vee0j5h4jqxfyarnvpxnkt))

View file

@ -0,0 +1,22 @@
# How I Remember Everything I Read With Readwise
![rw-book-cover](https://i.ytimg.com/vi/OlWomVta4DU/maxresdefault.jpg)
## Metadata
- Author: [[Tiago Forte]]
- Full Title: How I Remember Everything I Read With Readwise
- Category: #articles
- Document Tags: [[notetaking]] [[productivity]]
- URL: https://youtube.com/watch?v=OlWomVta4DU&si=9kSzbiC8eY_Bncgq
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20I%20Remember%20Everything%20I%20Read%20With%20Readwise
> [!tldr]
> Readwise is a platform that helps you remember everything you read by collecting highlights from books, articles, and other content. It can export these highlights to various note-taking apps, making it easy to organize your thoughts. This way, you can revisit important information whenever you need it without the hassle of copying and pasting.
## Highlights
that kind of focused aware reading where you're not just reading a tweet or an Instagram caption you're actually taking the time and space to sit down and really think about something really take an idea seriously that is a rare and precious experience [View Highlight](https://read.readwise.io/read/01j69ty4jsa8qyqrm76cb82e1c))
most of the internet if you think about it especially social media is not designed for calm deep purposeful reflection it's exactly the opposite [View Highlight](https://read.readwise.io/read/01j69v3539zhtvg4z09r0mhj0c))
what I find is I end up deleting never even looking at maybe half of the stuff that is saving my relater app and it's the half that is most click-baity most sensationalistic most pointless most full of hype that's the stuff that I don't even want to be filling my mind
anyway [View Highlight](https://read.readwise.io/read/01j69v79j1jfc2ptn55y886ee5))

View file

@ -0,0 +1,65 @@
# How Japanese Minimalism Changed My Life: 5 Principles to Declutter Your Life
![rw-book-cover](https://i.ytimg.com/vi/Sa7cgPILItQ/maxresdefault.jpg)
## Metadata
- Author: [[Zach Highley]]
- Full Title: How Japanese Minimalism Changed My Life: 5 Principles to Declutter Your Life
- Category: #articles
- Document Tags: [[productivity]]
- URL: https://www.youtube.com/watch?v=Sa7cgPILItQ
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20Japanese%20Minimalism%20Changed%20My%20Life%3A%205%20Principles%20to%20Declutter%20Your%20Life
> [!note]
> **Background:** I will soon be moving out of my parents' house and into a small apartment to live independently. I want to use this transition as an opportunity to embrace a minimalist lifestyle.
> ---
> ### Top 3 Most Important Takeaways:
> 🗑️ **Create Space by Decluttering**
> Start by evaluating your physical possessions and ask yourself if each item brings you joy. Embrace the concept of having ample physical space around you, and organize your belongings purposefully. Assign a designated place for every item to prevent clutter from accumulating again.
> 🧘 **Eliminate Choices to Free Up Mental Space**
> Reduce decision fatigue by minimizing choices in your daily life, such as wearing the same outfit or eating the same meals. Simplifying these decisions will free up mental space and time, allowing you to focus on what truly matters.
> 🌿 **Embrace Imperfection and Transience**
> Adopt the principle of Wabi-sabi, which encourages finding beauty in imperfection. Understand that nothing is perfect and that everything is transient. This mindset will help you appreciate the simplicity and clarity that comes with minimalism.
> [!tldr]
> When there is too much clutter, you can't think. When you can't think, you can't create. When you can't create, your world slows down. What if we only filled our lives with things that had real value and removed everything else.
📜 Write Up - https://zhighley.com/japanese-minimalism-five-principles-to-declutter-your-life/
📸 Instagram - https://www.instagram.com/zachhighley/
🐧 Twitter - https://twitter.com/zachhighley
💌 Newsletter - https://zhighley.com/newsletter/
——————————————————————————————————————————————————
Who am I:
My name is Zach. Im a Resident Physician in Boston. I make videos about medical school, studying, and growth. I love trying new things and often mess up. However, every time I screw up, I usually learn something. Whatever I learn, I post it either on YouTube or on my website 🌐 (https://zhighley.com/).
I write a weekly newsletter 💌 (https://zhighley.com/newsletter/) linking the best things I read, watched, and listened to that week. Join the 4,000+ that read it every other Sunday...
## Highlights
When there's too much stuff around us, our minds can't think straight. When your mind can't think straight, you can't create. When you can't create, when you can't contribute to the world, the world slows down a little bit. [View Highlight](https://read.readwise.io/read/01j7105sy62k477j7we49j3vng))
tip number one is create space. [View Highlight](https://read.readwise.io/read/01j710802fzkm0xb0jfvpe6zj0))
Marie Kondo says, "When people revert to clutter no matter how much they tidy, it is not their room or their belongings, but their way of thinking that is at fault." [View Highlight](https://read.readwise.io/read/01j71087j6npx5etywvmh93dq4))
Tip number two is embrace space. Embrace this newfound clearness you have. [View Highlight](https://read.readwise.io/read/01j71097tmgwwthqw40kqjm70e))
Seneca says, "It's not the man who has too little, but the man who craves more who is poor." [View Highlight](https://read.readwise.io/read/01j710ans5zjy9p4e10chdkk7b))
Tip number three is to be purposeful with your space fillers. [View Highlight](https://read.readwise.io/read/01j710eehmhsxrv02rbrkfxzp3))
"The reason every item must have a designated place is because the existence of an item without a home multiplies the chances that your space will become cluttered again. [View Highlight](https://read.readwise.io/read/01j710fafawb9z9265r7r036pv))
Tip number four is to eliminate choices. [View Highlight](https://read.readwise.io/read/01j710k01a20dk494w8yf8vq3w))
When you eliminate decisions, you create more time. Confucius said that, "Life is really simple. We insist on making it complicated." [View Highlight](https://read.readwise.io/read/01j710mjajf9x11sk2gy3h4tbm))
Eliminate decision fatigue, eliminate choices, free up mental space, free up time to focus on things that have a real impact. [View Highlight](https://read.readwise.io/read/01j710nn39sxpz7md9mhd4cx3q))
this comes to the important principle of Japanese minimalism of Wabi-sabi or kinda loving imperfection. [View Highlight](https://read.readwise.io/read/01j710xzs42s3dj7czt7py85qc))
Tip number six is to think beyond stuff. [View Highlight](https://read.readwise.io/read/01j710zgdawxb9bzxj4w5g67p8))
Create space by decluttering your physical possessions.
Does this item give me joy? Embrace space by having as much physical space around you wherever you live. Organize all the things in your life purposely. What is this drawer for? What is this cabinet for? Eliminate choices. Maybe you wear the same outfit every day maybe you eat the same breakfast every day. Maybe you only drink water. Next, everything is transient. Nothing is perfect, and that's okay. And finally, can we apply the idea of simple living to not only our stuff, but our thoughts and our actions. [View Highlight](https://read.readwise.io/read/01j7117z1262k0pwpp24knqea4))

View file

@ -0,0 +1,21 @@
# How a Collaborative Zettelkasten Might Work: A Modest Proposal for a New Kind of Collective Creativity
![rw-book-cover](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSBHZPD3JWcWaVg_AFb1m5du55SCFgj2hbE1Ek60-RFG4I3W8kvc35rFvniOx-G0NcNnwg&usqp=CAU)
## Metadata
- Author: [[hidden (bobdoto)]]
- Full Title: How a Collaborative Zettelkasten Might Work: A Modest Proposal for a New Kind of Collective Creativity
- Category: #articles
- URL: https://writing.bobdoto.computer/how-a-collaborative-zettelkasten-might-work-a-modest-proposal/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20a%20Collaborative%20Zettelkasten%20Might%20Work%3A%20A%20Modest%20Proposal%20for%20a%20New%20Kind%20of%20Collective%20Creativity
> [!tldr]
> This article gives a preliminary framework for people wanting to experiment with a collaborative zettelkasten. Keep in mind, these are mere suggestions, since I've not yet experimented with this type of slip box. As to whether the suggestions are valid, this will be determined by anyone who attempts to put them into practice. Note: While this article was written in the context of a Luhmann-style zettelkasten, people using similar, adjacent models, should feel free to work with what's presented in ways that fit their system.
What's a Collaborative Zettelkasten?A collaborative zettelkasten is maintained by multiple people, one in which all the participants add main notes, establish connections between ideas, and freely pull from the network of notes for their own projects / projects worked on as a collective. The contents of the zettelkasten may or may not be aligned with a single, agreed upon subject. Participants may or may not have a common output, goal, or project in mind when they start. The only requirements...
## Highlights
A collaborative zettelkasten is maintained by multiple people, one in which all the participants add main notes, establish connections between ideas, and freely pull from the network of notes for their own projects / projects worked on as a collective. The contents of the zettelkasten may or may not be aligned with a single, agreed upon subject. Participants may or may not have a common output, goal, or project in mind when they start. [View Highlight](https://read.readwise.io/read/01j5xzksta891sj1jfpexpb9vs))
"[Luhmann's] main concern was not to develop an idea to maximum sophistication; rather, he operated on the assumption that a decision on the usefulness of a note could only be made in relating it to the other notes."[2](https://writing.bobdoto.computer/how-a-collaborative-zettelkasten-might-work-a-modest-proposal/#fn-2) [View Highlight](https://read.readwise.io/read/01j5xzxhwd0d5cgcvstt6y57z4))
As Luhmann states in his own notes, let the zettelkasten function as a "septic tank."[3](https://writing.bobdoto.computer/how-a-collaborative-zettelkasten-might-work-a-modest-proposal/#fn-3) Allow the relationships between ideas to determine their value. [View Highlight](https://read.readwise.io/read/01j5xzz8xhq5r1tde4vkhr0fhp))

View file

@ -0,0 +1,28 @@
# How the Index Card Method Improves Your Knowledge Gathering
![rw-book-cover](http://cdn.shopify.com/s/files/1/0064/3665/1072/articles/how-the-index-card-method-improves-your-knowledge-gathering-963916_600x.jpg?v=1675232920)
## Metadata
- Author: [[THINKERS Notebook]]
- Full Title: How the Index Card Method Improves Your Knowledge Gathering
- Category: #articles
- Document Tags: [[notetaking]] [[productivity]]
- URL: https://thinkersnotebook.com/blogs/news/how-the-index-card-method-improves-your-knowledge-gathering
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20the%20Index%20Card%20Method%20Improves%20Your%20Knowledge%20Gathering
> [!tldr]
> The index card method is a simple and effective way to organize and connect information for writing, research, and projects. It allows you to summarize ideas on cards, linking them to main themes for easy reference. You can even adapt this method to digital formats for better organization and searchability.
## Highlights
The key components of an effective index card method are:
• The information on the card is summarized or simplified.
• Each card is linked back to a main thread or theme of information via a number, a tag, or a title (or a mix of all three). [View Highlight](https://read.readwise.io/read/01j80drzv3a1w0wppg4syztwc3))
There are other ways you can use this method in a notebook, to help order and structure your projects and ideas:
• Organize your thoughts and findings around a particular topic youre researching.
• Scope your long-form article, thesis or book, summarizing each section or chapter.
• Store important research data for key business metrics.
• Create reference cards for your business presentation.
• Track specific habits and goals for a week or month.
• Keep note of specific birthdays and recurring events by month.
• The key to using an index card method effectively lies in how you connect the separate ideas and information that youre listing. [View Highlight](https://read.readwise.io/read/01j80e0c34a7kbvxsy3cbbkf25))

View file

@ -0,0 +1,25 @@
# How to Actually Use What You Read With Readwise: Part 2
![rw-book-cover](https://s3.amazonaws.com/readwiseio/2018/03/kindle-highlights.png)
## Metadata
- Author: [[Daniel Doyon]]
- Full Title: How to Actually Use What You Read With Readwise: Part 2
- Category: #articles
- Document Tags: [[notetaking]]
- URL: https://blog.readwise.io/reading-workflow-part-2/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Actually%20Use%20What%20You%20Read%20With%20Readwise%3A%20Part%202
> [!tldr]
> In Part 2 of the Readwise series, we learn to enhance our reading workflow by actively engaging with what we read. This includes capturing highlights and notes, which help create a two-sided conversation with the text. The article emphasizes the importance of reviewing these materials through the Readwise web app for a more interactive experience.
## Highlights
you'll find yourself asking as you read: Do I actually want to see this passage again? Is this passage actually highlight-worthy? Will my future self be able to make sense of what I've highlighted? And so on. [View Highlight](https://read.readwise.io/read/01j6mqyk29xd598f62nayabzfj))
The internal dialog is actually a sign that you're *actively* — rather than passively — reading. [View Highlight](https://read.readwise.io/read/01j6mqzsxe83y8t342knm6y82h))
"If your aim in reading is to profit from it — to grow somehow in mind or spirit — you have to keep awake. That means reading as actively as possible. It means making an effort — an effort for which you expect to be repaid." [View Highlight](https://read.readwise.io/read/01j6mrf2e1tg6jz2209brj24yk))
Once you grow accustomed to actually revisiting what you've captured, however, you'll likely discover that you also want to review more than just the original passages. You'll also want to review your original reaction *to* those passages. You can capture these reactions, of course, by taking notes. [View Highlight](https://read.readwise.io/read/01j6mtvq8kd9c0cxcjmwp5bfpq))
The objective is simply to start a conversation rather than just silently highlighting. Maybe you strongly agree with something the author has written. Even better, maybe you strongly disagree. Note why. Maybe a section confuses you. Maybe a section could be helpful to something you're working on. [View Highlight](https://read.readwise.io/read/01j6mtym0q2qhrbap1r1tby8cn))

View file

@ -0,0 +1,37 @@
# How to Actually Use What You Read With Readwise: Part 3
![rw-book-cover](https://s3.amazonaws.com/readwiseio/2018/03/kindle-highlights.png)
## Metadata
- Author: [[Daniel Doyon]]
- Full Title: How to Actually Use What You Read With Readwise: Part 3
- Category: #articles
- Document Tags: [[notetaking]]
- URL: https://blog.readwise.io/reading-workflow-part-3/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Actually%20Use%20What%20You%20Read%20With%20Readwise%3A%20Part%203
> [!tldr]
> In Part 3 of the Readwise series, the author explains how to use advanced workflows for two types of reading: practical and theoretical. Practical reading aims for action, while theoretical reading focuses on gaining knowledge, and Readwise helps users capture and review key insights for both. By utilizing features like Inline Tagging and spaced repetition, readers can turn their reading into meaningful actions and lasting insights.
## Highlights
"Theoretical books teach you that something is the case. Practical books teach you how to do something you want to do or think you should do." [View Highlight](https://read.readwise.io/read/01j6mxk0qxsc1ge4ebcrabg7n8))
When you read something practical, you are seeking some sort of action — to *do*. When you read something theoretical, you are seeking some sort of knowledge — to *know*. [View Highlight](https://read.readwise.io/read/01j6mxkgms2x7rkwt6qqaaq144))
serendipitous [View Highlight](https://read.readwise.io/read/01j6mxnpq872bx9q40h1ez0hp3))
> [!note]
> serendipitous (adjective): occurring by chance in a happy or beneficial way; unexpected and fortunate 🌟🍀
For example, we might make it so highlights tagged `.i` for inbox, like above, are accelerated into your daily reviews until you do something about them. [View Highlight](https://read.readwise.io/read/01j6my11vve93ecp1hwdrd5n9n))
> [!note]
> tags highlights for actionability, something that I can filter later to search stuff I want to do or apply
to meaningfully understand a new concept, you need to ponder it repeatedly — in different moods and in different contexts, and from different perspectives. [View Highlight](https://read.readwise.io/read/01j6my5fjqcss9a8zb68vqerw4))
[spaced repetition](https://en.wikipedia.org/wiki/Spaced_repetition), [View Highlight](https://read.readwise.io/read/01j6my96k3avt6s37knqkehh9s))
> [!note]
> Spaced repetition: A learning technique that involves increasing intervals of review for information to enhance long-term retention and mastery. By leveraging the psychological spacing effect, spaced repetition optimizes the timing of study sessions based on how well the learner knows the material, promoting efficient memory consolidation and reducing the forgetting curve. This method is commonly used in educational software and flashcard systems to facilitate language learning, exam preparation, and skill acquisition.
[active recall](https://en.wikipedia.org/wiki/Active_recall), [View Highlight](https://read.readwise.io/read/01j6my8p2zekrx849jj5c4yj06))
> [!note]
> Active recall: A learning technique that involves actively stimulating memory during the learning process, typically by testing oneself on the material to be remembered. This method contrasts with passive review strategies, such as rereading or highlighting, by emphasizing retrieval practice, which has been shown to enhance long-term retention and understanding. Active recall can take various forms, including flashcards, quizzes, and self-questioning, and is widely used in educational settings to improve learning outcomes.

View file

@ -0,0 +1,29 @@
# How to Actually Use What You Read With Readwise
![rw-book-cover](https://s3.amazonaws.com/readwiseio/2018/03/kindle-highlights.png)
## Metadata
- Author: [[Daniel Doyon]]
- Full Title: How to Actually Use What You Read With Readwise
- Category: #articles
- Document Tags: [[notetaking]]
- URL: https://blog.readwise.io/reading-workflow-part-1/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Actually%20Use%20What%20You%20Read%20With%20Readwise
> [!tldr]
> Readwise is a tool that helps you remember and use the important ideas you find while reading. It offers a simple workflow with three steps: Capture your highlights, Review them regularly, and Integrate those insights into your life. By using Readwise, you can turn your reading into meaningful actions and lasting knowledge.
## Highlights
We read in order to learn how to do something or we read to understand some new concept. For example, we might read a book to learn how to negotiate or we might read a book to understand behavioral economics. We call these motives meaningful action and lasting insight, respectively, and a reading workflow will help you get more of both.[](https://blog.readwise.io/reading-workflow-part-1#fn1) [View Highlight](https://read.readwise.io/read/01j58ez9vkh68ptwbnt951wkg9))
*capture* any and all the things that might be meaningful to you — today or tomorrow, small or large — in a reliable system outside your mind so you can make use of those things later [View Highlight](https://read.readwise.io/read/01j58f1740ca5k7akyjp7enmkx))
Now that you're capturing all the things that might be meaningful to you, the next step is to actually go back and *review* those things. Otherwise, what was the point of capturing in the first place? [View Highlight](https://read.readwise.io/read/01j58f3zcas4ewpxjf861kzfy6)) [[favorite]]
Integrate might mean **improved retention** (or compression) of new concepts thanks to a lightweight form of [spaced repetition](https://en.wikipedia.org/wiki/Spaced_repetition). [View Highlight](https://read.readwise.io/read/01j58f5aqe8f69a4rvvypb3r1n))
Integrate might also mean **enhanced creativity** resulting from the serendipitous juxtaposition of seemingly unrelated ideas. [View Highlight](https://read.readwise.io/read/01j58f679pcp1vtd3ne64cxke9))
> [!note]
> This relates to BASB
Integrate might also mean **sudden inspiration** to act on something you've read due to a well-timed reminder in a daily review. [View Highlight](https://read.readwise.io/read/01j58f8fa57a88b7647bwyaxp4))

View file

@ -0,0 +1,33 @@
# How to Build New Habits by Taking Advantage of Old Ones
![rw-book-cover](https://jamesclear.com/wp-content/uploads/2014/07/Habit-stacking-01-1086x1200.png)
## Metadata
- Author: [[James Clear]]
- Full Title: How to Build New Habits by Taking Advantage of Old Ones
- Category: #articles
- Document Tags: [[productivity]]
- URL: https://jamesclear.com/habit-stacking
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Build%20New%20Habits%20by%20Taking%20Advantage%20of%20Old%20Ones
> [!tldr]
> James Clear explains how to build new habits by linking them to existing ones, a technique called habit stacking. By pairing a new behavior with a current daily habit, you make it easier to remember and stick to the new action. This method utilizes the brain's natural ability to strengthen connections between frequently used neurons, enhancing skill development over time.
## Highlights
One of the best ways to build a new habit is to identify a current habit you already do each day and then stack your new behavior on top. This is called habit stacking. [View Highlight](https://read.readwise.io/read/01j9ptg4p5nm7em2n2azb1e7vg))
The habit stacking formula is:
> After/Before [CURRENT HABIT], I will [NEW HABIT]. [View Highlight](https://read.readwise.io/read/01j9pth51kbn08v4p8q8pb6s8g))
![](https://jamesclear.com/wp-content/uploads/2014/07/Habit-stacking-01-1086x1200.png)
Habit stacking increases the likelihood that youll stick with a habit by stacking your new behavior on top of an old one. This process can be repeated to chain numerous habits together, each one acting as the cue for the next. [View Highlight](https://read.readwise.io/read/01j9ptmf01qgk91cvkdcd7kyqs))
No matter how you use this strategy, the secret to creating a successful habit stack is selecting the right cue to kick things off. [View Highlight](https://read.readwise.io/read/01j9ptqdz0614xq8g6apgh3kf2))
One way to find the right trigger for your habit stack is by brainstorming a list of your current habits. [View Highlight](https://read.readwise.io/read/01j9pts3gjkah6w1dm32xzdnnz))
, you can create a list with two columns. In the first column, write down the habits you do each day without fail. ... In the second column, write down all of the things that happen to you each day without fail. ... Armed with these two lists, you can begin searching for the best place to layer your new habit into your lifestyle.
Habit stacking works best when the cue is highly specific and immediately actionable. Many people select cues that are too vague. [View Highlight](https://read.readwise.io/read/01j9ptvtp0hv80yjc2cvt41esx))
Habits like “read more” or “eat better” are worthy causes but far too vague. These goals do not provide instruction on how and when to act. Be specific and clear: After I close the door. After I brush my teeth. After I sit down at the table. [View Highlight](https://read.readwise.io/read/01j9pty5517662hdae5jqcmpwj))

View file

@ -0,0 +1,28 @@
# How to Not Write Like an Asshole
![rw-book-cover](https://thehustle.co/wp-content/uploads/2015/09/copywork2_og_image.jpg)
## Metadata
- Author: [[The Hustle]]
- Full Title: How to Not Write Like an Asshole
- Category: #articles
- Document Tags: [[notetaking]]
- URL: https://thehustle.co/how-to-not-write-like-an-asshole
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Not%20Write%20Like%20an%20Asshole
> [!tldr]
> Most people write poorly, using confusing sentences and unnecessary words. A simple way to improve writing is through copywork, where you hand-copy great writing to learn from it. By practicing this method for just a few minutes each day, anyone can become a better writer.
## Highlights
The easiest way to become a better writer is to copy great writers. Its that simple. [View Highlight](https://read.readwise.io/read/01j6py7hp221k6fzx7mza6b3k1))
When I say you should copy great writers, I mean you should literally copy their best work, word-for-word, and preferably by hand.
This process is called copywork and its mind-numbingly simple. You barely have to think. All you have to do is sit down with your favorite book, article, or blog post and copy it. [View Highlight](https://read.readwise.io/read/01j6py9pbrq5epw3sxgy5a9wv2))
**Step 1: Pick a writer who you want to be like** ... To start with copywork, pick an author you love. Copywork is hard work, and youll spend a lot of time with whomever you decide to copy, so you need to love their work.
**Step 2: Buy a ton of legal notebooks**
[Studies have shown](https://lifehacker.com/5738093/why-you-learn-more-effectively-by-writing-than-typing) that people learn better when they write by hand versus typing. So, for copywork its best to do all the copying by hand. I prefer using yellow legal notepads as theyre easy to read and cheap. [View Highlight](https://read.readwise.io/read/01j6pzrch7rq9ct4xr5f58nxhc))
**Step 3: Start writing**
I suggest copying your favorite author for 10 minutes each day. Its that simple. [View Highlight](https://read.readwise.io/read/01j6pzs8wpx24wawjxq7fypj7f))

View file

@ -0,0 +1,54 @@
# How to Organize a Notebook for Work
![rw-book-cover](https://rebelsguidetopm.com/wp-content/uploads/2021/12/GPM-Featured-Image-11.jpg)
## Metadata
- Author: [[Elizabeth Harrin]]
- Full Title: How to Organize a Notebook for Work
- Category: #articles
- Document Tags: [[notetaking]] [[productivity]]
- URL: https://rebelsguidetopm.com/how-to-organize-a-notebook-for-work/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Organize%20a%20Notebook%20for%20Work
> [!tldr]
> This text provides tips on organizing a notebook for work, emphasizing the importance of personalizing the system to suit individual needs. It suggests practical strategies like cutting corners to locate pages easily and using sections to categorize notes effectively. The author shares insights on maximizing a notebook's potential as a productivity tool within a larger task management system.
## Highlights
2. Put the To Do list at the back [View Highlight](https://read.readwise.io/read/01j80bnsjvv4jdnga09mjrajqx))
3. Put important information on the inside front cover ... • Cost codes, timesheet codes or project codes
• Important telephone numbers
• Instructions on how to change your voicemail (can you tell thats a real example from inside my book?!)
Youll get through a lot of work notebooks in time, so put the start date on the front cover or one of the first inside pages so you know what time period this book covers. [View Highlight](https://read.readwise.io/read/01j80bpqqt6fhjntgx30tkvnmn))
5. Organize the inside ... I dont use page numbers in my books because they are free-flow for my notes and tend to be a chronological representation of what I was working on at the time. ... • Leave a page at the front for the table of contents or keep a page at the back for the index
• Add page numbers to each page
• Mark where things are in the notebook as you go.
I dont section my work because as a project manager, I find much of my work overlaps. [View Highlight](https://read.readwise.io/read/01j80bs5d5q3vp2ccdpq97j1fp))
If you dont want to number and structure, an alternative option is to have a different notebook for each project or to use sections. [View Highlight](https://read.readwise.io/read/01j80bsg6hnpaqwjvyjnszmsxy))
6. Use sections ... • Weekly goals and objectives (or monthly/annual goals)
• Trackers for habits e.g. drinking water, gratitude
• Lists e.g. team birthdays. ... Use sticky notes or sticky tabs to section off the book and make it easier to find the right page when you need it.
in circles to help them stand out in the notes:
A: Action for specific tasks to be done
D: Decision normally to be transferred to a decision log or confirmed on email so no one can forget that we made it.
R: Risk to be transferred to the project risk log and something done about it.
I: Issue to be transferred to the issue log and flagged with whomever is going to be able to do something about it.
Star something important. Normally something that has to be done today. [View Highlight](https://read.readwise.io/read/01j80am80gt459xt3n5hkv1mr5))
I make time to rewrite the important lists in my book (the actions) on a regular basis. It isnt strictly necessary, but it helps me clear my mind and focus on what is still to do. [View Highlight](https://read.readwise.io/read/01j80aq18td7pq8hk3ty7fh0pg))
However you use your notebook, I would recommend allocating some time on a regular basis to go through it and tidy it up. Mark tasks as complete, transfer notes to other tools, re-write lists. Just refresh yourself on what is in there and check it is still working for you. [View Highlight](https://read.readwise.io/read/01j80ar15h0jat05dtvevj5362))
Your notebook should be part of a whole productivity and task management system. It should fit alongside your online tools. [View Highlight](https://read.readwise.io/read/01j80ayzgm5px6mvxbvbnpxr8m))
Your system should work in the round. No one in your team should be waiting to be told what to do because you wrote it down in the wrong place. [View Highlight](https://read.readwise.io/read/01j80b1xq3h5rpdrrwmnbvkgqg))
Notebook organization should be simple. If you create a system that is too difficult to stick to, then you wont stick to it. [View Highlight](https://read.readwise.io/read/01j80b2b9t15za4kfvtmv0ytpr))
Remember, the way you organize your work notebook can evolve over time. Switch up how you use your notebook as your needs change. [View Highlight](https://read.readwise.io/read/01j80bbpykp4yqskxt4g5m1aaz))

View file

@ -0,0 +1,39 @@
# How to Rebuild Your Routines When Everything Changes | Rewind
![rw-book-cover](https://i.ytimg.com/vi/-c1HY-vrmIQ/maxresdefault.jpg)
## Metadata
- Author: [[How to ADHD]]
- Full Title: How to Rebuild Your Routines When Everything Changes | Rewind
- Category: #articles
- URL: https://youtube.com/watch?v=-c1HY-vrmIQ&si=7ximCdZha4zJg-LR
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Rebuild%20Your%20Routines%20When%20Everything%20Changes%20%7C%20Rewind
> [!tldr]
> The video discusses how to rebuild routines after significant changes, especially for those with ADHD. It offers eight practical tips, such as keeping what works, allowing time for transitions, and managing stress. The key message is to be patient with yourself and acknowledge your achievements while adjusting to new routines.
## Highlights
keep what you know works it can be tempting to start with a blank slate but the less you change the quicker you'll adjust to those changes so anything you liked from your old
routine that would still work with the new one consider keeping [View Highlight](https://read.readwise.io/read/01j8b6stmxqkv0rx1yq54y0fpb))
design the rest with you in mind hang on current you not future you [View Highlight](https://read.readwise.io/read/01j8b6x2we07a50fpdy60tx1xf))
give yourself plenty of white space in your schedule remember transitions will probably take longer at first because you're not used to your new routines [View Highlight](https://read.readwise.io/read/01j8b6z2dx0wnx94kde9a96xre))
can speed up the process of setting those new routines and reduce the transition time between them by mentally walking through your new routines a few times before you need to start using them [View Highlight](https://read.readwise.io/read/01j8b71t112qtedbcbxbyfd2q8))
write the new routines down ... put it in your schedule create a habit tracker sticker chart use an app
there's a surprising amount that will suddenly not be automatic when you go through Big Life Changes again speaking from experience once you're used to your routines your brain will usually remind you what's next until then you'll probably need some help so you need to
have a way of keeping yourself on track [View Highlight](https://read.readwise.io/read/01j8b776eyyvx1aq905tatr726))
if at all humanly possible wait until you're used to your new routine before adding in stuff that you've never done before [View Highlight](https://read.readwise.io/read/01j8b7be7rkvdf5z68nva3fkx5))
manage your stress levels change even good change is stressful expect small unexpected changes to affect you more than usual right now because they're not
really small changes they're Peaks on a mountain of giant changes [View Highlight](https://read.readwise.io/read/01j8b7efp3k1eb92dakzhy2m6z))
acknowledge your achievements it can be really easy when you're adjusting to a new routine to only see the stuff you didn't get to check out all the stuff you did even little things like getting to work on time that you might otherwise take for granted are a huge
Victory when you did it with a new routine [View Highlight](https://read.readwise.io/read/01j8b7jk8wq2xtpscy1fdbhesg))
tweak as necessary if anyone gets all of their routines right on their first try I'm going to very annoyed impressed but
annoyed it's totally normal for it to take some trial and error to figure out what works for you so expect that things will go wrong and you will need to make adjustments doesn't mean you're doing something wrong it's part of the process [View Highlight](https://read.readwise.io/read/01j8b7ntbt4jbsb7ma3axe4z3b))

View file

@ -0,0 +1,30 @@
# How to Start Journaling
![rw-book-cover](https://www.simplyfiercely.com/wp-content/uploads/2021/08/How-to-Start-Journaling-Feature-Image.jpg)
## Metadata
- Author: [[Jennifer]]
- Full Title: How to Start Journaling
- Category: #articles
- URL: https://www.simplyfiercely.com/start-journaling/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Start%20Journaling
> [!tldr]
> Journaling is a powerful habit that promotes self-awareness and helps you make intentional choices in life. To start, just relax and begin writing about your thoughts and feelings, using prompts if needed. Sticking with journaling daily can lead to greater clarity and personal growth.
## Highlights
Journaling helps combat this short-sightedness by encouraging us to step back and consider the big picture. [View Highlight](https://read.readwise.io/read/01j83ye06dw8vkysgntnavndb8))
First and foremost, relax and let go of any ideas about doing it the “right” way— because when it comes to journaling, theres no such thing! Your journal is a personal space for you to use however you see fit. [View Highlight](https://read.readwise.io/read/01j83yn2d1qgem2pycxrsth3gj)) ^363cd8
After that, the best way to start journaling is to just begin. [View Highlight](https://read.readwise.io/read/01j83yp4c2axwtzy3k87e98ajt))
If you dont know what to write about, a great place to begin is by **[asking questions](https://www.simplyfiercely.com/7-questions-to-inspire-intentional-living/).** My favourites include:
• *How do you feel right now?*
• *Why do you feel that way?*
• *How do you want to feel?*
*What can you do to feel that way?* [View Highlight](https://read.readwise.io/read/01j83yqf5g8j5h964d735bfexe)) [[journaling/prompt]]
If you dont feel comfortable writing long, in-depth entries in your journal then find something that works for you. Again, there are no right or wrong ways to journal as long as youre exploring your thoughts and feelings. [View Highlight](https://read.readwise.io/read/01j84amwhygt3bsycq85eptcs4))
**Make journaling a special ritual.** Try and do it at the same time every day and treat it as a special event, not a chore! Light a candle, make a hot drink, burn incense—whatever makes the experience special for you. [View Highlight](https://read.readwise.io/read/01j84anevvcn0ydv0287v7yjff))

View file

@ -0,0 +1,52 @@
# How to Think in Writing
![rw-book-cover](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8bec767-3242-4428-a281-0cdc3182ff75_750x587.png)
## Metadata
- Author: [[Henrik Karlsson]]
- Full Title: How to Think in Writing
- Category: #articles
- Document Tags: [[star]]
- URL: https://substack.com/home/post/p-143987982
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=How%20to%20Think%20in%20Writing
> [!note]
> Este articulo habla sobre cómo utilizar la escritura como un medio para realizar un análisis crítico de nuestros propios pensamientos e ideas y obtener su completo potencial.
> ---
> Utiliza un metodo kinda like Phoenix Wright cross examination:
> - hacer nuestros pensamientos solidos y especificos al escribirlos
> - Decantarlos hasta poder obtener una conclusión, una conjetura o una hipótesis
> - Desafiar esta conclusion intentando probarla verdadera o falsa, buscando sus fallas y grietas. Con _"pressionar"_ (follow up questions)
> - Esto nos proveerá más información, más pensamientos y más ideas que pueden re-definir nuestra conclusión
> [!tldr]
> Writing helps refine thinking by making ideas more precise and complete. Without writing, one may not fully form or realize the limitations of their ideas. By unfolding and probing claims through writing, one can discover flaws, refine understanding, and reach deeper insights.
## Highlights
Ideas can feel complete. It's only when you try to put them into words that you discover they're not. So if you never subject your ideas to that test, you'll not only never have fully formed ideas, but also never realize it. [View Highlight](https://read.readwise.io/read/01j8b867hqxmxzdkn3q3pjqbm4))
Good thinking is about pushing past your current understanding and reaching the thought behind the thought. [View Highlight](https://read.readwise.io/read/01j8b8cww40tqsnbaw3k42mgvn))
When I write, I get to observe the transition from this fluid mode of thinking to the rigid. As I type, Im often in a fluid mode—writing at the speed of thought. I feel confident about what Im saying. But as soon as I stop, the thoughts solidify, rigid on the page, and, as I read what Ive written, I see cracks spreading through my ideas. What seemed right in my head fell to pieces on the page. [View Highlight](https://read.readwise.io/read/01j8b8ezy6ywq99f4dkz8r3ymd))
a conjecture,” a qualified guess based on limited information. A hypothesis. [View Highlight](https://read.readwise.io/read/01j8b8hry74ry71zk4ffareecj))
Forcing the diffuse ideas and impressions in your head into a definite statement is an art form. You have to grab hold of what is floating and make it rigid and sharp. It can feel almost embarrassingrevealing your ignorance with as much vulnerability as possible. [View Highlight](https://read.readwise.io/read/01j8b8ksn5s7t4bn3wwefxeqwr))
By unfolding I mean “interrogating the conclusion to come up with an explanation of why it *could* be true.” What premises and reasoning chains leads to this conclusion? The explanation isnt meant to prove that your conclusion was right. It is just a way of unpacking it. [View Highlight](https://read.readwise.io/read/01j8b8nc9p2ywzsmztc4d6zjyk))
Since the goal is to find flaws in our guesses (so that we can change our minds, refine our mental models and our language, and be more right) unfolding a claim through an explanation is progress. Even if the explanation is wrong. [View Highlight](https://read.readwise.io/read/01j8b8q53msmbr9kbr9dzhew55))
Once I unfold my understanding in writing, I often see holes right away. I start correcting myself and discarding ideas already while typing. I cut ideas that are obviously flawed. I rewrite what feels ambiguous to make it sharpermore precise, concrete, unhedged, and true to my understanding. [View Highlight](https://read.readwise.io/read/01j8b8v6s8028792yvcwgy19n0))
I tend to go through my list of premises and assumptions and ask follow-up questions to myself, to further unfold my conclusion. [View Highlight](https://read.readwise.io/read/01j8b8y1z5wbjfjkjpjcwkwj4b))
Now that I have spelled out my position and fixed the obvious flaws, I start probing myself more seriously to see if I can get the argument to break down. [View Highlight](https://read.readwise.io/read/01j8b9fcg5r389f7pzvsfad82m))
If one of the premises I have unfolded is a factual claim, Ill spend a few minutes skimming research in the area to see how well my position holds up. [View Highlight](https://read.readwise.io/read/01j8b9g5d16dwc6dqe3b6x7hag))
But often the type of problem I like to think about is too personal and messy and qualitative to be resolved cleanly through a statistically significant study. What I do in these situations instead is to consider *counterexamples*. ... I like to visualize concrete situations when I make an argument ... When I have a concrete situation in mind, I can ask myself, “What is a situation where the opposite happened? Why was that?” I can list the characteristics of the situation that inform my conclusion and then systematically look for cases that have other characteristics.
Counterexamples are useful in two ways. Either you find a counterexample that a) proves one of the premises wrong but b) does not change your mind about the conclusion. Lakatos calls this a local (and non-global) counterexample. This means there is something wrong with your unfolding. ... Local counterexamples help you improve your explanation and get a better understanding.
Other times, the counterexample you find undermines the whole idea—a *global counterexample*. You unfold your conclusion and discover that one of the premises does not hold up, and there is no way to patch it. The fracture spreads right up to the conclusion. Now—this is what we have been longing for—there is a big hole of confusion where before there was a mental model. It is time to replace it with something more subtle and deep that incorporates the critique. [View Highlight](https://read.readwise.io/read/01j8b9vyrraya2jxw8ygqhb7nz))

View file

@ -0,0 +1,25 @@
# I Like Makefiles
![rw-book-cover](https://news.ycombinator.com/favicon.ico)
## Metadata
- Author: [[thunderbong]]
- Full Title: I Like Makefiles
- Category: #articles
- URL: https://switowski.com/blog/i-like-makefiles/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=I%20Like%20Makefiles
> [!tldr]
> The author, Sebastian Witowski, enjoys using makefiles because they provide a consistent way to automate project setups and commands. He finds makefiles simple to write and effective for managing various projects, regardless of the technologies used. While he appreciates other build tools, he prefers to use makefiles for their familiarity and ease of use.
## Highlights
they often follow an unwritten convention of implementing the same set of commands to get you up and running. [View Highlight](https://read.readwise.io/read/01j8tjgaevhxxyf0b2nf9gnbkd))
Even if I use tools like Docker or gulp in my project, I still use makefiles to orchestrate those tools. [View Highlight](https://read.readwise.io/read/01j8tjjdw6w421n8jk5vvj6cs5))
Some common tasks that most of my personal projects[[1]](https://switowski.com/blog/i-like-makefiles/#fn1) contain include:
`dev` to start the development server
`build` to build the project (if a build step is necessary)
`deploy` to deploy/publish the project [View Highlight](https://read.readwise.io/read/01j8tjknbwkzycf3ft7bka78ym))
Make is simple and doesn't require as many additional dependencies as some other build tools. This can be useful if you need a tool that will work in a restricted environment where installing additional packages is difficult or impossible for security reasons. [View Highlight](https://read.readwise.io/read/01j8tjpnwyppr4k1jf6ctx5js0))

View file

@ -0,0 +1,24 @@
# I've built my first successful side project, and I hate it
![rw-book-cover](https://switowski.com/posts/2024/i-have-built-my-first-successful-side-project-and-i-hate-it/cover.jpg)
## Metadata
- Author: [[switowski]]
- Full Title: I've built my first successful side project, and I hate it
- Category: #articles
- URL: https://switowski.com/blog/i-have-built-my-first-successful-side-project-and-i-hate-it/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=I%27ve%20built%20my%20first%20successful%20side%20project%2C%20and%20I%20hate%20it
> [!tldr]
> Sebastian Witowski created a stock trading script that initially excited him, but he soon faced challenges with customer support and feature requests. Despite some sales, he experienced burnout from managing the project while juggling a full-time job. Ultimately, he learned that selling a product is just the beginning, and it requires ongoing effort and support.
## Highlights
I'm an engineer, goddamit! We're not meant to click buttons in the browser or send the same email over and over again! [View Highlight](https://read.readwise.io/read/01j5y28d3ftfhss7wegbnkdwea)) [[favorite]]
Did disconnecting from my project affect my sanity? Oh, hell yes! The project went on autopilot, and it no longer felt like a dreaded chore when I was checking my emails or logging in to my TradingView account. It lost a lot of traction because I stopped updating it, so people think it's not useful anymore (even though it does its job as well as it did a few years ago). Its revenue declined in the past years. But I don't care. I'm happy again. [View Highlight](https://read.readwise.io/read/01j5y2yn2enf1aqz6y9akfmpxa))
The dreaded truth that most programmers learn the hard way is that releasing a product is just the beginning. Once it's out there, you have to maintain it: fix bugs, implement new features, deal with disputes or frauds, and answer a LOT of emails (often from curious window shoppers who never convert to paying customers). [View Highlight](https://read.readwise.io/read/01j5y2gg4qd0p65b97g6xjgxy1))
If your side project is not a source of genuine joy and you have other priorities, it's important to set some boundaries. [View Highlight](https://read.readwise.io/read/01j5y323gv3dwa4y15qzwpycg3))
If you're planning to sell products globally, consider using a "merchant of record" like Gumroad or Paddle. This way, you won't have to figure out how much tax to charge for each country (basically, you only sell to Gumroad, and they resell your product to the final customer). [View Highlight](https://read.readwise.io/read/01j5y32rm97xwbjg1tv9hr65g6))

View file

@ -0,0 +1,23 @@
# Implementing an Actor Model in Golang
![rw-book-cover](https://miro.medium.com/v2/da:true/resize:fit:1200/0*smZOmMQjuS_5l1Af)
## Metadata
- Author: [[Gaurav Sharma]]
- Full Title: Implementing an Actor Model in Golang
- Category: #articles
- Document Tags: [[dev]] [[dev/design-patterns]] [[dev/go]]
- URL: https://betterprogramming.pub/implementing-the-actor-model-in-golang-3579c2227b5e
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Implementing%20an%20Actor%20Model%20in%20Golang
> [!tldr]
> The article explains how to implement an actor model in Golang to handle concurrent tasks efficiently. It describes the roles of actors, task assigners, and the actor system, highlighting their interactions and task processing. The author also shares insights from a simulated web server benchmark that demonstrates how the system adapts to varying task latencies.
## Highlights
The actor model is one such programming construct that models a large number of independent jobs, being processed in any order with no need for a lock synchronisation. [View Highlight](https://read.readwise.io/read/01j96c65ze39pyrcsvp8fpg6xp))
An actor has a task queue and goroutine that listens to the task queue and execute task. [View Highlight](https://read.readwise.io/read/01j96c7xjz9y9snbaawa8qa6hn))
The task is executed in an actor. It is an implementation of a given interface with *Execute method*. Anything which can be executed by making Execute call. Task is a business implementation of the work we need to do. [View Highlight](https://read.readwise.io/read/01j96c958cxjr5855jy9qcshx1))
![](https://miro.medium.com/v2/resize:fit:700/1*YGV-7SgbyBUKIUnruMI5Sg.png) ... `Task`s are submitted to `ActorSystem` using the `SubmitTask` method. A `taskAssigner` assigns each of the task to one of the `Actor`s. Each `Actor` also has a small queue, in which it buffers the tasks and executes one by one.

View file

@ -0,0 +1,56 @@
# In Search of Code Purity
![rw-book-cover](https://i.ytimg.com/vi/voRBS0r4EyI/maxresdefault.jpg?v=65aa862f)
## Metadata
- Author: [[No Boilerplate]]
- Full Title: In Search of Code Purity
- Category: #articles
- Document Tags: [[dev]] [[dev/rust]]
- URL: https://www.youtube.com/watch?v=voRBS0r4EyI
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=In%20Search%20of%20Code%20Purity
> [!note]
> Goal: The intention is to leverage the principles of functional programming purity in a project, utilizing Rust or other programming languages, to enhance code readability, maintainability, and reliability. This to-do list will help achieve that by outlining actionable steps for implementation.
> - [ ] 🦀 **Familiarize with Rust's const functions** to understand how they execute at both compile time and runtime, ensuring the utilization of pure functions.
> - [ ] ⚙️ **Implement pure functions** in the codebase, ensuring they do not produce side effects and maintain referential transparency for predictable behavior.
> - [ ] 🔍 **Establish a system for tagging functions** as pure in the codebase, allowing both developers and the compiler to reason about function behavior effectively.
> - [ ] 📜 **Utilize Rust macros wisely** to enable compile-time evaluations effectively, while understanding their limitations compared to const functions.
> - [ ] 📝 **Incorporate error handling** strategies focused on return types and assertions for better debugging of const functions.
> - [ ] 🧪 **Experiment with caching techniques** that leverage the predictability of pure functions to optimize performance in the application.
> [!tldr]
> Alternate title: Rust's Hidden Purity System
I was taught formal methods at university but these ultra-safe development techniques are expensive, require using unusual external verification languages, and most damning for web and application developers, they slow down iteration.
After graduating and getting a webdev job, I despaired that the safety and guarantees of the formal systems that I had been introduced to weren't available to me as a web developer.
I was going to have to act if I wanted to live in a different world.
❤️ If you would like to support what I do, I have set up a Patreon here: https://www.patreon.com/noboilerplate - Thank you!
📄 All my videos are built in compile-checked markdown, transcript source code available here https://github.com/0atman/noboilerplate this is also where you'll find links to everything mentioned.
🖊️ Corrections are in the pinned ERRATA comment.
🦀 Start your Rust journey here: https://www.youtube.com/watch?v=2hXNd6x9sZs
👕 Bad shirts available here https://www.teepub...
## Highlights
first function here factorial is a pure function a function that doesn't cause or rely upon side effects we know this without reading the function body because it doesn't have IO in the signature the second function main prints to the screen and so must have I/O this is a fantastic way to keep side effects managed and covers half of the nightmare errors I've seen throughout my career [View Highlight](https://read.readwise.io/read/01j6ez3db15q2wagxxh4fxpagw))
if your language has a way of separating or tagging functions that are pure and then can hold you to that contract both you and the compiler can reason about your code in useful new ways [View Highlight](https://read.readwise.io/read/01j6ezg1548mj8f5ntkwrhxh86))
If a pure function is called twice with the same inputs the result is guaranteed to be the same every time this is called referential transparency or idance or determinism this enables perfect predictable caching of return values which your compiler might automatically and easier debugging [View Highlight](https://read.readwise.io/read/01j6ezh53e7hcszmxxd91aze3r))
const functions are functions that can be executed at compile time as well as runtime they differ from rust macros which can only run at compile time and can do anything by being much more limited [View Highlight](https://read.readwise.io/read/01j6ezpb7jgqybcmhz38r5sdxk))
when debugging the only way to get information out of a const function is by its return type or Hal in compilation
with a panic or a failed assertion [View Highlight](https://read.readwise.io/read/01j6f15drv4ypknhpcqz8jh9dc))
macros execute arbitrary code at compile time and then can insert the
results of that processing as potentially const values [View Highlight](https://read.readwise.io/read/01j6f1arc85y5twtf781mgy5tz))
rust's const functions are only pure once you get to runtime [View Highlight](https://read.readwise.io/read/01j6f1a5g0yddv78empzwmh1xp))
rust
is as pure as possible but no purer [View Highlight](https://read.readwise.io/read/01j6f1env98rtskyvf5sp1eygp)) [[dev/rust]] [[dev]]

View file

@ -0,0 +1,69 @@
# Journaling for Personal Development: Stress Management
![rw-book-cover](https://priscillapalmer.com/wp-content/uploads/2023/09/journaling.jpg)
## Metadata
- Author: [[Barbara H. Pugh]]
- Full Title: Journaling for Personal Development: Stress Management
- Category: #articles
- Document Tags: [[notetaking]]
- URL: https://priscillapalmer.com/journaling/
- Archive: https://web-archive.alecodes.page/bookmarks?bf=1&search=&title=Journaling%20for%20Personal%20Development%3A%20Stress%20Management
> [!tldr]
> Journaling is a helpful tool for managing stress and promoting personal growth by allowing individuals to reflect on their thoughts and emotions. It can lead to increased self-awareness, emotional release, and clarity about stressors. By regularly writing in a journal, people can develop strategies to cope with challenges and improve their overall well-being.
## Highlights
Research suggests that engaging in regular journaling can have numerous benefits when it comes to stress reduction and personal development. Firstly, by writing down ones thoughts and feelings related to stressful events or situations, individuals are able to gain clarity and perspective on their internal state. This process enables them to identify patterns or triggers that contribute to their stress levels, thereby empowering them with the knowledge needed to make positive changes in their lives. Additionally, journaling provides a safe outlet for expressing emotions that may be difficult to articulate verbally. Through this cathartic release of pent-up feelings, individuals can experience relief from emotional distress while gaining a sense of emotional release and catharsis. [View Highlight](https://read.readwise.io/read/01j82r0yf8r0wfj54mg92wx0rv))
Moreover, journaling can also serve as a means of problem-solving and decision-making. When faced with stressors or challenges, writing about them allows individuals to explore different perspectives and potential solutions. This process of self-reflection and brainstorming can lead to increased insight and clarity, helping individuals develop effective strategies for managing their stressors. [View Highlight](https://read.readwise.io/read/01j82r1qjbd8pykyn658ae279f))
Furthermore, the act of journaling itself can be a calming and grounding practice. Taking the time to sit down, focus on ones thoughts, and put them into words can create a sense of mindfulness and present-moment awareness. This mindfulness aspect of journaling has been shown to promote relaxation, reduce anxiety levels, and improve overall mental well-being. [View Highlight](https://read.readwise.io/read/01j82r23yyw2bs77zw57sdm8mk))
There are no strict rules for journaling; Sarah can write freely without worrying about grammar or structure the goal is simply to allow her thoughts and emotions to flow onto the pages. [View Highlight](https://read.readwise.io/read/01j82r51a1ef5bnr6mhk69e8q6))
Here are some key benefits of journaling for stress reduction:
**Emotional release:** Writing down our thoughts and feelings allows us to acknowledge and process them more effectively. It provides a safe space to express raw emotions without judgment or consequences.
**Perspective gain:** Through journaling, we gain perspective on our problems and challenges. This shift in viewpoint enables us to approach difficulties with greater clarity and objectivity.
**Problem-solving:** Journaling facilitates problem-solving by allowing us to explore different solutions and evaluate their pros and cons. It helps break down complex issues into manageable parts.
**Gratitude cultivation:** Writing about the things we are grateful for fosters positivity and shifts our focus away from stressors. This practice encourages mindfulness and promotes a sense of contentment. [View Highlight](https://read.readwise.io/read/01j82rdzjqkbhtddtevdwsb6ct))
Set aside dedicated time: Find a quiet space where you can focus solely on your writing without distractions. Allocating even just 10-15 minutes each day can make a significant difference in managing stress. [View Highlight](https://read.readwise.io/read/01j83g3ykzypexdx6yg264s24a))
Choose a format that suits you: Whether its pen and paper or digital platforms, select a medium that feels comfortable for you. Experiment with different styles such as free-writing or structured prompts until you find what resonates best. [View Highlight](https://read.readwise.io/read/01j83g47r6y96fpxd11gq003hg))
Be non-judgmental: Remember that your journal is a safe space for self-expression; there are no right or wrong answers. Allow yourself to freely explore your thoughts and feelings without censoring or criticizing them. [View Highlight](https://read.readwise.io/read/01j83g4f15c6h136m28f6ccymb))
Incorporate gratitude practices: Cultivating gratitude has been shown to reduce stress levels significantly. Consider including a regular gratitude reflection in your journal entries by listing things youre grateful for each day. [View Highlight](https://read.readwise.io/read/01j83g4t6htbb3g9av0q4czz0x))
Emotional release: The act of putting pen to paper allows individuals to express suppressed emotions effectively, leading to emotional catharsis. [View Highlight](https://read.readwise.io/read/01j83g8at9az6qxc9mbvvkrzma))
Stress reduction: Journaling offers an outlet for processing stressful experiences and reducing psychological distress. [View Highlight](https://read.readwise.io/read/01j83g8qgcdemre6wj8jz8hp27))
Problem-solving: By writing down challenges and brainstorming potential solutions, individuals can develop a clearer perspective on problems they face. [View Highlight](https://read.readwise.io/read/01j83g94f5gj99fz91kke20f1x))
Self-discovery: Regular journaling promotes self-awareness and facilitates personal growth by uncovering deeper layers of oneself. [View Highlight](https://read.readwise.io/read/01j83g98fa6s5kwmepwea2jh0x))
Reflect on Daily Experiences: Allocate dedicated time each day to record significant events or encounters that affected your mood positively or negatively. [View Highlight](https://read.readwise.io/read/01j83gcn96tpdded0ydrqb6052))
Identify Emotional Responses: Pay attention to how you feel throughout the day by checking in with yourself regularly. Describe these emotions accurately using specific terms such as frustration, excitement, sadness, or contentment. [View Highlight](https://read.readwise.io/read/01j83gcy7trhxp8ccs2kecxz2s))
Explore Underlying Causes: Dig deeper into your reactions by questioning why certain situations evoke particular emotional responses within you. [View Highlight](https://read.readwise.io/read/01j83gdgv4dd5z122knj7yyb8v))
Monitor Physical Sensations: Observe any physical sensations associated with different emotions—such as increased heart rate during moments of anger or tension—to develop an awareness of your bodys response. [View Highlight](https://read.readwise.io/read/01j83ge9xk9phtja3tpg8mcw1c))
**Identify coping mechanisms**: Reflect on past entries where you successfully managed stressful situations. Note down those techniques and activities that helped alleviate your stress levels. [View Highlight](https://read.readwise.io/read/01j83ghndtsnn7x0d678pgmtbz))
**Set realistic goals**: Break down larger tasks into smaller, achievable goals. This will provide a sense of progress and accomplishment while reducing overwhelm. [View Highlight](https://read.readwise.io/read/01j83ghwt10bc8h4d5wmteebb2))
**Practice self-care**: Prioritize activities that promote relaxation and well-being, such as exercise, meditation, or spending time in nature. [View Highlight](https://read.readwise.io/read/01j83gj5e39ctg3sj16zs2wpyw))
**Seek support**: Reach out to trusted friends or family members who can offer guidance and encouragement during challenging times. [View Highlight](https://read.readwise.io/read/01j83gj9v2zbm0ggre2zrgk54a))
Enhanced self-reflection: Practicing mindfulness allows individuals like Sarah to observe their thoughts and emotions without judgment, fostering greater understanding of their inner experiences. [View Highlight](https://read.readwise.io/read/01j83gmxxazma1tt6rb144p8xs))
Improved emotional regulation: By cultivating awareness of their emotions through mindful journaling, individuals can develop strategies for managing challenging feelings effectively. [View Highlight](https://read.readwise.io/read/01j83gneyj2gmpr6zp51vybmjp))
Increased clarity and perspective: Engaging in mindful reflection while journaling enables individuals to gain fresh insights and new perspectives on stressful situations. [View Highlight](https://read.readwise.io/read/01j83gnhg39rqb94yept0sk884))
Strengthened resilience: Regularly practicing mindfulness in conjunction with journaling equips individuals with tools to navigate adversity more skillfully. [View Highlight](https://read.readwise.io/read/01j83gp7c9ekx44ypp3sgrc4hz))

Some files were not shown because too many files have changed in this diff Show more