<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Daniel Mitchell]]></title><description><![CDATA[I'm Daniel Mitchell, a Senior Software and Cloud Engineer based in the UK.]]></description><link>https://www.daniel-mitchell.com/</link><image><url>https://www.daniel-mitchell.com/favicon.png</url><title>Daniel Mitchell</title><link>https://www.daniel-mitchell.com/</link></image><generator>Ghost 4.36</generator><lastBuildDate>Fri, 18 Sep 2026 03:51:24 GMT</lastBuildDate><atom:link href="https://www.daniel-mitchell.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Never Miss an Octopus Energy Saving Session Again ☀️]]></title><description><![CDATA[<p><strong>I built a little Cloudflare Worker that automatically joins Octopus Energy Saving Sessions so I don&apos;t have to remember to opt in. Here&apos;s how it works and how you can set it up for yourself.</strong></p><h2 id="the-problem">The Problem</h2><p><a href="https://octopus.energy/">Octopus Energy</a> runs <strong>Saving Sessions</strong> &#x2014; time windows where</p>]]></description><link>https://www.daniel-mitchell.com/blog/never-miss-an-octopus-energy-saving-session-again/</link><guid isPermaLink="false">6a79e1fac9c41c03942af35b</guid><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Mon, 10 Aug 2026 15:22:30 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2026/08/Gemini_Generated_Image_gpfoa4gpfoa4gpfo.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2026/08/Gemini_Generated_Image_gpfoa4gpfoa4gpfo.png" alt="Never Miss an Octopus Energy Saving Session Again &#x2600;&#xFE0F;"><p><strong>I built a little Cloudflare Worker that automatically joins Octopus Energy Saving Sessions so I don&apos;t have to remember to opt in. Here&apos;s how it works and how you can set it up for yourself.</strong></p><h2 id="the-problem">The Problem</h2><p><a href="https://octopus.energy/">Octopus Energy</a> runs <strong>Saving Sessions</strong> &#x2014; time windows where you&apos;re rewarded for shifting your electricity usage away from peak demand. The reward? OctoPoints, which convert directly to account credit. It&apos;s free money for simply being mindful about <em>when</em> you use power.</p><p>The catch? You have to <strong>manually opt in</strong> to each session. If you forget, you get nothing &#x2014; even if you shifted your usage anyway. These sessions come at irregular intervals, sometimes with a day&apos;s notice, sometimes just a few hours. Sometimes I would be away on holiday and miss out on the savings I would have generated anyways because I am not at home.</p><p>I wanted a fire-and-forget solution: something that checks periodically, joins any new sessions automatically, and lets me know when it does.</p><h2 id="the-solution-automator-octopus-energy">The Solution: <code>automator-octopus-energy</code></h2><p><a href="https://github.com/mrdanielmitchell/automator-octopus-energy"><code>automator-octopus-energy</code></a> is a serverless automation bot that runs on Cloudflare Workers. It&apos;s triggered every hour by a cron schedule, queries Octopus Energy&apos;s backend GraphQL API for new saving sessions, and joins them on your behalf.</p><p>Here&apos;s the high-level flow:</p><pre><code>Cron (hourly) &#x2192; Fetch saving sessions &#x2192; Filter expired events &#x2192; Check deduplication &#x2192; Join new sessions &#x2192; Email you
</code></pre><p>The whole thing costs <strong>nothing to run</strong> &#x2014; it fits comfortably within Cloudflare&apos;s generous free tier, and it runs in milliseconds per invocation.</p><h3 id="key-features">Key Features</h3><ul><li><strong>Fully automated</strong> &#x2014; set it up once, forget about it forever. Every new session gets joined automatically.</li><li><strong>Deduplication</strong> &#x2014; uses Cloudflare KV to track which sessions have already been joined or were ineligible, so it never double-joins or spams you with retries.</li><li><strong>Stale event filtering</strong> &#x2014; ignores sessions older than 5 days so it won&apos;t attempt to join events that have already passed.</li><li><strong>Ineligible account handling</strong> &#x2014; if your account isn&apos;t eligible for a particular session (some are region-specific), the worker records that and doesn&apos;t keep retrying.</li><li><strong>Email notifications via AWS SES</strong> &#x2014; get an email when a session is successfully joined, or if something goes wrong. Email is optional &#x2014; the worker runs fine without it.</li><li><strong>Manual trigger endpoint</strong> &#x2014; hit <code>/trigger</code> on your worker to test or run it on-demand.</li></ul><h2 id="how-it-works-under-the-hood">How It Works Under the Hood</h2><p>The worker is written in TypeScript and runs on Cloudflare Workers. It&apos;s about 300 lines of code across four files:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>File</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td>index.ts</td>
<td>The entry point &#x2014; handles the cron trigger, orchestrates the flow, and provides the HTTP trigger endpoint</td>
</tr>
<tr>
<td>octopus.ts</td>
<td>Octopus Energy GraphQL client &#x2014; handles authentication (Kraken token exchange) and API calls</td>
</tr>
<tr>
<td>email.ts</td>
<td>AWS SES sender using Signature V4 &#x2014; sends plain-text notification emails without any SDK dependency</td>
</tr>
<tr>
<td>types.ts</td>
<td>TypeScript type definitions for all API responses and the Worker environment</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h3 id="the-octopus-energy-api">The Octopus Energy API</h3><p>Octopus has two GraphQL endpoints. The worker first authenticates against the main API (<code>api.octopus.energy</code>) using your API key to obtain a short-lived Kraken JWT token. It then uses that token against the backend API (<code>api.backend.octopus.energy</code>) to query <code>savingSessions</code> and call the <code>joinSavingSessionsEvent</code> mutation.</p><p>The <code>savingSessions</code> query returns both available events <em>and</em> your account&apos;s already-joined events in one call, which eliminates the need for an extra round-trip to check membership.</p><h3 id="email-without-an-sdk">Email Without an SDK</h3><p>The email module implements AWS Signature V4 signing against SES using only the Web Crypto API &#x2014; no AWS SDK needed. This keeps the worker bundle tiny (under 50 KB) and avoids the cold-start penalty of loading a heavy dependency. The signing flow is:</p><ol><li>Hash the request payload with SHA-256</li><li>Build the canonical request string</li><li>Construct the &quot;string to sign&quot; with the date, region, and service</li><li>Derive the signing key through four rounds of HMAC-SHA-256</li><li>Sign and attach the <code>Authorization</code> header</li></ol><p>Email is entirely optional. If you don&apos;t set AWS credentials, the worker still runs &#x2014; it just skips the notification step and logs instead.</p><h2 id="setting-it-up-yourself">Setting It Up Yourself</h2><p>You&apos;ll need three things:</p><ol><li><strong>A Cloudflare account</strong> (free tier works fine)</li><li><strong>An Octopus Energy API key</strong> &#x2014; grab one from the <a href="https://octopus.energy/dashboard/developer/">Octopus developer dashboard</a></li><li><strong>Your Octopus account number</strong> &#x2014; the <code>A-XXXXXXXX</code> identifier on your bill</li></ol><h3 id="quick-start">Quick Start</h3><p>The easiest way is the <strong>Deploy to Cloudflare</strong> button &#x2014; one click provisions the worker:</p><figure class="kg-card kg-image-card"><a href="https://deploy.workers.cloudflare.com/?url=https://github.com/mrdanielmitchell/automator-octopus-energy"><img src="https://deploy.workers.cloudflare.com/button" class="kg-image" alt="Never Miss an Octopus Energy Saving Session Again &#x2600;&#xFE0F;" loading="lazy"></a></figure><p>Or clone and deploy manually:</p><pre><code class="language-bash">git clone https://github.com/mrdanielmitchell/automator-octopus-energy.git
cd automator-octopus-energy
npm install
</code></pre><p>Then create a KV namespace and set your secrets:</p><pre><code class="language-bash"># Create the KV namespace for deduplication
npx wrangler kv namespace create JOINED_SESSIONS
# &#x2192; Copy the returned ID into wrangler.jsonc

# Set required secrets
npx wrangler secret put OCTOPUS_API_KEY
npx wrangler secret put ACCOUNT_NUMBER
npx wrangler secret put EMAIL_FROM
npx wrangler secret put EMAIL_TO

# Optional &#x2014; omit to skip email notifications
npx wrangler secret put AWS_ACCESS_KEY_ID
npx wrangler secret put AWS_SECRET_ACCESS_KEY

# Deploy
npx wrangler deploy
</code></pre><p>That&apos;s it. The worker starts checking every hour. You&apos;ll get an email the next time a saving session opens up &#x2014; no action required.</p><h2 id="testing-it">Testing It</h2><p>Want to make sure it&apos;s working? Trigger a manual run:</p><pre><code class="language-bash">curl https://automator-octopus-energy.YOUR_SUBDOMAIN.workers.dev/trigger
</code></pre><p>Then check your worker logs in the Cloudflare dashboard. If there&apos;s a session available, you&apos;ll see it being joined in real time.</p><h2 id="why-cloudflare-workers">Why Cloudflare Workers?</h2><p>I chose Workers for this because:</p><ul><li><strong>Zero infrastructure</strong> &#x2014; no server to maintain, no Docker, no VPS</li><li><strong>Free tier</strong> &#x2014; 100,000 requests/day is more than enough for an hourly cron job (730 invocations/month)</li><li><strong>KV for state</strong> &#x2014; perfect for the deduplication store, with TTL-based expiry so old entries clean up automatically</li><li><strong>Cron triggers built in</strong> &#x2014; no need for an external scheduler like GitHub Actions or a separate cron service</li><li><strong>Edge execution</strong> &#x2014; runs close to Octopus&apos;s API endpoints in AWS eu-west-2 (London)</li></ul><p>The whole thing costs me &#xA3;0/month and is completely serverless.</p><h2 id="give-it-a-try">Give It a Try</h2><p>If you&apos;re an Octopus Energy customer, this takes about five minutes to set up and then you never have to think about it again. Every saving session gets joined automatically, every time.</p><p>The repo is at <strong><a href="https://github.com/mrdanielmitchell/automator-octopus-energy">github.com/mrdanielmitchell/automator-octopus-energy</a></strong> &#x2014; stars, issues, and PRs welcome.</p>]]></content:encoded></item><item><title><![CDATA[The Perils of test.php: How a Simple File Led to a Spam Nightmare]]></title><description><![CDATA[<p>In the world of web development, we&apos;ve all deployed throwaway files for debugging&#x2014;often with innocent names like <code>test.php</code>. But sometimes, these small conveniences can snowball into major security breaches.</p><p>One such case involved a <code>test.php</code> file containing a single, seemingly harmless line of code:</p>]]></description><link>https://www.daniel-mitchell.com/blog/the-perils-of-test-php-how-a-simple-file-led-to-a-spam-nightmare/</link><guid isPermaLink="false">686247b022fd18542d8b2d43</guid><category><![CDATA[PHP]]></category><category><![CDATA[Security]]></category><category><![CDATA[Email]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Mon, 30 Jun 2025 08:22:14 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2025/06/A-banner-image-illus---Copy-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2025/06/A-banner-image-illus---Copy-1.png" alt="The Perils of test.php: How a Simple File Led to a Spam Nightmare"><p>In the world of web development, we&apos;ve all deployed throwaway files for debugging&#x2014;often with innocent names like <code>test.php</code>. But sometimes, these small conveniences can snowball into major security breaches.</p><p>One such case involved a <code>test.php</code> file containing a single, seemingly harmless line of code:</p><pre><code class="language-PHP">&lt;?php phpinfo(); ?&gt;</code></pre><p><strong>What&#x2019;s the Harm in <code>phpinfo()</code>?</strong><br>At first glance, <code>phpinfo()</code> is a useful tool. It provides detailed information about your PHP configuration, environment variables, installed modules, and more. But that&#x2019;s also <em>exactly</em> why it&#x2019;s dangerous.</p><p>When <code>test.php</code> was deployed and left publicly accessible, it revealed sensitive <strong>environment variables</strong> to anyone who visited the URL. Among those were <strong>AWS SES credentials</strong>&#x2014;tokens that granted programmatic access to Amazon&#x2019;s Simple Email Service.</p><p><strong>The Consequence? Weaponized Infrastructure</strong><br>An attacker discovered the file, harvested the credentials, and used them to integrate AWS SES into a mailer service. From there, they sent out a tidal wave of spam emails&#x2014;all under the banner of the legitimate SES account. That not only led to a compromised sender reputation, but could have triggered account suspension, blacklisting, or even regulatory action depending on the volume and content of those messages.</p><p><strong>Key Takeaways for Developers and Ops Teams:</strong></p><ul><li><strong>Never expose <code>phpinfo()</code> or debugging tools in production.</strong> Use secure environments and authentication barriers for diagnostics.</li><li><strong>Audit all public files before deployment.</strong> Even a single overlooked file can undo years of careful engineering.</li><li><strong>Use scoped IAM roles</strong> and <strong>do not store credentials in environment variables</strong> that are accessible by the web server.</li><li><strong>Set up alerts</strong> and <strong>rotate credentials regularly</strong>&#x2014;a single leak shouldn&#x2019;t mean total compromise.</li></ul><p><strong>&#x1F575;&#xFE0F; Other Files Scammers Commonly Hunt For</strong></p><p>Bad actors often use automated scanners to sweep the internet for exposed files that can leak credentials, configurations, or system insights:</p><!--kg-card-begin: html--><table><thead><tr><th><p>File/Endpoint</p></th><th><p>Risk Description</p></th></tr></thead>
<tbody><tr><td><p><code>/phpinfo.php</code> or <code>/info.php</code></p></td><td><p>Same as <code>test.php</code>, exposes server configs and env variables</p></td></tr>
<tr><td><p><code>.env</code></p></td><td><p>Contains environment variables like database credentials, API keys</p></td></tr>
<tr><td><p><code>.git/config</code> or <code>.git/HEAD</code></p></td><td><p>Exposes Git repo internals, possibly allowing full source code download</p></td></tr>
<tr><td><p><code>config.php</code>, <code>db.php</code></p></td><td><p>Often contain DB login credentials hardcoded for convenience</p></td></tr>
<tr><td><p><code>backup.zip</code>, <code>site.tar.gz</code>, <code>db.sql</code></p></td><td><p>Accidental backups of full systems or databases</p></td></tr>
<tr><td><p><code>composer.json</code> / <code>composer.lock</code></p></td><td><p>Can reveal package dependencies with known vulnerabilities</p></td></tr>
<tr><td><p><code>/admin/</code> directories</p></td><td><p>Common brute-force targets for admin panel access</p></td></tr>
<tr><td><p><code>.DS_Store</code>, <code>Thumbs.db</code></p></td><td><p>Leak directory structure and sometimes sensitive filenames</p></td></tr>
<tr><td><p><code>/server-status</code> (Apache)</p></td><td><p>Provides live metrics about server load and connections (if enabled)</p></td></tr>
</tbody>
</table><!--kg-card-end: html--><p>Some scanners even look for misconfigured CI/CD pipelines, logs, or temporary test scripts named <code>debug.php</code>, <code>temp.php</code>, or <code>sandbox.php</code>.</p><p>Debugging should never come at the expense of security. In this case, one line of PHP script created a gateway for exploitation. The next time you&#x2019;re tempted to drop a <code>test.php</code> onto the server for a quick check&#x2014;pause and think of the spam tsunami that might be lurking behind it.</p>]]></content:encoded></item><item><title><![CDATA[Sign ASL Year Review 2024]]></title><description><![CDATA[<p>2024 saw new peaks in usage for the sign language dictionary, www.signasl.org. With a whopping <strong>34,412,937 searches</strong> conducted on the platform and <strong>908,000 unique visitors.</strong> This was a <strong>6.8% increase</strong> from 2023, which had 32,197,037 searches. This continued growth speaks to our</p>]]></description><link>https://www.daniel-mitchell.com/blog/sign-asl-year-review-2024/</link><guid isPermaLink="false">67bb56b922fd18542d8b2cfd</guid><category><![CDATA[SignASL]]></category><category><![CDATA[Year in Review]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Wed, 15 Jan 2025 17:11:00 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2025/02/1000030579-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2025/02/1000030579-1.png" alt="Sign ASL Year Review 2024"><p>2024 saw new peaks in usage for the sign language dictionary, www.signasl.org. With a whopping <strong>34,412,937 searches</strong> conducted on the platform and <strong>908,000 unique visitors.</strong> This was a <strong>6.8% increase</strong> from 2023, which had 32,197,037 searches. This continued growth speaks to our commitment to providing comprehensive resources for those learning American Sign Language.</p><h4 id="top-50-words-searched">Top 50 Words Searched</h4><p>Our top searched words for 2024 reflected both everyday conversation essentials and some intriguing trends:</p><ul><li>Pro</li><li>Have</li><li>Good</li><li>Like</li><li>What</li><li>Want</li><li>Love</li><li>When</li><li>How</li><li>You&apos;re Welcome</li><li>Do</li><li>School</li><li>Happy</li><li>Thank You</li><li>Where</li><li>To</li><li>And</li><li>With</li><li>Go</li><li>Translate</li><li>For</li><li>Play</li><li>Is</li><li>Help</li><li>Need</li><li>Why</li><li>Hello</li><li>We</li><li>How Are You</li><li>Dog</li><li>Favorite</li><li>Work</li><li>Please</li><li>No</li><li>I</li><li>Nazi</li><li>You</li><li>Can</li><li>All</li><li>Brother</li><li>Now</li><li>Not</li></ul><h4 id="upgraded-ios-asl-app">Upgraded IOS ASL App</h4><p>We&#x2019;re thrilled to announce the launch of our upgraded IOS ASL app, packed with user-friendly features to enhance your experience:</p><ul><li>New tabbed interface for easy navigation</li><li>Access to Recent and Popular signs</li><li>Option to hide video controls overlay</li><li>Loop video playback for continuous learning</li><li>Back and forward buttons in the video player for quick access to alternative signs</li><li>Ability to continue audio playback from other apps while watching videos</li><li>Show video attribution to credit content creators</li><li>Save your favorite signs and view them offline</li><li>Support for dark mode to reduce eye strain</li><li>Improved startup behavior for better offline access</li></ul><p>A special thanks to <strong>Mat Gadd</strong> for the incredible update! We couldn&#x2019;t have done it without you.</p><p>As we move forward, we&#x2019;re excited to continue providing improving the video dictionary. Stay tuned for more updates and happy signing!</p>]]></content:encoded></item><item><title><![CDATA[Sign BSL Year Review 2024]]></title><description><![CDATA[<p>Greetings, British Sign Language enthusiasts!</p><p>We&apos;re excited to share an incredible milestone in our journey to promote and support sign language learning. As we reflect on the year 2024, we&#x2019;re thrilled to report some fascinating insights and achievements from www.signbsl.com.</p><p><strong>Record-Breaking Searches: </strong>In 2024,</p>]]></description><link>https://www.daniel-mitchell.com/blog/sign-bsl-year-review-2024/</link><guid isPermaLink="false">67b9c54022fd18542d8b2c9e</guid><category><![CDATA[SignBSL]]></category><category><![CDATA[Year in Review]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Wed, 15 Jan 2025 16:59:00 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2025/02/1000030579.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2025/02/1000030579.png" alt="Sign BSL Year Review 2024"><p>Greetings, British Sign Language enthusiasts!</p><p>We&apos;re excited to share an incredible milestone in our journey to promote and support sign language learning. As we reflect on the year 2024, we&#x2019;re thrilled to report some fascinating insights and achievements from www.signbsl.com.</p><p><strong>Record-Breaking Searches: </strong>In 2024, our website experienced a significant surge in activity, with <strong>536,288 unique visitors</strong> and a staggering <strong>29,957,642 searches</strong> made. This is a <strong>21.9% increase</strong> compared to the 24,587,983 searches in 2023. We are beyond grateful for the growing interest and engagement from our dedicated users worldwide.</p><p><strong>Top 50 Searched Words: </strong>Our users&#x2019; curiosity and dedication to learning have highlighted some intriguing trends in search activity. Here are the top 50 words searched on our site in 2024:</p><ol><li>how are you</li><li>dictionary</li><li>i love you</li><li>want</li><li>more</li><li>how</li><li>like</li><li>with</li><li>what</li><li>happy</li><li>when</li><li>thank you</li><li>no</li><li>good morning</li><li>why</li><li>do</li><li>toilet</li><li>and</li><li>have</li><li>love</li><li>tired</li><li>go</li><li>where</li><li>water</li><li>translator</li><li>my name is</li><li>holiday</li><li>favourite</li><li>help</li><li>can</li><li>school</li><li>need</li><li>today</li><li>you&apos;re welcome</li><li>hello</li><li>sorry</li><li>sign</li><li>beautiful</li><li>please</li><li>who</li><li>friend</li><li>dog</li><li>to</li><li>you</li><li>play</li><li>i</li><li>week</li><li>tomorrow</li><li>yes</li><li>work</li></ol><p>These searches reflect the essential and heartfelt expressions that bind us together in communication. Whether it&#x2019;s a simple greeting like &#x201C;how are you&#x201D; or expressing love with &#x201C;i love you,&#x201D; our users are learning to connect, share, and understand through the beautiful language of signs.</p><p><strong>Upgraded IOS BSL App: </strong>2024 also saw the release of our upgraded IOS BSL app, packed with user-friendly features to enhance your learning experience:</p><ul><li>New tabbed interface</li><li>Recent and Popular signs</li><li>Hide video controls overlay</li><li>Loop video playback</li><li>Add back and forward buttons to video player for quick access to alternative signs</li><li>Don&#x2019;t stop audio playback from other apps when playing videos</li><li>Show video attribution</li><li>Favourites</li><li>View your favourites offline</li><li>Dark mode support</li><li>Improved app start-up behaviour for offline access</li></ul><p>A big thank you to Mat Gadd for these fantastic updates that make our app more intuitive and enjoyable to use.</p><p><strong>Looking Ahead: </strong>As we look to 2025, our goal is to continue growing and enhancing our platform. We have exciting plans to introduce new features, expand our dictionary, and provide more educational resources to support our users&#x2019; learning journeys.</p><p>Thank you for being a part of our community and for your support.</p><p>Here&#x2019;s to another year of learning, growing, and connecting!</p>]]></content:encoded></item><item><title><![CDATA[Identifying Valid MX Records to Clean Up Your Mailing List]]></title><description><![CDATA[<p>When managing a mailing list, one critical task is ensuring that the email addresses in your list are valid. Sending emails to invalid addresses not only clutters your system but also harms your sender reputation, which can affect your email deliverability. One effective way to validate email addresses is by</p>]]></description><link>https://www.daniel-mitchell.com/blog/identifying-valid-mx-records-to-clean-up-your-mailing-list/</link><guid isPermaLink="false">67337f3c22fd18542d8b2c70</guid><category><![CDATA[Email]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Tue, 12 Nov 2024 16:25:27 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2024/11/Designer.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2024/11/Designer.png" alt="Identifying Valid MX Records to Clean Up Your Mailing List"><p>When managing a mailing list, one critical task is ensuring that the email addresses in your list are valid. Sending emails to invalid addresses not only clutters your system but also harms your sender reputation, which can affect your email deliverability. One effective way to validate email addresses is by checking their Mail Exchanger (MX) records.</p><h3 id="what-are-mx-records">What Are MX Records?</h3><p>MX records are a type of Domain Name System (DNS) record that specifies the mail servers responsible for receiving email on behalf of a domain. If a domain has valid MX records, it means it is configured to receive emails. An email address without a valid MX record is considered invalid for sending emails.</p><h3 id="why-check-mx-records">Why Check MX Records?</h3><ol><li><strong>Reduce Bounce Rates</strong>: Emails sent to addresses without valid MX records will bounce back. High bounce rates can negatively impact your sender reputation with email service providers.</li><li><strong>Improve Deliverability</strong>: Cleaning up your list by removing emails without valid MX records helps ensure that your messages reach the intended recipients, improving overall deliverability rates.</li><li><strong>Cost Efficiency</strong>: Sending emails to invalid addresses wastes resources. By identifying and removing these addresses, you can save on costs associated with email sending services.</li><li><strong>Enhanced Analytics</strong>: A cleaner list provides more accurate metrics and insights. Knowing that your emails are reaching valid addresses helps you better measure the success of your email campaigns.</li></ol><h2 id="bash-script">Bash Script</h2><p>To help you can use the Bash script below to check if a domain list has valid MX records. If there is no MX record then any email sent here will be bounced. This can be used to remove email addresses that are not valid.</p><p>File domains.txt:</p><pre><code class="language-bash">freebsd.org
redhat.com
yahoo.com
google.com</code></pre><p>Then create <code>mxlookup.sh</code></p><pre><code class="language-bash">output=&apos;ns_output.txt&apos;

# Clears previous output
&gt; $output

# Seconds to wait between lookups:
loop_wait=&apos;1&apos; # Is set to 1 second.

for domain in `cat $domain_list` # Start looping through domains
  do
    MX=$(dig MX $domain +short) #query MX records from domain list and store it as variable $MX
    #echo $MX &gt;&gt; $output;
    #echo $domain &gt;&gt; $output;
    arr=( $MX ) #creates array variable for the MX record answers
    echo ${domain} -- ${arr[1]} &gt;&gt; $output; #outputs only one record from above MX dig

    : &apos;
    for ((i=1; i&lt;${#arr[@]}; i+=2)); #since MX records have multiple answers, for loop goes through each answer
      do
        #echo $domain &gt;&gt; $output;
        echo ${arr[i]} &gt;&gt; $output; #outputs each A record from above MX dig
        #dig A +short &quot;${arr[i]}&quot; &gt;&gt; $output #queries A record for IP and writes answer
      done
    &apos;

  done;</code></pre><p>Run it <code>./mxlookup.sh</code> which will produce a file <code>ns_output.txt</code> which will allow you to identify domains without a valid MX record. These can then be removed from your mailer list.</p><h2 id="python-script">Python Script</h2><p>Or if you prefer you can use this python script:</p><pre><code class="language-python">import dns.resolver

def check_mx(domain):
    try:
        records = dns.resolver.resolve(domain, &apos;MX&apos;)
        return True
    except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN):
        return False

domains = [&quot;example.com&quot;, &quot;invalid-domain.com&quot;]
valid_domains = [domain for domain in domains if check_mx(domain)]
print(f&quot;Valid domains: {valid_domains}&quot;)</code></pre><p>By regularly checking the MX records of the domains in your mailing list, you can maintain a clean and efficient list, improve your email deliverability, and protect your sending reputation.</p>]]></content:encoded></item><item><title><![CDATA[Send email with AWS SES in a CloudFlare Worker]]></title><description><![CDATA[<p>To send an email via a CloudFlare Worker you will need to call a email provider. AWS Simple Email Service (SES) is a robust transactional email provider that I already use in a number of other projects, and simplifies my billing. However the JavaScript SDK provided by AWS is very</p>]]></description><link>https://www.daniel-mitchell.com/blog/send-email-with-aws-ses-in-a-cloudflare-workers/</link><guid isPermaLink="false">666ca472594dd90d996ef9b6</guid><category><![CDATA[Email]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Mon, 01 Jul 2024 16:13:07 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2024/07/Cloudflare-and-SES.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2024/07/Cloudflare-and-SES.png" alt="Send email with AWS SES in a CloudFlare Worker"><p>To send an email via a CloudFlare Worker you will need to call a email provider. AWS Simple Email Service (SES) is a robust transactional email provider that I already use in a number of other projects, and simplifies my billing. However the JavaScript SDK provided by AWS is very large and is not compatible with the CloudFlare Worker runtime. So we will want to roll our own simple API call to the SES.</p><h2 id="prerequisites-and-setup">Prerequisites and Setup</h2><ul><li>Setup the domain identity in SES. This will require you to add 3 CNAME records to your domain name.</li><li>You can then create a new IAM user with an IAM Inline Policy to restrict access to a particular email address.</li></ul><!--kg-card-begin: markdown--><pre><code>{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;ses:SendEmail&quot;
            ],
            &quot;Resource&quot;: &quot;*&quot;,
            &quot;Condition&quot;: {
                &quot;StringEquals&quot;: {
                    &quot;ses:FromAddress&quot;: &quot;help@fiftypencedirectdebit.co.uk&quot;
                }
            }
        }
    ]
}
</code></pre>
<!--kg-card-end: markdown--><ul><li>You will need to create access key for this new user, which will provide the credentials you will use in the code.</li><li>For the contact sending we will use code from the <a href="https://github.com/mhart/aws4fetch">AWS 4 Fetch</a> project on GitHub - This project will handle the authentication required to use SES.</li></ul><!--kg-card-begin: markdown--><p><code>npm install aws4fetch</code></p>
<!--kg-card-end: markdown--><ul><li>Below is the code I am using. (Remember to change your <a href="https://docs.aws.amazon.com/general/latest/gr/ses.html">SES region</a>). </li></ul><!--kg-card-begin: markdown--><pre><code>export async function sendEmail(toEmail, subjectLine, message) {
	const aws = new AwsClient({ accessKeyId: IAM_ACCESS_KEY, secretAccessKey: IAM_ACCESS_KEY_SECRET&apos; });
	let resp = await aws.fetch(&apos;https://email.eu-west-1.amazonaws.com/v2/email/outbound-emails&apos;, {
		method: &apos;POST&apos;,
		headers: {
			&apos;content-type&apos;: &apos;application/json&apos;,
		},
		body: JSON.stringify({
			Destination: 
			{
				ToAddresses: [ toEmail ],
				BccAddresses: [ &apos;me@daniel-mitchell.com&apos; ],
			},
			FromEmailAddress: &apos;Fifty Pence Direct Debit &lt;help@fiftypencedirectdebit.co.uk&gt;&apos;,
			Content: {
				Simple: {
					Subject: {
						Data: subjectLine
					},
					Body: {
						Text: {
							Data: message.replace(/&lt;br\s*[\/]?&gt;/gi, &quot;\n&quot;),
						},
						Html: {
							Data: &apos;&lt;body&gt;&lt;div align=&quot;center&quot; style=&quot;font-family:Calibri, Arial, Helvetica, sans-serif;&quot;&gt;&lt;table width=&quot;600&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;0&quot; style=&quot;font-family:Calibri, Arial, Helvetica, sans-serif&quot;&gt;&lt;tr style=&quot;background-color:white;&quot;&gt;&lt;td&gt;&lt;table width=&quot;600&quot; cellpadding=&quot;0&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;h1&gt;Fifty Pence Direct Debit&lt;/h1&gt;&lt;p&gt;&apos; + message +&apos;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/body&gt;&apos;,
						}
					}
				},
			},
		}),
	});

	const respText = await resp.json();
	console.log(resp.status + &quot; &quot; + resp.statusText);
	console.log(respText);
	if (resp.status != 200 &amp;&amp; resp.status != 201) {
		throw new Error(&apos;Error sending email: &apos; + resp.status + &quot; &quot; + resp.statusText + &quot; &quot; + respText);
	}
	return resp.status;
}
</code></pre>
<!--kg-card-end: markdown--><ul><li>Send the email via a function call:</li></ul><!--kg-card-begin: markdown--><p><code>ctx.waitUntil(sendEmail(&apos;Email To Address&apos;, &apos;Subject Line&apos;, &apos;Html Message here&apos;));</code></p>
<!--kg-card-end: markdown--><p>The SES parameters that can be used in the API call can be found in the AWS documentation: <a href="https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html">https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html</a></p>]]></content:encoded></item><item><title><![CDATA[Unlocking Bank Switch Bonuses with Fifty Pence Direct Debit]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Switching banks has never been more rewarding. With enticing cash bonuses, interest rates, and other perks, savvy consumers are capitalizing on these offers. However, many of these deals come with a requirement: you need to have active direct debits. But what if you could set up these direct debits without</p>]]></description><link>https://www.daniel-mitchell.com/blog/unlocking-bank-switch-bonuses-with-fifty-pence-direct-debit/</link><guid isPermaLink="false">666364be594dd90d996ef95e</guid><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Mon, 10 Jun 2024 11:06:00 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2024/06/blog-fifty-pence.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://www.daniel-mitchell.com/content/images/2024/06/blog-fifty-pence.png" alt="Unlocking Bank Switch Bonuses with Fifty Pence Direct Debit"><p>Switching banks has never been more rewarding. With enticing cash bonuses, interest rates, and other perks, savvy consumers are capitalizing on these offers. However, many of these deals come with a requirement: you need to have active direct debits. But what if you could set up these direct debits without breaking the bank? Enter <strong>Fifty Pence Direct Debit</strong>, the service that makes it easy for you to manage your direct debits for just 50p per transaction.</p>
<p><strong>What Is Fifty Pence Direct Debit?</strong></p>
<p>Fifty Pence Direct Debit is a simple service to help those looking to take advantage of bank switch offers. Here&apos;s why:</p>
<ol>
<li>
<p><strong>Affordability</strong>: For only 50p per direct debit, it is the cheapest service to set up hassle-free direct debits for bank switching.</p>
</li>
<li>
<p><strong>Speedy Setup</strong>: Need to switch banks quickly? Fifty Pence Direct Debit has you covered. Their simple signup ensures that you&apos;re up and running in no time. New direct debits are setup in 5 working days.</p>
</li>
<li>
<p><strong>Flexible Usage</strong>: Whether you need one, two direct debits or more, Fifty Pence Direct Debit has got you covered. You can use the same service multiple times if necessary.</p>
</li>
</ol>
<p><strong>How It Works</strong></p>
<ol>
<li>
<p><strong>Sign Up</strong>: Visit the <a href="https://www.50pdirectdebit.co.uk/">50p Direct Debit</a> website and sign up. Provide your basic details, and you&apos;re ready to roll.</p>
</li>
<li>
<p><strong>Pay Only 50p</strong>: Each direct debit setup costs just 50p. It&apos;s a small price to pay for the convenience and savings you&apos;ll enjoy.</p>
</li>
</ol>
<p><strong>Security and Peace of Mind</strong></p>
<p>Fifty Pence Direct Debit takes security seriously. Here&apos;s why you can trust them:</p>
<ul>
<li>
<p><strong>Payment Gateway</strong>: All payment processing is handled by the reputable payment gateway, <strong>Stripe</strong>. Your financial information is encrypted and secure.</p>
</li>
<li>
<p><strong>Cancellation Flexibility</strong>: Once your bank switch is complete, you have options. You can cancel the direct debit payment from your banking mobile app or leave it running for your next switch. It&apos;s entirely up to you.</p>
</li>
</ul>
<p><strong>Maximizing Bank Switch Offers</strong></p>
<p>Now that you&apos;ve set up your affordable direct debits with Fifty Pence Direct Debit, here are some recent of bank switch offers:</p>
<ol>
<li><strong>Santander</strong>: Get a FREE &#xA3;175 cash bonus plus 1% cashback when you switch to Santander.</li>
<li><strong>First Direct</strong>: Enjoy a FREE &#xA3;175 bonus along with top-notch service.</li>
<li><strong>TSB</strong>: Grab a FREE &#xA3;100 bonus plus an additional &#xA3;60 over 6 months.</li>
<li><strong>Virgin Money</strong>: Benefit from 12.68% interest for the first 12 months.</li>
<li><strong>Nationwide</strong>: Existing customers can earn a FREE &#xA3;200 bonus.</li>
</ol>
<p>Remember, these offers change over time, so always check the latest deals. With Fifty Pence Direct Debit, you&apos;re well on your way to maximizing your rewards without breaking the bank.</p>
<p><strong>Conclusion</strong></p>
<p><a href="https://www.50pdirectdebit.co.uk/">50p Direct Debit</a> is your secret weapon for hassle-free direct debits. Switch banks, unlock bonuses, and keep more money in your pocket &#x2013; all for just 50p!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[The Real Cost of Free Transactional Email Services]]></title><description><![CDATA[<p>When it comes to managing costs, especially ongoing ones, businesses and individuals with side projects alike seek efficient solutions. Email services are no exception. While free email providers can be enticing initially, they come with a serious drawback. Learn from my experience that see that resisting the draw of free</p>]]></description><link>https://www.daniel-mitchell.com/blog/the-real-cost-of-free-transactional-email-services/</link><guid isPermaLink="false">66622cbe594dd90d996ef8a5</guid><category><![CDATA[Email]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Fri, 07 Jun 2024 19:50:10 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2024/06/blog-email-header.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2024/06/blog-email-header.png" alt="The Real Cost of Free Transactional Email Services"><p>When it comes to managing costs, especially ongoing ones, businesses and individuals with side projects alike seek efficient solutions. Email services are no exception. While free email providers can be enticing initially, they come with a serious drawback. Learn from my experience that see that resisting the draw of free email services and opting for paid transactional email services from the beginning is the smart choice.</p><p><strong><strong>The Free Service Dilemma:</strong></strong></p><ul><li>Free email services are convenient when setting up a project. They run smoothly for months or even years without any cost.</li><li>However, there&#x2019;s a catch: these free services eventually get discontinued. The abrupt announcement of it being discontinued can seriously disrupt your workflow, especially if you haven&#x2019;t revisited the project in a while.</li></ul><p><strong><strong>The Hidden Costs of Free Services:</strong></strong></p><p>When a free service is pulled, you&#x2019;re left scrambling to:</p><ul><li>Retrieve the project details.</li><li>Understand the deployment process.</li><li>Perform necessary upgrades.</li><li>Find, evaluate and transition to the new provider.</li><li>Update DNS entries.</li><li>Test and deploy.</li></ul><p>These tasks consume valuable time and will completely negate any savings from using a free service that seems like such a good idea at the start.</p><p><strong><strong>The Solution: </strong>Always opt for paid transactional email services<strong>:</strong></strong></p><p>Here&#x2019;s why:</p><ul><li><strong>Minimal Cost:</strong> The expense of using a paid service is negligible compared to the time and stress saved when the service is inevitably pulled<strong>.</strong></li></ul><p><strong><strong>Personal Experience:</strong></strong></p><p>I have made the mistake of using a free email service twice:</p><ul><li>Once with MailChimp, which initially provided 5,000 free emails per month. Unfortunately, it was discontinued with just 30 days&#x2019; notice, prompting my move to AWS for my email needs.</li><li>MailChannels in conjunction with CloudFlare Workers allowed unlimited free emails, but again they pulled the service abruptly. They even started immediately failing a small percentage of emails without any grace period, impacting my service. Again, I had to scramble to switch provider.</li></ul><blockquote>While I choose AWS because that is what I am already familiar with, any reputable email service provider will suffice. The important thing is to ensure that the service has long term support and will not leave you in the lurch by pulling the API or service.</blockquote><p>In summary, investing in paid transactional email services ensures stability, peace of mind, and efficient workflows. The minimal cost is well worth the long-term benefits.</p>]]></content:encoded></item><item><title><![CDATA[SignASL year in review 2023]]></title><description><![CDATA[<p>In 2023 <strong>32,197,037</strong> searches were made on www.signasl.org a massive <strong>+22.5%</strong> increase from last year! (This is a 31% higher search volume compared to Sign BSL). Below I have provided a snapshot of the top 50 most searched words during the year.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Search Query</th>
<th style="text-align:right">No.</th></tr></thead></table>]]></description><link>https://www.daniel-mitchell.com/blog/signasl-year-in-review-2023/</link><guid isPermaLink="false">6593eeff509eab04a30d4679</guid><category><![CDATA[SignASL]]></category><category><![CDATA[Sign Language]]></category><category><![CDATA[Year in Review]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Tue, 02 Jan 2024 16:21:14 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2024/01/Adobe_Express_20231225_2356100_1-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2024/01/Adobe_Express_20231225_2356100_1-1.png" alt="SignASL year in review 2023"><p>In 2023 <strong>32,197,037</strong> searches were made on www.signasl.org a massive <strong>+22.5%</strong> increase from last year! (This is a 31% higher search volume compared to Sign BSL). Below I have provided a snapshot of the top 50 most searched words during the year.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Search Query</th>
<th style="text-align:right">No. searches</th>
<th style="text-align:right">% change</th>
</tr>
</thead>
<tbody>
<tr>
<td>****</td>
<td style="text-align:right">62,356</td>
<td style="text-align:right">96%</td>
</tr>
<tr>
<td>****</td>
<td style="text-align:right">45,408</td>
<td style="text-align:right">109%</td>
</tr>
<tr>
<td>abortion</td>
<td style="text-align:right">37,692</td>
<td style="text-align:right">758%</td>
</tr>
<tr>
<td>you&apos;re welcome</td>
<td style="text-align:right">35,950</td>
<td style="text-align:right">225%</td>
</tr>
<tr>
<td>****</td>
<td style="text-align:right">30,649</td>
<td style="text-align:right">9%</td>
</tr>
<tr>
<td>****</td>
<td style="text-align:right">26,458</td>
<td style="text-align:right">109%</td>
</tr>
<tr>
<td>****</td>
<td style="text-align:right">26,199</td>
<td style="text-align:right">47%</td>
</tr>
<tr>
<td>****</td>
<td style="text-align:right">25,883</td>
<td style="text-align:right">52%</td>
</tr>
<tr>
<td>****</td>
<td style="text-align:right">23,845</td>
<td style="text-align:right">163%</td>
</tr>
<tr>
<td>translate</td>
<td style="text-align:right">23,161</td>
<td style="text-align:right">337%</td>
</tr>
<tr>
<td>have</td>
<td style="text-align:right">19,699</td>
<td style="text-align:right">35%</td>
</tr>
<tr>
<td>good</td>
<td style="text-align:right">19,636</td>
<td style="text-align:right">34%</td>
</tr>
<tr>
<td>what</td>
<td style="text-align:right">19,063</td>
<td style="text-align:right">34%</td>
</tr>
<tr>
<td>like</td>
<td style="text-align:right">18,955</td>
<td style="text-align:right">34%</td>
</tr>
<tr>
<td>love</td>
<td style="text-align:right">18,746</td>
<td style="text-align:right">50%</td>
</tr>
<tr>
<td>want</td>
<td style="text-align:right">18,742</td>
<td style="text-align:right">48%</td>
</tr>
<tr>
<td>how</td>
<td style="text-align:right">18,425</td>
<td style="text-align:right">31%</td>
</tr>
<tr>
<td>when</td>
<td style="text-align:right">18,030</td>
<td style="text-align:right">33%</td>
</tr>
<tr>
<td>thank you</td>
<td style="text-align:right">17,029</td>
<td style="text-align:right">40%</td>
</tr>
<tr>
<td>how are you</td>
<td style="text-align:right">17,005</td>
<td style="text-align:right">52%</td>
</tr>
<tr>
<td>to</td>
<td style="text-align:right">16,915</td>
<td style="text-align:right">53%</td>
</tr>
<tr>
<td>and</td>
<td style="text-align:right">16,487</td>
<td style="text-align:right">39%</td>
</tr>
<tr>
<td>do</td>
<td style="text-align:right">15,786</td>
<td style="text-align:right">34%</td>
</tr>
<tr>
<td>is</td>
<td style="text-align:right">15,754</td>
<td style="text-align:right">31%</td>
</tr>
<tr>
<td>with</td>
<td style="text-align:right">15,131</td>
<td style="text-align:right">30%</td>
</tr>
<tr>
<td>school</td>
<td style="text-align:right">14,970</td>
<td style="text-align:right">35%</td>
</tr>
<tr>
<td>where</td>
<td style="text-align:right">14,846</td>
<td style="text-align:right">28%</td>
</tr>
<tr>
<td>hello</td>
<td style="text-align:right">14,788</td>
<td style="text-align:right">28%</td>
</tr>
<tr>
<td>happy</td>
<td style="text-align:right">14,765</td>
<td style="text-align:right">29%</td>
</tr>
<tr>
<td>i</td>
<td style="text-align:right">14,516</td>
<td style="text-align:right">32%</td>
</tr>
<tr>
<td>for</td>
<td style="text-align:right">14,456</td>
<td style="text-align:right">58%</td>
</tr>
<tr>
<td>why</td>
<td style="text-align:right">14,440</td>
<td style="text-align:right">41%</td>
</tr>
<tr>
<td>we</td>
<td style="text-align:right">14,243</td>
<td style="text-align:right">52%</td>
</tr>
<tr>
<td>go</td>
<td style="text-align:right">14,233</td>
<td style="text-align:right">31%</td>
</tr>
<tr>
<td>you</td>
<td style="text-align:right">14,225</td>
<td style="text-align:right">60%</td>
</tr>
<tr>
<td>dog</td>
<td style="text-align:right">14,164</td>
<td style="text-align:right">44%</td>
</tr>
<tr>
<td>help</td>
<td style="text-align:right">14,030</td>
<td style="text-align:right">44%</td>
</tr>
<tr>
<td>need</td>
<td style="text-align:right">13,927</td>
<td style="text-align:right">35%</td>
</tr>
<tr>
<td>the</td>
<td style="text-align:right">13,435</td>
<td style="text-align:right">68%</td>
</tr>
<tr>
<td>no</td>
<td style="text-align:right">13,418</td>
<td style="text-align:right">44%</td>
</tr>
<tr>
<td>no more</td>
<td style="text-align:right">13,412</td>
<td style="text-align:right">27%</td>
</tr>
<tr>
<td>favorite</td>
<td style="text-align:right">13,337</td>
<td style="text-align:right">14%</td>
</tr>
<tr>
<td>play</td>
<td style="text-align:right">13,247</td>
<td style="text-align:right">42%</td>
</tr>
<tr>
<td>peace</td>
<td style="text-align:right">12,938</td>
<td style="text-align:right">4%</td>
</tr>
<tr>
<td>please</td>
<td style="text-align:right">12,913</td>
<td style="text-align:right">37%</td>
</tr>
<tr>
<td>glory</td>
<td style="text-align:right">12,862</td>
<td style="text-align:right">33%</td>
</tr>
<tr>
<td>not</td>
<td style="text-align:right">12,732</td>
<td style="text-align:right">52%</td>
</tr>
<tr>
<td>can</td>
<td style="text-align:right">12,615</td>
<td style="text-align:right">22%</td>
</tr>
<tr>
<td>in</td>
<td style="text-align:right">12,557</td>
<td style="text-align:right">34%</td>
</tr>
<tr>
<td>know</td>
<td style="text-align:right">12,539</td>
<td style="text-align:right">54%</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Offensive language and racial slurs<strong> </strong>continue to see a significant increase in searches, with 7 of the top 10 most searched queries containing offensive terms, this is intriguing compared to the search data from the BSL version of the site where the top 50 searches do not contain any such offensive terms.</p><p>The big stand out search query for 2023 is searches for &quot;abortion&quot; which experienced a 758% increase from 2022, making it the 3rd most commonly searched word. This is not surprising given the political situation in the United States in 2023.</p><p>Aside from the offensive language, common and neutral terms such as &quot;translate,&quot; &quot;have,&quot; &quot;good,&quot; &quot;what,&quot; and &quot;like&quot; have also seen increases in searches, suggesting a diverse range of user interests and language learning activities. Polite expressions like &quot;you&apos;re welcome,&quot; &quot;thank you,&quot; and &quot;please&quot; have high search volumes, indicating a focus on communication etiquette.</p><p>Basic language components such as pronouns (&quot;I,&quot; &quot;you,&quot; &quot;we&quot;), conjunctions (&quot;and,&quot; &quot;or,&quot; &quot;with&quot;), and prepositions (&quot;to,&quot; &quot;for,&quot; &quot;in&quot;) are frequently searched, reflecting a typical pattern of language learning.</p><p>Question words like &quot;how,&quot; &quot;when,&quot; &quot;where,&quot; and &quot;why&quot; are commonly searched, suggesting users are interested in learning how to frame questions. Positive expressions like &quot;love,&quot; &quot;happy,&quot; and &quot;peace&quot; are searched frequently, indicating a desire for positive and uplifting conversations.</p><p><strong>Other news updates</strong></p><p>An update to the <a href="https://play.google.com/store/apps/details?id=com.signasl.signasl">SignASL android app</a> was released to fix video playback issues and support the latest versions of Android. (Special thanks to <a href="https://twitter.com/thegazler">Gary Rennie</a> for your support with this app.)</p><p>I would also like to thank <a href="https://twitter.com/zpakrueger">Zachary Krueger</a> a Sign Language Interpreter from Iowa who has for the last few months been reviewing and improving the quality of the ASL dictionary (removing incorrect signs and fixing the word definition associations for the videos).</p><p>For those interested in the technology stack that powers the ASL dictionary, I have upgraded the MySQL database from 5.7 to version 8. I have also upgraded the AWS Lambda functions from dot net core 3.1 to .net6. I have also replaced most YouTube embeds to use self hosted videos for improved playback experience.</p><p>Looking forward to what 2024 will bring for SignASL!</p>]]></content:encoded></item><item><title><![CDATA[SignBSL year in review 2023]]></title><description><![CDATA[<p>In 2023 <strong>24,587,983</strong> searches were made on www.signbsl.com a <strong>+4.2%</strong> increase from last year indicating a growing interest in BSL which I expect to continue, especially with the plans to allow students to learn BSL as a GCSE subject. Below I have provided a snapshot</p>]]></description><link>https://www.daniel-mitchell.com/blog/signbsl-year-in-review-2023/</link><guid isPermaLink="false">65933943509eab04a30d45ed</guid><category><![CDATA[SignBSL]]></category><category><![CDATA[Sign Language]]></category><category><![CDATA[Year in Review]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Mon, 01 Jan 2024 22:48:28 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2024/01/Adobe_Express_20231225_2356100_1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2024/01/Adobe_Express_20231225_2356100_1.png" alt="SignBSL year in review 2023"><p>In 2023 <strong>24,587,983</strong> searches were made on www.signbsl.com a <strong>+4.2%</strong> increase from last year indicating a growing interest in BSL which I expect to continue, especially with the plans to allow students to learn BSL as a GCSE subject. Below I have provided a snapshot of the top 50 most searched words.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Search Query</th>
<th style="text-align:right">No. Searches</th>
<th style="text-align:right">% change from last year</th>
</tr>
</thead>
<tbody>
<tr>
<td>how are you</td>
<td style="text-align:right">45,364</td>
<td style="text-align:right">-1%</td>
</tr>
<tr>
<td>i love you</td>
<td style="text-align:right">43,547</td>
<td style="text-align:right">2%</td>
</tr>
<tr>
<td>want</td>
<td style="text-align:right">33,111</td>
<td style="text-align:right">7%</td>
</tr>
<tr>
<td>with</td>
<td style="text-align:right">31,836</td>
<td style="text-align:right">24%</td>
</tr>
<tr>
<td>how</td>
<td style="text-align:right">30,632</td>
<td style="text-align:right">11%</td>
</tr>
<tr>
<td>thank you</td>
<td style="text-align:right">28,823</td>
<td style="text-align:right">16%</td>
</tr>
<tr>
<td>more</td>
<td style="text-align:right">28,680</td>
<td style="text-align:right">22%</td>
</tr>
<tr>
<td>what</td>
<td style="text-align:right">28,063</td>
<td style="text-align:right">8%</td>
</tr>
<tr>
<td>happy</td>
<td style="text-align:right">27,450</td>
<td style="text-align:right">9%</td>
</tr>
<tr>
<td>good morning</td>
<td style="text-align:right">27,415</td>
<td style="text-align:right">2%</td>
</tr>
<tr>
<td>dictionary</td>
<td style="text-align:right">27,321</td>
<td style="text-align:right">43%</td>
</tr>
<tr>
<td>no</td>
<td style="text-align:right">25,227</td>
<td style="text-align:right">12%</td>
</tr>
<tr>
<td>like</td>
<td style="text-align:right">24,657</td>
<td style="text-align:right">10%</td>
</tr>
<tr>
<td>when</td>
<td style="text-align:right">24,192</td>
<td style="text-align:right">3%</td>
</tr>
<tr>
<td>why</td>
<td style="text-align:right">23,762</td>
<td style="text-align:right">4%</td>
</tr>
<tr>
<td>hello</td>
<td style="text-align:right">23,434</td>
<td style="text-align:right">-1%</td>
</tr>
<tr>
<td>you&apos;re welcome</td>
<td style="text-align:right">23,089</td>
<td style="text-align:right">21%</td>
</tr>
<tr>
<td>my name is</td>
<td style="text-align:right">22,542</td>
<td style="text-align:right">-8%</td>
</tr>
<tr>
<td>and</td>
<td style="text-align:right">21,812</td>
<td style="text-align:right">15%</td>
</tr>
<tr>
<td>have</td>
<td style="text-align:right">21,683</td>
<td style="text-align:right">11%</td>
</tr>
<tr>
<td>do</td>
<td style="text-align:right">21,555</td>
<td style="text-align:right">18%</td>
</tr>
<tr>
<td>toilet</td>
<td style="text-align:right">21,353</td>
<td style="text-align:right">11%</td>
</tr>
<tr>
<td>tired</td>
<td style="text-align:right">21,061</td>
<td style="text-align:right">10%</td>
</tr>
<tr>
<td>love</td>
<td style="text-align:right">20,475</td>
<td style="text-align:right">11%</td>
</tr>
<tr>
<td>where</td>
<td style="text-align:right">20,135</td>
<td style="text-align:right">9%</td>
</tr>
<tr>
<td>sorry</td>
<td style="text-align:right">19,503</td>
<td style="text-align:right">19%</td>
</tr>
<tr>
<td>today</td>
<td style="text-align:right">19,293</td>
<td style="text-align:right">10%</td>
</tr>
<tr>
<td>go</td>
<td style="text-align:right">19,114</td>
<td style="text-align:right">14%</td>
</tr>
<tr>
<td>please</td>
<td style="text-align:right">18,935</td>
<td style="text-align:right">16%</td>
</tr>
<tr>
<td>school</td>
<td style="text-align:right">18,512</td>
<td style="text-align:right">12%</td>
</tr>
<tr>
<td>water</td>
<td style="text-align:right">18,371</td>
<td style="text-align:right">9%</td>
</tr>
<tr>
<td>dog</td>
<td style="text-align:right">18,286</td>
<td style="text-align:right">16%</td>
</tr>
<tr>
<td>beautiful</td>
<td style="text-align:right">18,249</td>
<td style="text-align:right">12%</td>
</tr>
<tr>
<td>can</td>
<td style="text-align:right">17,958</td>
<td style="text-align:right">15%</td>
</tr>
<tr>
<td>help</td>
<td style="text-align:right">17,673</td>
<td style="text-align:right">14%</td>
</tr>
<tr>
<td>i</td>
<td style="text-align:right">17,520</td>
<td style="text-align:right">17%</td>
</tr>
<tr>
<td>sign</td>
<td style="text-align:right">17,374</td>
<td style="text-align:right">32%</td>
</tr>
<tr>
<td>who</td>
<td style="text-align:right">17,309</td>
<td style="text-align:right">10%</td>
</tr>
<tr>
<td>favourite</td>
<td style="text-align:right">17,140</td>
<td style="text-align:right">22%</td>
</tr>
<tr>
<td>you</td>
<td style="text-align:right">17,025</td>
<td style="text-align:right">15%</td>
</tr>
<tr>
<td>need</td>
<td style="text-align:right">16,937</td>
<td style="text-align:right">13%</td>
</tr>
<tr>
<td>boy</td>
<td style="text-align:right">16,869</td>
<td style="text-align:right">32%</td>
</tr>
<tr>
<td>yes</td>
<td style="text-align:right">16,850</td>
<td style="text-align:right">9%</td>
</tr>
<tr>
<td>holiday</td>
<td style="text-align:right">16,835</td>
<td style="text-align:right">5%</td>
</tr>
<tr>
<td>friend</td>
<td style="text-align:right">16,665</td>
<td style="text-align:right">12%</td>
</tr>
<tr>
<td>girl</td>
<td style="text-align:right">16,378</td>
<td style="text-align:right">21%</td>
</tr>
<tr>
<td>tomorrow</td>
<td style="text-align:right">15,823</td>
<td style="text-align:right">10%</td>
</tr>
<tr>
<td>good</td>
<td style="text-align:right">15,541</td>
<td style="text-align:right">5%</td>
</tr>
<tr>
<td>translator</td>
<td style="text-align:right">15,295</td>
<td style="text-align:right">28%</td>
</tr>
<tr>
<td>to</td>
<td style="text-align:right">15,230</td>
<td style="text-align:right">21%</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Its pleasing to see that the common themes of the top searches include: Basic communication phrases, expressions of love and affection, inquiries about well-being, and seeking information. There is a strong interest in everyday communication. The top searches highlight the importance of BSL for everyday interactions and relationship building.</p><p><strong>Other news updates</strong></p><p>An update to the <a href="https://play.google.com/store/apps/details?id=com.signbsl.signbsl">SignBSL android app</a> was also released to fix video playback issues and support the latest versions of Android. (Special thanks to <a href="https://twitter.com/thegazler">Gary Rennie</a> for your support with this app.)</p><p>In preparation for the new GSCE in BSL I have added a new page to make it easy to find all the <a href="https://www.signbsl.com/gcse-vocabulary">BSL GCSE vocabulary</a> that students are expected to learn as part of their qualification.</p><p>For those who use Reddit, I have now setup daily auto posting of videos to the <a href="https://www.reddit.com/r/BSL/">BSL subreddit</a>. This posts the same videos as found on <a href="https://twitter.com/Bslsign">twitter</a>.</p><p>For those interested in the technology stack that powers the BSL dictionary, I have upgraded the MySQL database from 5.7 to version 8. I have also upgraded the AWS Lambda functions from dot net core 3.1 to .net6. I have also replaced most YouTube embeds to use self hosted videos for improved playback experience.</p><p>Looking forward to what 2024 will bring for SignBSL!</p>]]></content:encoded></item><item><title><![CDATA[Partitioned Cookies in C#]]></title><description><![CDATA[<p>As browsers start to phase out 3rd party cookies developers need to start using the <code>partitioned</code> cookie attribute (this is a new feature of <strong>C</strong>ookies <strong>H</strong>aving <strong>I</strong>ndependent <strong>P</strong>artitioned State <strong>C</strong>HIPS). This will allow users to login when accessing your site in an iframe whiles maintaining</p>]]></description><link>https://www.daniel-mitchell.com/blog/partitioned-cookies-in-c-sharp/</link><guid isPermaLink="false">65537a82b1529a3b88d21e93</guid><category><![CDATA[C#]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Tue, 14 Nov 2023 13:58:38 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2023/11/Untitled.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2023/11/Untitled.png" alt="Partitioned Cookies in C#"><p>As browsers start to phase out 3rd party cookies developers need to start using the <code>partitioned</code> cookie attribute (this is a new feature of <strong>C</strong>ookies <strong>H</strong>aving <strong>I</strong>ndependent <strong>P</strong>artitioned State <strong>C</strong>HIPS). This will allow users to login when accessing your site in an iframe whiles maintaining privacy. While blocking 3rd party cookies is not yet set as the default, all the major browsers are planning to do this. Also to support users using Chrome in incognito mode you need to be ready to support this, otherwise you will be prevented from setting a cookie.</p><p>The partitioned attribute is supported in Chrome 114 and higher, it is also supported by Edge. How it works is well explained at <a href="https://developer.chrome.com/docs/privacy-sandbox/chips/">https://developer.chrome.com/docs/privacy-sandbox/chips/</a> - essentially the cookie is partitioned according to the parent top level site. (See diagram below).</p><figure class="kg-card kg-image-card"><img src="https://www.daniel-mitchell.com/content/images/2023/11/image.png" class="kg-image" alt="Partitioned Cookies in C#" loading="lazy" width="845" height="468" srcset="https://www.daniel-mitchell.com/content/images/size/w600/2023/11/image.png 600w, https://www.daniel-mitchell.com/content/images/2023/11/image.png 845w" sizes="(min-width: 720px) 720px"></figure><p>To configure this you need to set the cookie header:</p><pre><code>Set-Cookie: __Host-name=value; Secure; Path=/; SameSite=None; Partitioned;</code></pre><p>C# does not yet have an option to appended this <code>Partitioned</code> attribute, but you can just append the <code>Partitioned</code> property to the Path option. For example:</p><pre><code class="language-c#">Response.Cookies.Append(&quot;X-Access-Token&quot;, accessToken, new CookieOptions()
{
    HttpOnly = true,
    Secure = true,
    SameSite = SameSiteMode.None,
    Path = &quot;/; samesite=None; Partitioned&quot;
});</code></pre><p>This code also includes a fix to ensure the option <code>samesite=None</code> is outputted into the cookie (which is also required for 3rd party cookies).</p>]]></content:encoded></item><item><title><![CDATA[Email Spam Headers]]></title><description><![CDATA[<p>One way to help reduce the chances of your emails being marked as spam is to understand email spam headers. Spam headers are the hidden messages that are attached to every email. They contain information about the sender, the recipient, and the content of the email.</p><p>Two of the most</p>]]></description><link>https://www.daniel-mitchell.com/blog/email-spam-headers/</link><guid isPermaLink="false">649c3d99497b6004bd58baf9</guid><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Wed, 28 Jun 2023 15:28:07 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1530436098968-cab21a5dfea6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDU2fHxlbWFpbCUyMHNwYW18ZW58MHx8fHwxNjg3OTY1OTc3fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1530436098968-cab21a5dfea6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDU2fHxlbWFpbCUyMHNwYW18ZW58MHx8fHwxNjg3OTY1OTc3fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Email Spam Headers"><p>One way to help reduce the chances of your emails being marked as spam is to understand email spam headers. Spam headers are the hidden messages that are attached to every email. They contain information about the sender, the recipient, and the content of the email.</p><p>Two of the most important spam headers are <strong>SPF </strong>and <strong>DKIM</strong>. SPF stands for Sender Policy Framework. It is a way for businesses to tell email servers which servers are authorized to send email on their behalf. DKIM stands for DomainKeys Identified Mail. It is a way for businesses to sign their email messages with a digital signature. This signature can be used to verify that the email message is actually from the sender it claims to be from.</p><h2 id="what-to-check">What to check</h2><ol><li><strong>SPF</strong></li></ol><p>SPF is a way for businesses to tell email servers which servers are authorized to send email on their behalf. This information is stored in a DNS record called the SPF record. The SPF record for a domain tells email servers which IP addresses are authorized to send email from that domain.</p><p>When an email server receives an email message, it will check the SPF record for the domain that the email message is from. If the IP address of the server that sent the email message is not listed in the SPF record, the email server will likely mark the email message as spam.</p><p>To check if this is setup correctly, in the message header you are looking for something that says:</p><p><code>Authentication-Results: spf=pass (sender IP is 159.135.225.169) smtp.mailfrom=daniel-mitchell.com;</code></p><p>If you can see <code>spf=pass</code> then this means the domain setup is correct. If not you will need to check the instructions provided by your email provider. They require a TXT DNS record that explains which IP addresses are allowed to send email on behalf of your domain.</p><p><strong>2. DKIM</strong></p><p>While not a requirement for email to be delivered to a users inbox it will increase its chances, and is well worth setting up correctly. The DKIM signature is created by the business that sends the email message. The signature is then included in the email message header. When an email server receives an email message, it will check the DKIM signature to verify that the email message is actually from the sender it claims to be from.</p><p>If the DKIM signature is valid, the email server will likely deliver the email message to the recipient&apos;s inbox. If the DKIM signature is invalid, the email server may mark the email message as spam or block it altogether.</p><p>To check if DKIM is setup correctly, in the message header you are looking for something that says:</p><p><code>dkim=pass (signature was verified)</code></p><p>If DKIM is not setup or the email is not signed, it will say:</p><p><code>dkim=none (message not signed)</code></p><p>To fix these issues you will need to check the instructions provided by your email provider. They require two CNAME DNS record that contain the DKIM signing key.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x2139;&#xFE0F;</div><div class="kg-callout-text">DKIM is not automatically setup when you use Microsoft 365. Setup DKIM under Email Authentication Settings: https://security.microsoft.com/dkimv2</div></div><p><strong>3. Other SPAM headers</strong></p><p>This will vary according to the users email provider. They all have different rules and configuration. These headers are for users who use Microsoft365 for their email.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Header Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>X-MS-Exchange-Organization-PCL:</td>
<td><strong>Phishing score</strong> A score between 1-8. Anything 3 or under is good. [1]</td>
</tr>
<tr>
<td>X-Microsoft-Antispam: BCL:</td>
<td><strong>Bulk sending score</strong> A score between 0-9. Anything 3 or under is good. [2]</td>
</tr>
<tr>
<td>X-MS-Exchange-Organization-SCL:</td>
<td><strong>Spam confidence level</strong> A score between 0-9. Anything under 5 is good. [3]</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Email services use a number of rules and tools to determine the SPAM Confidence Level. This based upon the language and email style.</p><p><strong>References</strong><br>[1] <a href="https://learn.microsoft.com/en-us/exchange/antispam-and-antimalware/antispam-protection/antispam-stamps?view=exchserver-2019#the-phishing-confidence-level-stamp">https://learn.microsoft.com/en-us/exchange/antispam-and-antimalware/antispam-protection/antispam-stamps?view=exchserver-2019#the-phishing-confidence-level-stamp</a><br>[2] <a href="https://learn.microsoft.com/en-us/microsoft-365/security/office-365-security/anti-spam-bulk-complaint-level-bcl-about?view=o365-worldwide">https://learn.microsoft.com/en-us/microsoft-365/security/office-365-security/anti-spam-bulk-complaint-level-bcl-about?view=o365-worldwide</a><br>[3] <a href="https://learn.microsoft.com/en-us/exchange/antispam-and-antimalware/antispam-protection/antispam-stamps?view=exchserver-2019#the-spam-confidence-level-stamp">https://learn.microsoft.com/en-us/exchange/antispam-and-antimalware/antispam-protection/antispam-stamps?view=exchserver-2019#the-spam-confidence-level-stamp</a></p>]]></content:encoded></item><item><title><![CDATA[SignBSL Year in Review 2022]]></title><description><![CDATA[<p>Quick recap of this year&apos;s search data for SignBSL <strong>23,595,029</strong> searches were done. This is a tiny increase of <strong>+0.6%</strong> from last year. So almost unchanged the amount of searches. Below I have included the <strong>top 50 most searched words</strong>.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Search Query</th>
<th>No. Searches</th>
<th>% Change</th></tr></thead></table>]]></description><link>https://www.daniel-mitchell.com/blog/signbsl-year-in-review-2022/</link><guid isPermaLink="false">63b59518679c4b63757944a1</guid><category><![CDATA[Sign Language]]></category><category><![CDATA[Year in Review]]></category><category><![CDATA[SignBSL]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Tue, 10 Jan 2023 20:58:53 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2023/01/Adobe_Express_20230110_2056480_1-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2023/01/Adobe_Express_20230110_2056480_1-1.png" alt="SignBSL Year in Review 2022"><p>Quick recap of this year&apos;s search data for SignBSL <strong>23,595,029</strong> searches were done. This is a tiny increase of <strong>+0.6%</strong> from last year. So almost unchanged the amount of searches. Below I have included the <strong>top 50 most searched words</strong>.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Search Query</th>
<th>No. Searches</th>
<th>% Change from last year</th>
</tr>
</thead>
<tbody>
<tr>
<td>how are you</td>
<td>45,911</td>
<td>-16%</td>
</tr>
<tr>
<td>i love you</td>
<td>42,692</td>
<td>26%</td>
</tr>
<tr>
<td>want</td>
<td>30,697</td>
<td>2%</td>
</tr>
<tr>
<td>how</td>
<td>27,340</td>
<td>-2%</td>
</tr>
<tr>
<td>good morning</td>
<td>26,995</td>
<td>13%</td>
</tr>
<tr>
<td>what</td>
<td>25,895</td>
<td>-15%</td>
</tr>
<tr>
<td>happy</td>
<td>24,989</td>
<td>-22%</td>
</tr>
<tr>
<td>my name is</td>
<td>24,245</td>
<td>-25%</td>
</tr>
<tr>
<td>with</td>
<td>24,173</td>
<td>20%</td>
</tr>
<tr>
<td>thank you</td>
<td>24,144</td>
<td>-10%</td>
</tr>
<tr>
<td>hello</td>
<td>23,747</td>
<td>-31%</td>
</tr>
<tr>
<td>when</td>
<td>23,348</td>
<td>9%</td>
</tr>
<tr>
<td>why</td>
<td>22,706</td>
<td>2%</td>
</tr>
<tr>
<td>more</td>
<td>22,277</td>
<td>7%</td>
</tr>
<tr>
<td>no</td>
<td>22,253</td>
<td>-10%</td>
</tr>
<tr>
<td>like</td>
<td>22,155</td>
<td>-11%</td>
</tr>
<tr>
<td>have</td>
<td>19,241</td>
<td>-13%</td>
</tr>
<tr>
<td>toilet</td>
<td>19,054</td>
<td>5%</td>
</tr>
<tr>
<td>tired</td>
<td>18,879</td>
<td>-33%</td>
</tr>
<tr>
<td>and</td>
<td>18,608</td>
<td>-36%</td>
</tr>
<tr>
<td>where</td>
<td>18,325</td>
<td>-1%</td>
</tr>
<tr>
<td>love</td>
<td>18,216</td>
<td>-18%</td>
</tr>
<tr>
<td>you&apos;re welcome</td>
<td>18,194</td>
<td>58%</td>
</tr>
<tr>
<td>do</td>
<td>17,753</td>
<td>-22%</td>
</tr>
<tr>
<td>today</td>
<td>17,332</td>
<td>5%</td>
</tr>
<tr>
<td>water</td>
<td>16,808</td>
<td>15%</td>
</tr>
<tr>
<td>go</td>
<td>16,400</td>
<td>-9%</td>
</tr>
<tr>
<td>school</td>
<td>16,277</td>
<td>0%</td>
</tr>
<tr>
<td>beautiful</td>
<td>16,048</td>
<td>-10%</td>
</tr>
<tr>
<td>holiday</td>
<td>16,029</td>
<td>33%</td>
</tr>
<tr>
<td>please</td>
<td>15,862</td>
<td>-13%</td>
</tr>
<tr>
<td>sorry</td>
<td>15,723</td>
<td>-14%</td>
</tr>
<tr>
<td>who</td>
<td>15,664</td>
<td>-6%</td>
</tr>
<tr>
<td>dictionary</td>
<td>15,462</td>
<td>300%</td>
</tr>
<tr>
<td>yes</td>
<td>15,383</td>
<td>-14%</td>
</tr>
<tr>
<td>dog</td>
<td>15,347</td>
<td>-12%</td>
</tr>
<tr>
<td>can</td>
<td>15,227</td>
<td>-23%</td>
</tr>
<tr>
<td>help</td>
<td>15,179</td>
<td>-14%</td>
</tr>
<tr>
<td>good</td>
<td>14,772</td>
<td>-21%</td>
</tr>
<tr>
<td>need</td>
<td>14,752</td>
<td>-9%</td>
</tr>
<tr>
<td>friend</td>
<td>14,678</td>
<td>-13%</td>
</tr>
<tr>
<td>i</td>
<td>14,606</td>
<td>-45%</td>
</tr>
<tr>
<td>you</td>
<td>14,456</td>
<td>-37%</td>
</tr>
<tr>
<td>tomorrow</td>
<td>14,209</td>
<td>8%</td>
</tr>
<tr>
<td>play</td>
<td>13,761</td>
<td>-6%</td>
</tr>
<tr>
<td>work</td>
<td>13,526</td>
<td>7%</td>
</tr>
<tr>
<td>green</td>
<td>13,425</td>
<td>-2%</td>
</tr>
<tr>
<td>word</td>
<td>13,405</td>
<td>-19%</td>
</tr>
<tr>
<td>favourite</td>
<td>13,382</td>
<td>2%</td>
</tr>
<tr>
<td>know</td>
<td>13,380</td>
<td>-10%</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[SignASL Year in Review 2022]]></title><description><![CDATA[<p>Quick recap of this year&apos;s search data for SignASL <strong>26,274,632</strong> searches were done. This is a small increase of <strong>+5.6%</strong> from last year. Below I have included the <strong>top 50 most searched words</strong>.</p><p>The top 5 words are offensive words. In fact there are 7</p>]]></description><link>https://www.daniel-mitchell.com/blog/signasl-year-in-review-2022/</link><guid isPermaLink="false">63b597b7679c4b63757944d7</guid><category><![CDATA[SignASL]]></category><category><![CDATA[Sign Language]]></category><category><![CDATA[Year in Review]]></category><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Tue, 10 Jan 2023 20:58:18 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2023/01/Adobe_Express_20230110_2056480_1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2023/01/Adobe_Express_20230110_2056480_1.png" alt="SignASL Year in Review 2022"><p>Quick recap of this year&apos;s search data for SignASL <strong>26,274,632</strong> searches were done. This is a small increase of <strong>+5.6%</strong> from last year. Below I have included the <strong>top 50 most searched words</strong>.</p><p>The top 5 words are offensive words. In fact there are 7 offensive words in the top 50, unlike users searching for BSL where none of the top 50 include such words. Of note from 2022 is the word &apos;<strong>Ukraine</strong>&apos; enters into the <strong>top 50</strong> with a <strong>688%</strong> increase from last year. The word &apos;<strong>God</strong>&apos; dropped from position <strong>2</strong> to position <strong>42</strong>.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Search Query</th>
<th>No. Searches</th>
<th>% Change</th>
</tr>
</thead>
<tbody>
<tr>
<td>****</td>
<td>31,884</td>
<td>227%</td>
</tr>
<tr>
<td>****</td>
<td>28,194</td>
<td>43%</td>
</tr>
<tr>
<td>****</td>
<td>21,706</td>
<td>711%</td>
</tr>
<tr>
<td>****</td>
<td>17,849</td>
<td>30%</td>
</tr>
<tr>
<td>****</td>
<td>17,038</td>
<td>95%</td>
</tr>
<tr>
<td>good</td>
<td>14,660</td>
<td>17%</td>
</tr>
<tr>
<td>have</td>
<td>14,586</td>
<td>16%</td>
</tr>
<tr>
<td>what</td>
<td>14,275</td>
<td>13%</td>
</tr>
<tr>
<td>like</td>
<td>14,182</td>
<td>28%</td>
</tr>
<tr>
<td>how</td>
<td>14,082</td>
<td>20%</td>
</tr>
<tr>
<td>ukraine</td>
<td>14,059</td>
<td>688%</td>
</tr>
<tr>
<td>****</td>
<td>13,990</td>
<td>263%</td>
</tr>
<tr>
<td>when</td>
<td>13,585</td>
<td>22%</td>
</tr>
<tr>
<td>****</td>
<td>12,645</td>
<td>86%</td>
</tr>
<tr>
<td>want</td>
<td>12,643</td>
<td>10%</td>
</tr>
<tr>
<td>love</td>
<td>12,490</td>
<td>12%</td>
</tr>
<tr>
<td>peace</td>
<td>12,421</td>
<td>62%</td>
</tr>
<tr>
<td>thank you</td>
<td>12,204</td>
<td>21%</td>
</tr>
<tr>
<td>is</td>
<td>12,047</td>
<td>7%</td>
</tr>
<tr>
<td>and</td>
<td>11,857</td>
<td>9%</td>
</tr>
<tr>
<td>do</td>
<td>11,786</td>
<td>21%</td>
</tr>
<tr>
<td>favorite</td>
<td>11,679</td>
<td>15%</td>
</tr>
<tr>
<td>with</td>
<td>11,672</td>
<td>24%</td>
</tr>
<tr>
<td>where</td>
<td>11,609</td>
<td>27%</td>
</tr>
<tr>
<td>hello</td>
<td>11,567</td>
<td>16%</td>
</tr>
<tr>
<td>happy</td>
<td>11,428</td>
<td>13%</td>
</tr>
<tr>
<td>how are you</td>
<td>11,187</td>
<td>35%</td>
</tr>
<tr>
<td>school</td>
<td>11,127</td>
<td>15%</td>
</tr>
<tr>
<td>you&apos;re welcome</td>
<td>11,049</td>
<td>-4%</td>
</tr>
<tr>
<td>to</td>
<td>11,038</td>
<td>15%</td>
</tr>
<tr>
<td>i</td>
<td>10,984</td>
<td>9%</td>
</tr>
<tr>
<td>go</td>
<td>10,836</td>
<td>14%</td>
</tr>
<tr>
<td>did</td>
<td>10,611</td>
<td>28%</td>
</tr>
<tr>
<td>no more</td>
<td>10,574</td>
<td>102%</td>
</tr>
<tr>
<td>ill be right back</td>
<td>10,413</td>
<td>-4%</td>
</tr>
<tr>
<td>went</td>
<td>10,348</td>
<td>-5%</td>
</tr>
<tr>
<td>can</td>
<td>10,342</td>
<td>28%</td>
</tr>
<tr>
<td>need</td>
<td>10,299</td>
<td>25%</td>
</tr>
<tr>
<td>why</td>
<td>10,247</td>
<td>12%</td>
</tr>
<tr>
<td>god</td>
<td>10,116</td>
<td>-30%</td>
</tr>
<tr>
<td>dog</td>
<td>9,807</td>
<td>8%</td>
</tr>
<tr>
<td>help</td>
<td>9,769</td>
<td>25%</td>
</tr>
<tr>
<td>glory</td>
<td>9,647</td>
<td>80%</td>
</tr>
<tr>
<td>grace</td>
<td>9,439</td>
<td>28%</td>
</tr>
<tr>
<td>please</td>
<td>9,395</td>
<td>19%</td>
</tr>
<tr>
<td>we</td>
<td>9,356</td>
<td>15%</td>
</tr>
<tr>
<td>in</td>
<td>9,355</td>
<td>19%</td>
</tr>
<tr>
<td>play</td>
<td>9,324</td>
<td>19%</td>
</tr>
<tr>
<td>no</td>
<td>9,320</td>
<td>27%</td>
</tr>
<tr>
<td>glitter</td>
<td>9,235</td>
<td>1291%</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Inbox Zero in Outlook without deleting an email]]></title><description><![CDATA[<p>Many email organisers recommend a ruthless approach to email management. However, for me, email is an important record of all conversations and a record of what happened, it forms a journal of important details, which I rely upon when needed. Therefore deleting email is not an option. Yet, still finding</p>]]></description><link>https://www.daniel-mitchell.com/blog/inbox-zero-in-outlook-without-deleting-an-email/</link><guid isPermaLink="false">62e7aa2fa8064c501e7a4c1d</guid><dc:creator><![CDATA[Daniel Mitchell]]></dc:creator><pubDate>Tue, 02 Aug 2022 10:45:00 GMT</pubDate><media:content url="https://www.daniel-mitchell.com/content/images/2022/08/Adobe_Express_20220803_2309540_1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.daniel-mitchell.com/content/images/2022/08/Adobe_Express_20220803_2309540_1.png" alt="Inbox Zero in Outlook without deleting an email"><p>Many email organisers recommend a ruthless approach to email management. However, for me, email is an important record of all conversations and a record of what happened, it forms a journal of important details, which I rely upon when needed. Therefore deleting email is not an option. Yet, still finding emails that need to be answered or emails that represents a task I need to complete is important. So, being faced with a massive list that requires lots of scrolling is not optimal either.</p><p>The solution, is to create a customised view in Outlook. The only emails I want to see most of the time our emails that have not yet been read, or emails I have flagged because they represent some kind of task or action I need to take.</p><p>To do this take advantage of the <code>Change View</code> feature in Outlook. Click the little arrow three buttons in from the top left. And then choose <code>Manage Views...</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.daniel-mitchell.com/content/images/2022/08/image.png" class="kg-image" alt="Inbox Zero in Outlook without deleting an email" loading="lazy" width="384" height="191"><figcaption>Outlook - Change View | Manage Views</figcaption></figure><p>This brings up a new window which allows you to Manage Views.</p><figure class="kg-card kg-image-card"><img src="https://www.daniel-mitchell.com/content/images/2022/08/image-2.png" class="kg-image" alt="Inbox Zero in Outlook without deleting an email" loading="lazy" width="478" height="431"></figure><p>We can then choose <code>New</code>. I give it a title of <code>90 days Unread or Flagged</code></p><figure class="kg-card kg-image-card"><img src="https://www.daniel-mitchell.com/content/images/2022/08/image-4.png" class="kg-image" alt="Inbox Zero in Outlook without deleting an email" loading="lazy" width="260" height="332"></figure><p>Choose <code>Filter</code></p><figure class="kg-card kg-image-card"><img src="https://www.daniel-mitchell.com/content/images/2022/08/image-5.png" class="kg-image" alt="Inbox Zero in Outlook without deleting an email" loading="lazy" width="489" height="334"></figure><p>Select the tab <code>SQL</code> and then <code>Edit these criteria directly</code> and paste in the following statement.</p><pre><code>((&quot;urn:schemas:httpmail:read&quot; = 0) OR (&quot;http://schemas.microsoft.com/mapi/proptag/0x10900003&quot; &gt; 1)) AND (&quot;urn:schemas:httpmail:datereceived&quot; &gt; today(-7776000))</code></pre><figure class="kg-card kg-image-card"><img src="https://www.daniel-mitchell.com/content/images/2022/08/image-6.png" class="kg-image" alt="Inbox Zero in Outlook without deleting an email" loading="lazy" width="415" height="320"></figure><p>This will then filter emails that are unread or have been flagged. And only if the emails are less than 90 days. (After all if you have not responded to them in 90 days they are no longer so important!)</p><p>Then choose this new view from the <code>Change View</code> icon.</p><figure class="kg-card kg-image-card"><img src="https://www.daniel-mitchell.com/content/images/2022/08/image-8.png" class="kg-image" alt="Inbox Zero in Outlook without deleting an email" loading="lazy" width="377" height="242"></figure><p>Now you can enjoy the advantages of Inbox Zero of a small mailbox with only the most important messages displayed. Yet all those important emails that are a record of your life still intact. Enjoy!</p>]]></content:encoded></item></channel></rss>