<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://tuskerette.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://tuskerette.com/" rel="alternate" type="text/html" /><updated>2026-05-25T19:24:37+00:00</updated><id>http://tuskerette.com/feed.xml</id><title type="html">It’s a bench!</title><subtitle>blog: https://heyvaleria.github.io/</subtitle><entry><title type="html">Your carousel might not be accessible: designing for reduced motion</title><link href="http://tuskerette.com/accessibility/design/development/coding/inclusive-design/2026/03/24/designing-for-reduced-motion.html" rel="alternate" type="text/html" title="Your carousel might not be accessible: designing for reduced motion" /><published>2026-03-24T00:00:00+00:00</published><updated>2026-03-24T00:00:00+00:00</updated><id>http://tuskerette.com/accessibility/design/development/coding/inclusive-design/2026/03/24/designing-for-reduced-motion</id><content type="html" xml:base="http://tuskerette.com/accessibility/design/development/coding/inclusive-design/2026/03/24/designing-for-reduced-motion.html"><![CDATA[<p>On a website I worked on, I noticed some logos stacked vertically on the left
instead of being spread horizontally and evenly spaced, as I expected,
and as the design clearly suggested.</p>

<p>Opened an issue. Carefully listed browsers and versions.
I investigated like a careful end-user. Not like a developer solutionizing on
it, and looking at the code yet.
I thought I just found a bug while doing something else, I was not there to drop
everything and fix it on the spot.</p>

<p>Hard reload. Cleared cache. Tried again. Same problem. Oh well, it’s a bug.</p>

<p>A designer checked and told me it looked fine for them.
So… at that point I was puzzled. 🧐</p>

<p>Then it clicked.
I have Reduce Motion enabled in my system settings.</p>

<p>So yeah, it wasn’t a bug… or was it just a different kind of bug?</p>

<p>That’s when it hit me: a scrolling set of logos, a carousel, isn’t inherently
accessible. And more importantly, when a user opts into reduced motion for
accessibility reasons, we need to ensure that the layout stays intact, and with
it, the meaning of the content.</p>

<p>A pretty common UI pattern like a carousel suddenly became… not so inclusive.</p>

<p>If you’d asked me yesterday whether a carousel of moving items is accessible
design, I would have said, “sure, why not?”</p>

<p>Today, I’d say: not entirely.
Not unless there’s a proper fallback, a static list of items that preserves
layout and still communicates the same information clearly.</p>

<p>Because accessibility isn’t just about turning things off.
It’s about making sure the experience still works when things change.</p>

<p>And the good news is, this is something we can account for.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@media (prefers-reduced-motion: reduce) {
  /* provide a non-animated, stable layout */
}
</code></pre></div></div>

<p>A small detail, but one that can make the difference between something that
looks fine, and something that actually works for everyone.</p>

<p>Reference: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/prefers-reduced-motion">prefers-reduced-motion on MDN</a></p>]]></content><author><name>Valeria</name></author><category term="accessibility" /><category term="design" /><category term="development" /><category term="coding" /><category term="inclusive-design" /><summary type="html"><![CDATA[On a website I worked on, I noticed some logos stacked vertically on the left instead of being spread horizontally and evenly spaced, as I expected, and as the design clearly suggested.]]></summary></entry><entry><title type="html">Zero-downtime with Rails credentials part III</title><link href="http://tuskerette.com/coding/2025/02/26/from-environment-variables-to-rails-credentials-part-iii.html" rel="alternate" type="text/html" title="Zero-downtime with Rails credentials part III" /><published>2025-02-26T00:00:00+00:00</published><updated>2025-02-26T00:00:00+00:00</updated><id>http://tuskerette.com/coding/2025/02/26/from-environment-variables-to-rails-credentials-part-iii</id><content type="html" xml:base="http://tuskerette.com/coding/2025/02/26/from-environment-variables-to-rails-credentials-part-iii.html"><![CDATA[<p>We left you hanging with a big question, whether we still need an <code class="language-plaintext highlighter-rouge">.env</code> file after all. Here’s the answer…</p>

<p>Credentials don’t fully replace <code class="language-plaintext highlighter-rouge">.env</code>
In an ideal world we would not need to have a .env file at all.</p>

<p>When we originally started this task, we thought credentials would replace environment variables in their entirety.</p>

<p>However, as you may have already guessed, at the very least we need 2 environment variables even when using credentials:</p>

