1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5 <title>SwaroopCH.com</title> 6 <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"> 7 <meta name="description" content="Exploring books, mental models, travel, software engineering (craft, career, open source, side projects), ML & Generative AI."> 8 9 <meta name="twitter:card" content="summary_large_image"> 10 <meta name="twitter:title" content="SwaroopCH.com"> 11 <meta name="twitter:description" content="Exploring books, mental models, travel, software engineering (craft, career, open source, side projects), ML & Generative AI."> 12 <meta name="twitter:url" content="https://www.swaroopch.com/SwaroopCH-com-11b0924249b1804e8171c5a52631dada"> 13 <meta name="twitter:image" content="https://www.swaroopch.com/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fbe942327-7867-4309-be80-04bafdd61d16%2F2e7e6b2a-db0c-48e9-ac2c-3348dc191fc2%2FSocialMediaPreviewImage.png?table=block&id=11b09242-49b1-804e-8171-c5a52631dada&spaceId=be942327-7867-4309-be80-04bafdd61d16&width=2000&userId=&cache=v2&imgBuildSrc=pageMetadataCover"> 14 <meta property="og:site_name" content="commonplace book"> 15 <meta property="og:type" content="article"> 16 <meta property="og:url" content="https://www.swaroopch.com/SwaroopCH-com-11b0924249b1804e8171c5a52631dada"> 17 <meta property="og:title" content="SwaroopCH.com"> 18 <meta property="og:description" content="Exploring books, mental models, travel, softw
18are engineering (craft, career, open source, side projects), ML & Generative AI."> 19 <meta property="og:image" content="https://www.swaroopch.com/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fbe942327-7867-4309-be80-04bafdd61d16%2F2e7e6b2a-db0c-48e9-ac2c-3348dc191fc2%2FSocialMediaPreviewImage.png?table=block&id=11b09242-49b1-804e-8171-c5a52631dada&spaceId=be942327-7867-4309-be80-04bafdd61d16&width=2000&userId=&cache=v2&imgBuildSrc=pageMetadataCover"> 20 <meta property="og:locale" content="en_US"> 21 <meta name="slack-app-id" content="A049JV0H0KC"> 22 <link rel="shortcut icon" href="https://www.swaroopch.com/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fbe942327-7867-4309-be80-04bafdd61d16%2F823544bd-32aa-4951-bd85-623b5d939ad0%2Fae99295e-cbc1-408d-8d02-e5583f5d299f.png?table=block&id=11b09242-49b1-804e-8171-c5a52631dada&spaceId=be942327-7867-4309-be80-04bafdd61d16&width=2000&userId=&cache=v2&imgBuildSrc=pageMetadataIcon"/> 23 <link rel="canonical" href="https://www.swaroopch.com/SwaroopCH-com-11b0924249b1804e8171c5a52631dada" /> 24 25 <style> /* cspell:disable-file */ /* webkit printing magic: print all background colors */ html { -webkit-print-color-adjust: exact; } * { box-sizing: border-box; -webkit-print-color-adjust: exact; } html, body { margin: 0; padding: 0; } @media only screen { body { margin: 2em auto; max-width: 900px; color: rgb(55, 53, 47); } } body { line-height: 1.5; white-space: pre-wrap; } a, a.visited { color: inherit; text-decoration: underline; } .pdf-relative-link-path { font-size: 80%; color: #444; } h1, h2, h3 { letter-spacing: -0.01em; line-height: 1.2; font-weight: 600; margin-bottom: 0; } /* Override strong tags inside headings to maintain consistent weight */ h1 strong, h2 strong, h3 strong { font-weight: 600; } .page-title { font-size: 2.5rem; font-weight: 700; margin-top: 0; margin-bottom: 0.75em; } h1 { font-size: 1.875rem; margin-top: 1.875rem; } h2 { font-size: 1.5rem; margin-top: 1.5rem; } h3 { font-size: 1.25rem; margin-top: 1.25rem; } .source { border: 1px solid #ddd; border-radius: 3px; padding: 1.5em; word-break: break-all; } .callout { border-radius: 10px; padding: 1rem; /* Paint a complete callout box on every PDF page fragment. */ -webkit-box-decoration-break: clone; box-decoration-break: clone; } /* For default-background callouts, render the border outline. */ .callout.block-color-default_background { border: 1px solid rgba(55, 53, 47, 0.09); } figure { margin: 1.25em 0; page-break-inside: avoid; } /* * Toggles and callouts hold arbitrary content, so they can easily be taller * than a page. They must stay breakable: avoiding breaks inside them makes * Chromium push the whole block onto the next page, which leaves the previous * page mostly empty before every long toggle. */ details, aside { margin: 1.25em 0; } /* Keep a toggle's title on the same page as the start of its content. */ summary { page-break-after: avoid; break-after: avoid; } /* * Toggle headings render as <h1/h2/h3 style="display:inline-block"> inside * <summary>. Without this reset, the heading's margin-top pushes it below the * ::marker (â¼), so the triangle and the title appear on separate lines. */ summary h1, summary h2, summary h3, summary h4 { margin-top: 0; } figcaption { opacity: 0.5; font-size: 85%; margin-top: 0.5em; } mark { background-color: transparent; } .indented { padding-left: 1.5em; } hr { background: transparent; display: block; width: 100%; height: 1px; visibility: visible; border: none; border-bottom: 1px solid rgba(55, 53, 47, 0.09); } img { max-width: 100%; } @media only print { img { max-height: 100vh; object-fit: contain; } table.collection-content { width: 100%; table-layout: fixed; } table.collection-content th, table.collection-content td { overflow-wrap: anywhere; } table.collection-content td > .user, table.collection-content td > time { white-space: pre-wrap; } } @page { margin: 1in; } .collection-content-wrapper { overflow-x: auto; } @media only print { .collection-content-wrapper { overflow-x: visible; } } .collection-content { font-size: 0.875rem; } .collection-content td { white-space: pre-wrap; word-break: break-word; } .column-list { display: flex; gap: 46px; } .column { min-width: 0; overflow: hidden; } .column > *:first-child { margin-top: 0; } .table_of_contents-item { display: block; font-size: 0.875rem; line-height: 1.3; padding-inline: 0.125rem; padding-block: 0.375rem; } .table_of_contents-indent-1 { margin-left: 1.5rem; } .table_of_contents-indent-2 { margin-left: 3rem; } .table_of_contents-indent-3 { margin-left: 4.5rem; } .table_of_contents-link { text-decoration: none; opacity: 0.7; border-bottom: 1px solid rgba(55, 53, 47, 0.18); } table, th, td { border: 1px solid rgba(55, 53, 47, 0.09); } table { border-collapse: collapse; border-left: none;
25 border-right: none; } th, td { font-weight: normal; padding: 0.25em 0.5em; line-height: 1.5; min-height: 1.5em; text-align: left; } th { color: rgba(55, 53, 47, 0.6); } ol, ul { margin: 0; margin-block-start: 0.6em; margin-block-end: 0.6em; } li > ol:first-child, li > ul:first-child { margin-block-start: 0.6em; } ul > li { list-style: disc; } ul.to-do-list { padding-inline-start: 0; } ul.to-do-list > li { list-style: none; } .to-do-children-checked { text-decoration: line-through; opacity: 0.375; } ul.toggle > li { list-style: none; } ul { padding-inline-start: 1.7em; } ul > li { padding-left: 0.1em; } ol { padding-inline-start: 1.6em; } ol.numbered-list.numbered-list-digits-2 { padding-inline-start: 2em; } ol.numbered-list.numbered-list-digits-3plus { padding-inline-start: 2.4em; } ol > li { padding-left: 0.2em; } .mono ol { padding-inline-start: 2em; } .mono ol > li { text-indent: -0.4em; } .toggle { padding-inline-start: 0em; list-style-type: none; } /* Indent toggle children */ .toggle > li > details { padding-left: 1.7em; } .toggle > li > details > summary { margin-left: -1.1em; } .selected-value { display: inline-block; padding: 0 0.5em; background: rgba(206, 205, 202, 0.5); border-radius: 3px; margin-right: 0.5em; margin-top: 0.3em; margin-bottom: 0.3em; white-space: nowrap; } .collection-title { display: inline-block; margin-right: 1em; } .page-description { margin-bottom: 2em; } .simple-table { margin-top: 1em; font-size: 0.875rem; empty-cells: show; } .simple-table td { height: 29px; min-width: 120px; } .simple-table th { height: 29px; min-width: 120px; } .simple-table-header-color { background: rgb(247, 246, 243); color: black; } .simple-table-header { font-weight: 500; } time { opacity: 0.5; } .icon { display: inline-flex; align-items: center; justify-content: center; max-width: 1.2em; max-height: 1.2em; text-decoration: none; vertical-align: text-bottom; margin-right: 0.5em; } /* * Render emoji icons using a ::before pseudo-element to keep the glyph * out of the DOM textContent traversal. This avoids double-rendering icons * in callouts and page titles. * NOTE(slim/html-export-pseudo-icons): I can't tagref this because it will * flag as a duplicate tag after codegen. */ .icon[data-emoji]::before { content: attr(data-emoji); } img.icon { border-radius: 3px; } .callout img.notion-static-icon { width: 1em; height: 1em; } .callout p { margin: 0; } .callout h1, .callout h2, .callout h3 { margin: 0 0 0.6rem; } .user-icon { width: 1.5em; height: 1.5em; border-radius: 100%; margin-right: 0.5rem; } .user-icon-inner { font-size: 0.8em; } .text-icon { border: 1px solid #000; text-align: center; } .page-cover-image { display: block; object-fit: cover; width: 100%; max-height: 30vh; } .page-header-icon { font-size: 3rem; margin-bottom: 1rem; } .page-header-icon-with-cover { margin-top: -0.72em; margin-left: 0.07em; } .page-header-icon img { border-radius: 3px; } .link-to-page { margin: 1em 0; padding: 0; border: none; font-weight: 500; } p > .user { opacity: 0.5; } td > .user, td > time { white-space: nowrap; } input[type="checkbox"] { margin-right: 0.4em; vertical-align: middle; } p { margin-top: 0.5em; margin-bottom: 0.5em; } .image { border: none; margin: 1.5em 0; padding: 0; border-radius: 0; text-align: center; } .code, code { background: rgba(135, 131, 120, 0.15); border-radius: 3px; padding: 0.2em 0.4em; border-radius: 3px; font-size: 85%; tab-size: 2; } code { color: #eb5757; } .code { padding: 1.5em 1em; } .code-wrap { white-space: pre-wrap; word-break: break-all; } .code > code { background: none; padding: 0; font-size: 100%; color: inherit; } blockquote { font-size: 1em; margin: 1em 0; padding-left: 1em; border-left: 3px solid rgb(55, 53, 47); } blockquote.quote-large { font-size: 1.25em; } .bookmark { text-decoration: none; max-height: 8em; padding: 0; display: flex; width: 100%; align-items: stretch; } .bookmark-title { font-size: 0.85em; overflow: hidden; text-overflow: ellipsis; height: 1.75em; white-space: nowrap; } .bookmark-text { display: flex; flex-direction: column; } .bookmark-info { flex: 4 1 180px; padding: 12px 14px 14px; display: flex; flex-direction: column; justify-content: space-between; } .bookmark-image { width: 33%; flex: 1 1 180px; display: block; position: relative; object-fit: cover; border-radius: 1px; } .bookmark-description { color: rgba(55, 53, 47, 0.6); font-size: 0.75em; overflow: hidden; max-height: 4.5em; word-break: break-word; } .bookmark-href { font-size: 0.75em; margin-top: 0.25em; } .tab { margin: 1.25em 0; padding-inline: 1rem; border: 1px solid rgba(55, 53, 47, 0.09); } .sans { font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "Apple Color Emoji", "Noto Sans Arabic", "Noto Sans Hebrew", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; } .code { font-family: "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace; } .serif { font-family: Lyon-Text, Georgia, ui-serif, serif; } .mono { font-family: iawriter-mono, Nitti, Menlo, Courier, monospace; } .pdf .sans { font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "Apple Color Emoji", "Noto Sans Arabic", "Noto Sans Hebrew", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol", 'Twemoji', 'Noto Color Emoji', 'Noto Sans CJK JP'; } .pdf:lang(zh-CN) .sans { font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "Apple Color Emoji", "Noto Sans Arabic", "Noto Sans Hebrew", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol", 'Twemoji', 'Noto Color Emoji', 'Noto Sans CJK SC'; } .pdf:lang(zh-TW) .sans { font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "Apple Color Emoji", "Noto Sans Arabic", "Noto Sans Hebrew", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol", 'Twemoji', 'Noto Color Emoji', 'Noto Sans CJK TC'; } .pdf:lang(ko-KR) .sans { font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "Apple Color Emoji", "Noto Sans Arabic", "Noto Sans Hebrew", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol", 'Twemoji', 'Noto Color Emoji', 'Noto Sans CJK KR'; } .pdf .code { font-family: Source Code Pro, "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK JP'; } .pdf:lang(zh-CN) .code { font-family: Source Code Pro, "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK SC'; } .pdf:lang(zh-TW) .code { font-family: Source Code Pro, "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK TC'; } .pdf:lang(ko-KR) .code { font-family: Source Code Pro, "SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK KR'; } .pdf .serif { font-family: PT Serif, Lyon-Text, Georgia, ui-serif, serif, 'Twemoji', 'Noto Color Emoji', 'Noto Serif CJK JP'; } .pdf:lang(zh-CN) .serif { font-family: PT Serif, Lyon-Text, Georgia, ui-serif, serif, 'Twemoji', 'Noto Color Emoji', 'Noto Serif CJK SC'; } .pdf:lang(zh-TW) .serif { font-family: PT Serif, Lyon-Text, Georgia, ui-serif, serif, 'Twemoji', 'Noto Color Emoji', 'Noto Serif CJK TC'; } .pdf:lang(ko-KR) .serif { font-family: PT Serif, Lyon-Text, Georgia, ui-serif, serif, 'Twemoji', 'Noto Color Emoji', 'Noto Serif CJK KR'; } .pdf .mono { font-family: PT Mono, iawriter-mono, Nitti, Menlo, Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK JP'; } .pdf:lang(zh-CN) .mono { font-family: PT Mono, iawriter-mono, Nitti, Menlo, Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK SC'; } .pdf:lang(zh-TW) .mono { font-family: PT Mono, iawriter-mono, Nitti, Menlo, Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK TC'; } .pdf:lang(ko-KR) .mono { font-family: PT Mono, iawriter-mono, Nitti, Menlo, Courier, monospace, 'Twemoji', 'Noto Color Emoji', 'Noto Sans Mono CJK KR'; }
25 .highlight-default { color: rgba(44, 44, 43, 1); } .highlight-gray { color: rgba(125, 122, 117, 1); fill: rgba(125, 122, 117, 1); } .highlight-brown { color: rgba(159, 118, 90, 1); fill: rgba(159, 118, 90, 1); } .highlight-orange { color: rgba(210, 123, 45, 1); fill: rgba(210, 123, 45, 1); } .highlight-yellow { color: rgba(203, 148, 52, 1); fill: rgba(203, 148, 52, 1); } .highlight-teal { color: rgba(80, 148, 110, 1); fill: rgba(80, 148, 110, 1); } .highlight-blue { color: rgba(56, 125, 201, 1); fill: rgba(56, 125, 201, 1); } .highlight-purple { color: rgba(154, 107, 180, 1); fill: rgba(154, 107, 180, 1); } .highlight-pink { color: rgba(193, 76, 138, 1); fill: rgba(193, 76, 138, 1); } .highlight-red { color: rgba(207, 81, 72, 1); fill: rgba(207, 81, 72, 1); } .highlight-default_background { color: rgba(44, 44, 43, 1); } .highlight-gray_background { background: rgba(42, 28, 0, 0.07); } .highlight-brown_background { background: rgba(139, 46, 0, 0.086); } .highlight-orange_background { background: rgba(224, 101, 1, 0.129); } .highlight-yellow_background { background: rgba(211, 168, 0, 0.137); } .highlight-teal_background { background: rgba(0, 100, 45, 0.09); } .highlight-blue_background { background: rgba(0, 124, 215, 0.094); } .highlight-purple_background { background: rgba(102, 0, 178, 0.078); } .highlight-pink_background { background: rgba(197, 0, 93, 0.086); } .highlight-red_background { background: rgba(223, 22, 0, 0.094); } .block-color-default { color: inherit; fill: inherit; } .block-color-gray { color: rgba(125, 122, 117, 1); fill: rgba(125, 122, 117, 1); } .block-color-brown { color: rgba(159, 118, 90, 1); fill: rgba(159, 118, 90, 1); } .block-color-orange { color: rgba(210, 123, 45, 1); fill: rgba(210, 123, 45, 1); } .block-color-yellow { color: rgba(203, 148, 52, 1); fill: rgba(203, 148, 52, 1); } .block-color-teal { color: rgba(80, 148, 110, 1); fill: rgba(80, 148, 110, 1); } .block-color-blue { color: rgba(56, 125, 201, 1); fill: rgba(56, 125, 201, 1); } .block-color-purple { color: rgba(154, 107, 180, 1); fill: rgba(154, 107, 180, 1); } .block-color-pink { color: rgba(193, 76, 138, 1); fill: rgba(193, 76, 138, 1); } .block-color-red { color: rgba(207, 81, 72, 1); fill: rgba(207, 81, 72, 1); } .block-color-default_background { color: inherit; fill: inherit; } .block-color-gray_background { background: rgba(240, 239, 237, 1); } .block-color-brown_background { background: rgba(245, 237, 233, 1); } .block-color-orange_background { background: rgba(251, 235, 222, 1); } .block-color-yellow_background { background: rgba(249, 243, 220, 1); } .block-color-teal_background { background: rgba(232, 241, 236, 1); } .block-color-blue_background { background: rgba(229, 242, 252, 1); } .block-color-purple_background { background: rgba(243, 235, 249, 1); } .block-color-pink_background { background: rgba(250, 233, 241, 1); } .block-color-red_background { background: rgba(252, 233, 231, 1); } .select-value-color-default { background-color: rgba(42, 28, 0, 0.07); } .select-value-color-gray { background-color: rgba(28, 19, 1, 0.11); } .select-value-color-brown { background-color: rgba(127, 51, 0, 0.156); } .select-value-color-orange { background-color: rgba(196, 88, 0, 0.203); } .select-value-color-yellow { background-color: rgba(209, 156, 0, 0.282); } .select-value-color-green { background-color: rgba(0, 96, 38, 0.156); } .select-value-color-blue { background-color: rgba(0, 118, 217, 0.203); } .select-value-color-purple { background-color: rgba(92, 0, 163, 0.141); } .select-value-color-pink { background-color: rgba(183, 0, 78, 0.152); } .select-value-color-red { background-color: rgba(206, 24, 0, 0.164); } .checkbox { display: inline-flex; vertical-align: text-bottom; width: 16; height: 16; background-size: 16px; margin-left: 2px; margin-right: 5px; } .checkbox-on { background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%2358A9D7%22%2F%3E%0A%3Cpath%20d%3D%22M6.71429%2012.2852L14%204.9995L12.7143%203.71436L6.71429%209.71378L3.28571%206.2831L2
25%207.57092L6.71429%2012.2852Z%22%20fill%3D%22white%22%2F%3E%0A%3C%2Fsvg%3E"); } .checkbox-off { background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20x%3D%220.75%22%20y%3D%220.75%22%20width%3D%2214.5%22%20height%3D%2214.5%22%20fill%3D%22white%22%20stroke%3D%22%2336352F%22%20stroke-width%3D%221.5%22%2F%3E%0A%3C%2Fsvg%3E"); } </style> 26 </head> 27 <body> 28 <p><aside> 29<img src="/icons/info-alternate_gray.svg" alt="/icons/info-alternate_gray.svg" width="40px" /></p> 30<p>A personal blog by Swaroop Chitlur about life (books I read, ways of thinking, travel stories, parenting) & coding (software development, ML, Generative AI).</p> 31<p></aside></p> 32<h2>Books Iâve Written</h2> 33<ul> 34<li><a href="https://python.swaroopch.com/">A Byte of Python</a></li> 35<li><a href="https://vim.swaroopch.com/">A Byte of Vim</a></li> 36</ul> 37<p><a href="https://www.swaroopch.com/11b0924249b180ac9206d7c85d172859">Blog Posts (since 2004)</a></p> 38<p><aside> 39<img src="/icons/follow_gray.svg" alt="/icons/follow_gray.svg" width="40px" /></p> 40<p>For updates, please follow via <a href="https://subscribe.swaroopch.com/subscribe">email</a> or <a href="https://rss.beehiiv.com/feeds/gJPBx7r44X.xml">RSS</a>.</p> 41<p></aside></p> 42<p><aside> 43<img src="/icons/conversation_gray.svg" alt="/icons/conversation_gray.svg" width="40px" /></p> 44<p>For comments, please respond via <a href="https://subscribe.swaroopch.com/subscribe">email</a> or <a href="https://x.com/swaroopch">Twitter/X</a> or <a href="https://t.me/+Rr5pJTis5XQzMjAx">Telegram</a>.</p> 45<p></aside></p> 46<p><a href="https://www.swaroopch.com/11b0924249b180fba5a4d04a18f1cc79">Mental Models</a></p> 47<ul> 48<li>Pages</li> 49</ul> 50 51 </body> 52</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.