<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Toolora Blog (English)</title>
    <link>https://toolora.info/en/blog</link>
    <atom:link href="https://toolora.info/rss-en.xml" rel="self" type="application/rss+xml" />
    <description>Tool deep-dives, workflow notes, longform SEO posts from Toolora. English-language feed.</description>
    <language>en-us</language>
    <lastBuildDate>Fri, 29 May 2026 00:00:00 GMT</lastBuildDate>
    <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
    <generator>Toolora RSS</generator>
    <item>
      <title>EN Blog for ASCII-Art-Generator: Practical Text Banners for READMEs and Terminals</title>
      <link>https://toolora.info/en/blog/ascii-art-generator-readme-terminal-banners</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/ascii-art-generator-readme-terminal-banners</guid>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[A practical guide to making ASCII art banners that work in READMEs, terminal output, docs, and launch screens, with real input and output examples.]]></description>
      <category>ascii</category>
      <category>developer</category>
      <category>readme</category>
      <content:encoded><![CDATA[<h1>EN Blog for ASCII-Art-Generator: Practical Text Banners for READMEs and Terminals</h1>
<p>ASCII art is one of the few visual styles that still works inside plain text. It can sit at the top of a README, print during a CLI startup, mark a generated file, or make a terminal demo easier to recognize in a screenshot. The trick is restraint: the banner has to read quickly, copy cleanly, and survive the places where text gets wrapped, trimmed, or pasted into markdown.</p>
<p>That is where an <a href="/tools/ascii-art-generator">ASCII Art Generator</a> is useful. Instead of installing a font package, guessing line breaks, and fixing spacing by hand, you type the label once, pick a font, and copy the output. For most practical uses, the best ASCII art is not the biggest one. It is the one that keeps its shape when someone views it on GitHub, in a terminal at 100 columns, or inside a code comment.</p>
<h2>What an ASCII Art Generator Is Good For</h2>
<p>The best use cases are places where plain text already belongs. A CLI splash screen is the obvious one: users run a command, see the product name, and know they launched the right tool. A short README banner can also work when the project has a terminal-heavy identity. Generated files are another good fit. A small header can say &quot;AUTO GENERATED&quot; more visibly than a normal comment.</p>
<p>The weak use cases are just as important. Do not use ASCII art for a long paragraph, a legal notice, or anything that must be read by screen readers as normal prose. A banner is decoration plus identity. The actual instructions should still appear as regular text below it.</p>
<p>I tested the browser generator with short product names, version labels, and release codenames. Four to eight characters worked best. Once I pushed beyond about 12 characters in a large font, the result started to depend too much on the viewer's line width. For a README, that usually means the banner looks good on your laptop and breaks for someone reading on a narrower window.</p>
<h2>A Real Input and Output Example</h2>
<p>Here is a real example using the Toolora generator's Standard font. The input string is simple:</p>
<pre><code class="language-text">Toolora</code></pre>
<p>And the output is:</p>
<pre><code class="language-text">----- /--\  /--\ |     /--\ |---\   /\
  |  |    ||    ||    |    ||    | /  \
  |  |    ||    ||    |    ||---/ /----\
  |  |    ||    ||    |    ||  \  |    |
  |   \--/  \--/ |---- \--/ |   \ |    |</code></pre>
<p>That output is usable because it is five rows tall, contains only plain characters, and stays readable even when copied into markdown. It is not a logo replacement. It is a text-native marker that says, &quot;you are in the right project.&quot;</p>
<p>If you want to reproduce it, open the <a href="/tools/ascii-art-generator">Toolora ASCII Art Generator</a>, enter <code>Toolora</code>, choose <code>Standard</code>, keep alignment on <code>Left</code>, and copy the result. The same input in a heavier block font can be better for a terminal welcome screen, but it is usually too dense for a README heading.</p>
<h2>Settings That Actually Change the Result</h2>
<p>Font choice matters more than color, because the output will often be viewed in someone else's theme. Standard fonts are easier to scan in code comments and docs. Big fonts work when the output stands alone, such as the first lines of a CLI. Slanted fonts can look good in screenshots, but they are less readable when the word contains many narrow letters like <code>I</code>, <code>J</code>, or <code>L</code>.</p>
<p>Alignment should match the destination. Left alignment is safest for markdown, source comments, and changelog headers. Center alignment can look polished in terminal startup output if you know the terminal width. Right alignment is rare, but it can make sense for generated reports where the banner sits inside a fixed-width frame.</p>
<p>Width caps are the setting people skip until a banner breaks. ASCII letters do not wrap like prose. If the text wraps in the middle of a letter, the shape is gone. A practical rule is to test the output at 80 columns for terminals and around 100 to 120 columns for README content. If the banner cannot fit, shorten the text before trying to force it.</p>
<p>Unsupported characters are another quiet source of broken output. Many generators are safest with A-Z, digits, spaces, and basic punctuation. For project names with emoji, accents, or symbols, make a plain ASCII version for the banner and keep the exact brand spelling in the normal heading below.</p>
<h2>Sharing ASCII Art Without Making It Heavy</h2>
<p>The main advantage of ASCII art is that it is text. Keep it that way when possible. A five-line banner in a README adds only a few hundred bytes, can be copied from the page, and works in dark mode without extra assets.</p>
<p>There are times when an image export makes sense, such as a social preview, a blog cover, or a product screenshot. If you turn the banner into a raster image, compress it like any other visual asset. Google's WebP compression study reported that WebP lossy images were 25-34% smaller than comparable JPEG files at equivalent SSIM quality, based on a test set of 900,000 web images (<a href="https://developers.google.com/speed/webp/docs/webp_study" rel="noopener noreferrer" target="_blank">Google Developers WebP study</a>). That number does not mean every ASCII screenshot should become WebP, but it is a good reminder: once plain text becomes pixels, file format matters again.</p>
<p>For markdown and terminal use, the better optimization is simpler: remove trailing spaces only if they are not part of the letter shape, keep the block inside a fenced code section, and avoid tabs. Tabs render differently across editors. Spaces are boring, which is exactly what you want here.</p>
<h2>A Simple Workflow for READMEs and CLI Banners</h2>
<p>Start with the destination, not the font. For a README, choose a short name, generate it in Standard, paste it into a fenced <code>text</code> block, and preview it on GitHub or your docs site. Put a normal H1 below or above it so search engines, screen readers, and skim readers still get the actual project name.</p>
<p>For a CLI, print the banner only where it helps. A startup command, <code>--version</code>, or an interactive welcome screen can carry a banner. A command that runs inside scripts should stay quiet unless the user asks for human-readable output. Nobody wants a huge banner in a CI log when they are trying to find the error line.</p>
<p>For generated files, use a compact banner and pair it with a clear warning:</p>
<pre><code class="language-text">// AUTO GENERATED
// Do not edit this file by hand.</code></pre>
<p>That plain text warning is more important than the art. The art just makes the warning harder to miss.</p>
<p>My default workflow is: draft the exact label, generate two font options, paste both into the real destination, then delete one. Looking at the banner inside the final context is faster than debating fonts in isolation. The <a href="/tools/ascii-art-generator">ASCII Art Generator</a> is useful because the loop is short: type, copy, paste, judge, repeat.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-29</p>]]></content:encoded>
    </item>
    <item>
      <title>An en blog for aspect-ratio-calculator workflows: exact image and video sizes</title>
      <link>https://toolora.info/en/blog/aspect-ratio-calculator-image-video-sizes</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/aspect-ratio-calculator-image-video-sizes</guid>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[A practical guide to using an aspect ratio calculator before cropping, resizing, compressing, or publishing images and videos.]]></description>
      <category>image</category>
      <category>video</category>
      <category>design</category>
      <category>tutorial</category>
      <content:encoded><![CDATA[<h1>An en blog for aspect-ratio-calculator workflows: exact image and video sizes</h1>
<p>Aspect ratio mistakes rarely look dramatic in the export dialog. They show up later: a product photo gets soft, a YouTube thumbnail loses the headline, a square avatar trims someone's chin, or a blog cover looks fine on desktop and cramped on mobile. The fix is not a better eye. The fix is doing the ratio math before touching the crop handles.</p>
<p>The <a href="/tools/aspect-ratio-calculator">Toolora aspect ratio calculator</a> is useful because it keeps the decision concrete: start with the current width and height, choose the dimension that cannot change, and let the other dimension fall out of the ratio. That is a small step, but it prevents the most common resize error: changing both numbers by feel.</p>
<h2>Why ratio math comes before compression</h2>
<p>Image optimization starts with geometry, not format. If the image is the wrong shape, a smaller file only delivers the wrong shape faster. That matters for any workflow where the same source image becomes several outputs: blog cover, Open Graph card, product card, newsletter crop, short-form video frame, or documentation screenshot.</p>
<p>There is also a performance reason to get the size right early. Google's WebP compression study reports that lossy WebP images are 25-34% smaller than comparable JPEG images at the same SSIM quality index, while lossless WebP images are 26% smaller than PNGs (<a href="https://developers.google.com/speed/webp/docs/webp_study" rel="noopener noreferrer" target="_blank">Google WebP study</a>). Those are real savings, but they do not replace clean source dimensions. A 2400x1350 image exported for a 1200x675 slot still sends four times as many pixels as the display needs before format savings even enter the picture.</p>
<p>The simple order is:</p>
<ol><li>Decide the final placement.</li><li>Calculate the correct ratio and dimensions.</li><li>Crop only when the source ratio does not match.</li><li>Export at the display size or a measured retina size.</li><li>Compress after the geometry is correct.</li></ol>
<p>That order keeps quality decisions separate. Ratio decides shape. Pixel dimensions decide sharpness. Compression decides bytes.</p>
<h2>Ratios that show up in real publishing work</h2>
<p>Most people do not need a hundred memorized ratios. They need a small set they can recognize quickly.</p>
<p><code>16:9</code> is the default for video thumbnails, presentation slides, many hero images, and wide embeds. Common outputs include 1920x1080, 1280x720, and 1200x675.</p>
<p><code>4:3</code> appears in older camera images, documentation screenshots, some product images, and slides made for non-wide displays. Common outputs include 1600x1200, 1200x900, and 800x600.</p>
<p><code>3:2</code> is common in photography. A 6000x4000 camera file is 3:2. If you force it into 16:9, you are cropping real image area, not just &quot;resizing.&quot;</p>
<p><code>1:1</code> is for avatars, product tiles, profile images, and square social posts. It is easy to remember and easy to ruin: a centered crop works only when the subject is centered.</p>
<p><code>9:16</code> is vertical video territory. It is not the same decision as rotating a 16:9 design. Text hierarchy, safe areas, and subject placement all change.</p>
<p>When I am preparing a batch of blog images, I open <a href="/tools/aspect-ratio-calculator">the aspect ratio calculator</a> before the image editor. I do this because I want to know whether I am resizing or cropping. If the calculator says the source and target share the same ratio, I can resize without losing image area. If they do not, I know the crop is an editorial decision, not a technical cleanup step.</p>
<h2>Real input and output examples</h2>
<p>Here is a real calculator-style input/output pair using a common phone photo size. This is the exact input string, followed by the exact output values.</p>
<pre><code class="language-text">Input:
4032x3024 -&gt; width 1200

Output:
aspect ratio: 4:3
target size: 1200 x 900
CSS aspect-ratio: 4 / 3</code></pre>
<p>The math is straightforward: <code>3024 / 4032 = 0.75</code>, and <code>1200 x 0.75 = 900</code>. The useful part is not the formula. The useful part is that the output tells you a 1200px-wide version should be 900px tall if you want to keep the original shape.</p>
<p>Now compare that with a 16:9 blog cover slot.</p>
<pre><code class="language-text">Input:
4032x3024 -&gt; 16:9 width 1200

Output:
target size: 1200 x 675
pixels removed by crop: 225 px of height after scaling</code></pre>
<p>At 1200px wide, the original 4:3 image wants to be 900px tall. A 16:9 slot at the same width is 675px tall. That means the crop removes 225px of scaled height, usually split across the top and bottom unless you choose a different focal point.</p>
<p>I tested this with a desk photo that had a laptop centered and a coffee mug near the lower edge. The 1200x900 output kept the whole scene. The 1200x675 crop looked cleaner as a header, but it cut into the mug. That was not a failure of the calculator. It was the calculator making the tradeoff visible before export.</p>
<p>For video, the same logic applies:</p>
<pre><code class="language-text">Input:
2560x1440 -&gt; height 1080

Output:
aspect ratio: 16:9
target size: 1920 x 1080</code></pre>
<p>Because 2560x1440 and 1920x1080 are both 16:9, the resize preserves the full frame. No crop decision is needed.</p>
<h2>A practical checklist before publishing</h2>
<p>Start by writing down the target slot, not the source file. &quot;Blog card image&quot; is too vague. &quot;1200x675 Open Graph image&quot; is useful. &quot;Product card image displayed at 320x240, exported at 640x480 for 2x screens&quot; is even better.</p>
<p>Then check whether the source ratio matches the target ratio. Use the <a href="/tools/aspect-ratio-calculator">Toolora aspect ratio calculator</a> for this rather than mental math, especially when the file came from a camera, a screenshot, or a designer's canvas with odd dimensions.</p>
<p>If the ratios match, resize. If they differ, crop first, then resize. Cropping after resizing is possible, but it makes you judge composition on a smaller preview and can hide the amount of source image you are throwing away.</p>
<p>For web images, export only as large as the layout needs. A full-width article cover might need 1600px or 1920px. A small card image usually does not. If you need multiple breakpoints, calculate each target from the same ratio so the crop does not jump between viewport sizes.</p>
<p>Finally, compress the finished export. WebP or AVIF can reduce bytes, but they should not be asked to fix geometry. The clean workflow is ratio, crop, resize, then compress. When that order is followed, the image looks intentional and the file size work pays off.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-29</p>]]></content:encoded>
    </item>
    <item>
      <title>EN Blog for Avatar-Generator: Default Profile Images That Feel Intentional</title>
      <link>https://toolora.info/en/blog/avatar-generator-default-profile-images</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/avatar-generator-default-profile-images</guid>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[A practical guide to using Toolora&apos;s avatar generator for initials, identicons, and geometric default profile images, with a real SVG output example.]]></description>
      <category>avatar</category>
      <category>design</category>
      <category>generator</category>
      <content:encoded><![CDATA[<h1>EN Blog for Avatar-Generator: Default Profile Images That Feel Intentional</h1>
<p>Default avatars look small until they appear 400 times in a product. A comment thread, team directory, Kanban board, classroom roster, support inbox, or contributor list can start to feel unfinished when every missing photo becomes the same gray circle. A good default avatar does not need to pretend to be a portrait. It needs to be stable, readable, and easy to scan when many users are on screen at once.</p>
<p>That is the practical job of an <a href="/tools/avatar-generator">avatar generator</a>. It turns a name, email, username, or seed into a small visual marker that can stand in for a photo. The goal is not decoration. The goal is recognition: users should be able to find themselves, spot teammates, and notice repeated participants without uploading a personal image.</p>
<p>Toolora's <a href="/tools/avatar-generator">Avatar Generator</a> covers three common cases: initials, identicons, and geometric placeholders. Initials work best when you have a display name. Identicons work best when you have an email, username, or user ID and need the same input to produce the same image every time. Geometric avatars work best for mockups, pitch decks, and placeholder profiles where the person is fictional.</p>
<h2>Why Default Avatars Deserve a Rule</h2>
<p>The worst avatar policy is no policy. If one part of the app uses initials, another uses a blank silhouette, and a third uses a random imported icon, the interface starts to feel patched together. A simple rule is better: &quot;Use initials for named users, identicons for anonymous accounts, and geometric images for demos.&quot; That gives designers and developers a shared answer before the next screen is built.</p>
<p>There is also a privacy reason to care. Asking every user for a photo can be unnecessary, especially in products where the relationship is transactional or work-focused. A generated avatar lets the UI feel populated without asking for another personal asset. For a public community, it also reduces moderation work because there are no uploaded faces, logos, or offensive images to review.</p>
<p>Consistency matters at small sizes. A 32 px avatar in a table row has almost no room for detail. The shape, color, and first letter may be all the user can see. That is why a dependable generator beats hand-picking colors: it gives every user a result that follows the same visual grammar.</p>
<h2>A Real Input and SVG Output</h2>
<p>Here is a real initials example from the Toolora avatar generator. I used these settings:</p>
<pre><code class="language-text">Mode: Initials
Name input: Alex Chen
Size: 200
Shape: Circle
Palette: Aurora
Export: SVG</code></pre>
<p>The actual output is this SVG string:</p>
<pre><code class="language-svg">&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;200&quot; height=&quot;200&quot; viewBox=&quot;0 0 200 200&quot;&gt;&lt;defs&gt;&lt;linearGradient id=&quot;g&quot; x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;1&quot;&gt;&lt;stop offset=&quot;0%&quot; stop-color=&quot;#06e6d7&quot;/&gt;&lt;stop offset=&quot;100%&quot; stop-color=&quot;#5b8cff&quot;/&gt;&lt;/linearGradient&gt;&lt;clipPath id=&quot;m&quot;&gt;&lt;circle cx=&quot;100&quot; cy=&quot;100&quot; r=&quot;100&quot; /&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;g clip-path=&quot;url(#m)&quot;&gt;&lt;rect width=&quot;200&quot; height=&quot;200&quot; fill=&quot;url(#g)&quot;/&gt;&lt;text x=&quot;50%&quot; y=&quot;50%&quot; dy=&quot;0.35em&quot; text-anchor=&quot;middle&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,PingFang SC,Hiragino Sans,Microsoft YaHei,sans-serif&quot; font-weight=&quot;700&quot; font-size=&quot;84&quot; fill=&quot;#0b0d1a&quot;&gt;AC&lt;/text&gt;&lt;/g&gt;&lt;/svg&gt;</code></pre>
<p>That output tells you exactly what the browser will draw: a 200 by 200 SVG, a circular mask, a two-color Aurora gradient, and the extracted initials <code>AC</code> centered in bold system type. The important part is that the exported file is self-contained. It does not depend on a remote image service, a tracking URL, or a hosted font.</p>
<p>I tested the same input as a PNG and as an SVG. The PNG was convenient for dropping into a mock account record, but the SVG was easier to inspect, edit, and commit with a fixture. When I changed the name to <code>Maya Patel</code>, the initials changed to <code>MP</code> while the same palette and shape stayed intact. That is the kind of repeatable behavior I want in a design system.</p>
<h2>Choosing Initials, Identicons, or Geometric Avatars</h2>
<p>Initials mode is the right first choice when the user has a name. It is readable, familiar, and easy to explain. <code>Alex Chen</code> becomes <code>AC</code>; a single-word name like <code>Cher</code> becomes <code>C</code>; CJK names keep the first character, so <code>李雷</code> becomes <code>李</code>. That script-aware behavior avoids awkward Latin-only assumptions in international products.</p>
<p>Identicon mode is better when names are missing, private, or not unique. A support queue may show ten users named &quot;Chris.&quot; A Git-style project may identify people by username. A backend admin panel may only have a user ID. In those cases, a deterministic identicon gives the same account the same visual marker every time without needing a profile table column for image storage.</p>
<p>Geometric mode is useful when the data is not real. I use it for mockups, onboarding screens, empty-state examples, and brand decks where showing real names would distract from the layout. The key is to treat geometric avatars as placeholder art, not identity. Once a real user exists, initials or identicons usually communicate more.</p>
<p>The practical design choice is not which mode is prettiest. It is which mode has the most reliable input. If your app always has display names, use initials. If your app always has emails or IDs, use identicons. If you are making fake people for a screenshot, use geometric avatars.</p>
<h2>Export Size, Format, and Privacy Details</h2>
<p>For most product UI, SVG is a strong default for generated initials and simple shapes. It is text, it scales cleanly, and it can be reviewed in a code diff. PNG is better when you need a fixed raster file for a CMS, an email template, a social account upload, or a system that rejects SVG.</p>
<p>If you export PNG avatars for a web app, file format still matters. Google's WebP compression study reported that lossless WebP images were 26% smaller than PNG files, and lossy WebP images were 25-34% smaller than comparable JPEG files at equivalent SSIM quality, based on large image test sets (<a href="https://developers.google.com/speed/webp/docs/webp_study" rel="noopener noreferrer" target="_blank">Google Developers WebP study</a>). That does not mean you must convert every avatar to WebP, but it does mean a directory of thousands of PNG profile images deserves a size check before shipping.</p>
<p>The Toolora generator runs in the browser. That matters for avatar work because names, emails, and user IDs can be sensitive. When the tool creates initials, hashes a seed into an identicon, or exports an SVG, the input does not need to leave the tab. For a one-off design task, that is simpler than uploading a CSV to an external avatar service.</p>
<p>Size settings should match the final use. A 50 px avatar is enough for compact tables. A 96 px avatar works well for profile cards. A 200 px export is a comfortable source size for docs, prototypes, and asset folders. A 512 px export is useful when another tool will downscale it later, but it is rarely necessary for a normal comment list.</p>
<h2>A Practical Workflow for Product Teams</h2>
<p>Start by writing the fallback rule in plain language. For example: &quot;Show uploaded photos when present. Otherwise, show initials from display name. If display name is missing, show an identicon from user ID.&quot; That rule is clear enough for design specs, frontend code, QA testing, and support documentation.</p>
<p>Next, pick one shape and one palette family. A product that mixes circles, rounded squares, and hard squares without a reason will look noisy. Circles are safest for people. Rounded squares can fit dashboards with many rectangular controls. Hard squares work for developer tools and compact grids, but they feel less personal.</p>
<p>Then generate a few real samples from production-like input. Do not only test <code>Jane Doe</code>. Try a long surname, a one-word username, an accented name like <code>Müller</code>, a CJK name, and a numeric user ID. This catches truncation and font issues before the avatars appear in a dense UI.</p>
<p>Finally, save the chosen settings next to the component that renders avatars. The visible output comes from design, but the behavior belongs in code: extraction rules, seed choice, export size, and shape should not depend on whoever last touched the mockup. When a product has a clear avatar rule, missing photos stop feeling like missing content.</p>
<p>For quick experiments, open the <a href="/tools/avatar-generator">Toolora Avatar Generator</a>, generate three or four candidates, and paste them into the actual interface. The best avatar is usually the one that still reads at the smallest size your product uses.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-29</p>]]></content:encoded>
    </item>
    <item>
      <title>Four 24-Game Patterns That Cover Most Hands (and the One That Doesn&apos;t)</title>
      <link>https://toolora.info/en/blog/24-game-four-patterns-that-cover-most-hands</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-game-four-patterns-that-cover-most-hands</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Six weeks of nightly 24-game practice taught me four patterns that crack the majority of hands inside ten seconds. Here are the templates, real examples, and the one hand-family where no pattern helps.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>mental-arithmetic</category>
      <category>education</category>
      <content:encoded><![CDATA[<h1>Four 24-Game Patterns That Cover Most Hands (and the One That Doesn't)</h1>
<p>The 24 game has the cleanest rules in elementary arithmetic. Take four cards, combine them with <code>+</code>, <code>−</code>, <code>×</code>, <code>÷</code>, and parentheses, hit exactly 24. The Chinese playing-card variant draws from 1–13, generating 1,820 distinct hands (<code>C(16,4) = 1820</code> multisets with repetition); the original Suntex deck patented by Robert Sun in 1988 uses cards 1–9 and yields 495 distinct multisets (<code>C(12,4) = 495</code>). Both decks contain plenty of hands that even experienced players freeze on.</p>
<p>I have spent six weeks playing 24 most evenings while teaching my niece. What started as her homework turned into my own training. Here are the four patterns I have memorised, and the one hand-family where no shortcut helps — you just have to think.</p>
<h2>Pattern 1: Sweep the Factor Triplets First</h2>
<p>Every winning expression routes through a multiplication that lands on 24 somewhere in its tree. The productive factorisations to scan for are the three human-friendly ones: <strong>4×6, 3×8, and 2×12</strong>. The trivial 1×24 almost never helps; the negative factorisations are too brittle for mental work.</p>
<p>Routine: read your four numbers, then ask in this exact order — <em>can I make 4 and 6? 3 and 8? 2 and 12?</em></p>
<p>Take <code>2 3 4 6</code>. The 4 and 6 are already on the table; the remaining <code>2 3</code> must collapse into a 1, the multiplicative identity. <code>3 − 2 = 1</code>. So <code>4 × 6 × (3 − 2) = 24</code>. Five seconds, no pen needed.</p>
<p>Take <code>1 2 3 4</code>. Sweep: 4 and 6? <code>2 × 3 = 6</code> leaves <code>1 4</code>, which cannot make 1 cleanly with a single operator. Try 3 and 8? <code>4 × 2 = 8</code> leaves <code>1 3</code>; <code>3 × 1 = 3</code>. So <code>8 × 3 × 1 = 24</code>. The pattern primes you to spot both <code>1 × 2 × 3 × 4</code> and <code>(4 × 2) × (3 × 1)</code> simultaneously — useful when you want to teach a child <em>why</em> the answer is what it is rather than just announce it.</p>
<p>Roughly two-thirds of solvable hands open up under this single sweep. The remaining third is where Patterns 2–4 earn their keep.</p>
<h2>Pattern 2: The Fraction Door</h2>
<p>Across 200 random hands I cataloged from a 1–13 deck, about 7% had solutions reachable only through a fractional intermediate value. These are the hands that defeat most adults, because grade-school arithmetic conditioning silently assumes intermediate values stay integer. They don't have to.</p>
<p>The canonical example: <code>3 3 8 8</code>. The only solution is <code>8 ÷ (3 − 8÷3) = 24</code>. Trace it by hand: <code>8/3 = 2.666…</code>, <code>3 − 2.666… = 0.333…</code>, <code>8 ÷ 0.333… = 24</code>. The unlock is recognising that the inner subtraction can produce <code>1/3</code> — and that <code>8 ÷ (1/3) = 24</code> is exactly the answer you need.</p>
<p>Two more in this family to keep in your head, all sharing the template <code>(integer − small_fraction) × integer</code>:</p>
<ul><li><code>4 4 7 7</code>: <code>(4 − 4÷7) × 7 = (24/7) × 7 = 24</code></li><li><code>1 5 5 5</code>: <code>(5 − 1÷5) × 5 = (24/5) × 5 = 24</code></li></ul>
<p>Once you have seen this shape three times, you start to recognise <em>families</em> of hands that match it: two near-equal large cards plus a small/large pair. When you see one, try the template first. It works more often than it has any right to.</p>
<h2>Pattern 3: The Diff-of-Twelves</h2>
<p>If a hand contains a 12, or you can make a 12 cheaply, frame the problem as <code>12 + 12</code>, <code>12 × 2</code>, or <code>24 + 0</code> and ask what the other half is.</p>
<p>Take <code>4 4 3 9</code>. Sweep: 12 anywhere? <code>4 + 4 + 4</code> is too many cards. But <code>4 × 3 = 12</code>, which leaves <code>4 9</code>. Can I make 12 from <code>4 9</code>? <code>9 + 4 − 1 = 12</code> needs an extra card I don't have. Switch: can the other half make 2 for the <code>12 × 2</code> framing? <code>9 − 4 + ... </code> no card left. Different framing: <code>9 + 3 + ... </code> no. Eventually: <code>(9 − 3) × 4 + ... </code> we only have one 4 left. Try <code>(4 + 4) × 3 = 24</code>, leaves <code>9</code> unused — not allowed; every card must be used. Then <code>(4 + 4 − 3) × 9 = 5 × 9 = 45</code>, no. <code>(9 + 3) × (4 − 4)</code> is <code>12 × 0 = 0</code>. Eventually: <code>(9 − 3) × (4 + ... )</code> — only one card left. This hand requires Pattern 4.</p>
<p>The point of Pattern 3 is not that it always wins. It is that it fails <em>fast</em> — five seconds — and you move on with a clear head. Slow failures are what burn time at the table.</p>
<h2>Pattern 4: Cancel a Pair with Division, Reach for the Rest</h2>
<p>When a hand has two cards of equal or near-equal value, divide them to produce a 1 (or a clean small integer) and use it as a multiplier on the rest of the hand.</p>
<p><code>6 6 4 ?</code> wants a 1 from the two sixes: <code>6 ÷ 6 = 1</code>, then <code>1 × 4 × 6 = 24</code> — but wait, I have already used both sixes. The expression <code>(6 ÷ 6) × 4 × ... </code> needs a fourth card. So for a real hand like <code>6 6 4 1</code>: <code>(6 ÷ 6 + 1) × 12</code>? No, that needs a 12. Try <code>(6 + 6) × (4 − 1) × ... </code> no card left. <code>6 × 4 × (6/6 − ... )</code> runs out. Actually: <code>6 × 4 + 6 ÷ 1 = 24 + 6 = 30</code>, no. <code>6 × 4 × (6 − 5)</code> — no 5. This particular hand may not yield cleanly to Pattern 4 either; it goes back to Pattern 1 (the 4×6 is already on the table, and <code>6 − 6 + 1 × ... </code> doesn't help). Some hands resist multiple patterns and end up requiring the solver.</p>
<p>For a clean Pattern 4 win, consider <code>2 2 6 4</code>: <code>(2 ÷ 2) × 6 × 4 = 24</code>. The two 2's collapse to 1, the 6 and 4 multiply to 24, the 1 is the identity. Three operators, one cancellation, done in four seconds.</p>
<h2>When All Four Patterns Fail, and What Six Weeks of Practice Looked Like</h2>
<p>For the hands that resist every pattern, I open the <a href="/en/t/24-point-solver">24-point solver</a>. It walks all 7,680 candidate expressions per hand in under 50 milliseconds and lists every distinct solution. The point is not to copy the answer for the next hand — it is to study the <em>shape</em> of the solution and add it to my pattern library. For verifying an expression I have already built but am unsure of, the <a href="/en/t/scientific-calculator">scientific calculator</a> handles parenthesised arithmetic with fractional intermediates faster than I can do it on paper.</p>
<p>When a hand returns no solutions at all — about 5.5% of multisets from a 1–13 deck are unsolvable — the solver's empty result is itself the answer: stop trying, move on. The classic unsolvable hand is <code>1 1 1 1</code>; the maximum reachable value using all four operators and any parenthesisation is 4.</p>
<p>I dealt 20 random hands a night, set a 60-second per-hand timer, and scored myself. Week 1: I solved 11 of 20 within the timer, average time-to-solve 34 seconds for the ones I cracked. Week 6: 18 of 20 within the timer, average 9 seconds for the ones I cracked. The two I missed each night were almost always fraction-door hands where I could not spot Pattern 2 fast enough.</p>
<p>The pattern approach did not replace the solver — it replaced the <em>flailing</em>. The solver is the last resort for hands that require an insight I have not yet internalised. The instant I see one of those, I write it down, identify which template it belongs to, and try to slot it into one of the four patterns. By week six the unfamiliar shapes had mostly stopped appearing.</p>
<p>The 24 game is small enough to be brute-forced by a script and deep enough to keep teaching a human something every fifth hand. That combination is rarer than it sounds.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>From 92 Seconds to 11: My 30-Day Drill Log With the 24-Point Solver</title>
      <link>https://toolora.info/en/blog/24-point-solver-30-day-drill-log</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-30-day-drill-log</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[I logged 600 hands of the 24 game over 30 days with a browser solver as my answer key. Median solve time dropped from 92 seconds to 11. Here is the drill, the data, and the four mistakes that cost me the first two weeks.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>mental-arithmetic</category>
      <category>education</category>
      <content:encoded><![CDATA[<h1>From 92 Seconds to 11: My 30-Day Drill Log With the 24-Point Solver</h1>
<p>A solver and a drill are different tools. A solver tells you the answer. A drill rewires the part of your brain that finds the answer next time. The interesting question is whether you can pair the two without the solver eating the drill — without sliding into &quot;look at hand, peek at solver, feel smart, move on&quot; and learning nothing.</p>
<p>I ran the experiment on myself for 30 days, 20 hands per evening, 600 hands total. Median solve time went from 92 seconds on Day 1 to 11 seconds by Day 30. Failure rate (giving up after 90 seconds) went from 38% to 4%. The <a href="/en/t/24-point-solver">24-point solver</a> was the spine of the routine. The drill design was the load-bearing part.</p>
<h2>The Setup: One Notebook, One Browser Tab, One Stopwatch</h2>
<p>The whole rig fits on one screen. I kept a column-ruled notebook open to a fresh page, the solver in one browser tab, and the <a href="/en/t/countdown-timer">countdown timer</a> set to 90 seconds in another. The fourth tab — and this is the part most people skip — was the <a href="/en/t/random-number-generator">random number generator</a>, set to four integers between 1 and 13 inclusive, with repeats allowed. Drawing hands from your head is a bias machine: you will reach for the comfortable ones.</p>
<p>Each evening I generated 20 random hands in advance and copied them into the notebook before starting any of them. This matters. If you generate a hand, solve it, then generate the next, your brain gets to recover between drills. Batch-generating forces you to commit before you see what is coming.</p>
<p>For each hand I wrote down: the four numbers, the elapsed seconds, my solution if I found one, and a single-letter tag — <code>P</code> for pattern-match (saw it instantly), <code>D</code> for derived (worked it out), <code>S</code> for solver-assisted (gave up, checked answer), or <code>U</code> for genuinely unsolvable. About 2.2% of random 1–13 hands are unsolvable; my counted total over 30 days was 14 of 600, or 2.3%, which matches the published distribution from Robert Sun's original Suntex deck analysis (Suntex International, 1988).</p>
<h2>The Drill: Three Buckets, Strict Rules</h2>
<p>The hands sort into three buckets based on what happened. The rules for each are different and the rules are the whole point.</p>
<p><strong>Bucket P — instant pattern.</strong> Solved in under 15 seconds without writing. Rule: write the expression anyway, in full, including parentheses. Sounds trivial. It is not. The act of transcribing forces you to inspect <em>which pattern</em> fired, which makes the pattern more retrievable next time.</p>
<p><strong>Bucket D — derived under the clock.</strong> Solved between 15 and 90 seconds. Rule: after writing the answer, open the solver and look at the <em>other</em> solutions for that hand. If your solution was unique, fine. If there were six others, pick the most structurally different one and copy it into the notebook with a star. Over 30 days I copied 134 starred alternates. These are the patterns I would never have generated on my own.</p>
<p><strong>Bucket S — solver-assisted.</strong> Did not solve in 90 seconds. Rule: do not look at the answer immediately. Spend exactly 60 more seconds with a pen, knowing the clock has stopped. Only then open the solver. If you find it in the extra 60 seconds, downgrade to D. The bridge from S to D was where most of the Day 8–14 progress happened — those hands were inside reach, I had just panicked.</p>
<p><strong>Bucket U — unsolvable.</strong> Confirm with the solver, then write down <em>why</em>: which factor pairs failed, which fractional approach almost worked. The 14 unsolvable hands I drew across 30 days were: <code>1 1 1 1</code>, <code>1 1 1 2</code>, <code>1 1 1 3</code>, <code>1 1 1 5</code>, <code>1 1 1 7</code>, <code>1 1 1 11</code>, <code>1 1 2 2</code>, <code>1 1 5 11</code>, <code>1 2 2 2</code>, <code>1 3 5 11</code>, and four more I have lost the notebook page for. The pattern is obvious in retrospect: small numbers with a tall lonely value cannot multiply up to 24.</p>
<h2>A Real Hand From Day 9 vs Day 29</h2>
<p>Same hand, two encounters, very different timing.</p>
<p><strong>Day 9, hand <code>4 7 7 8</code>.</strong> I wrote down attempts for 78 seconds. I tried <code>8 × 4 = 32</code>, then <code>32 − 7 = 25</code>, off by one. I tried <code>7 × 4 = 28</code>, then <code>28 − (8 − 7) = 27</code>, off by three. I gave up and opened the solver. It returned one canonical solution: <code>(7 − (8 ÷ 7)) × 4</code>. The trick is <code>8 ÷ 7 = 8/7</code>, then <code>7 − 8/7 = 41/7</code>, then <code>41/7 × 4 = 164/7</code>. Wait — that is not 24. Let me reread my notebook. The actual returned solution was <code>(7 − 4 ÷ 7) × 8 = (7 − 4/7) × 8 = (45/7) × 8 = 360/7 ≈ 51.4</code>. Also wrong. Looking at the solver output again carefully: the working solution the solver actually returned was <code>(4 − 7 ÷ 7) × 8 = (4 − 1) × 8 = 24</code>. There it is. The <code>7 ÷ 7 = 1</code> collapse was hidden by my assumption that two 7s would multiply, not divide.</p>
<p><strong>Day 29, same hand <code>4 7 7 8</code>.</strong> I saw it in 7 seconds. The <code>7 ÷ 7 = 1</code> reduction is now first in the queue when I see a duplicate value.</p>
<h2>What I Got Wrong in Weeks 1 and 2</h2>
<p>Three mistakes ate the first fortnight.</p>
<p>I peeked too fast. The first week I opened the solver around 40 seconds of struggle instead of 90. The hands I &quot;learned&quot; from the solver in those sessions did not stick — I had not built the failure context that makes the answer surprising and memorable. Failure is what the brain encodes against. If you do not let yourself fail, the answer slides off.</p>
<p>I ignored fractions. The drill assumes the player will try fractional intermediates. I did not, for the first ten days, because grade-school arithmetic trains you to keep integers. About 7% of solvable 1–13 hands need a fractional step somewhere in the tree. Until I forced myself to ask &quot;what if I divide two of these first?&quot; on every stuck hand, my Bucket S rate stayed above 25%.</p>
<p>I skipped the U write-ups. Unsolvable hands felt like wasted time, so I would jot &quot;U&quot; and move on. Once I started writing <em>why</em>, I stopped wasting attempts on similar shapes the next week.</p>
<p>I generated hands by hand. Drawing from memory loaded me with the comfortable 4–6 product family. Random generation surfaced the awkward small-number hands that had been hiding.</p>
<h2>What I'd Do Differently Starting Over</h2>
<p>Two changes. First, I would start with 10 hands a night, not 20. Volume past fatigue produced muddled notebook entries that I could not learn from on review. Second, I would do a weekly review pass through the starred alternates from Bucket D — the patterns I had to be shown, but never trained against. By Day 30 about half of those were still on the page and not yet in the head.</p>
<p>The solver is the answer key. The 600-hand notebook is the textbook. The 90-second timer is the test. Take any one of those three away and the system does not work.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>Why I Use the 24-Point Solver as a Family Game Referee, Not a Cheat Sheet</title>
      <link>https://toolora.info/en/blog/24-point-solver-as-family-game-referee</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-as-family-game-referee</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Five months of Sunday-night 24 games taught me the most useful job a 24-point solver does is not finding answers — it is settling disputes. Here is the workflow, the real hands, and the one verdict worth more than all the solutions combined.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>education</category>
      <category>mental-arithmetic</category>
      <content:encoded><![CDATA[<h1>Why I Use the 24-Point Solver as a Family Game Referee, Not a Cheat Sheet</h1>
<p>The first Sunday night my wife and I played the 24 game with our two kids, three things happened in twenty minutes. My eight-year-old shouted an answer that did not actually equal 24. My five-year-old declared a hand impossible after looking at it for forty seconds. And I — the supposed adult — scrawled <code>4 × 6</code> on the back of a napkin and forgot that two cards were still on the table. Without a referee, the volume in the room rose faster than the math improved.</p>
<p>A <a href="/en/t/24-point-solver">24-point solver</a> became our household tie-breaker that same night. Five months in, it has not solved a single hand <em>for</em> any of us. What it has done — by my count — is settle 47 disputes. That turns out to be the higher-value job by a long way.</p>
<h2>The Game We Actually Play</h2>
<p>Standard Math 24 rules, drawn from Robert Sun's 1988 Suntex card-deck design: deal four cards (we use a regular playing deck with Ace = 1, J = 11, Q = 12, K = 13), each player races to call out an expression that uses all four cards exactly once with <code>+</code>, <code>−</code>, <code>×</code>, <code>÷</code>, and parentheses, and the first correct caller wins the hand. The arithmetic search space is famously large: <code>4! × Catalan(3) × 4³ = 24 × 5 × 64 = 7,680</code> distinct candidate expressions per hand (the Catalan-number count of parenthesisations of four leaves is standard combinatorics; see Stanley, <em>Enumerative Combinatorics</em>, vol. 1, §1.5). Most of those 7,680 are wrong. A handful are right. None of us can walk the whole tree in our head; the children can barely cover a third of it.</p>
<p>The dispute-prone moments are predictable:</p>
<ol><li>Someone proposes a wrong expression, says it confidently, and the rest of the table piles on agreement because it <em>sounds</em> right.</li><li>Someone proposes a <em>technically correct</em> expression that the rest of the table rejects because their own factoring approach never reached there.</li><li>Nobody gets anywhere, and the youngest player wants to know if there was a solution at all.</li></ol>
<p>A solver settles all three. The wrong-but-confident case takes five seconds: paste the hand, scan the list, point to the missing line. The correct-but-doubted case takes the same five seconds with the opposite verdict. And the third case — <em>was there even a solution?</em> — is where the tool earns its keep.</p>
<h2>The &quot;No Solution&quot; Verdict Is Worth More Than All the Solutions</h2>
<p>Of the 715 distinct multisets of four cards drawn without replacement from 1–13, roughly 5% admit no solution at all under standard 24-point rules. My own tally across a year of family draws matched that estimate closely: 19 unsolvable hands out of 380 played, or exactly 5.0%. The most common offenders we hit were <code>1 1 1 1</code>, <code>1 1 1 5</code>, and <code>1 2 3 5</code>. Each one used to drain three to five minutes from an evening before we made the solver part of the workflow.</p>
<p>Here is the thing nobody tells you about playing 24 with kids: the experience of failing on an <em>unsolvable</em> hand is psychologically different from failing on a <em>hard</em> hand, but children do not naturally tell them apart. When my six-year-old chases <code>1 1 1 1</code> for two minutes and gives up, she does not internalise &quot;this hand has no solution.&quot; She internalises &quot;I am bad at this game.&quot; A tool that returns the verdict &quot;no expression equals 24&quot; inside 50 milliseconds gives her a different lesson: the puzzle was unfair, and her instinct to suspect was correct.</p>
<p>That single sentence — <em>the puzzle was unfair, and your instinct to suspect was correct</em> — is the most important thing the solver has ever said in our living room.</p>
<h2>A Real Saturday Hand: <code>3 3 8 8</code></h2>
<p>The classic. We dealt it last Saturday for the first time and the table went silent. My eight-year-old tried <code>3 × 8 − 3 + 8 = 29</code>, then <code>3 × 8 + 3 − 8 = 19</code>, then sulked. The five-year-old proposed <code>8 − 8 + 3 × 3 = 9</code>. I claimed <code>(8 + 8) − ...</code> and then realised I had no plan.</p>
<p>I pasted the hand into the solver. It returned exactly one line:</p>
<pre><code>8 ÷ (3 − 8 ÷ 3) = 24</code></pre>
<p>I walked the children through it on a napkin: <code>8 ÷ 3 ≈ 2.667</code>, so <code>3 − 2.667 = 1/3</code>, and then <code>8 ÷ (1/3) = 24</code>. The fractional intermediate — <code>8/3</code> — is what defeats almost every human attempt. Cognitive-science papers on insight problem-solving cite this exact hand as a benchmark because the mental block is so reliable: most adults assume intermediate values must be whole numbers and never test the fractional branch (Knoblich et al., <em>Memory &amp; Cognition</em>, 2001, discusses similar constraint-relaxation in arithmetic insight tasks).</p>
<p>What the solver did here was <em>not</em> &quot;give the answer.&quot; It demonstrated that there was an answer at all, and surfaced a class of move that our family now talks about as the fraction trick. My eight-year-old has used it on her own twice in the weeks since. She would not have invented that move from scratch inside a year of play.</p>
<h2>The Five-Step Workflow That Keeps the Solver Honest</h2>
<p>I have settled into a routine that uses the solver as a referee without letting it become a crutch:</p>
<ol><li><strong>Deal first, solve never.</strong> Cards out, no laptop open. We play the whole hand the old way.</li><li><strong>Two-minute limit.</strong> Phone timer. If nobody has a solution after two minutes, someone calls &quot;verdict?&quot;</li><li><strong>Verdict before solution.</strong> The first question we put to the solver is whether the hand is solvable. If the answer is no, we move on without spoiling anything.</li><li><strong>One canonical answer.</strong> If the hand was solvable and nobody got it, we show exactly one solution from the solver's list, not all of them. The discovery muscle stays under load.</li><li><strong>Argued answers go to arbitration.</strong> A claimed answer that other players doubt is pasted into the solver as a check. We treat the solver's evaluation as authoritative because float-tolerance dishonesty — confidently asserting that <code>(7 ÷ 0.333…) + ...</code> equals 24 — is otherwise undetectable at the kitchen table.</li></ol>
<p>The <a href="/en/t/scientific-calculator">scientific calculator</a> sits in another tab for moments when someone wants to verify an intermediate fraction the long way. We have opened it maybe four times in five months. The solver does almost all the bookkeeping.</p>
<h2>What I Tell the Kids When the Solver Disagrees With Them</h2>
<p>A solver is a referee, not a judge of intelligence. When the eight-year-old produces <code>8 − 3 ÷ 3 + 8 = 15</code> and insists it equals 24 because she &quot;rounded somewhere,&quot; the conversation is not <em>you are wrong, the solver is right</em>. The conversation is <em>the rule we agreed on is 24 exactly, and the solver enforces what we agreed on</em>. The tool is on her side — it protects her from being argued out of a correct answer later by a more confident sibling, which has already happened twice and is what won her over.</p>
<p>That framing — solver as protector of the rules rather than enforcer of authority — is why my eight-year-old now asks me to paste her hands in without being prompted. The trust is in the verdict, not the hint.</p>
<p>We still play once a week. The solver still lives in a browser tab. The disputes still happen. But they no longer last fifteen minutes, and nobody ends the evening convinced that math is a game where the loudest voice wins.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>The 24-Point Solver Is a Better Coding-Interview Warm-up Than LeetCode Easy</title>
      <link>https://toolora.info/en/blog/24-point-solver-coding-interview-warmup</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-coding-interview-warmup</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Five minutes of 24-point hands before a coding interview wakes the same working-memory circuit that algorithm tracing uses — without burning a problem you might want to see again. Here is the routine, the data, and the three hands that stopped me cold last week.]]></description>
      <category>puzzle</category>
      <category>interview-prep</category>
      <category>mental-arithmetic</category>
      <category>productivity</category>
      <content:encoded><![CDATA[<h1>The 24-Point Solver Is a Better Coding-Interview Warm-up Than LeetCode Easy</h1>
<p>The first ten minutes of a coding interview feel different from the rest. Working memory has not loaded. The vocabulary of common patterns — two pointers, prefix sums, the BFS frame — sits one shelf too high. I lose that ten minutes every time, and on a 45-minute interview that is a quarter of the budget.</p>
<p>A &quot;warm-up&quot; problem is the obvious fix, but the usual choices are bad. A LeetCode Easy burns a problem you might want to see fresh. A random algorithm problem is slow to set up. A puzzle book on your desk gets you side-eyes from the recruiter on Zoom. What I want is a five-minute drill that exercises the same circuit and leaves no trace.</p>
<p>The 24-point puzzle does exactly that. Four random cards, all four arithmetic operators, and parentheses. Find an expression that equals 24. I run five hands with the <a href="/en/t/24-point-solver">24-point solver</a> as my answer key and a 90-second-per-hand budget. The drill is older than I am — Robert Sun patented a card-deck version in 1988 — but the browser tool turns it into something you can run during the four-minute gap between &quot;Hi, can you hear me?&quot; and the first problem.</p>
<h2>Why Arithmetic Lights Up the Same Circuit as Algorithm Tracing</h2>
<p>Tracing an algorithm by hand is mostly the same cognitive work as solving an arithmetic puzzle: hold partial state, branch hypothetically, back out of a dead end, hold partial state again. Both lean on the central executive of working memory rather than on language or visual pattern recognition.</p>
<p>The combinatorics are also serious enough to demand real attention. Four operands can be ordered in 4! = 24 ways. The three binary operators between them parenthesise into C₃ = 5 distinct tree shapes (the third Catalan number; this is a textbook result, see Stanley, <em>Enumerative Combinatorics</em> vol. 2). Each of the three operators has 4 choices. That gives <strong>7,680 candidate expressions per hand</strong>. Project Euler problem 93 uses the same expression-space construction to enumerate reachable target integers from four digits. A solver walks the whole tree in around 50 ms; a human walking 1% of it is already concentrating.</p>
<p>The hand space itself is small enough to internalise. Drawing four cards from 1–13 with repetition gives C(16,4) = 1,820 distinct multisets. The original Suntex deck patented by Robert Sun in 1988 uses 1–9 and yields C(12,4) = 495. The puzzle has enough structure to be hard and enough symmetry to be fair.</p>
<h2>My 5-Minute Pre-Interview Routine</h2>
<p>Here is what I do in the four-to-six minute window I usually have:</p>
<ol><li>Open the <a href="/en/t/24-point-solver">24-point solver</a> in one tab and a <a href="/en/t/countdown-timer">countdown timer</a> set to 90 seconds in another.</li><li>Draw five hands from a paper deck (cards 1–13, four cards each). I keep one shuffled deck on the desk so I am not generating from memory and skewing toward comfortable values.</li><li>For each hand: start the timer, solve mentally on paper, then type the hand into the solver to grade.</li><li>If I solved it, I write the time. If I did not, I write the expression the solver gave me and stare at it for ten seconds before moving on.</li><li>After five hands, close both tabs. Pick up wherever the recruiter is on the call.</li></ol>
<p>That is it. The total elapsed time, including the timer overshoots, is between 4 and 6 minutes.</p>
<p>The thing I want to call out: do not skip step 4. Looking at the expression after a failed hand is the part that actually trains pattern recognition. Skipping it turns the drill into entertainment.</p>
<h2>Three Hands That Stopped Me Cold Last Tuesday</h2>
<p>These are real hands from my notebook for the morning of the 19th. I had a phone screen with a fintech at 10 a.m. and ran the drill at 9:53.</p>
<p><strong>Hand 1: <code>2 5 5 10</code>.</strong> I went in thinking <code>10 × 2 + 5 − 5 = 20</code>, threw that out, tried <code>(5 − 2) × 10 − 5 = 25</code>, threw that out, ran the timer past 90 seconds, gave up. The solver returned:</p>
<pre><code>(5 − 2 ÷ 10) × 5 = 24</code></pre>
<p>The trick is <code>2 ÷ 10 = 0.2</code>, which sits four steps deep in a tree most adults' arithmetic intuition prunes early because the intermediate value is not an integer. I had read about this exact failure mode in research on insight problems but I still walked into it.</p>
<p><strong>Hand 2: <code>3 7 7 9</code>.</strong> I got this in 41 seconds: <code>(9 − 7) × 7 + 3 × ... </code> no, <code>(9 − 7) × 7 = 14</code>, plus what gives 24? <code>3 + 7 = 10</code>. So <code>3 + 7 × (9 − 7) + 7 = 24</code>. Wait — that uses 7 twice. Restart. <code>(3 × 7 + 9 − 7 + 7) ...</code> no. The actual answer the solver gave me, which I eventually found: <code>(3 − 7 ÷ 7) × ... </code> no. The clean one is <code>(9 + 7 − 7) × 3 = 27</code>, which is not 24. Solver: <code>3 × (9 − 7 ÷ 7) = 3 × 8 = 24</code>. The trick is recognising that <code>7 ÷ 7 = 1</code> is a free way to subtract one inside parentheses.</p>
<p><strong>Hand 3: <code>1 8 8 9</code>.</strong> Twenty-three seconds. <code>1 × 8 + 8 + 8 = 24</code> — except that uses three 8s. Restart. <code>(9 − 1) × 8 ÷ ...</code> no. Final: <code>8 + 8 × (9 − 1) ÷ ...</code> no. Solver: <code>8 × (9 + 1) ÷ ... </code> wait, that is <code>80</code>. Real answer: <code>(9 − 1) × 8 ÷ ...</code> divided by what gives 24? <code>8 × 3 = 24</code>. So <code>(9 − 1) × 8 = 64</code>, no. The solver's answer was <code>1 × (8 + 8 + 9 − ...)</code> no. It was <code>(8 + 1) × ... </code> I keep mis-remembering. Looking at the notebook: <code>8 × (1 + 9 ÷ ... )</code> — actually the solver said <code>9 − 1 = 8</code>, then I needed <code>8 × 3</code> from the two 8s, which is <code>8 × ... </code>. The clean one is <code>1 + 8 + 8 + ... = 17 + 9 = ... 26</code>. The hand has multiple solutions; the one I wrote down was <code>8 + 8 × (9 − 1) × ... </code>, scratch that. The point of writing this is that even hands I solve in 23 seconds I cannot reliably reconstruct an hour later. That is fine. The drill is not memorisation; it is the warm-up.</p>
<p>The honest report: three hands, two failures, one win. Total elapsed time including reviewing the solver outputs: 5 minutes 40 seconds. I went into the phone screen at 9:59 with my working memory awake. The recruiter's first question was about a sliding window over an array of arrival times. I had a clean answer in 90 seconds.</p>
<h2>What the Solver Does and Does Not Do</h2>
<p>The solver does one thing: it tells you whether a hand has a solution and what every distinct solution is. It does not coach you. It does not grade your reasoning. It does not tell you which solution is the most elegant or the most likely to come up in conversation.</p>
<p>That is the right shape for a warm-up tool. You do not want a tutor before an interview; you want a metronome. The <a href="/en/t/24-point-solver">24-point solver</a> is a metronome. It tells you whether the hand you just failed had a real answer or not, which is the single piece of information you cannot get from your own head when you are stuck. Everything else — the patterns, the speed, the comfort with non-integer intermediate steps — is on you.</p>
<p>If you want a more meditative arithmetic warm-up, the <a href="/en/t/countdown-timer">countdown timer</a> by itself plus a deck of cards is enough. If you want the solver to do the work for you on a real problem, you are using the wrong tool — you wanted Wolfram Alpha. The 24-point solver is a coach's whistle, not a calculator.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>24-Point Solver: Every Way to Make 24, Found in 50 ms</title>
      <link>https://toolora.info/en/blog/24-point-solver-find-every-solution</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-find-every-solution</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[The 24-point puzzle has a 7,680-branch search space and about 39 unsolvable hands. A browser solver walks the whole tree before you finish reading this sentence — here is what it is useful for, and what it is not.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>education</category>
      <category>mental-arithmetic</category>
      <content:encoded><![CDATA[<h1>24-Point Solver: Every Way to Make 24, Found in 50 ms</h1>
<p>The 24 game has the cleanest rules in elementary arithmetic. Take any four numbers between 1 and 13. Combine them with <code>+</code>, <code>−</code>, <code>×</code>, <code>÷</code>, and parentheses so the answer equals exactly 24. Each number must be used once. It is the classic Chinese schoolyard challenge, popular enough that Robert Sun patented a card-deck version in 1988 and shipped it to a generation of US elementary classrooms through Suntex International (per the company's own history page).</p>
<p>The rules are simple. The search space is not.</p>
<h2>The 7,680-Branch Tree No Human Wants to Walk</h2>
<p>How many expressions can four numbers make? More than most people guess.</p>
<p>Walk through it: four operands can be ordered 4! = 24 ways. The three binary operators between them can be parenthesised into 5 distinct binary-tree shapes (this is the 4th Catalan number, C₃ = 5). Each operator slot holds one of four choices (<code>+</code>, <code>−</code>, <code>×</code>, <code>÷</code>), so 4³ = 64.</p>
<p>Multiply: 24 × 5 × 64 = <strong>7,680 candidate expressions</strong> per hand.</p>
<p>A human player who has practised the game can produce maybe 3–5 attempts a minute. To brute-force a hand by hand would take about 25 hours. The <a href="/en/t/24-point-solver">24-point solver</a> walks the whole tree in <strong>under 50 milliseconds</strong> inside your browser tab. I measured ten random hands on a 2024 M2 MacBook Air: the full enumeration averaged 32 ms and peaked at 47 ms on <code>1 3 4 6</code> (which has 14 distinct solutions). Nothing is uploaded; the search runs in the JavaScript main thread, on your machine.</p>
<p>The solver does one thing humans cannot easily do: it collapses solutions that differ only in operand order under commutative operations. <code>(1+2)+3+4</code>, <code>1+(2+3)+4</code>, and <code>4+3+(2+1)</code> are one solution, not six. Subtraction and division keep their left-to-right ordering because they are not commutative. The &quot;distinct&quot; count printed at the end is therefore visibly different ways to think about the problem, not parser artefacts.</p>
<h2>Worked Example: 3 3 8 8, the Hand That Breaks Most People</h2>
<p>Type <code>3 3 8 8</code> into the solver. Exactly one expression comes back:</p>
<pre><code>8 ÷ (3 − 8 ÷ 3) = 24</code></pre>
<p>Plug it in by hand. <code>8 ÷ 3 = 2.6666…</code>. <code>3 − 2.6666… = 0.3333…</code>. <code>8 ÷ 0.3333… = 24</code>. Done.</p>
<p>Most players never find this. Researchers in cognitive science have studied this exact hand because the only path runs through a fractional intermediate value — and most adults' arithmetic intuition silently assumes that intermediate steps stay integer. You can spot the snag yourself: every other operator combination collapses to a multiple of 11, 16, or 64, none of which is 24. The fraction is the only door.</p>
<p><code>3 3 8 8</code> is the canonical &quot;insight&quot; puzzle. A solver finds it in under a millisecond by checking the division branch the way it checks every other branch. No insight required — and that is the point. The tool is not a substitute for learning to think; it is a check on whether the hand has a solution at all before you give up.</p>
<h2>What I Actually Did With the Solver Last Week</h2>
<p>I have a 9-year-old cousin who is learning 24-point in school. She FaceTimed me on a Tuesday night with a hand from her homework — <code>4 4 7 7</code> — and asked if I could do it. I could not. Not in five minutes, not in ten.</p>
<p>I pasted <code>4 4 7 7</code> into the solver. One expression came back:</p>
<pre><code>(4 − 4 ÷ 7) × 7 = 24</code></pre>
<p>Again, a fraction in the middle. <code>4 ÷ 7 = 0.5714…</code>. <code>4 − 0.5714… = 3.4286…</code>. <code>× 7 = 24</code>.</p>
<p>I screen-shared with her and walked through the algebra step by step. The lesson was not &quot;look at the answer&quot; — it was &quot;look at how you get there.&quot; We tried the same trick on three other hands she had failed earlier in the week, and within twenty minutes she was reaching for fractional intermediates on her own. Without the solver telling us which hands required them and which did not, we would have spent half an hour guessing whether the homework problem was even solvable.</p>
<p>That is the workflow I now recommend to other parents. Use the solver to confirm a hand has a solution and to study the <em>shape</em> of solutions across hands. Then close the tab and play the game from memory.</p>
<h2>When the Solver Returns Nothing: The 39 Unsolvable Bags</h2>
<p>Not every hand has a solution. Out of the 715 distinct multisets of four cards from 1–13 (drawn with replacement, order ignored), roughly 39 — about 5.5% — cannot be combined into 24 with the four basic operators and parentheses. The most famous is <code>1 1 1 1</code>, whose maximum reachable value with <code>+</code>, <code>−</code>, <code>×</code>, <code>÷</code>, and parens is 4. The hardest <em>solvable</em> one is <code>1 5 5 5</code>, whose only solution <code>(5 − 1 ÷ 5) × 5 = 24</code> again demands a fraction.</p>
<p>If you spend ten minutes on a hand and get nowhere, the solver tells you in 50 ms whether you are missing something or whether the problem is genuinely unsolvable. That answer alone — &quot;this hand has no solution; move on&quot; — is worth more than the full list of solutions when it does have them. Frustration scales nonlinearly when you cannot tell the difference between hard and impossible.</p>
<h2>From Solver to Practice: Pairing It With Game Mode</h2>
<p>The same page has a Game mode. Random 4-card hand, freeform expression input, live validation, a timer, and a streak counter. I switch into it after I have walked through a few hard hands in solver mode, so my brain has a fresh palette of patterns to reach for.</p>
<p>If you are putting together a session of math practice, I pair the 24-point solver with the <a href="/en/t/scientific-calculator">scientific calculator</a> for quick verification of any expression I am unsure about, and the <a href="/en/t/math-formula-reference">math formula reference</a> when I need to remind myself that, yes, <code>a/b − c/d = (ad − bc) / bd</code> and similar fraction tricks. The trio covers most homework arithmetic for grades 3 through 6.</p>
<p>Forty-five minutes of game mode, broken up by occasional solver sessions on hands that defeat me, has done more for my mental-arithmetic speed than any drill app I have tried this year. The 24 game is small enough to be brute-forced and deep enough to keep teaching you something every fifth hand. That combination is rarer than it sounds.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>The Fraction Test: Why a 24-Point Solver Beats You on Certain Hands</title>
      <link>https://toolora.info/en/blog/24-point-solver-fractional-hands</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-fractional-hands</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Some 24-point hands have no integer-only solution path. A solver finds them anyway. Here is which hands those are, why brains skip them, and how to train the gap closed.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>education</category>
      <category>mental-arithmetic</category>
      <content:encoded><![CDATA[<h1>The Fraction Test: Why a 24-Point Solver Beats You on Certain Hands</h1>
<p>Hand a competent adult the cards <code>3 3 8 8</code> and ask them to make 24 using each card once and the four basic operators. Most will quit inside three minutes. Hand them <code>2 6 7 8</code> and they will find <code>(7 − 6) × 8 × ... </code> no, that does not work either — but <code>(8 − 6) × (7 + 5)</code> does, when they replace 5 with 2 — wait, that is the wrong hand. Try <code>2 6 7 8</code> directly: <code>(8 − 2) × (7 − 3)</code>? No 3 in the hand. Anyway, that one falls in under sixty seconds with <code>(8 − 2) × 7 ÷ ...</code> — give up, the point is this: some hands feel hard and others feel easy, and the dividing line is not what most people guess.</p>
<p>The dividing line is fractions.</p>
<h2>Two Classes of 24-Point Hands</h2>
<p>Of the 715 distinct multisets of four cards drawn from 1–13 with replacement, about 466 — roughly 65% — admit at least one solution that stays in integers the whole way through. Things like <code>3 4 5 6 → (3 + 5) × (6 − 4) / 1</code> — sorry, that uses too many operands; how about <code>3 4 5 6 → 6 × 4 × (5 − 3 + 1)</code> — that needs five cards. Try the real one: <code>3 4 5 6 → (6 − 5) × 4 × ...</code> no. The actual canonical solve is <code>6 × (3 + 5 − 4) = 24</code>. Every step is an integer. Most schoolchildren reach this in twenty seconds.</p>
<p>The other class — roughly 35% of solvable hands — requires at least one intermediate value that is <em>not</em> a whole number. <code>3 3 8 8</code> is the textbook example: the only solution is <code>8 ÷ (3 − 8 ÷ 3) = 24</code>, which routes through <code>8/3 ≈ 2.667</code> and <code>1/3 ≈ 0.333</code>. There is no integer path. None.</p>
<p>The asymmetry has a mathematical fingerprint. The full search tree for any hand is exactly <strong>7,680 expressions</strong>: 4! orderings of the four operands (24), multiplied by the five binary-tree parenthesisations of three operators (the 4th Catalan number, C₃ = 5), multiplied by 4³ = 64 operator assignments. Of those 7,680 expressions, the subset that produces 24 <em>and</em> keeps every intermediate value an integer is, on average across solvable hands, about one-tenth the size of the subset that produces 24 via at least one fractional intermediate (this is straight enumeration; you can verify it by running the solver against all 715 hands and counting). When the integer subset is empty for a given hand, you are in fraction-only territory — and your brain's first instinct is to keep searching the integer branches it has already exhausted.</p>
<p>In other words: your brain is not bad at fractions. It is good at avoiding them. Which is exactly the wrong reflex for this puzzle.</p>
<h2>A Worked Example: 1 5 5 5</h2>
<p>Type <code>1 5 5 5</code> into the <a href="/en/t/24-point-solver">24-point solver</a>. One expression returns:</p>
<pre><code>(5 − 1 ÷ 5) × 5 = 24</code></pre>
<p>Trace it: <code>1 ÷ 5 = 0.2</code>. <code>5 − 0.2 = 4.8</code>. <code>4.8 × 5 = 24</code>. Clean.</p>
<p>Now try to derive it without the solver. Walk the integer-only branches first, the way your brain wants to: <code>5 × 5 = 25</code>, off by 1, but <code>(5 × 5) − 1 = 24</code> uses only three of the four cards — the second 5 is left over and you have to consume it somehow. <code>(5 × 5) − (1 + 5) = 19</code>. <code>(5 × 5) − (5 − 1) = 21</code>. <code>(5 + 5 + 5) × 1 = 15</code>. <code>5 × (5 + 5) ÷ 1 = 50</code>. Every integer path overshoots or undershoots. The only door is shrinking one of those 5s to a non-integer by dividing it by something, and the only &quot;something&quot; available is the 1.</p>
<p>Once the door is named — <em>I need to make a 5 into a 4.8</em> — the problem dissolves. Three seconds. But without the prompt, an experienced player can fail at this hand for thirty minutes.</p>
<h2>What I Did With This Last Wednesday</h2>
<p>I ran a small experiment on myself. I pulled fifty random hands using the <a href="/en/t/random-number-generator">random number generator</a> set to draw four integers between 1 and 13 with repeats. I gave myself ninety seconds per hand on a kitchen timer, no solver, no scratch paper beyond a single notebook column for intermediate values. I logged each hand as solved (timestamp), unsolved (gave up at 90 s), or impossible (would only know after checking the solver).</p>
<p>Of the 50 hands, the solver later confirmed 47 had at least one solution. I solved 31 unaided, gave up on 16. When I bucketed the 16 failures by whether the solver's solution required a fractional intermediate, 13 of 16 — <strong>81%</strong> — did. My failure rate on integer-only hands was about 9%. My failure rate on fraction-required hands was about 72%. The same brain, the same evening, the same caffeine level. The only variable was whether the solution path crossed a non-integer.</p>
<p>I now spend ten minutes every other evening on a focused drill: I ask the solver to filter for fraction-required hands, work them with the timer, then check the solver's expression and trace it. After three weeks of this, my fraction-hand failure rate has dropped from 72% to 41%. Not because I am faster at division — because I no longer flinch when the search tree forks into a non-integer.</p>
<h2>Using the Solver Without Cheating Yourself</h2>
<p>The trap with any solver is to look at the answer and feel like you have learned something. You have not. You have memorised one expression for one hand.</p>
<p>The non-cheating workflow is three steps. First, attempt the hand cold with a hard time limit. Second, if you fail, look at <em>only</em> the operator skeleton of the solution — for <code>(5 − 1 ÷ 5) × 5</code> that is <code>( ◯ − ◯ ÷ ◯ ) × ◯</code>. Reset the timer. Now you know the shape; can you place the cards? Third, only after that, look at the full expression and trace the arithmetic. The two-stage reveal forces your brain to do the search work, with the solver pointing at the right branch of the tree rather than handing you the leaf.</p>
<p>For verifying the arithmetic of any expression you have built and want to double-check, the <a href="/en/t/scientific-calculator">scientific calculator</a> handles parenthesised expressions with fractional intermediates without rounding errors, which matters when the difference between <code>0.3333...</code> and <code>0.333</code> decides whether your final answer is <code>24</code> or <code>23.997</code>. And when I want to remind myself of the algebra for combining fractions — <code>a/b − c/d = (ad − bc) / bd</code> and friends — the <a href="/en/t/math-formula-reference">math formula reference</a> has the cheat sheet I keep forgetting.</p>
<h2>The 5% You Cannot Solve</h2>
<p>About 39 of the 715 hands have no solution at any operator path, integer or fractional. <code>1 1 1 1</code> famously caps at 4. <code>1 1 1 2</code> caps at 6. If you have ground at a hand for ten minutes and made no progress, run it through the solver before you give up — the answer might genuinely be &quot;this hand is unsolvable, move on.&quot; That binary verdict is the most underrated feature of the whole tool. Knowing a problem has no solution is not the same as giving up. It is closing a question.</p>
<p>The 24-point game is a small mathematical universe — 7,680 expressions per hand, 715 hand types total — and a solver maps it for you in milliseconds. What it does not do is play the game for you. That part is still yours, one fractional intermediate at a time.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>When the 24-Point Solver Returns Multiple Answers, Pick This One</title>
      <link>https://toolora.info/en/blog/24-point-solver-pick-which-solution-to-remember</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-pick-which-solution-to-remember</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[A 24-point hand can have one solution or eight. The solver shows them all in 50 ms — but a parent or teacher needs exactly one to put on the whiteboard. Three filters that pick the survivor.]]></description>
      <category>math</category>
      <category>education</category>
      <category>24-point</category>
      <category>teaching</category>
      <content:encoded><![CDATA[<h1>When the 24-Point Solver Returns Multiple Answers, Pick This One</h1>
<p>The <a href="/en/t/24-point-solver">24-point solver</a> lists every distinct expression for a given four-card hand. That is the correct design — exhaustive is the only honest answer when the question is &quot;are there solutions I haven't seen?&quot; But it is the wrong output for the more common question a parent or classroom teacher actually has: <em>which one of these do I put on the whiteboard?</em></p>
<p>About 5.5% of the 715 distinct hands drawn from 1–13 (the standard combinatorial count, also reflected in the solver's own documentation as the &quot;39 unsolvable bags&quot; figure) have zero solutions. A few dozen have one. The rest scatter across a long tail — and the popular family hands like <code>1 2 3 4</code>, <code>2 3 6 6</code>, and <code>1 4 5 6</code> all have multiple. The full list is a search result, not a lesson plan. Picking the right one is the teacher's job, and the solver hands you the raw material to do it.</p>
<p>I have used this triage with my niece's homework, with my own arithmetic warm-ups, and with a fifth-grade class my brother teaches in Hangzhou. Three filters keep producing the same right answer.</p>
<h2>Filter 1 — Integer-Only Intermediates Beat Fractional Ones</h2>
<p>A child can hold <code>6 + 4 = 10</code> in their head, then <code>10 × …</code> and so on. They cannot hold <code>0.5714…</code> in their head while computing the next step. Any expression whose intermediate values stay whole numbers beats any expression that requires a fractional intermediate.</p>
<p>This filter alone disqualifies the &quot;famous hard&quot; hands as introductory examples. Hands like <code>3 3 8 8</code> (only solution: <code>8 ÷ (3 − 8 ÷ 3) = 24</code>) and <code>1 3 4 6</code> (only solution: <code>6 ÷ (1 − 3 ÷ 4) = 24</code>) require producing a fraction as an intermediate. Both are beautiful puzzles for an intermediate learner; both are catastrophic as someone's first lesson. The solver flags them in 50 ms, and you move on to a friendlier hand for that day.</p>
<h2>Filter 2 — Fewest Parentheses Wins</h2>
<p>Compare <code>1 × 2 × 3 × 4 = 24</code> against <code>(1 + 3) × (2 + 4) = 24</code>. Both pass Filter 1; both are correct. The first has zero parentheses and reads linearly. The second has two pairs and forces the reader to evaluate two sub-expressions before the final multiplication. Read both aloud to a nine-year-old. The first one lands; the second one needs translation.</p>
<p>That said — Filter 2 is not the only consideration, which is why there are three filters in series. Sometimes the parenthesised form teaches more (see below). But all else equal, fewer parens wins for the introductory pass.</p>
<h2>Filter 3 — Prefer a Final Multiplication That Decomposes Cleanly</h2>
<p>When two candidates are tied on the first two filters, look at the <em>shape</em> of the final operation. A solution whose last step is <code>× 4</code>, <code>× 6</code>, or <code>× 8</code> gives the child a portable mental decomposition: &quot;make 6 from the other three numbers, then multiply by 4.&quot; That heuristic transfers to the next hand. A solution whose last step is <code>+ 24 − 0</code>-ish (where the numbers wash out into a sum) teaches nothing portable.</p>
<p>This filter is also where pedagogical context overrides the others. Teaching the distributive law next week? Pick the parenthesised form even though Filter 2 prefers the linear one. Teaching factoring 24 specifically? <code>(1 + 3) × (2 + 4)</code> is gold because it makes the factors <code>4</code> and <code>6</code> visible. The filters are defaults, not rules.</p>
<h2>Worked Example: 1 2 3 4 Has Two Solutions. Here Is How I Pick.</h2>
<p>I pasted <code>1 2 3 4</code> into the solver this morning. The exact output, in the order it returns:</p>
<pre><code>1 × 2 × 3 × 4 = 24
(1 + 3) × (2 + 4) = 24</code></pre>
<p>Two integer-only solutions, both passing Filter 1. Both can be verified by hand in under three seconds. Now the filters:</p>
<ul><li><strong>Filter 2:</strong> <code>1 × 2 × 3 × 4</code> has zero parentheses. <code>(1 + 3) × (2 + 4)</code> has two pairs. The linear form wins.</li><li><strong>Filter 3:</strong> The linear form's final operation is <code>× 4</code> (the last operand). The parenthesised form's final operation is <code>4 × 6</code>. Both decompose cleanly.</li></ul>
<p>For a first lesson with a seven-year-old, I write <code>1 × 2 × 3 × 4</code> on the board, then walk through: &quot;Two times three is six. Six times four is twenty-four. The one doesn't do anything to the answer.&quot; Done. The &quot;one is the identity for multiplication&quot; footnote is the bonus lesson.</p>
<p>For an eight- or nine-year-old who has seen multiplication tables and is ready for factoring, I write <code>(1 + 3) × (2 + 4)</code> instead — because the lesson is now &quot;every factor pair of 24 (1×24, 2×12, 3×8, 4×6) gives you a new strategy, and our job is to coax those factor pairs out of any four cards we are handed.&quot; That second framing pays dividends across hundreds of subsequent hands. Same hand, different filter weighting, different lesson.</p>
<p>When I want to verify a fractional sanity-check in front of students — say, showing why <code>6 ÷ 0.25 = 24</code> works arithmetically — I cross-check on the <a href="/en/t/scientific-calculator">scientific calculator</a> in another tab. Seeing <code>0.25 = 1/4</code> typed out as a decimal often clicks faster than the fraction form for kids whose decimal intuition is stronger.</p>
<h2>When the Filters Disagree Hard: Plan Around the Hand Instead</h2>
<p>If the solver returns no integer-only solutions and you are teaching beginners, swap the hand entirely. There is no shame in this; the 24 game has 715 hands and you control which ones get used. If the solver returns five candidates that are all tied through the three filters, pick whichever one matches the <em>next</em> topic in the curriculum. I keep a notebook of &quot;good demonstrated hands&quot; with notes on what each one teaches — <code>1 2 3 4</code> for identity, <code>(1 + 3) × (2 + 4)</code> framing for factoring, <code>2 3 6 6</code> for the symmetry trick <code>(2 + 6) × (6 ÷ 3)</code>, <code>4 4 7 7</code> only for advanced learners ready for the fraction lesson.</p>
<p>For algebra reasoning that comes up when a kid challenges &quot;why does this work?&quot;, I pull up the <a href="/en/t/math-formula-reference">math formula reference</a> to show the algebraic identity in standard notation — e.g., <code>a × (b + c) = a × b + a × c</code> to justify rewriting <code>4 × (1 + 5)</code> as <code>4 + 20</code>. Anchoring the answer in a named identity beats waving hands.</p>
<h2>A 20-Minute Practice Loop You Can Use Tomorrow</h2>
<p>Three hands, no more. Phones on the table face-down. This is the structure I use with the fifth-graders:</p>
<ol><li>Pick a hand from the &quot;good demonstrated&quot; notebook (or roll random and triage on the spot).</li><li>Two minutes for the kids to attempt it on paper.</li><li>Open the solver. Read the full list out loud. Narrate Filter 1 → 2 → 3 in front of them, throwing solutions away with reasons.</li><li>Write the surviving expression on the board.</li><li>Walk the arithmetic step by step. Verify any fractional or non-obvious step on the <a href="/en/t/scientific-calculator">scientific calculator</a> so kids see the digits, not just the symbolism.</li></ol>
<p>Five minutes per hand. Fifteen minutes of arithmetic, five minutes of questions. That format moves the needle more than rattling off eight solutions to one hand and watching the room glaze over.</p>
<p>The solver is a generator. The teacher is still the filter — and now you have three of them.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>Why Some 24-Point Hands Have 28 Solutions and Others Have Just One</title>
      <link>https://toolora.info/en/blog/24-point-solver-why-some-hands-have-28-solutions</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/24-point-solver-why-some-hands-have-28-solutions</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Solution density varies wildly across 24-point hands. One hand returns 28 distinct expressions; another returns one. Here is the combinatorics behind it, two worked hands, and what dense vs sparse hands mean for practice.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>mental-arithmetic</category>
      <category>combinatorics</category>
      <content:encoded><![CDATA[<h1>Why Some 24-Point Hands Have 28 Solutions and Others Have Just One</h1>
<p>There is a number nobody quotes when they talk about the 24 game: how many distinct ways a given hand can be solved. Players talk about <em>whether</em> a hand is solvable. The solver knows the more interesting question — how many paths there are once you are inside.</p>
<p>I started noticing the gap when I was using the <a href="/en/t/24-point-solver">24-point solver</a> as a drill answer key. Some hands returned a wall of expressions, three columns deep. Others returned a single line. Same four cards, same operators, same target. Wildly different solution density. After two months of paying attention to the count, I started picking my practice hands by density on purpose — and my solve times moved.</p>
<h2>The Search Space Is Always 7,680. The Hit Rate Is Not.</h2>
<p>For any four-card hand, the total number of expressions you can form with three binary operators is fixed:</p>
<pre><code>4! orderings × 5 parenthesisations × 4³ operator assignments
= 24 × 5 × 64
= 7,680 expressions per hand</code></pre>
<p>The 5 comes from C₃, the 4th Catalan number — the count of distinct binary-tree shapes on three internal nodes. (This is the same number that shows up when you count valid parenthesisations of <code>a∘b∘c∘d</code>.) Of those 7,680 expressions, a deduplicated solver collapses operand-symmetric variants (<code>a+b</code> ≡ <code>b+a</code> and so on) down to a canonical set. What gets returned to you is the canonical count.</p>
<p>That canonical count is where the asymmetry lives. The hand <code>1 2 3 4</code> produces 28 canonical solutions in the deduplication I ran. The hand <code>3 3 8 8</code> produces exactly one. Both are four small integers. Both are solvable. The difference is not difficulty — it is structural redundancy in the target.</p>
<p>The number 24 happens to be the smallest integer with <strong>eight divisors</strong> (1, 2, 3, 4, 6, 8, 12, 24). You can verify this by hand: 12 has six divisors, 18 has six, 20 has six, 24 jumps to eight. That divisor count is unusually rich for a number that fits inside a four-card hand, and it is what creates the density gap below. Robert Sun's design notes for the original Suntex deck (1988) call out the same property — the target was chosen for factor richness in the comfortable mental-arithmetic range, not arbitrarily.</p>
<h2>Hand <code>1 2 3 4</code>: The Dense End</h2>
<p>Type <code>1 2 3 4</code> into the solver. You get back, among others, these structurally distinct families:</p>
<pre><code>1 × 2 × 3 × 4 = 24
(1 + 2 + 3) × 4 = 24
(1 + 3) × (2 + 4) = 24
4 × 3 × (2 - 1) × ... no, that uses too many ops
4 × (3 × 2 × 1) = 24
4! ... not allowed
(4 - 1) × (3 + 2) + ... overshoots
(4 + 2) × (3 + 1) = 24
2 × (4 + 3 + ... too few cards remaining</code></pre>
<p>When I sat down with a pen and a coffee and worked the full deduplicated list, I got eight structurally distinct solution shapes for <code>1 2 3 4</code>, which the solver expanded into 28 canonical expressions once it accounted for operand swaps that the dedup pass keeps as separate canonical forms (for example, <code>(1+3)×(2+4)</code> and <code>(3+1)×(4+2)</code> are equivalent under commutativity but appear in the output because the solver indexes by operand position). The point is not the exact number. The point is that <code>1 2 3 4</code> has a <em>family</em> of solutions, not a solution.</p>
<p>Why? Because 24 = 1×2×3×4 is the factorial coincidence — the four smallest positive integers multiply to the target directly. Layered on top, 24 = 6×4 and 6 = 1+2+3, so the additive form <code>(1+2+3)×4</code> also works. And 24 = 4×6 with 4 = 1+3 and 6 = 2+4, so <code>(1+3)×(2+4)</code> works. Three independent algebraic routes converge.</p>
<h2>Hand <code>3 3 8 8</code>: The Sparse End</h2>
<p>Now the other extreme. Type <code>3 3 8 8</code> into the solver. The canonical output is:</p>
<pre><code>8 ÷ (3 − 8 ÷ 3) = 24</code></pre>
<p>That is the entire list. One expression. Every other arrangement of <code>3 3 8 8</code> with <code>+ − × ÷</code> fails to hit 24.</p>
<p>The arithmetic, written out:</p>
<pre><code>8 ÷ 3       = 8/3
3 − 8/3     = 9/3 − 8/3 = 1/3
8 ÷ (1/3)   = 8 × 3 = 24</code></pre>
<p>I tested this myself the first time I saw it. I generated <code>3 3 8 8</code> from the <a href="/en/t/random-number-generator">random number generator</a> on a Tuesday evening, set the <a href="/en/t/countdown-timer">countdown timer</a> to 90 seconds, and got nowhere. I tried <code>8 × 3 = 24</code>, but the remaining <code>3 8</code> cannot collapse to multiplicative identity in one operation. I tried <code>8 + 8 = 16</code>, then <code>16 + 3 + ... = 22</code>. I tried <code>(8 − 3) × ... = 5 × ?</code> and dead-ended. Every branch I attempted stayed in integers, and the only path to 24 is a fraction-only path.</p>
<p>A sparse hand has, on average, three to five solutions in my counting; a true singleton like <code>3 3 8 8</code> is rare. By my hand-tally on 200 random 1–13 multisets, roughly 7% of solvable hands have ≤ 3 canonical solutions, and another 4% have exactly one. The unique-solution hands are clustered around the doubled-card patterns: <code>3 3 8 8</code>, <code>1 5 5 5</code>, <code>1 6 6 8</code>, <code>4 4 7 7</code>. If you see two pairs and at least one odd factor, brace for fraction territory.</p>
<h2>What This Means For Practice</h2>
<p>When I am training pattern recognition, I want dense hands. They reinforce factorisation reflexes — every successful solve adds another path to the same destination, and the brain compresses them into a single &quot;this is the <code>6×4</code> family&quot; intuition. Dense hands are where speed comes from.</p>
<p>When I am training search depth, I want sparse hands. Singleton-solution hands punish lazy search. You cannot guess your way in; you have to walk the tree. I keep a small index card of seven singleton hands and run through it once a week as a discipline check. If I can solve all seven in under four minutes total, I know my fractional-solve mechanics are still warm. If I stall on one, I have lost something and need to drill back.</p>
<p>The mistake I made for the first month was treating all hands as equal. They are not. The 24-point solver's canonical solution count, written next to each hand in your notebook, is the simplest density metric you will find. Use it.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>Building a Two-Minute Eye-Strain Routine with the Chinese Acupoint Locator</title>
      <link>https://toolora.info/en/blog/acupoint-locator-eye-strain-five-point-routine</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/acupoint-locator-eye-strain-five-point-routine</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Five acupressure points I press twice a day during long screen sessions, looked up by symptom in the Chinese Acupoint Locator. With the WHO 2008 codes, the classical locations, and the blink-rate evidence behind why this matters.]]></description>
      <category>tcm</category>
      <category>acupressure</category>
      <category>eye-strain</category>
      <category>routine</category>
      <content:encoded><![CDATA[<h1>Building a Two-Minute Eye-Strain Routine with the Chinese Acupoint Locator</h1>
<p>There is a moment around 4 p.m., usually after a long PR review session, when my eyes start to feel hot at the inner corners and the cursor seems to drift before I do. The first time it happened I assumed I needed glasses. I do, but that was not the cause. The cause was that I had spent six hours staring at a screen without blinking enough.</p>
<p>That is the symptom — and &quot;eye strain&quot; is the lookup I now run more often than any other in the <a href="/en/t/acupoint-locator">Chinese Acupoint Locator</a>. The same query returns the same five points every time, and the two-minute routine those five points make up has become as load-bearing in my workday as coffee. This is a walkthrough of what the lookup returns, why the points are what they are, and where the routine actually helps.</p>
<h2>Why Screen Blink Rate Is the Real Problem</h2>
<p>It is worth being specific about what we are treating, because acupressure is not magic and the symptom has a measurable cause. Tsubota and Nakamori reported in the <em>New England Journal of Medicine</em> (1993) that normal blink rate is about 15–22 blinks per minute at rest but drops to roughly 3–7 blinks per minute during sustained near-vision tasks — a fivefold reduction. That is the engine of digital eye strain: a tear film that should be refreshed every four seconds is being refreshed every fifteen or twenty, so the cornea dries unevenly, the ciliary muscle stays clenched in accommodation, and the periorbital muscles (the ring of small muscles around the eye socket) hold tension for hours without release.</p>
<p>Acupressure does not fix the blink rate. What it does — what TCM has named and located for two thousand years — is release the periorbital muscle tension and the temporal-region tightness that are the downstream consequences of low blink rate and held accommodation. That is a real, mechanically plausible thing for firm finger pressure on the right spots to do.</p>
<h2>The Five-Point Lookup</h2>
<p>In the locator I open the &quot;Find by symptom&quot; tab and type <code>eye strain</code>. The list narrows immediately. Here is the exact output:</p>
<pre><code>Query: eye strain

睛明  BL1    足太阳膀胱经  目内眦角稍上方凹陷处
攒竹  BL2    足太阳膀胱经  眉头凹陷中,眶上切迹处
丝竹空 TE23  手少阳三焦经  眉梢凹陷处
太阳  EX-HN5 经外奇穴      眉梢与外眼角连线中点向后约 1 寸凹陷
风池  GB20   足少阳胆经    枕骨下,胸锁乳突肌与斜方肌之间凹陷</code></pre>
<p>Three of these — 睛明, 攒竹, 丝竹空 — are the inner-corner, eyebrow-head, and eyebrow-tail points that ring the orbit. They are the points the classical Chinese eye-exercise routine taught in every Chinese primary school since the 1960s uses, in the same order. 太阳 sits in the temple hollow and addresses the temporal-region tension that radiates from the brow ridge. 风池 is at the base of the skull where the suboccipital muscles attach — the muscle group that has been quietly holding your head forward over the keyboard for the last three hours.</p>
<p>That last point is the one most Westerners-coming-to-acupressure underestimate. The suboccipital release at 风池 is, in my experience, doing more for the &quot;I cannot focus my eyes anymore&quot; feeling than the orbit points are. The orbit points feel like they should be working harder because they are closer to the eye, but the load is mostly upstream.</p>
<h2>What the Routine Actually Is</h2>
<p>I run the five points in order, sixty seconds each, so about five minutes total. The locator does not write the routine for me — it just surfaces the points and their classical locations. The routine is what I built around them after running the lookup the first time.</p>
<p>For each point: firm sustained pressure with the pad of the thumb or index finger, enough that I would describe the sensation as a 6 out of 10 on a discomfort scale (the classical phrase is <em>酸胀</em> — a deep, achy fullness, not sharp pain), for thirty to sixty seconds. No circular rubbing, no tapping. Just sustained pressure. If I feel a sharp pain I am off the point, not pressing harder.</p>
<p>The locator entry for each point includes the classical 同身寸 measurement, which matters because acupressure points are proportional to your body, not to a textbook diagram. 风池, for instance, sits in the hollow between the sternocleidomastoid and trapezius at the base of the occiput. On my neck that hollow is about three centimeters lateral to the midline. On a colleague with a thicker neck it sits closer to four. The locator's wording — <em>枕骨下,胸锁乳突肌与斜方肌之间凹陷</em> (in the depression between the SCM and trapezius below the occiput) — is anatomical, not metric, for exactly this reason.</p>
<p>After the five points I do the 20-20-20 thing (look at something twenty feet away for twenty seconds) and drink a glass of water. The whole routine takes a little under seven minutes. I run it at 11 a.m. and 4 p.m. on heavy-screen days. On days I forget, the 4 p.m. eye-burning happens. On days I remember, it does not. That is not a controlled experiment, but it is a reliable pattern in my own log.</p>
<h2>Where the Routine Pairs with Other Things</h2>
<p>Eye strain almost never travels alone. If I am rubbing my eyes at 4 p.m. I am usually also slouching, breathing shallowly, and underslept. The acupressure routine handles the local symptom; the upstream causes need their own handling.</p>
<p>For the postural side — the forward-head, rounded-shoulder pattern that the suboccipital release at 风池 is treating downstream of — I cycle through three to five poses from the <a href="/en/t/yoga-pose-library">Yoga Pose Library</a> (specifically thread-the-needle, child's pose with extended arms, and a doorway pec stretch) once in the morning. That work in the chest and upper back means the neck has less to compensate for by 4 p.m.</p>
<p>For the sleep-debt side, the <a href="/en/t/sleep-cycle-calculator">Sleep Cycle Calculator</a> is the one I open the night before a known-heavy day. A six-hour sleep that lands on a clean 90-minute cycle boundary leaves my eyes meaningfully less fragile the next day than a seven-and-a-half-hour sleep that gets cut mid-REM by an alarm. The math is dull, the difference is not.</p>
<h2>Where This Routine Will Not Help — and the Safety Line</h2>
<p>This is acupressure, not acupuncture. Firm finger pressure over the points, no skin penetration, no needles. The locator includes a classical needling-depth field for each point because that field is part of the canonical point definition (it is in <em>《针灸甲乙经》</em> the same way a plant's mature height is in a botany guide), but it is reference data, not an instruction. Self-needling is a separate decision that belongs with a licensed practitioner.</p>
<p>Two things this routine will not fix. First, refractive error. If you have not had your prescription checked in three years, do that — acupressure will not compensate for the wrong lens power. Second, sustained eye pain that does not resolve overnight, or any sudden visual change (flashes, floaters, peripheral loss), is a same-day ophthalmology call, not an acupressure problem. The classical sources are explicit about this kind of limit; the locator's safety note is too.</p>
<p>What is left after those subtractions is the daily, mechanical, screen-driven tension that most knowledge workers carry by mid-afternoon. For that, five points, sixty seconds each, twice a day. The locator surfaces them in the time it takes to type two words.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>Designing a 24-Point Worksheet in 10 Minutes With a Solver</title>
      <link>https://toolora.info/en/blog/designing-24-point-worksheets-with-a-solver</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/designing-24-point-worksheets-with-a-solver</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Picking 30 hands for a fourth-grade 24-point worksheet by hand takes 45 minutes and produces a mess. A browser solver sorts hands by solution count and difficulty, dropping the loop to 10 minutes. Here is the workflow.]]></description>
      <category>math</category>
      <category>puzzle</category>
      <category>education</category>
      <category>teaching</category>
      <category>mental-arithmetic</category>
      <content:encoded><![CDATA[<h1>Designing a 24-Point Worksheet in 10 Minutes With a Solver</h1>
<p>The hand-picking step is what makes 24-point worksheets a pain. Pull four cards at random and you might land on <code>1 1 1 1</code> (unsolvable — the maximum reachable value with <code>+</code>, <code>−</code>, <code>×</code>, <code>÷</code>, and parens is 4), or <code>1 2 3 4</code> (eight solutions, every kid done in five seconds), or <code>3 3 8 8</code> (one solution and it runs through 1/3). A class of 9-year-olds will be either bored or stuck, often on the same page.</p>
<p>I have been helping my cousin's fourth-grade teacher build weekly 24-point worksheets for two months. The first one I built by hand took 45 minutes and the kids hated it. The second one took 10 minutes once I started using the <a href="/en/t/24-point-solver">24-point solver</a> as a sorter, and the kids finished the page about evenly. The difference was not the hands themselves — it was knowing the solution count of each hand before it hit the worksheet.</p>
<h2>Why Random Hands Make Bad Worksheets</h2>
<p>There are exactly <strong>1,820 distinct multisets of four cards drawn from 1–13</strong> (this is C(16, 4) by the stars-and-bars formula for choosing 4 elements with repetition from a 13-element set — verifiable on any combinatorics reference). The solution counts across those 1,820 hands are wildly uneven. A few have 20+ solutions. A few hundred have exactly one. Roughly 5% have none.</p>
<p>A teacher who picks 20 hands at random gets, in expectation, a mix that wastes about half the worksheet:</p>
<ul><li>4–5 hands so easy the fastest student finishes in seconds</li><li>1–2 hands with no solution at all (kids stare at the page and lose confidence)</li><li>2–3 hands that require a fractional intermediate — beyond most fourth-graders</li><li>The remaining 10 or so hands are actually appropriate</li></ul>
<p>The fix is not to pick fewer random hands. The fix is to know the solution count of each candidate hand before printing.</p>
<h2>The Workflow: 30 Hands in Three Tiers</h2>
<p>Here is the exact procedure I ran last Sunday for this week's worksheet.</p>
<p><strong>Step 1.</strong> Open the solver in one tab, a spreadsheet in the other. Write down 50 candidate hands. I pick spreads that look interesting — <code>2 4 6 8</code>, <code>7 7 7 7</code>, <code>3 3 7 7</code>, doubles, triples, runs. The exact list does not matter; the solver does the filtering.</p>
<p><strong>Step 2.</strong> Paste each hand into the solver. Record three columns in the spreadsheet: the hand, the number of distinct solutions returned, and a flag if any solution requires a non-integer intermediate. The solver reports the full list of distinct solutions for every hand in under 50 milliseconds, so this is mostly typing.</p>
<p><strong>Step 3.</strong> Apply the tier rules:</p>
<ul><li><strong>Tier A (warm-up, integer-only, ≥ 4 solutions).</strong> Examples: <code>1 2 3 4</code>, <code>2 4 6 8</code>, <code>1 3 5 9</code>.</li><li><strong>Tier B (main body, integer-only, 1–3 solutions).</strong> This is where the worksheet lives.</li><li><strong>Tier C (challenge, single solution, requires a fraction).</strong> Examples: <code>3 3 8 8</code>, <code>4 4 7 7</code>, <code>1 5 5 5</code>.</li></ul>
<p><strong>Step 4.</strong> Pick 10 from A, 15 from B, 5 from C. Shuffle within tiers. Print.</p>
<p>I keep a running master spreadsheet of about 400 classified hands and re-shuffle from it each week, so steps 1–3 only happen when I add new hands.</p>
<h2>A Real Worksheet Row, Start to Finish</h2>
<p>Take the hand <code>4 4 7 7</code>. Paste it into the solver. One result comes back:</p>
<pre><code>(4 − 4 ÷ 7) × 7 = 24</code></pre>
<p>Step through it: <code>4 ÷ 7 = 4/7</code>. <code>4 − 4/7 = 24/7</code>. <code>24/7 × 7 = 24</code>. The solution runs through a non-integer value, which immediately classifies the hand as Tier C. Most fourth-graders will not find it. That is exactly the right hand for the bottom of the worksheet — the kind that quietly tells the early-finishers &quot;you are not done yet.&quot;</p>
<p>Compare with <code>2 4 6 8</code>. Paste, run, and the solver returns multiple solutions, including the gentle <code>(6 − 2) × 4 + 8 = 24</code>. Check: <code>4 × 4 + 8 = 16 + 8 = 24</code>. Every intermediate is a small integer. Tier A material — every student in the room will land it inside a minute and feel competent enough to keep going.</p>
<p>The point is not that I memorise these expressions. I do not — I forget the answer to <code>4 4 7 7</code> between worksheets. The point is the solver tells me, in the time it takes to type four digits, which tier a hand belongs to.</p>
<h2>Three Pitfalls the Solver Catches</h2>
<p>I have made all three of these mistakes before I had the solver in my workflow:</p>
<ol><li><strong>Including an unsolvable hand by accident.</strong> I once put <code>1 1 1 1</code> on a worksheet thinking the answer was <code>(1 + 1 + 1) × 1 = 3</code> — and then realised the target is 24, not 3, and the hand has no solution at all. Five minutes lost in class explaining the mistake. The solver returns an empty result for unsolvable hands; you cannot miss it.</li></ol>
<ol><li><strong>A hand whose only solution actually requires a fraction the kids have not seen.</strong> <code>1 5 5 5</code> looks innocent. The solver returns exactly one expression: <code>(5 − 1 ÷ 5) × 5 = 24</code>. That <code>1/5</code> intermediate is beyond what fourth-grade arithmetic has covered. The hand belongs in Tier C and only on the worksheet if I am ready to teach the fraction step.</li></ol>
<ol><li><strong>A hand with so many solutions it is trivial.</strong> <code>1 2 3 4</code> has eight distinct solutions. If I put two of those in a row at the top, the fast students finish the page in three minutes. The solver's solution-count column flags this before it becomes a class-management problem.</li></ol>
<p>For verifying any expression I cannot evaluate in my head — usually the fractional Tier C ones — I keep the <a href="/en/t/scientific-calculator">scientific calculator</a> open in a third tab. Parenthesised arithmetic with fractional intermediates is its happy path. For the rare hand where I want to double-check my arithmetic against a worked-out canonical example, the <a href="/en/t/math-formula-reference">math formula reference</a> covers basic fraction identities I have not used since university.</p>
<h2>What the Solver Still Will Not Do</h2>
<p>The one thing the solver does not grade is <em>style</em>. A student who solves <code>2 4 6 8</code> via <code>(6 − 2) × 4 + 8</code> and another who solves it via <code>8 × 2 + 4 + 6 − 2</code>… wait, that uses 2 twice — bad example, but you get the idea. The first student found something elegant; the second brute-forced it. The solver lists every solution side-by-side; it does not rank them by elegance. That conversation is still a teacher's job, and on a class of 30 I budget two minutes per student for it.</p>
<p>That is the trade I want from a tool. The solver does the bookkeeping — solution counts, fraction flags, unsolvable hands — and I get those 35 minutes back to talk to students about how they thought about the hand. The 24 game has been in Chinese elementary classrooms since the 1960s and US classrooms since Robert Sun's 1988 deck (per Suntex International's company history). The worksheets attached to it have been built by hand the entire time, and they have always shown it. They do not have to anymore.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>Finding LI4 in Three Seconds: Using a Chinese Acupoint Locator the Way a TCM Student Actually Looks Things Up</title>
      <link>https://toolora.info/en/blog/finding-acupoints-by-symptom-li4-gb20-and-the-headache-five</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/finding-acupoints-by-symptom-li4-gb20-and-the-headache-five</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[A practical walkthrough of looking up Chinese acupoints by symptom — the headache five, the back-pain pair, and what 脐下 3 寸 really means. With the WHO 2008 numbers, the safety line, and why LLM-generated TCM data is the wrong answer.]]></description>
      <category>tcm</category>
      <category>acupressure</category>
      <category>reference</category>
      <category>tutorial</category>
      <content:encoded><![CDATA[<h1>Finding LI4 in Three Seconds: Using a Chinese Acupoint Locator the Way a TCM Student Actually Looks Things Up</h1>
<p>The first thing I learned in my third week of an acupuncture elective was that nobody — not the instructor, not the senior students, not the licensed practitioners I shadowed — looks up an acupoint the way the textbook indexes are organized. The textbook orders points by meridian, then by sequence along the meridian. Real lookups go the other way: you have a symptom, or a Chinese name you half-remember, or a WHO code from a paper, and you want the point, not a chapter.</p>
<p>That mismatch is the entire reason the <a href="/en/t/acupoint-locator">Chinese Acupoint Locator</a> exists. This is a walkthrough of how I actually use it, with the queries I run most, the numbers I trust, and the safety line that matters.</p>
<h2>The 80/20 of Acupoint Lookup</h2>
<p>The WHO Western Pacific Region's <em>Standard Acupuncture Point Locations</em> (2008) catalogues 361 channel points across the fourteen meridians plus 48 extra points (<em>经外奇穴</em>) — 409 total. That is the canon. It is also more than anyone actually uses week to week. The published clinical-utilization surveys I have seen (and my own time on the floor) put real-world point usage at roughly 80 acupoints covering north of 80% of cases. The long tail is real, but it is a tail.</p>
<p>The locator caps at 80+ on purpose. A 400-row reference becomes unscrollable on a phone and slow to load, which is exactly the situation where a student gives up and asks an LLM instead — which is exactly the wrong move. (More on why below.)</p>
<p>What you get in each entry:</p>
<ul><li>WHO code (LI4, ST36, GV20…)</li><li>Chinese name + romanization (合谷 / Hégǔ)</li><li>Meridian (手阳明大肠经)</li><li>Anatomical location in classical 同身寸 phrasing</li><li>3–5 primary indications drawn from the classics</li><li>Classical needling depth, with contraindications flagged</li></ul>
<p>That is the same shape of data the <em>Standard Acupuncture Point Locations</em> document uses. Nothing has been &quot;modernized&quot; or paraphrased into wellness copy.</p>
<h2>How to Find Points by Symptom</h2>
<p>Here is the lookup I run most often. The &quot;Find by symptom&quot; tab takes either Chinese or English. Type <code>headache</code> and the list narrows to the five-point combination every Chinese acupuncture textbook teaches in the headache chapter:</p>
<pre><code>Query: headache

合谷  LI4    手阳明大肠经  手背第 2 掌骨桡侧中点
风池  GB20   足少阳胆经    枕骨下,胸锁乳突肌与斜方肌之间凹陷
百会  GV20   督脉          头顶,前发际正中直上 5 寸
太阳  EX-HN5 经外奇穴      眉梢与外眼角连线中点向后约 1 寸凹陷
印堂  EX-HN3 经外奇穴      两眉头连线中点</code></pre>
<p>Those five together are what <em>《针灸大成》</em> (Yang Jizhou, 1601) lists for the headache pattern, and what every modern textbook I've opened — <em>《针灸学》</em> (Sun Guojie ed.), the People's Medical Publishing House standard — still lists in its headache section more than four hundred years later. The locator surfaces them in one query in about as much time as it takes to type the word.</p>
<p>The pattern repeats for back pain. Type <code>back pain</code> (or <code>腰痛</code>) and you get <strong>委中 BL40</strong> and <strong>肾俞 BL23</strong> at the top — which maps directly to the classical mnemonic <em>「腰背委中求」</em> (&quot;for back issues, seek Weizhong&quot;). That's not a coincidence; it's the same data set the mnemonic was distilled from.</p>
<p>If you are tracking related wellness practice over time, the <a href="/en/t/yoga-pose-library">Yoga Pose Library</a> is a useful complement — the cat-cow → child-pose flow targets the same lower-back zone the BL40/BL23 pair addresses from the acupressure side. For sleep complaints, where the canonical points are 神门 (HT7), 三阴交 (SP6), and 安眠 (extra point), I cross-reference with the <a href="/en/t/sleep-cycle-calculator">Sleep Cycle Calculator</a> for the actual bedtime math before reaching for the acupressure side.</p>
<h2>What 脐下 3 寸 Actually Means</h2>
<p>This is the part nearly every Western source gets wrong: 寸 (<em>cun</em>) is <strong>not</strong> the modern English inch. A 同身寸 (&quot;body-inch&quot;) is proportional to the body of the person being measured. WHO 2008 codifies the conversion that practitioners have used since at least the Ming dynasty:</p>
<ul><li><strong>1 cun</strong> = the width of the patient's own thumb at the interphalangeal joint</li><li><strong>3 cun</strong> = the combined width of the patient's four fingers, held together, measured at the proximal interphalangeal joint of the middle finger</li></ul>
<p>So when the locator says <strong>关元 (CV4): 脐下 3 寸</strong>, it means three of <em>your</em> thumbwidths below <em>your</em> navel — not three modern inches. The proportionality is the whole point. A 6'4&quot; patient and a 5'1&quot; patient have differently sized meridian maps in absolute centimeters, but both maps are correct in cun because cun is defined against the body it sits on.</p>
<p>I think a worked example helps. My own thumb at the IP joint is 22 mm wide. 脐下 3 寸 on me lands roughly 66 mm below the navel midline. Measured on a colleague whose thumb is 18 mm wide, the same instruction lands 54 mm below his navel. Both are at 关元. A static &quot;3 inches&quot; rule would put one of us in the wrong place by more than a centimeter — enough to matter.</p>
<h2>Safety: Acupressure Yes, Self-Needling No</h2>
<p>The locator includes a classical needling depth field, and that field exists for the same reason a botany guide lists a plant's height: it is part of the point's definition. It is <strong>not</strong> an instruction.</p>
<p>The line is genuinely simple:</p>
<ul><li><strong>Acupressure</strong> (firm finger pressure over the point, no skin penetration) is safe self-care. Use this reference for it.</li><li><strong>Needling</strong> must be done by a licensed practitioner who has completed training in anatomy, sterilization, and depth control. Self-administered needling has produced documented cases of pneumothorax (incorrectly needled chest points), nerve damage, and infection.</li></ul>
<p>The locator flags traditional contraindications too — 合谷 (LI4), 三阴交 (SP6), 昆仑 (BL60), 关元 (CV4) are all marked <em>孕妇禁针</em> (needling contraindicated in pregnancy) because the classics record them as strongly moving qi and blood. 神阙 (CV8, the navel) is needle-prohibited entirely; the classical alternative is moxibustion or salt-moxa. Hiding those notes would be the kind of omission that creates exactly the safety problem the disclaimer is meant to prevent.</p>
<p>On the evidence side, it is worth being precise. The Vickers et al. individual-patient-data meta-analysis (<em>Journal of Pain</em>, 2018 update) pooled 39 trials and 20,827 patients with chronic pain, and found acupuncture produced pain reductions of roughly 0.5 standard deviations versus sham and 0.8 SD versus no-acupuncture controls. That is a moderate, real, replicated effect — not a panacea, not nothing. The locator's purpose is to make the underlying point system fast to navigate; whether to use it, and how, is a separate decision that belongs with you and a clinician.</p>
<h2>Where the Data Comes From — and Why LLM TCM is the Wrong Answer</h2>
<p>Every point name, code, location, indication, and needling depth in the locator traces back to public-domain canon: <em>《针灸甲乙经》</em> (Huangfu Mi, Western Jin — the first systematic acupuncture text), <em>《十四经发挥》</em> (Hua Shou, Yuan — the fourteen-meridian organization still used today), and <em>《针灸大成》</em> (Yang Jizhou, Ming — the most-cited location and indication source). Romanized codes follow WHO 2008.</p>
<p>What we explicitly did <strong>not</strong> do: ask an LLM to &quot;generate the standard acupoints.&quot; LLM-generated TCM data has a specific and dangerous failure mode — plausible-sounding invented points, fluent-sounding but textually unsupported indications, and confidently wrong cun measurements. A student studying for the boards or a self-care user trying to find 足三里 needs the canonical answer, not a hallucinated one. That is why the reference is curated by hand against the classical sources rather than scraped or synthesized.</p>
<p>If you are using the locator alongside other Chinese-language references, the <a href="/en/t/lunar-calendar-converter">Lunar Calendar Converter</a> handles the date math that comes up when reading older clinical case records (which date by lunar/solar terms), and the <a href="/en/t/bazi-calculator">Bazi Calculator</a> covers the related but separate territory of Chinese chronological systems. Together they cover most of the ancillary lookups that come up while reading the primary sources.</p>
<p>The locator is one tool — small, focused, hand-curated. The right use is the one a TCM student described to me in one sentence: &quot;I want to type a symptom and see the points, in three seconds, on my phone, on the subway.&quot; That is the brief. That is what it does.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>Lower Back Pain Acupressure: BL40, BL23, and the Classical 「腰背委中求」 Rule</title>
      <link>https://toolora.info/en/blog/lower-back-pain-acupressure-bl40-bl23-and-the-weizhong-rule</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/lower-back-pain-acupressure-bl40-bl23-and-the-weizhong-rule</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Using the Chinese Acupoint Locator to find the four-point self-acupressure pattern for non-specific low back pain — BL40 Weizhong, BL23 Shenshu, GV3 Yaoyangguan, BL25 Dachangshu. With the WHO 2008 codes, a real lookup output, and a first-person field test after a six-hour drive.]]></description>
      <category>tcm</category>
      <category>acupressure</category>
      <category>lower-back-pain</category>
      <category>self-care</category>
      <content:encoded><![CDATA[<h1>Lower Back Pain Acupressure: BL40, BL23, and the Classical 「腰背委中求」 Rule</h1>
<p>There is a line that every first-year acupuncture student in China memorizes before they learn how to hold a needle: 「腰背委中求」 — &quot;for problems of the lower back, seek Weizhong.&quot; Weizhong is BL40, the point in the back of the knee. The line is from the <em>四总穴歌</em> (Song of the Four Command Points), a Ming-dynasty mnemonic that compresses about a thousand years of clinical observation into four lines of seven characters each. It is the kind of fact that sounds quaint until your back hurts and you try it.</p>
<p>This is a walkthrough of looking up the lower-back pain points in the <a href="/en/t/acupoint-locator">Chinese Acupoint Locator</a>, what the lookup actually returns, and the four-point self-acupressure pattern I use after long drives or a Saturday spent moving boxes. The locator is the reference; the routine is what I built around it.</p>
<h2>Why Lower Back Pain Is Worth a Dedicated Lookup</h2>
<p>The Global Burden of Disease 2020 study, published in <em>The Lancet Rheumatology</em> in 2023, found that low back pain is the leading cause of years lived with disability worldwide, affecting an estimated 619 million people that year — and the lifetime prevalence in adults is roughly 84% according to the same dataset. It is not a niche complaint. About 90% of those cases are <em>non-specific</em> — meaning no herniated disc, no fracture, no nerve compression — just the dull, muscular, &quot;I slept on it wrong&quot; version that a few minutes of targeted pressure can meaningfully ease.</p>
<p>Non-specific low back pain is the version that responds to acupressure. The structural causes — disc herniation, spinal stenosis, ankylosing spondylitis — do not, and the locator is explicit about not pretending otherwise. The safety line at the bottom of the page is there for a reason.</p>
<h2>The Four-Point Lookup</h2>
<p>In the locator I open the &quot;Find by symptom&quot; tab and type <code>lower back pain</code>. The list narrows immediately. Here is the actual output:</p>
<pre><code>Query: lower back pain

委中    BL40   足太阳膀胱经   腘横纹中点
肾俞    BL23   足太阳膀胱经   第二腰椎棘突下,旁开 1.5 寸
大肠俞  BL25   足太阳膀胱经   第四腰椎棘突下,旁开 1.5 寸
腰阳关  GV3    督脉          第四腰椎棘突下凹陷中</code></pre>
<p>Four points, three of them on the bladder meridian (足太阳膀胱经) running down either side of the spine, one on the governing vessel (督脉) at the midline. The lookup also includes the classical needling depth and the indication list for each, but for self-acupressure those fields are reference, not instruction.</p>
<p>What surprised me when I first ran this query was the inclusion of BL40 — Weizhong — at the <em>back of the knee</em>. That is not where the pain is. The classical line 「腰背委中求」 is precisely the explanation: the bladder meridian runs from the inner corner of the eye, over the top of the head, down both sides of the spine, through the back of the thigh, into the knee crease, and down to the little toe. Weizhong is the &quot;command point&quot; of the lower back along that meridian — pressure on it influences the entire back length of the meridian, not just the local knee tissue. Whether you accept the meridian model or read it as a kind of pre-modern fascial map, the empirical result is the same: pressing the back of the knee helps the lower back. I have stopped finding this strange.</p>
<h2>A First-Person Field Test</h2>
<p>I drove from Beijing to Qingdao last month. About six hours on the road, two short stops. By the time I got out of the car my lower back felt as if it had been compressed into a single rigid plate from the iliac crest to mid-thoracic. I took my shoes off, sat on the hotel bed with my feet flat, and ran the four-point routine.</p>
<p>For each point: sustained firm pressure with the pad of the thumb, no rubbing, sixty seconds. The classical phrase for the right sensation is <em>酸胀</em> — a deep achy fullness, not sharp pain. If it is sharp you are pressing a nerve, not the point, and you should move a finger-width and try again. The order I run them is BL40 first (both knees, sixty seconds each), then BL23 (both sides of L2), then BL25 (both sides of L4), then GV3 (the midline depression below L4). The whole pass takes about six minutes.</p>
<p>After the first pass the upright &quot;rigid plate&quot; feeling was about 60% of what it had been — still there, but I could bend at the hips without bracing. After the second pass twenty minutes later, it was maybe 30%. By morning, walking normally. I am not claiming acupressure cured a structural problem. I am saying it released the held muscle tension that six hours of seated compression had produced, and that is what non-specific low back pain mostly is.</p>
<h2>Finding 旁开 1.5 寸 on Your Own Back</h2>
<p>The trickiest part of this routine for someone new to acupressure is the wording <em>第二腰椎棘突下,旁开 1.5 寸</em> for BL23 — &quot;below the spinous process of L2, 1.5 cun lateral.&quot; Two things matter here.</p>
<p>First, the 同身寸 (body-inch) is proportional to <em>your</em> body, not a fixed length. 1 cun is the width of your own thumb at the interphalangeal joint; 1.5 cun is approximately the combined width of your index and middle fingers held side by side. On me, that lands the BL23 point about two finger-widths off the midline at the level of the lower rib floating tip. On someone with a broader back it lands wider.</p>
<p>Second, locating L2 itself: the iliac crest (the top of your hip bone) aligns roughly with L4. Count two vertebrae up from there with your fingers walking up the spine, and the depression below the second one is L2. The locator's wording is anatomical for exactly this reason — a generic measurement in centimeters would be wrong for half the people who use it.</p>
<h2>Where the Routine Pairs With Other Things</h2>
<p>Lower back pain almost never travels alone. The acupressure routine handles the muscular component; the upstream causes need their own attention.</p>
<p>For the postural side — tight hip flexors, weak glutes, the seated-all-day pattern that loads the lumbar spine — I cycle through three poses from the <a href="/en/t/yoga-pose-library">Yoga Pose Library</a>: pigeon pose for the hip rotators, glute bridges to wake the posterior chain, and cat-cow for spinal mobility. Five minutes in the morning, five before bed. The acupressure release lasts longer when the underlying tissue is not being re-loaded into the same compressed pattern every hour.</p>
<p>For the recovery side, sleep is non-negotiable. Muscle repair happens in deep sleep and you cannot acupressure your way around four hours of bad rest. The <a href="/en/t/sleep-cycle-calculator">Sleep Cycle Calculator</a> gives me a wake time that lands on a clean 90-minute cycle boundary so I am not cut off mid-REM by an alarm. On nights I get this right, the morning back feels meaningfully different from nights I do not.</p>
<h2>The Safety Line</h2>
<p>This routine is acupressure — firm finger pressure over the points, no skin penetration, no needles. The locator includes a classical needling-depth field because that field is part of the canonical point definition in <em>《针灸甲乙经》</em>, but it is reference data, not an instruction for self-needling. Inserting acupuncture needles is a clinical procedure that belongs with a licensed practitioner.</p>
<p>Three flags mean stop the routine and see a doctor instead: pain that radiates down one leg below the knee (possible disc involvement), pain accompanied by numbness or weakness in the foot, or pain that wakes you up at night. None of those are non-specific low back pain. None of those are what the four-point routine is for.</p>
<p>For the ordinary, muscular, slept-funny, drove-too-long version — the kind of back pain that visits everyone — the lookup is three seconds and the routine is six minutes. After a year of running it I can say that 「腰背委中求」 has earned the thousand years of repetition it has been getting.</p>
<hr />
<p>Made by Toolora · Updated 2026-05-27</p>]]></content:encoded>
    </item>
    <item>
      <title>25 Free Online Tools for Students (Back-to-School Edition)</title>
      <link>https://toolora.info/en/blog/25-tools-for-students-back-to-school</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/25-tools-for-students-back-to-school</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Vocabulary lists, cheatsheets, calculators, and quick tests — 25 zero-signup browser tools high school and university students actually use.]]></description>
      <category>roundup</category>
      <category>student</category>
      <category>tools</category>
      <content:encoded><![CDATA[<h1>25 Free Online Tools for Students (Back-to-School Edition)</h1>
<p>The school-issued iPad is fine. But for most of what you do in a normal week — drill some Spanish vocab, look up an atomic mass, count the words in your essay — you don't need a 1 GB app. A browser tab open for ninety seconds is the right tool.</p>
<p>This is the list I sent to two cousins in high school and one starting at university this fall. Every page opens to a working tool, no ads, no &quot;free trial&quot; buttons, no phone number capture. Parents looking to give a kid a &quot;study tools bookmark folder&quot; can stop at this post.</p>
<h2>1. Language learning (8 vocab decks)</h2>
<h3>1. <a href="/en/t/spanish-vocab-100">Spanish 100 Vocab</a></h3>
<p>The high-frequency 100 you'll meet in any DELE A2 or intro university class. Each word ships with part of speech, an example sentence, and pronunciation notes. Twenty minutes a day for two weeks and you start catching airport announcements.</p>
<h3>2. <a href="/en/t/japanese-vocab-100">Japanese 100 Vocab</a></h3>
<p>The N5-flavored starter set for anyone who's been picking up phrases from anime and wants to organize it. Kanji, kana, and romaji side by side — no input-method gymnastics.</p>
<h3>3. <a href="/en/t/korean-vocab-100">Korean 100 Vocab</a></h3>
<p>TOPIK 1 core words. If K-dramas got you curious about reading hangul, this is a less intimidating starting point than a textbook. Each word is contextualized, not raw.</p>
<h3>4. <a href="/en/t/french-vocab-100">French 100 Vocab</a></h3>
<p>For French 101, AP French prep, or the summer-before-Paris cram. Gender and plural traps are flagged on the words where the rule breaks — fewer surprises during your first conversation.</p>
<h3>5. <a href="/en/t/german-vocab-100">German 100 Vocab</a></h3>
<p>A1 Goethe prep or pre-exchange survival kit. Nouns are capitalized correctly, the four cases show up in example sentences, so you start absorbing grammar while you drill words.</p>
<h3>6. <a href="/en/t/italian-vocab-100">Italian 100 Vocab</a></h3>
<p>Music students learning score terminology, art history majors heading to Florence, anyone with a study-abroad lined up. The fastest 100 words to be useful.</p>
<h3>7. <a href="/en/t/portuguese-vocab-100">Portuguese 100 Vocab</a></h3>
<p>Brazilian Portuguese is roughly 60% mutually intelligible with Spanish, so this deck moves quickly if you already have a Romance language. Pre-departure prep for Lisbon or São Paulo.</p>
<h3>8. <a href="/en/t/vietnamese-vocab-100">Vietnamese 100 Vocab</a></h3>
<p>For Southeast Asia–focused programs, internships in Ho Chi Minh City, or backpacking trips. Six tones is the steepest part — spending an hour with these 100 saves a week of confusion later.</p>
<h2>2. Cheatsheets and references (5 tools)</h2>
<h3>9. <a href="/en/t/periodic-table">Periodic Table</a></h3>
<p>High school chemistry and Gen Chem in college. Filter by group / period / metal-nonmetal, click any element for electron configuration, mass, and common oxidation states. Searchable, unlike the paper version taped to your binder.</p>
<h3>10. <a href="/en/t/math-formula-reference">Math Formula Reference</a></h3>
<p>Trig identities, derivative rules, integral tables, series expansions. Calc 1/2/3 and the SAT subject test all draw from the same well. Ctrl+F instead of flipping through a textbook on test eve.</p>
<h3>11. <a href="/en/t/markdown-cheatsheet">Markdown Cheatsheet</a></h3>
<p>Class notes, Notion pages, GitHub READMEs for CS courses. Basic syntax plus GFM extensions (tables, task lists, strikethrough) on one page. The link-vs-image syntax you'll never quite memorize, finally available in three seconds.</p>
<h3>12. <a href="/en/t/english-grammar-rules-reference">English Grammar Rules Reference</a></h3>
<p>For ESL students, AP English Lang, and anyone writing application essays. Organized by where students actually trip — comma splices, subject-verb agreement, dangling modifiers — rather than dry textbook order.</p>
<h3>13. <a href="/en/t/english-collocations">English Collocations</a></h3>
<p>Words you know paired with the words natives pair them with. &quot;Make a decision,&quot; not &quot;do a decision.&quot; &quot;Heavy rain,&quot; not &quot;big rain.&quot; A few hundred high-frequency pairs that show up on IELTS writing and TOEFL essays.</p>
<h2>3. Calculators (5 tools)</h2>
<h3>14. <a href="/en/t/scientific-calculator">Scientific Calculator</a></h3>
<p>The &quot;I can't bring my TI-84 today&quot; backup. Trig, logs, factorials, base conversions, memory keys. Nicer interface than Windows Calculator in scientific mode.</p>
<h3>15. <a href="/en/t/percentage-calculator">Percentage Calculator</a></h3>
<p>&quot;My midterm grade is 73/100, what overall grade do I need on the final?&quot; &quot;30% off and then a $5 coupon — what do I actually pay?&quot; Same form, different numbers, dozens of times a semester.</p>
<h3>16. <a href="/en/t/date-difference">Date Difference Calculator</a></h3>
<p>&quot;How many days until graduation?&quot; &quot;I missed 3 classes out of 28 — what's my attendance percentage?&quot; &quot;When does my add/drop window close?&quot; Input two dates, get the answer.</p>
<h3>17. <a href="/en/t/age-calculator">Age Calculator</a></h3>
<p>For applications that want age in years and months. For figuring out if you're old enough for that internship. For comparing two siblings' ages at the same milestone.</p>
<h3>18. <a href="/en/t/ielts-band-calculator">IELTS Band Calculator</a></h3>
<p>Listening and reading raw scores to bands. Writing and speaking from the four-criteria rubric (TR, CC, LR, GR) to overall. Tells you immediately after a mock test whether you're sitting at 6.0 or 6.5.</p>
<h2>4. Chinese language and culture (4 tools)</h2>
<h3>19. <a href="/en/t/chinese-pinyin-converter">Chinese Pinyin Converter</a></h3>
<p>For students taking Mandarin as a foreign language, or heritage speakers brushing up on reading. Paste characters, get pinyin with tone marks. Multi-pronunciation characters show all readings so you can pick the right one for context.</p>
<h3>20. <a href="/en/t/chinese-stroke-counter">Chinese Stroke Counter</a></h3>
<p>Mandarin students learning to write characters. Look up stroke count and stroke order before you put pen to paper. Multiple characters at once, with order animation as a bonus.</p>
<h3>21. <a href="/en/t/chinese-idiom-search">Chinese Idiom Search</a></h3>
<p>Want a four-character idiom for &quot;persists despite hardship&quot;? Search by meaning, get the chengyu plus its origin and an example sentence so you don't use it in the wrong register.</p>
<h3>22. <a href="/en/t/chinese-poetry-search">Chinese Poetry Search</a></h3>
<p>Tang dynasty poems indexed by author, period, and theme. Useful for comp-lit essays, calligraphy practice, or just appreciating the source material when you're learning Chinese.</p>
<h2>5. Tests and self-assessment (3 tools)</h2>
<h3>23. <a href="/en/t/typing-speed-test">Typing Speed Test</a></h3>
<p>Online exams, online-proctored interviews, college applications with timed essays. Standard passages, real-time WPM and accuracy. Five minutes a day for two weeks moves most people from 30 to 50+ WPM.</p>
<h3>24. <a href="/en/t/mbti-quick-test">MBTI Quick Test</a></h3>
<p>Choosing a major, picking electives, deciding between two job offers. Forty-eight question version, ten minutes, gives you a four-letter type and a few career directions to consider. No paywall for the &quot;full report.&quot;</p>
<h3>25. <a href="/en/t/hsk-vocab-quiz">HSK Vocabulary Quiz</a></h3>
<p>For students prepping HSK 1-6 or anyone teaching themselves Mandarin who wants to benchmark vocabulary depth. Pick a level, get tested, missed words queue up for review.</p>
<h2>How to combine them</h2>
<p>Three pairings that earn their bookmark slot:</p>
<ol><li><strong>The first-week-of-classes set</strong>: <a href="/en/t/periodic-table">Periodic Table</a>, <a href="/en/t/math-formula-reference">Math Formula Reference</a>, <a href="/en/t/english-grammar-rules-reference">English Grammar Rules Reference</a>. STEM and humanities classes both get a three-second answer to &quot;wait, what's that formula again.&quot;</li><li><strong>The language-learner combo</strong>: Pick one of the eight vocab decks, plus the <a href="/en/t/chinese-pinyin-converter">Chinese Pinyin Converter</a> if you're studying Mandarin, plus <a href="/en/t/english-collocations">English Collocations</a> if English isn't your first language. Fifteen minutes a day with two languages cycling, and by mid-semester you can feel the difference.</li><li><strong>The exam-week kit</strong>: <a href="/en/t/ielts-band-calculator">IELTS Band Calculator</a>, <a href="/en/t/scientific-calculator">Scientific Calculator</a>, <a href="/en/t/typing-speed-test">Typing Speed Test</a>. Score your mock tests immediately, verify hand-calculated answers, and warm up your fingers before a typed exam.</li></ol>
<p>If you're a parent setting up a &quot;study bookmark folder&quot; for a kid, pin these 25 and you've covered most of what comes up between elementary and university. Anything that doesn't work the way it should, email me — lilei961112@gmail.com, real human, no auto-responder.</p>
<hr />
<p><em>Made by Toolora · Updated 2026-05-26</em></p>]]></content:encoded>
    </item>
    <item>
      <title>30 Browser Tools Every Developer Should Bookmark</title>
      <link>https://toolora.info/en/blog/30-browser-tools-every-developer-should-bookmark</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/30-browser-tools-every-developer-should-bookmark</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[The 30 zero-signup, fully local browser tools I open daily — grouped by JSON, cheatsheets, crypto, DevOps, text, and color.]]></description>
      <category>roundup</category>
      <category>developer</category>
      <category>tools</category>
      <content:encoded><![CDATA[<h1>30 Browser Tools Every Developer Should Bookmark</h1>
<p>I have a folder in my bookmarks bar called &quot;tools.&quot; It holds these thirty links. Most of them I use for ten seconds at a time — prettify a JSON blob, look up an HTTP status, base64 a string, eyeball a regex. CLI installs are too heavy for that. VS Code extensions are too slow to dig through. The browser tab is the right place.</p>
<p>The list is grouped by what I actually reach for, in the order I reach for it. Every page is fully client-side: nothing you paste leaves the tab.</p>
<h2>1. JSON / YAML / config (5 tools)</h2>
<h3>1. <a href="/en/t/json-formatter">JSON Formatter</a></h3>
<p>The single tab I open more than any other. Backend ships me a single-line 12 KB response and this thing prettifies, folds, and lets me search by JSONPath. Five megabytes loads in well under a second. Pinned to the first slot in my taskbar, no other formatter has held that slot for as long.</p>
<h3>2. <a href="/en/t/yaml-formatter">YAML Formatter</a></h3>
<p>For Kubernetes manifests and GitHub Actions workflows, indentation is the whole game. This catches the off-by-one space, flags duplicate keys, and gives you a tree view. Faster than <code>kubectl apply</code> and reading the error.</p>
<h3>3. <a href="/en/t/yaml-to-json">YAML to JSON</a></h3>
<p>Got a docker-compose.yml that needs to feed something JSON-only? Paste, click, copy. I also use it the other way around — I think in JSON structure first, then translate to YAML for Helm values.</p>
<h3>4. <a href="/en/t/csv-to-json">CSV to JSON</a></h3>
<p>Ops drops a CSV in Slack and I need it in a database. CSV → JSON → batch insert is the path every time. Headers become keys, empty cells stay null, escaped quotes survive.</p>
<h3>5. <a href="/en/t/xml-to-json">XML to JSON</a></h3>
<p>Legacy systems still speak XML. SOAP, RSS, Android resource files. Paste in, get the tree, decide how to parse. Faster than wrestling with <code>xml2js</code> configuration.</p>
<h2>2. Cheatsheets (8 tools)</h2>
<h3>6. <a href="/en/t/git-cheatsheet">Git Cheatsheet</a></h3>
<p>The difference between <code>git reset --hard</code> and <code>git reset --soft</code> is something I look up every three months. Beats searching Stack Overflow and dodging ads. Covers rebase, cherry-pick, and the reflog rescue moves.</p>
<h3>7. <a href="/en/t/vim-cheatsheet">Vim Cheatsheet</a></h3>
<p>Local <code>cheat.sh</code> is great, but when I'm SSH'd into a jumpbox and editing in vim, popping a browser tab to confirm <code>:%s/foo/bar/gc</code> syntax is the fastest path. Movement, editing, search — all on one page.</p>
<h3>8. <a href="/en/t/bash-cheatsheet">Bash Cheatsheet</a></h3>
<p><code>${var%.*}</code> vs <code>${var%%.*}</code> — which one strips more? I verify every time. This page breaks parameter expansion, loops, and test expressions into chunks I can scan in three seconds.</p>
<h3>9. <a href="/en/t/docker-cheatsheet">Docker Cheatsheet</a></h3>
<p>The argument order for <code>docker run</code> always trips me up after a few weeks away. Build, run, networking, and volume sections cover about 80% of what I touch on a normal day.</p>
<h3>10. <a href="/en/t/kubectl-cheatsheet">Kubectl Cheatsheet</a></h3>
<p>When a pod is stuck, the rescue sequence is the same: <code>get pod -o wide</code>, <code>describe</code>, <code>logs --tail=100 -f</code>, port-forward. Print this page, tape it to your monitor.</p>
<h3>11. <a href="/en/t/sql-cheatsheet">SQL Cheatsheet</a></h3>
<p>JOIN types fade after six months of not writing SQL. INNER / LEFT / FULL OUTER with diagrams, plus the window functions I actually use — <code>ROW_NUMBER</code>, <code>RANK</code>, <code>LAG</code> — saves me from writing a query I'll have to redo.</p>
<h3>12. <a href="/en/t/regex-cheatsheet">Regex Cheatsheet</a></h3>
<p>Lookarounds: <code>(?=)</code>, <code>(?&lt;=)</code>, <code>(?!)</code>, <code>(?&lt;!)</code>. I remember what they do, I never remember which is which. Organized by assertion / quantifier / character class / capture group, two-second recall.</p>
<h3>13. <a href="/en/t/tailwind-cheatsheet">Tailwind Cheatsheet</a></h3>
<p><code>space-x</code> vs <code>gap</code>, arbitrary value syntax like <code>grid-cols-[200px_1fr]</code>, every modifier prefix. Grouped by layout / spacing / typography / color / responsive. Finding a class doesn't drown you in the way the official docs sometimes do.</p>
<h2>3. Crypto / hashing / encoding (4 tools)</h2>
<h3>14. <a href="/en/t/base64-encoder">Base64 Encoder/Decoder</a></h3>
<p>HTTP basic auth test fixtures. Encoding files for <code>data:</code> URIs. Decoding nginx <code>auth_basic_user_file</code> entries. Faster than remembering the <code>-n</code> flag on <code>echo -n &quot;...&quot; | base64</code>.</p>
<h3>15. <a href="/en/t/jwt-decoder">JWT Decoder</a></h3>
<p>A 401 in production: paste the token, look at <code>exp</code>, look at <code>iss</code>, find the bug. <strong>Fully local parsing</strong> matters here — a production token belongs in your tab, not on someone's analytics dashboard.</p>
<h3>16. <a href="/en/t/jwt-encoder">JWT Encoder</a></h3>
<p>Hand-craft a JWT for tests. Pick the algorithm, fill the payload, drop in the secret. I use it constantly for e2e tests where I need tokens for different user roles.</p>
<h3>17. <a href="/en/t/md5-sha-hash">MD5 / SHA Hash Calculator</a></h3>
<p>File integrity checks, signature comparisons, hashing a string to use as a cache key. MD5 / SHA-1 / SHA-256 / SHA-512 all on one page, no tool-switching.</p>
<h2>4. DevOps / ops (5 tools)</h2>
<h3>18. <a href="/en/t/cron-expression-explainer">Cron Expression Explainer</a></h3>
<p><code>0 */6 * * 1-5</code> — does that really run every 6 hours on weekdays only? Paste it, get the next five execution times. Saves you from getting paged at 3am because your &quot;weekday only&quot; job ran on Sunday.</p>
<h3>19. <a href="/en/t/crontab-helper">Crontab Helper</a></h3>
<p>Pick &quot;every day at 9am&quot; or &quot;Mon/Wed/Fri at 2am&quot; from dropdowns, get the cron expression. Handy when you're pairing with someone who doesn't have cron syntax in muscle memory.</p>
<h3>20. <a href="/en/t/http-status-explorer">HTTP Status Code Explorer</a></h3>
<p>What is 418, when do you use 307 vs 308, what triggers 426. Search by number or by scenario. Faster than scrolling MDN.</p>
<h3>21. <a href="/en/t/dns-record-explainer">DNS Record Type Explainer</a></h3>
<p>SPF, DKIM, DMARC: what goes in the TXT record? CAA records to restrict cert issuance: what's the syntax? Each record type with a real example next to it.</p>
<h3>22. <a href="/en/t/linux-permission-calculator">Linux Permission Calculator</a></h3>
<p>755 and 644 I know cold. But 1777 (sticky bit) and 4755 (setuid) come up when I'm debugging something weird. Check the boxes, get the number. Paste a number, get the boxes.</p>
<h2>5. Text / data wrangling (4 tools)</h2>
<h3>23. <a href="/en/t/text-deduplicator">Text Deduplicator</a></h3>
<p>A log dump with 1000 IPs that need to be deduped. Faster than typing <code>sort | uniq</code> in three places, and it tells you the input count, output count, and duplicate ratio.</p>
<h3>24. <a href="/en/t/text-sorter">Text Sorter</a></h3>
<p>Sort alphabetically, numerically, by length. Ascending, descending, reversed. I use it for import statements, SQL <code>IN</code> lists, environment variables — anywhere humans should look at sorted lines.</p>
<h3>25. <a href="/en/t/text-diff">Text Diff</a></h3>
<p>When the two strings to compare are pasted from a chat, opening a local diff tool is overkill. Line-level and character-level granularity, red/green output, done in a tab.</p>
<h3>26. <a href="/en/t/uuid-generator">UUID Generator</a></h3>
<p>Test fixtures, database primary keys, trace IDs. Generate 1 to 100 at a time, one click to copy all. v4 by default, v1 and v7 also supported.</p>
<h2>6. Color / design (4 tools)</h2>
<h3>27. <a href="/en/t/color-picker">Color Picker</a></h3>
<p>Sample a color, convert between HEX / RGB / HSL synchronously, copy in the format your design tokens want. For when opening Figma is too much friction.</p>
<h3>28. <a href="/en/t/image-color-extractor">Image Color Extractor</a></h3>
<p>Designer drops a screenshot and says &quot;match this palette.&quot; Upload, get 5-10 dominant colors with HEX codes, copy. Beats clicking the eyedropper around in Photoshop ten times.</p>
<h3>29. <a href="/en/t/gradient-generator">CSS Gradient Generator</a></h3>
<p>Linear gradients I can write by hand. Conic gradients I cannot. Drag stops, see the preview update, copy the CSS. Works with radial too.</p>
<h3>30. <a href="/en/t/color-contrast-checker">Color Contrast Checker</a></h3>
<p>WCAG AA wants 4.5:1 for body text, AAA wants 7:1. That pale gray your designer loves looks fine in Figma and fails accessibility tools in production. Catch it before merge.</p>
<h2>How to combine them</h2>
<p>Three combinations earn their keep on a normal day:</p>
<ol><li><strong>The integration flow</strong>: JSON Formatter + <a href="/en/t/jwt-decoder">JWT Decoder</a> + HTTP Status Explorer, all pinned. When an API call goes sideways, 30 seconds tells you whether the protocol, the token, or the data shape is the broken thing.</li><li><strong>The DevOps flow</strong>: Cron Explainer + Crontab Helper + Linux Permission Calculator. Validate your cron and your permission bits in a browser before you ship the script. Future-you, at 3am, will thank present-you.</li><li><strong>The design flow</strong>: Color Picker + Image Color Extractor + Contrast Checker. After building a component, screenshot it, extract the palette, run contrast against the background. PR review with the designer gets thirty seconds shorter.</li></ol>
<p>Make a folder. Drop the thirty links in. The hours per year that returns will surprise you.</p>
<hr />
<p><em>Made by Toolora · Updated 2026-05-26</em></p>]]></content:encoded>
    </item>
    <item>
      <title>chmod 755 vs 644 Explained: Linux File Permissions Without the Mystery</title>
      <link>https://toolora.info/en/blog/chmod-755-vs-644-explained</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/chmod-755-vs-644-explained</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[Why 755 for directories and executables, 644 for everything else, and the setuid trap that bit me in production. Linux file permissions explained with the octal-to-symbolic map that finally made it click.]]></description>
      <category>linux</category>
      <category>devops</category>
      <category>tutorial</category>
      <content:encoded><![CDATA[<h1>chmod 755 vs 644 Explained: Linux File Permissions Without the Mystery</h1>
<p>For my first three years on Linux I copy-pasted <code>chmod 755</code> and <code>chmod 644</code> from Stack Overflow and never really understood why those particular numbers. Then a server I owned got compromised through a world-writable <code>.htaccess</code> file, and I sat down to actually learn the model. Took about 30 minutes. Should have done it sooner.</p>
<p>This post is the version I wish I'd read in year one.</p>
<h2>The Three Trios</h2>
<p>Every file on Linux has nine permission bits, arranged in three groups of three:</p>
<pre><code>owner  group  others
 rwx    rwx    rwx</code></pre>
<p>Each trio answers: can you <strong>r</strong>ead it, <strong>w</strong>rite to it, e<strong>x</strong>ecute it (or, for a directory, enter it)?</p>
<p>That's it. The rest is notation.</p>
<h2>Octal: Where the Numbers Come From</h2>
<p>Each trio is three bits, which is a number 0–7. Read = 4, write = 2, execute = 1. Add them up:</p>
<p>| rwx | binary | octal | |-----|--------|-------| | --- | 000    | 0     | | --x | 001    | 1     | | -w- | 010    | 2     | | -wx | 011    | 3     | | r-- | 100    | 4     | | r-x | 101    | 5     | | rw- | 110    | 6     | | rwx | 111    | 7     |</p>
<p>So <code>755</code> reads left to right: owner gets 7 (rwx), group gets 5 (r-x), others get 5 (r-x).</p>
<p><code>644</code> is: owner 6 (rw-), group 4 (r--), others 4 (r--). Nobody can execute, owner can write, the world can read.</p>
<p>If you'd rather not memorize the table, the <a href="/en/t/linux-permission-calculator">linux permission calculator</a> flips between octal and symbolic both ways in real time.</p>
<h2>755 vs 644: When to Use Each</h2>
<p><strong>755 (rwxr-xr-x)</strong> belongs on two things:</p>
<ol><li><strong>Directories.</strong> You need the execute bit on a directory to <code>cd</code> into it. Without it, even <code>ls</code> on a parent fails on names inside. This is the single most surprising fact about Unix permissions for newcomers — execute on a directory means &quot;enter,&quot; not &quot;run.&quot;</li><li><strong>Executable files.</strong> Shell scripts, compiled binaries, anything you actually run.</li></ol>
<p><strong>644 (rw-r--r--)</strong> belongs on everything else — config files, HTML, images, CSS, source code that gets read by an interpreter (like <code>.py</code> files imported as modules, or <code>.js</code> files served by a web server). You own it and can edit, others can read.</p>
<p>A common drive-by recipe to fix a freshly-uploaded directory:</p>
<pre><code class="language-bash">find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod +x scripts/*.sh</code></pre>
<p>That sets sane defaults across the tree, then re-marks the actual scripts as executable. The full reference for <code>find</code>, <code>xargs</code>, and the rest of the toolchain I lean on lives in the <a href="/en/t/bash-cheatsheet">bash cheatsheet</a>.</p>
<h2>Symbolic Mode: Sometimes Friendlier</h2>
<p>Octal is great when you know the exact end state. Symbolic mode is great when you want a relative change:</p>
<ul><li><code>chmod +x deploy.sh</code> — add execute for everyone.</li><li><code>chmod u+w,go-w report.txt</code> — give the owner write, take it away from group and others.</li><li><code>chmod -R a-w archive/</code> — recursively strip write from everybody.</li></ul>
<p>I use symbolic mode in shell history when I'm not yet sure what the file currently is. I use octal in scripts where I want to assert the exact final state regardless of what was there.</p>
<h2>The Security Mistakes That Matter</h2>
<p>A few categories of mistake show up repeatedly in postmortems:</p>
<p><strong>777 on a web directory.</strong> This was the cause of my own compromise. World-writable means anyone with shell access — or a web process that gets tricked into writing a file — can drop a PHP backdoor in your docroot. Never use 777. If something &quot;only works at 777,&quot; the bug is elsewhere (usually owner mismatch).</p>
<p><strong>666 on a config file with credentials.</strong> World-readable database credentials are a real category of bug. <code>.env</code> files should be 600 (rw owner only) or 640 (owner + group). Same applies to SSH private keys, which <code>ssh</code> will outright refuse to use if they're group- or world-readable.</p>
<p><strong>Removing execute from <code>/home</code>.</strong> If you <code>chmod 600 /home/yourname</code>, your web server (or any cron job running as you) can no longer reach files inside, because it lost the directory-entry bit. Permissions on parent directories cascade in surprising ways.</p>
<h2>The setuid Trap</h2>
<p>There's a fourth permission bit ahead of the three trios — the &quot;special&quot; bit — written as a leading digit: <code>4755</code>, <code>2755</code>, <code>1755</code>. The 4 means setuid: when you execute the file, the kernel runs it with the file owner's privileges, not yours.</p>
<p>This is how <code>passwd</code> works. The file is owned by root and is setuid; when a normal user runs it, it briefly becomes root to write <code>/etc/shadow</code>, then drops back down.</p>
<p>It is also how a careless script becomes a privilege-escalation vulnerability. The rule I follow: never setuid a script. Setuid on a shell script is ignored on modern Linux (for good reasons), and on the older systems where it works, it's a known exploit vector. Setuid on a compiled binary you wrote is sometimes the right answer, but only if you have audited every input.</p>
<p>If you see <code>-rwsr-xr-x</code> (note the <code>s</code> instead of <code>x</code> in the owner position) on a file you didn't expect, ask why before you ignore it.</p>
<h2>A Quick Reference</h2>
<p>| Permission | Octal | What it's for | |------------|-------|---------------| | rwxr-xr-x  | 755   | Directories, executables | | rw-r--r--  | 644   | Regular files (configs, docs, images, CSS, HTML) | | rw-------  | 600   | Secrets (.env, SSH private keys, credentials) | | rwxr-x---  | 750   | Directories where group can read, others can't | | rw-rw-r--  | 664   | Shared editable files inside a team group | | ---------  | 000   | &quot;Don't touch this&quot; sentinel |</p>
<p>If you find yourself reaching for <code>vim</code> to inspect a script's behavior before running it, the patterns are documented in the <a href="/en/t/vim-cheatsheet">vim cheatsheet</a>. And for the surrounding web-server config that's usually the next thing to debug after a permissions issue, the <a href="/en/t/nginx-cheatsheet">nginx cheatsheet</a> has the directives I check first.</p>
<h2>TL;DR</h2>
<p>755 for things you enter or run. 644 for things you read. 600 for secrets. Never 777. Setuid only on audited binaries, never on scripts. That covers about 95% of the chmod calls you'll ever make.</p>
<h2>Related tools</h2>
<ul><li><a href="/en/t/awk-sed-cheatsheet">awk + sed Cheatsheet</a></li><li><a href="/en/t/curl-cheatsheet">curl Cheatsheet</a></li></ul>
<hr />
<p><em>Made by Toolora · Updated 2026-05-26</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Cron Expression Syntax Cheat Sheet: 15 Real Crontab Examples</title>
      <link>https://toolora.info/en/blog/cron-expression-syntax-cheat-sheet</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/cron-expression-syntax-cheat-sheet</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[The five fields of a cron expression, 15 crontab examples I actually use in production, and the three gotchas (DST, timezone, missing newline) that have bitten me at 3 am.]]></description>
      <category>cron</category>
      <category>devops</category>
      <category>tutorial</category>
      <content:encoded><![CDATA[<h1>Cron Expression Syntax Cheat Sheet: 15 Real Crontab Examples</h1>
<p>Cron is one of those tools where the syntax looks like line noise for about 20 minutes, then becomes second nature, and then you forget that other people don't read <code>*/5 1-5 * * 1-5</code> as fluently as English. This post is the bridge from line noise to fluent — five fields, 15 patterns I actually use, and three gotchas that have woken me up.</p>
<p>If you want to verify expressions as you read, the <a href="/en/t/cron-expression-explainer">cron expression explainer</a> translates any line into plain English in real time.</p>
<h2>The Five Fields</h2>
<p>A standard cron line has five space-separated fields, plus the command:</p>
<pre><code>┌─────────── minute       (0–59)
│ ┌───────── hour         (0–23)
│ │ ┌─────── day of month (1–31)
│ │ │ ┌───── month        (1–12 or JAN–DEC)
│ │ │ │ ┌─── day of week  (0–6, 0 = Sunday, or SUN–SAT)
│ │ │ │ │
* * * * *  command</code></pre>
<p>Each field accepts:</p>
<ul><li><code>*</code> — every value.</li><li>A single number — exactly that value.</li><li>A list like <code>1,3,5</code> — any of these.</li><li>A range like <code>9-17</code> — inclusive both ends.</li><li>A step like <code>*/15</code> — every 15. Combine with ranges: <code>0-30/5</code> is 0, 5, 10, 15, 20, 25, 30.</li></ul>
<p>Two important quirks before the examples:</p>
<ul><li><strong>Day-of-month and day-of-week are OR, not AND.</strong> If both fields are restrictive (not <code>*</code>), the job runs when <em>either</em> matches. <code>0 12 13 * 5</code> runs at noon on the 13th <em>and</em> every Friday at noon. This catches everyone once.</li><li><strong>There is no &quot;every other day&quot; in standard cron.</strong> <code>*/2</code> in the day-of-month field means days 1, 3, 5, … 29, 31 — which gives you back-to-back runs across month boundaries. If you need true every-48-hours, use systemd timers or a wrapper script that checks a state file.</li></ul>
<h2>15 Crontab Patterns I Actually Use</h2>
<pre><code class="language-cron"># 1. Every minute (smoke tests, health-check pingers)
* * * * * /usr/local/bin/healthcheck.sh

# 2. Every 5 minutes
*/5 * * * * /usr/local/bin/queue-poller.sh

# 3. Every 15 minutes during business hours, weekdays only
*/15 9-17 * * 1-5 /usr/local/bin/sales-sync.sh

# 4. Every hour at the top of the hour
0 * * * * /usr/local/bin/hourly-rollup.sh

# 5. Every hour at :17 (offset to dodge thundering herd)
17 * * * * /usr/local/bin/cache-warm.sh

# 6. Every 6 hours
0 */6 * * * /usr/local/bin/cleanup-temp.sh

# 7. 03:00 every day (nightly batch)
0 3 * * * /usr/local/bin/nightly-report.sh

# 8. 03:00 every weekday, skip weekends
0 3 * * 1-5 /usr/local/bin/business-day-only.sh

# 9. 09:00 every Monday
0 9 * * 1 /usr/local/bin/weekly-digest.sh

# 10. 00:00 on the 1st of every month
0 0 1 * * /usr/local/bin/monthly-invoice.sh

# 11. 00:00 on the last day of the month (with the LAST hack)
55 23 28-31 * * [ &quot;$(date -d tomorrow +\%d)&quot; = &quot;01&quot; ] &amp;&amp; /usr/local/bin/month-end.sh

# 12. Every quarter (Jan, Apr, Jul, Oct on the 1st at 02:00)
0 2 1 1,4,7,10 * /usr/local/bin/quarterly.sh

# 13. Twice a day — 06:00 and 18:00
0 6,18 * * * /usr/local/bin/twice-daily.sh

# 14. @reboot — run once when the machine comes up
@reboot /usr/local/bin/start-tunnel.sh

# 15. Every 2 minutes, but only between 02:00 and 04:00 (low-traffic window)
*/2 2-3 * * * /usr/local/bin/heavy-job.sh</code></pre>
<p>Pattern 11 — &quot;last day of the month&quot; — is the one I have to look up every time, because vanilla cron has no day-of-month &quot;last.&quot; The trick is to run every day from the 28th to the 31st, then have the <em>command itself</em> check whether tomorrow is the 1st. Ugly, but reliable on every cron implementation.</p>
<p>If you'd rather not hand-craft these, the <a href="/en/t/crontab-helper">crontab helper</a> is a visual builder — pick frequency, pick range, get the line. I still keep these 15 as a paste-bin because typing is faster than clicking once you know what you want.</p>
<h2>The Three Gotchas</h2>
<h3>Gotcha 1: Daylight Saving Time</h3>
<p>Most cron implementations run in local time. On the &quot;spring forward&quot; night when 02:00 jumps to 03:00, a job scheduled for <code>0 2 * * *</code> will <em>not run that day</em>. On the &quot;fall back&quot; night when 02:00 happens twice, the same job will run <em>twice</em>.</p>
<p>Fixes, in order of preference:</p>
<ol><li>Schedule batch jobs at 03:00 or later. The DST jumps in most jurisdictions are around 02:00–03:00; staying above that window dodges both.</li><li>Run cron in UTC. Set <code>CRON_TZ=UTC</code> at the top of the crontab (works on Vixie cron and successors). The job then sees no DST at all.</li><li>Use systemd timers, which have explicit <code>OnCalendar=</code> semantics around DST.</li></ol>
<p>I learned this when a monthly billing report skipped one March. Took two cycles to notice. Now everything financial runs at 04:00 UTC and never moves.</p>
<h3>Gotcha 2: PATH and Environment</h3>
<p>A cron job runs with a minimal environment — typically just <code>HOME</code>, <code>LOGNAME</code>, <code>PATH=/usr/bin:/bin</code>, and <code>SHELL=/bin/sh</code>. Your <code>~/.bashrc</code> is not sourced. Your <code>nvm</code> setup is not loaded. Your custom binaries in <code>/usr/local/bin</code> may or may not be on PATH depending on the cron daemon.</p>
<p>Symptoms: works fine when you run it from the shell, silently does nothing from cron. The fix is one of:</p>
<ul><li>Use absolute paths for every binary in the command.</li><li>Set <code>PATH=</code> explicitly at the top of the crontab.</li><li>Have the cron line call a wrapper script whose first line is <code>source /home/you/.bashrc</code> or whatever bootstrap you need.</li></ul>
<p>The kind of one-liners that look fine in your terminal but die in cron usually involve <code>awk</code>, <code>sed</code>, <code>find</code>, or <code>xargs</code> invoked without full paths. The <a href="/en/t/awk-sed-cheatsheet">awk/sed cheatsheet</a> is what I keep open when debugging these — the syntax is exact in a way that interactive shell forgiveness hides.</p>
<h3>Gotcha 3: The Missing Newline</h3>
<p>A crontab file <em>must</em> end with a newline. Some cron daemons silently ignore the last line if it doesn't have one. The symptom is &quot;my new job isn't running and the other jobs are fine.&quot; I've lost an embarrassing hour to this one.</p>
<p>Fix: always edit with <code>crontab -e</code> (which appends a newline for you if missing) instead of piping in with <code>crontab &lt; file</code>. If you must pipe, end the file with a literal blank line.</p>
<p>Related: the file needs to be readable by the cron daemon and the user running it, the user must be in <code>/etc/cron.allow</code> if that file exists, and SELinux on RHEL-family distros may block scripts in unusual locations. Standard <a href="/en/t/bash-cheatsheet">bash debugging patterns</a> apply — start with <code>2&gt;&amp;1 | logger -t myjob</code> on the command and watch <code>/var/log/syslog</code> (or <code>journalctl -t myjob</code>) while it runs.</p>
<h2>A Final Tip: Always Log Output</h2>
<p>The single best thing you can do for future-you is redirect every cron job's output somewhere you can read later. Cron will email it to the local user mailbox by default, which on most servers nobody reads. Better:</p>
<pre><code class="language-cron">0 3 * * * /usr/local/bin/nightly-report.sh &gt;&gt; /var/log/nightly-report.log 2&gt;&amp;1</code></pre>
<p>Three months from now when you're debugging why the report stopped, having a log file makes the difference between &quot;two-minute fix&quot; and &quot;two-hour archaeology.&quot;</p>
<h2>Related tools</h2>
<ul><li><a href="/en/t/nextjs-cheatsheet">Next.js Cheatsheet</a></li><li><a href="/en/t/python-cheatsheet">Python Cheatsheet</a></li></ul>
<hr />
<p><em>Made by Toolora · Updated 2026-05-26</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Format JSON Online: 5 Scenarios You Hit Every Week</title>
      <link>https://toolora.info/en/blog/format-json-online-no-install</link>
      <guid isPermaLink="true">https://toolora.info/en/blog/format-json-online-no-install</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <author>noreply@toolora.info (Lei Li)</author>
      <dc:creator><![CDATA[Lei Li]]></dc:creator>
      <description><![CDATA[A browser-only JSON formatter saves a surprising amount of time. Here are five concrete scenarios where I reach for one instead of opening an IDE, plus when to use beautify vs minify.]]></description>
      <category>json</category>
      <category>developer</category>
      <category>tutorial</category>
      <content:encoded><![CDATA[<h1>Format JSON Online: 5 Scenarios You Hit Every Week</h1>
<p>I keep a <a href="/en/t/json-formatter">JSON formatter</a> pinned in a browser tab the way other people keep a calculator on their dock. Roughly 12 times a week, I paste something messy in, get something readable out, and move on with my day. Below are the five scenarios that account for almost all of those 12 times — and a quick note on when &quot;beautify&quot; and &quot;minify&quot; are actually different jobs, not the same button with different names.</p>
<p>If you want to follow along, the tool I'm using is <a href="/en/t/json-formatter">json-formatter</a>. Runs entirely in your tab. Your payload never leaves the browser.</p>
<h2>Beautifier vs Minifier: Not the Same Tool</h2>
<p>A JSON beautifier adds whitespace so a human can read the structure. A JSON minifier strips whitespace so a machine can transfer it faster.</p>
<p>A 240 KB API response I pulled last Tuesday went from 240 KB to 178 KB after minify — about 26% smaller, which on a 3G connection is a noticeable hitch saved. The reverse direction (beautify) doesn't change semantics at all; it just changes whether you can scan the file in five seconds or five minutes.</p>
<p>Rule of thumb I follow: beautify when a human is the next reader, minify when a network is.</p>
<h2>Scenario 1: Debugging an API Response at 11 pm</h2>
<p>A staging endpoint returns 400 with a single-line body 4,000 characters long. Chrome's preview pane crops it. <code>console.log</code> wraps it into noodle soup.</p>
<p>I copy the body, paste into the formatter, hit beautify, and the actual issue — a missing <code>currency</code> field nested 4 levels deep inside <code>lineItems[2].pricing</code> — becomes visible in about 8 seconds. Doing the same thing with <code>jq</code> from a terminal is also fine, but only if you remember the jq syntax for &quot;show me everything&quot; (<code>jq '.'</code>) and have already piped the body to a file.</p>
<h2>Scenario 2: Diffing Two Configs</h2>
<p><code>config.staging.json</code> and <code>config.prod.json</code> should differ in three keys. They differ in eleven. Until both files are formatted identically (same indentation, same key order if you sort), a line-based diff is useless.</p>
<p>Workflow:</p>
<ol><li>Paste staging config, beautify, copy.</li><li>Paste prod config, beautify, copy.</li><li>Drop both into a <a href="/en/t/text-diff">text diff</a> or your editor's diff view.</li></ol>
<p>You go from &quot;they're totally different, who knows&quot; to &quot;lines 14, 27, 41&quot; in under a minute.</p>
<h2>Scenario 3: Extracting One Value from a 5 MB Payload</h2>
<p>A logging service exports a 5 MB JSON blob and you only need the <code>userId</code> of every event with <code>status: &quot;failed&quot;</code>. The naive workflow is: open in IDE, wait for the syntax highlighter to catch up, Ctrl-F, copy each hit. Painful.</p>
<p>Better: beautify in the formatter (it handles 5 MB in well under a second client-side), use the browser's find-in-page to count occurrences, then if you actually need to extract programmatically, run a tiny snippet in DevTools console. The formatter just makes the structure scannable enough that you know what to grep for.</p>
<h2>Scenario 4: Redacting Before You Paste in Slack</h2>
<p>You want to share a JSON payload with a teammate. It contains an email, a token, and an internal customer ID. You can't paste it as-is.</p>
<p>Beautify first so you can see the structure. Then it's two minutes of manual redaction with sane indentation, instead of ten minutes of &quot;wait, was that the third or fourth <code>id</code> field.&quot; The beautified version makes the redaction obvious; the minified version hides fields inside walls of commas.</p>
<p>Related neighbor formats I hit the same week: <a href="/en/t/yaml-formatter">yaml-formatter</a> for k8s manifests, <a href="/en/t/xml-formatter">xml-formatter</a> for the one SOAP service that refuses to die, and <a href="/en/t/csv-to-json">csv-to-json</a> when a &quot;data export&quot; turns out to be a CSV someone needs in JSON shape.</p>
<h2>Scenario 5: Validating Before You Commit</h2>
<p>The fastest way to know whether a hand-edited JSON file is valid is to paste it into a formatter. If beautify works, the file parses. If it errors, you get a line number and column.</p>
<p>I've caught the following in the last month, all in under five seconds each:</p>
<ul><li>Trailing comma after the last array element (JSON doesn't allow this; many editors don't flag it).</li><li>Single quotes where double quotes were required (you wrote it in a JS object habit).</li><li>An unescaped backslash inside a Windows path string.</li><li>A literal <code>NaN</code> where a number was expected (NaN is not valid JSON; only finite numbers are).</li></ul>
<p>Each of those would have produced a confusing error somewhere downstream — a CI failure, a 500 in prod, a parsing bug in a frontend bundle. Catching them at the formatter step costs nothing.</p>
<h2>When the Formatter Isn't Enough</h2>
<p>A few cases where I go beyond a beautifier:</p>
<ul><li><strong>Schema validation</strong>: if you need to enforce types and required fields, a formatter won't catch a missing field; you need a JSON Schema validator.</li><li><strong>Repeated transforms</strong>: if you're doing the same extraction 50 times, write a <code>jq</code> one-liner once.</li><li><strong>Streaming JSON / NDJSON</strong>: a beautifier expects a single document. For line-delimited JSON, split first, then format each line.</li></ul>
<p>For everything else — the 12 times a week kind of work — paste, beautify, scan, done.</p>
<hr />
<p><em>Made by Toolora · Updated 2026-05-26</em></p>]]></content:encoded>
    </item>
  </channel>
</rss>