<p><code class="language-plaintext highlighter-rouge">RAILS_ENV</code>
<code class="language-plaintext highlighter-rouge">RAILS_MASTER_KEY</code>
<code class="language-plaintext highlighter-rouge">RAILS_ENV</code> tells the application which environment it is when it loads and guides the application towards the correct credentials file for that environment.</p>

<p><code class="language-plaintext highlighter-rouge">RAILS_MASTER_KEY</code> allows Rails to decrypt the credentials.</p>

<p>Without these 2 environment variables, Rails would not be able to infer which credential file to use and how to encrypt it.</p>

<p>…continue reading on the <a href="https://thoughtbot.com/blog/from-environment-variables-to-rails-credentials-part-three">thoughtbot blog</a></p>

<p>Co-authored-by: <a href="https://thoughtbot.com/blog/authors/sami-birnbaum">Sami Birnbaum</a></p>]]></content><author><name>Valeria</name></author><category term="coding" /><summary type="html"><![CDATA[We left you hanging with a big question, whether we still need an .env file after all. Here’s the answer…]]></summary></entry><entry><title type="html">Zero-downtime with Rails credentials part II</title><link href="http://tuskerette.com/coding/2024/12/18/from-environment-variables-to-rails-credentials-part-ii.html" rel="alternate" type="text/html" title="Zero-downtime with Rails credentials part II" /><published>2024-12-18T00:00:00+00:00</published><updated>2024-12-18T00:00:00+00:00</updated><id>http://tuskerette.com/coding/2024/12/18/from-environment-variables-to-rails-credentials-part-ii</id><content type="html" xml:base="http://tuskerette.com/coding/2024/12/18/from-environment-variables-to-rails-credentials-part-ii.html"><![CDATA[<p>In this article we are going to look at the consequences, and the impact that these have on you as a developer, and your codebase.</p>

<p>What impact does this change have on you?
Credential files for each environment
It is important to conceptually consider all the environments we run the application in. In our case, these are:</p>

<p>development
test
staging
production</p>

<p>…continue reading on the <a href="https://thoughtbot.com/blog/from-environment-variables-to-rails-credentials-part-two">thoughtbot blog</a></p>

<p>Co-authored-by: <a href="https://thoughtbot.com/blog/authors/sami-birnbaum">Sami Birnbaum</a></p>]]></content><author><name>Valeria</name></author><category term="coding" /><summary type="html"><![CDATA[In this article we are going to look at the consequences, and the impact that these have on you as a developer, and your codebase.]]></summary></entry><entry><title type="html">Parallels between consulting &amp;amp; software development and staying in a hotel room in London</title><link href="http://tuskerette.com/consulting/2024/11/21/parallels-between-consulting-and-a-hotel-room-in-london.html" rel="alternate" type="text/html" title="Parallels between consulting &amp;amp; software development and staying in a hotel room in London" /><published>2024-11-21T00:00:00+00:00</published><updated>2024-11-21T00:00:00+00:00</updated><id>http://tuskerette.com/consulting/2024/11/21/parallels-between-consulting-and-a-hotel-room-in-london</id><content type="html" xml:base="http://tuskerette.com/consulting/2024/11/21/parallels-between-consulting-and-a-hotel-room-in-london.html"><![CDATA[<p>The end-users, myself and another guest that we are going to call Rob, were staying in 2 hotel rooms in a London hotel.
Neither of the hairdryers in our rooms worked properly, and they were attached to the wall.</p>

<p>Rob’s reaction: “It’s fine, I’ll make do without using a hairdryer during my stay”.
My reaction: When I went to breakfast I let the staff members know I needed a hairdryer. They had one delivered to my room, while I was eating breakfast. Problem solved.</p>

<p>Later that day I read on the hotel room brochure on my desk, about the services provided, something like “there is a tea/coffee machine at every floor, and a closet where there are ironing boards and additional hairdryers available.”</p>

<p>That last part made me feel like they (the product owners and/or developers) knew more than one of their hairdryers were faulty but instead of replacing them (higher investment of time/money/effort), they provided instructions on how to solve the problem, a workaround: “go get another one at the end of the corridor.”</p>

<p>Except this information was not highly visible and available when I needed it. The text was not in the context where the error happened. The message to help solve my issue was not next to the hairdryer on the wall.</p>

<p>I had to ask a staff member (the developers) who basically made a change in the backend for me to remove the error that was happening in the UI, and I found a hairdryer on my bed later.</p>

<p>In your opinion, was this a good strategy to tackle the broken hairdryer issue?
What would have been an alternative/better solution?</p>

<p>Let’s not forget about the user Rob who didn’t say anything and dealt with the broken feature and had a less-than-ideal experience overall, and nobody will ever know. But he may stop using the app… as in staying in a different hotel next time, maybe.</p>]]></content><author><name>Valeria</name></author><category term="consulting" /><summary type="html"><![CDATA[The end-users, myself and another guest that we are going to call Rob, were staying in 2 hotel rooms in a London hotel. Neither of the hairdryers in our rooms worked properly, and they were attached to the wall.]]></summary></entry><entry><title type="html">Zero-downtime with Rails credentials</title><link href="http://tuskerette.com/coding/2024/11/14/from-environment-variables-to-rails-credentials.html" rel="alternate" type="text/html" title="Zero-downtime with Rails credentials" /><published>2024-11-14T00:00:00+00:00</published><updated>2024-11-14T00:00:00+00:00</updated><id>http://tuskerette.com/coding/2024/11/14/from-environment-variables-to-rails-credentials</id><content type="html" xml:base="http://tuskerette.com/coding/2024/11/14/from-environment-variables-to-rails-credentials.html"><![CDATA[<p>The project we’re working on is currently set to have new code released following
a schedule, twice a week and the process is heavily manual.
A developer needs to be online at specific times, after-hours, to limit the
impact on the users. By impact we mean that the site has to be taken into
maintenance mode, preventing the users from accessing the app while new code is
being deployed.</p>

<p>…continue reading on the <a href="https://thoughtbot.com/blog/from-environment-variables-to-rails-credentials">thoughtbot blog</a></p>

<p>Co-authored-by: <a href="https://thoughtbot.com/blog/authors/sami-birnbaum">Sami Birnbaum</a></p>]]></content><author><name>Valeria</name></author><category term="coding" /><summary type="html"><![CDATA[The project we’re working on is currently set to have new code released following a schedule, twice a week and the process is heavily manual. A developer needs to be online at specific times, after-hours, to limit the impact on the users. By impact we mean that the site has to be taken into maintenance mode, preventing the users from accessing the app while new code is being deployed.]]></summary></entry><entry><title type="html">Custom site search in Google Chrome</title><link href="http://tuskerette.com/toolchain/2024/04/12/custom-site-search-in-google-chrome.html" rel="alternate" type="text/html" title="Custom site search in Google Chrome" /><published>2024-04-12T00:00:00+00:00</published><updated>2024-04-12T00:00:00+00:00</updated><id>http://tuskerette.com/toolchain/2024/04/12/custom-site-search-in-google-chrome</id><content type="html" xml:base="http://tuskerette.com/toolchain/2024/04/12/custom-site-search-in-google-chrome.html"><![CDATA[<p>We recently started using JIRA at the client I work with, and I remembered a
useful shortcut from a long time ago: making my own site search custom shortcut
to find JIRA tickets quickly.</p>

<h3 id="the-way-it-works">The way it works</h3>

<p>In the address bar you can type <code class="language-plaintext highlighter-rouge">jira [space] CODE-123 [enter]</code> where CODE-123 is the
ticket’s reference number.
This will autofill the URL with the ticket identifier variable and take you there
without passing from the Sprint or Board or pasting a whole URL.</p>

<h3 id="how-to-set-it-up">How to set it up</h3>

<p>Go to Chrome &gt; Settings &gt; Search engine &gt; Site Search &gt; Click on Add</p>

<p>In the dialog add the name you want, then the shortcut field is the keyword you
want to use to start this site search, and the URL with <code class="language-plaintext highlighter-rouge">%s</code> in place of the query,
for example: <code class="language-plaintext highlighter-rouge">https://jira.my-beautiful-project.com/browse/%s</code></p>

<p>Now when I type <code class="language-plaintext highlighter-rouge">jira [space] CODE-123 [enter]</code>, Chrome will load</p>

<p><code class="language-plaintext highlighter-rouge">https://jira.my-beautiful-project.com/browse/CODE-123</code> for me! Yay!</p>]]></content><author><name>Valeria</name></author><category term="toolchain" /><summary type="html"><![CDATA[We recently started using JIRA at the client I work with, and I remembered a useful shortcut from a long time ago: making my own site search custom shortcut to find JIRA tickets quickly.]]></summary></entry><entry><title type="html">Remove annoying sound from VSCode</title><link href="http://tuskerette.com/coding/2024/03/18/remove-annoying-sound-from-vs-code.html" rel="alternate" type="text/html" title="Remove annoying sound from VSCode" /><published>2024-03-18T00:00:00+00:00</published><updated>2024-03-18T00:00:00+00:00</updated><id>http://tuskerette.com/coding/2024/03/18/remove-annoying-sound-from-vs-code</id><content type="html" xml:base="http://tuskerette.com/coding/2024/03/18/remove-annoying-sound-from-vs-code.html"><![CDATA[<p>In VSCode I use the keybindings from Atom, the old editor.</p>

<p>I move lines up and down using “Control + Command + Arrow Up” and “Arrow Down”.</p>

<p>In VSCode when I move a line down with “Control + Command + Arrown Down”
there is an annoying error sound that, like the Terminal sound.
This is a known bug related to <a href="https://github.com/Microsoft/vscode/issues/44070">Electron</a>,
apparently.</p>

<h1 id="the-solution-">The solution 🙌</h1>

<p>Create a file for default keybindings and edit it (I use VIM 😉):</p>

<p><code class="language-plaintext highlighter-rouge">vim ~/Library/KeyBindings/DefaultKeyBinding.dict</code></p>

<p>Add this exact content to it, save it.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="o">{</span>
    <span class="s2">"@^</span><span class="se">\U</span><span class="s2">F701"</span> <span class="o">=</span> <span class="s2">"noop:"</span><span class="p">;</span>
  <span class="o">}</span>
</code></pre></div></div>

<p>I got the keybindings from <a href="https://gist.github.com/trusktr/1e5e516df4e8032cbc3d">this gist</a>
where <code class="language-plaintext highlighter-rouge">@</code> is Command, <code class="language-plaintext highlighter-rouge">^</code> is Control and <code class="language-plaintext highlighter-rouge">\UF701</code> is Arrow Down.</p>

<p>Restart VSCode. DONE.</p>]]></content><author><name>Valeria</name></author><category term="coding" /><summary type="html"><![CDATA[In VSCode I use the keybindings from Atom, the old editor.]]></summary></entry><entry><title type="html">DEI during in-person meetups</title><link href="http://tuskerette.com/dei/2023/12/01/dei-during-in-person-meetups.html" rel="alternate" type="text/html" title="DEI during in-person meetups" /><published>2023-12-01T00:00:00+00:00</published><updated>2023-12-01T00:00:00+00:00</updated><id>http://tuskerette.com/dei/2023/12/01/dei-during-in-person-meetups</id><content type="html" xml:base="http://tuskerette.com/dei/2023/12/01/dei-during-in-person-meetups.html"><![CDATA[<p>About 2-3 times a year we get to meet our teammates in-person and hang out and/or work together for a few days.</p>

<p>We sign and acknowledge the code of conduct, buy our plane tickets, we pack and go. 🛫</p>

<p>During my last trip to a week-long in-person meetup, is when it hit me 💡!</p>

<p>Side note, the trip was a blast, a sort of a coding retreat, and having fun make food together, and talking about this and that.
And I even saw the second to last stage of La Vuelta España passing by, and I was beyond excited.</p>

<h3 id="lets-continue">Let’s continue…</h3>

<p>The concepts of diversity, equality, and inclusion are not in a vacuum.
They don’t start and end when you’re on Google Meet or in the DEI Council monthly meeting.</p>

<p>In a remote-first-and-pretty-much-remote-only world like ours, we interact only for a limited amount of time per day.
A meeting can last a half our or an hour, pairing sessions can be longer, as can be 1:1s.</p>

<p>These meetings are predictable slices of time in our days, and we are prepared for them, we are in control.
But in the in-person setting there is ane aspect of team building, doing activities together, pairing in-person, talk about code or consulting together, relax, and be ourselves in a shared physical space.</p>

<p>It’s important to be able to be ourselves, and we share parts of ourselves that maybe others don’t get to see on a daily basis, like for example they know I love to cycle but they don’t know I could get obsessed to the point of refurbishing a 70s road bike I asked my team lead to bring, and that made me the happiest person in the neighborhood for half a week. Oh did I mention the stage of la Vuelta? 😅</p>

<p>We get to be ourselves and it is a great DEI exercise, it’s real, not practice.</p>

<p>It may seem I’m saying I am a butt when I’m outside of work, or outside of meetings.
It’s more subtle than that.
It’s a conscious application of our high standards, and of the values we believe in.</p>]]></content><author><name>Valeria</name></author><category term="dei" /><summary type="html"><![CDATA[About 2-3 times a year we get to meet our teammates in-person and hang out and/or work together for a few days.]]></summary></entry><entry><title type="html">The importance of everyone’s opinion</title><link href="http://tuskerette.com/dei/inclusivity/process/2023/12/01/the-importance-of-everyones-opinion.html" rel="alternate" type="text/html" title="The importance of everyone’s opinion" /><published>2023-12-01T00:00:00+00:00</published><updated>2023-12-01T00:00:00+00:00</updated><id>http://tuskerette.com/dei/inclusivity/process/2023/12/01/the-importance-of-everyones-opinion</id><content type="html" xml:base="http://tuskerette.com/dei/inclusivity/process/2023/12/01/the-importance-of-everyones-opinion.html"><![CDATA[<p>These days we luckily hear and read more about inclusivity. Inclusivity in the language we use, in the way we treat people, in the workplace, in meetings.</p>

<p>Especially in meetings, in my experience, some folks may tend to speak less than others. Some of the reasons that come to mind are:</p>

<ul>
  <li>They may be a member of a marginalized group, and may be afraid to speak up because of prior experience. By the definition they’ve been treated as insignificant and powerless;</li>
  <li>They may be a member of an underrepresented group, and may be afraid to voice a contrary opinion if they are up against a majority;</li>
  <li>They may have an introverted personality;</li>
  <li>Their title (less experience) or their role (to an adjacent department or field) may discourage them from actively participating.
While you can check out our meeting guidelines, for further reading, I would like to focus on the last item in the list.</li>
</ul>

<p>To the folks who tend to speak more in meetings: we should do our best to make sure everyone has a chance to express their opinion. I come from a culture where everyone is silent in a group of people causes discomfort and awkwardness. I am aware that I get impatient waiting in silence while I say “Does anyone have any thoughts or want to add anything?” and after a few seconds, we end up filling up the silence with a conversation with a restricted number of actors, and some quiet spectators.</p>

<p>This is not ideal, to say the least! We should try to avoid accidental power dynamics, where the conversation ends up among the ones who have more context than others, or have more decisional power over the resolution of an issue or strategy to tackle the next task at hand.</p>

<p>If someone in the team has less experience or context on a subject, we should absolutely encourage them to share their input, as it will bring a different point of view, a new perspective on the subject, and hopefully they would be asking clarifying questions to force the folks with more knowledge to explain what we are doing and why, what has been attempted thus far, the current resolution plan… out loud.</p>

<p>There are strategies to improve the participation from everyone in a group meeting:</p>

<p>Starting the meeting with a quick ice breaker game, where everyone gets to say something, will increase the chances that everyone will speak throughout the rest of the meeting, improving teamwork and collaboration. It could be as simple as “two truths and a lie”, or “what’s your least favorite household chore?”
While talking about the purpose of the meeting, and the proposed solutions, even when it is a very technical question, try to zoom out, and ask for everyone’s input.</p>

<p>Scenario: we are trying to come up with the most effective way to store certain data about the orders for our pizza delivery service. The question is around Postgres tables, joins, SQL queries, and possibly analysis tools. Ask everyone, for example: “If you order a pizza online, how do you expect to see your order details?” Any answer will do, including “I have never ordered a pizza online.”
Providing input and actively participating in meetings is a great way to:</p>

<ul>
  <li>increase shared knowledge;</li>
  <li>discuss alternatives;</li>
  <li>write meaningful documentation. We may realize that some assumptions were wrong, we may compare solutions, and come up with new approaches.</li>
</ul>]]></content><author><name>Valeria</name></author><category term="dei" /><category term="inclusivity" /><category term="process" /><summary type="html"><![CDATA[These days we luckily hear and read more about inclusivity. Inclusivity in the language we use, in the way we treat people, in the workplace, in meetings.]]></summary></entry><entry><title type="html">Pairing is caring</title><link href="http://tuskerette.com/coding/consulting/2023/03/01/pairing-is-caring.html" rel="alternate" type="text/html" title="Pairing is caring" /><published>2023-03-01T00:00:00+00:00</published><updated>2023-03-01T00:00:00+00:00</updated><id>http://tuskerette.com/coding/consulting/2023/03/01/pairing-is-caring</id><content type="html" xml:base="http://tuskerette.com/coding/consulting/2023/03/01/pairing-is-caring.html"><![CDATA[<p>Here at thoughtbot a big part of our culture is pair programming pretty much on a daily basis.
There are many reasons to work in a pairing session, including:</p>

<p>…continue reading on the <a href="https://thoughtbot.com/blog/pairing-is-caring">thoughtbot blog</a></p>]]></content><author><name>Valeria</name></author><category term="coding" /><category term="consulting" /><summary type="html"><![CDATA[Here at thoughtbot a big part of our culture is pair programming pretty much on a daily basis. There are many reasons to work in a pairing session, including:]]></summary></entry></feed>