<p>We're excited to announce the release of <a href="https://github.com/fedify-dev/fedify/releases/tag/1.5.0" rel="nofollow">Fedify 1.5.0</a>! This version brings several significant improvements to performance, configurability, and developer experience. Let's dive into what's new:</p><p>Two-Stage Fan-out Architecture for Efficient Activity Delivery</p><p><a href="/tags/fedify/" rel="tag">#Fedify</a> now implements a smart fan-out mechanism for delivering activities to large audiences. This change is particularly valuable for accounts with many followers. When sending activities to many recipients, Fedify now creates a single consolidated message containing the activity payload and recipient list, which a background worker then processes to re-enqueue individual delivery tasks.</p><p>This architectural improvement delivers several benefits: <a href="https://jsr.io/@fedify/[email protected]/doc/~/Context.sendActivity" rel="nofollow">Context.sendActivity()</a> returns almost instantly even with thousands of recipients, memory consumption is dramatically reduced by avoiding payload duplication, UI responsiveness improves since web requests complete quickly, and the system maintains reliability with independent retry logic for each delivery.</p><p>For specific requirements, we've added a new <a href="https://fedify.dev/manual/send#optimizing-activity-delivery-for-large-audiences" rel="nofollow">fanout</a> option with three settings:</p><p>// Configuring fan-out behaviorawait ctx.sendActivity( { identifier: "alice" }, recipients, activity, { fanout: "auto" } // Default: automatic based on recipient count // Other options: "skip" (never use fan-out) or "force" (always use fan-out));</p><p>Canonical Origin Support for Multi-Domain Setups</p><p>You can now explicitly configure a canonical origin for your server, which is especially useful for multi-domain setups. This feature allows you to set different domains for WebFinger handles and <a href="/tags/activitypub/" rel="tag">#ActivityPub</a> URIs, configured through the new <a href="https://jsr.io/@fedify/[email protected]/doc/federation/~/CreateFederationOptions.origin" rel="nofollow">origin</a> option in <a href="https://jsr.io/@fedify/[email protected]/doc/federation/~/createFederation" rel="nofollow">createFederation()</a>. This enhancement prevents unexpected URL construction when requests bypass proxies and improves security by ensuring consistent domain usage.</p><p>const federation = createFederation({ // Use example.com for handles but ap.example.com for ActivityPub URIs origin: { handleHost: "example.com", webOrigin: "<a href="https://ap.example.com" rel="nofollow"><span class="invisible">https://</span>ap.example.com</a>", }, // Other options...});</p><p>Optional Followers Collection Synchronization</p><p><a href="https://fedify.dev/manual/send#followers-collection-synchronization" rel="nofollow">Followers collection synchronization</a> (<a href="https://w3id.org/fep/8fcf" rel="nofollow">FEP-8fcf</a>) is now opt-in rather than automatic. This feature must now be explicitly enabled through the <a href="https://jsr.io/@fedify/[email protected]/doc/~/SendActivityOptionsForCollection.syncCollection" rel="nofollow">syncCollection</a> option, giving developers more control over when to include followers collection digests. This change improves network efficiency by reducing unnecessary synchronization traffic.</p><p>await ctx.sendActivity( { identifier: sender }, "followers", activity, { preferSharedInbox: true, syncCollection: true, // Explicitly enable collection synchronization });</p><p>Enhanced Key Format Compatibility</p><p>Key format support has been expanded for better interoperability. Fedify now accepts PEM-PKCS<a href="/tags/1/" rel="tag">#1</a> format in addition to PEM-SPKI for RSA public keys. We've added <a href="https://jsr.io/@fedify/[email protected]/doc/~/importPkcs1" rel="nofollow">importPkcs1()</a> and <a href="https://jsr.io/@fedify/[email protected]/doc/~/importPem" rel="nofollow">importPem()</a> functions for additional flexibility, which improves compatibility with a wider range of ActivityPub implementations.</p><p>Improved Key Selection Logic</p><p>The key selection process is now more intelligent. The <a href="https://jsr.io/@fedify/[email protected]/doc/~/fetchKey" rel="nofollow">fetchKey()</a> function can now select the public key of an actor if keyId has no fragment and the actor has only one public key. This enhancement simplifies key handling in common scenarios and provides better compatibility with implementations that don't specify fragment identifiers.</p><p>New Authorization Options</p><p>Authorization handling has been enhanced with new options for the <a href="https://jsr.io/@fedify/[email protected]/doc/~/RequestContext.getSignedKey" rel="nofollow">RequestContext.getSignedKey()</a> and <a href="https://jsr.io/@fedify/[email protected]/doc/~/RequestContext.getSignedKeyOwner" rel="nofollow">getSignedKeyOwner()</a> methods. This provides more flexible control over authentication and authorization flows. We've deprecated older parameter-based approaches in favor of the more flexible method-based approach.</p><p>Efficient Bulk Message Queueing</p><p>Message queue performance is improved with bulk operations. We've added an optional <a href="https://jsr.io/@fedify/[email protected]/doc/federation/~/MessageQueue.enqueueMany" rel="nofollow">enqueueMany()</a> method to the <a href="https://jsr.io/@fedify/[email protected]/doc/federation/~/MessageQueue" rel="nofollow">MessageQueue</a> interface, enabling efficient queueing of multiple messages in a single operation. This reduces overhead when processing batches of activities. All our message queue implementations have been updated to support this new operation:</p><p><a href="https://github.com/fedify-dev/redis" rel="nofollow">@fedify/redis</a> 0.4.0<br><a href="https://github.com/fedify-dev/postgres" rel="nofollow">@fedify/postgres</a> 0.3.0<br><a href="https://github.com/fedify-dev/amqp" rel="nofollow">@fedify/amqp</a> 0.2.0</p><p>If you're using any of these packages, make sure to update them alongside Fedify to take advantage of the more efficient bulk message queueing.</p><p>CLI Improvements</p><p>The Fedify command-line tools have been enhanced with an improved web interface for the <a href="https://fedify.dev/cli#fedify-inbox-ephemeral-inbox-server" rel="nofollow">fedify inbox</a> command. We've added the Fedify logo with the cute dinosaur at the top of the page and made it easier to copy the fediverse handle of the ephemeral actor. We've also fixed issues with the web interface when installed via <a href="https://docs.deno.com/runtime/reference/cli/install/" rel="nofollow">deno install</a> from <a href="https://jsr.io/@fedify/cli" rel="nofollow">JSR</a>.</p><p>Additional Improvements and Bug Fixes</p><p>Updated dependencies, including @js-temporal/polyfill to 0.5.0 for Node.js and Bun<br>Fixed bundler errors with uri-template-router on Rollup<br>Improved error handling and logging for document loader when KV store operations fail<br>Added more log messages using the LogTape library<br>Internalized the multibase package for better maintenance and compatibility</p><p>For the complete list of changes, please refer to the <a href="https://github.com/fedify-dev/fedify/releases/tag/1.5.0" rel="nofollow">changelog</a>.</p><p>To update to Fedify 1.5.0, run:</p><p># For Denodeno add jsr:@fedify/[email protected]# For npmnpm add @fedify/[email protected]# For Bunbun add @fedify/[email protected]</p><p>Thank you to all contributors who helped make this release possible!</p><p><a href="/tags/fedidev/" rel="tag">#fedidev</a> <a href="/tags/fediverse/" rel="tag">#fediverse</a></p>
1
<p>读过 <a href="https://neodb.social/search?r=1&q=https://neodb.social/book/7NnTbp0ZX0Yh6yQ73fKdTB" rel="nofollow">X-Force, Vol. 1</a> 🌕🌕🌕🌗🌑 <br><a href="/tags/1/" rel="tag">#1</a>-6:Xeno绑架多米诺并植皮刺杀教授事件;人造人工厂;X-force的组建(Mutant CIA lol);卡西迪和K岛的逐渐融合像个伏笔;telefloronics;Terra Verde和K岛的签署风波;野兽“灵活”的道德标准说实话有点吓人,指挥家比喻一记丧钟似的敲在结尾。这本有些地方画得血呲呼啦的,被砍得只剩上半身的老狼竟然还能爬着杀人😂但复仇的多米诺超帅的!老万做的Cerebro Sword秀一脸,结果后来泽维尔的自白果然又在Play Father Play God,说K岛需要一场珍珠港事件我真是醉了,只能说迟早要完。<br></p>
<p>读过 <a href="https://neodb.social/search?r=1&q=https://neodb.social/book/3gMmKrUfK2VhAChlDwjw15" rel="nofollow">Wolverine by Benjamin Percy Vol. 1</a> 🌕🌕🌕🌗🌑 <br><a href="/tags/1/" rel="tag">#1</a>-5:Pale girl和老狼各种我预判了你的预判;克拉科亚花瓣被滥用制成毒品;吸血鬼看上老狼的血,红色欧米茄受德古拉要挟。没错,叉人宇宙竟然还有吸血鬼的存在……给老狼脖子上叉根吸管使劲喝真的笑死我了,血液无限量自助是吧!这期更搞的是老狼偷了老万的头盔后宁静议会专门开了庭处理这个事儿,老万先退一步说不想追究之后老狼继续挑衅:我还用你这头盔当过尿壶🤣老狼误杀琴之后射竟然只是去复活点看了看啥也没说就走了,果然吧没有了死亡之后也就不存在激烈的爱和恨了。(但想想教授死而复活后的老万,虽然情形不太一样但是呵呵看不懂)老狼独白里说在K岛上待着觉得很压抑仿佛处处受监视那段写挺好,结果直接偷偷藏个传送门到加拿大,只能说极寒之地是老狼的一款man cave哈哈哈<br></p>
<p>cash; Clever Counting CSS Queries; Crazy CSS Cursors</p><p>Programming note: I’m both headed out west to hang with <a href="/tags/1/" rel="tag">#1</a> for a week, and am fairly devastated with what just happened to the U.S. and what’s left of the world order. Drops will likely be intermittent until I get back a week from this Thursday, and I’ll also very likely be taking an extended social media hiatus (save for the auto-posts of the Drop to Mastodon, my necessary promotion of the Storm⚡️Watch podcast episodes, and major cyber situations). If the week ends looking like it did at 03:30 ET, today, we’ll be featuring scads of resources on tech for security, safety, privacy, and community.</p><p>Hang in there, folks. Hang in there.</p><p>Also: no section header images today.</p><p>TL;DR</p><p>(This is an AI-generated summary of today’s Drop using Ollama + llama 3.2 and a custom Modelfile.)</p><p>Cash is a lightweight JavaScript library that simplifies DOM manipulation and provides jQuery-like functionality, weighing in at just 5.2KB when minified and gzipped (<a href="https://github.com/fabiospampinato/cash?tab=readme-ov-file" rel="nofollow" class="ellipsis" title="github.com/fabiospampinato/cash?tab=readme-ov-file"><span class="invisible">https://</span><span class="ellipsis">github.com/fabiospampinato/cas</span><span class="invisible">h?tab=readme-ov-file</span></a>).<br>The CSS :has() selector enables powerful quantity queries to style containers differently based on their number of child elements, facilitating more aesthetically pleasing layouts (<a href="https://css-tip.com/quantity-queries/" rel="nofollow"><span class="invisible">https://</span>css-tip.com/quantity-queries/</a>).<br>Custom CSS cursors can be used to display a website’s favicon when hovering over external links, but this approach faces usability issues, security concerns, and performance implications that make it problematic for production use (<a href="https://shkspr.mobi/blog/2024/10/using-a-css-cursor-to-show-the-external-links-favicon/" rel="nofollow" class="ellipsis" title="shkspr.mobi/blog/2024/10/using-a-css-cursor-to-show-the-external-links-favicon/"><span class="invisible">https://</span><span class="ellipsis">shkspr.mobi/blog/2024/10/using</span><span class="invisible">-a-css-cursor-to-show-the-external-links-favicon/</span></a>).</p><p>cash</p><p>While you 100% <a href="https://github.com/you-dont-need-x/you-dont-need-jquery" rel="nofollow">do not need jQuery</a>, one has to admit the diminuitive $ syntax was both novel and helpful during that heyday period of the web. And, there are some things you could do succinctly in jQuery that are still a bit verbose/clunky in modern JS.</p><p><a href="https://github.com/fabiospampinato/cash?tab=readme-ov-file" rel="nofollow">Cash</a> is a lightweight JavaScript library designed to simplify DOM manipulation and provide jQuery-like functionality with a smaller footprint. It offers a concise API that closely mirrors jQuery’s syntax, making it an attractive option for folks who are familiar with jQuery but want a more streamlined alternative.</p><p>The library is particularly useful for projects that require basic DOM manipulation and don’t need the full feature set of jQuery. Cash weighs in at just 5.2KB when minified and gzipped, which is significantly smaller than jQuery’s 30KB. This size difference can lead to faster load times and improved performance, especially on mobile devices or in situations with limited bandwidth.</p><p>Cash supports modern browsers, including Chrome, Firefox, Safari, and Edge, as well as IE11 with a polyfill. It implements a subset of jQuery’s most commonly used methods, focusing on core functionality like element selection, traversal, manipulation, and event handling. This approach allows developers to leverage familiar jQuery patterns without the overhead of unused features.</p><p>It provides methods for adding, removing, and modifying elements in the DOM. Developers can easily create, insert, and delete elements, as well as modify their attributes and content. It also includes support for attaching and removing event listeners, as well as triggering events programmatically. This functionality is crucial for creating interactive web applications.</p><p>While not as extensive as jQuery’s AJAX implementation, Cash offers basic AJAX functionality for making HTTP requests and handling responses. It does maintain jQuery’s chainable syntax, allowing developers to perform multiple operations on selected elements in a single statement. This leads to more concise and readable code.</p><p>Integrating Cash into a project is pretty easy. Just include it via a CDN or install it using npm. The library exposes a global $ function, which serves as the main entry point for selecting elements and invoking Cash methods.</p><p>Clever Counting CSS Queries</p><p><p>Feel empowered to skip my summary blathering and just head to <a href="https://css-tip.com/quantity-queries/" rel="nofollow">here</a> and <a href="https://piccalil.li/blog/making-content-aware-components-using-css-has-grid-and-quantity-queries/" rel="nofollow">here</a> for expanded expository on this clever use of element counting to facilitate more aesthetically pleasing layouts.</p></p><p>The CSS :has() selector enables powerful quantity queries that let you style containers differently based on their number of child elements. This capability is particularly useful when building content-aware components that need to adapt their layout based on the quantity of items they contain.</p><p>The basic pattern for quantity queries uses a combination of :has() and nth-child selectors:</p><p>.container:has(> :nth-last-child(3):nth-child(-n + 8)) { /* styles applied when container has between 3-8 children */}</p><p>Two particularly useful patterns handle even/odd numbers of children:</p><p>/* Even number of children */.container:has(> :last-child:nth-child(even)) { grid-template-columns: repeat(2, 1fr);}/* Odd number of children */.container:has(> :last-child:nth-child(odd)) { grid-template-columns: repeat(3, 1fr);}</p><p>These queries are super helpful when building responsive grid layouts that need to adjust based on content quantity. For example, you might want a different column arrangement when there are fewer than 3 items versus more than 6 items.</p><p>The real power comes from combining quantity queries with CSS Grid or Flexbox, allowing for truly adaptive layouts that respond not just to viewport size but to the actual content quantity. This creates more resilient components that maintain visual harmony regardless of their content amount.</p><p>Crazy CSS Cursors</p><p>Terence Eden has <a href="https://shkspr.mobi/blog/2024/10/using-a-css-cursor-to-show-the-external-links-favicon/" rel="nofollow">a fun post</a> describing an intriguing CSS technique that uses custom cursors to display a website’s favicon when hovering over external links. The implementation leverages CSS’s cursor property to load a favicon URL from DuckDuckGo’s icon service, displaying it as the mouse cursor when hovering over links.</p><p>The approach combines two key components: CSS cursor styles and favicon services. The CSS cursor property accepts custom image URLs along with a fallback cursor value. DuckDuckGo’s icon service provides favicons by domain, making implementation straightforward with inline CSS like:</p><p><a href="<a href="https://google.com/" rel="nofollow"><span class="invisible">https://</span>google.com/</a>" style='cursor:url("<a href="https://icons.duckduckgo.com/ip9/google.com.ico" rel="nofollow" class="ellipsis" title="icons.duckduckgo.com/ip9/google.com.ico"><span class="invisible">https://</span><span class="ellipsis">icons.duckduckgo.com/ip9/googl</span><span class="invisible">e.com.ico</span></a>"), auto;'> Visit this website</a></p><p>While clever, this technique faces several significant challenges that make it problematic for production use. Custom cursors can create usability issues and frustrate users by making click targets less obvious. The approach doesn’t work on mobile devices, and not all users will recognize website favicons, potentially reducing rather than enhancing the user experience.</p><p>Loading remote images as cursors also introduces security considerations — if a referenced site is compromised, malicious images could be served. And, there are performance implications, as each cursor change triggers an additional HTTP request. Browser compatibility adds complexity, with different maximum supported cursor image sizes and inconsistent behavior across platforms.</p><p>For indicating external links, traditional approaches like appending “(Wikipedia)” or using subtle icons next to links remain more accessible and reliable. These conventional patterns benefit from widespread user familiarity and don’t suffer from the technical limitations and potential security issues of cursor-based solutions.</p><p>Still, it’s kind of fun to see it in action while marveling at yet one more clever thing you can do with just CSS.</p><p>FIN</p><p>Remember, you can follow and interact with the full text of The Daily Drop’s free posts on Mastodon via <span class="h-card"><a href="https://dailydrop.hrbrmstr.dev" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>dailydrop.hrbrmstr.dev</span></a></span> ☮️</p><p><a href="https://dailydrop.hrbrmstr.dev/2024/11/06/drop-551-2024-11-06-web-slinging-wednesday/" rel="nofollow" class="ellipsis" title="dailydrop.hrbrmstr.dev/2024/11/06/drop-551-2024-11-06-web-slinging-wednesday/"><span class="invisible">https://</span><span class="ellipsis">dailydrop.hrbrmstr.dev/2024/11</span><span class="invisible">/06/drop-551-2024-11-06-web-slinging-wednesday/</span></a></p><p><a href="/tags/1/" rel="tag">#1</a></p>
<p>opstr; go-icu-regex; Intl.NumberFormat</p><p><p>U.S. Folk: REMEMBER TO VOTE THIS WEEK!</p></p><p><a href="https://icu.unicode.org/" rel="nofollow">ICU</a> (International Components for Unicode) is a comprehensive set of C/C++ and Java libraries that provide essential Unicode and globalization support for software applications. The project recently announced <a href="https://unicode-org.github.io/icu/download/76.html" rel="nofollow">ICU 76</a> release candidate, which brings Unicode 16 support and CLDR 46 locale data updates.</p><p>It began as part of <a href="https://en.wikipedia.org/wiki/Taligent" rel="nofollow">Taligent</a>, a joint Apple-IBM venture in the 1990s, before becoming an IBM project and eventually being open-sourced in 1999.</p><p>ICU excels at character set conversion, offering arguably the most complete charset data available, built upon decades of IBM’s collection efforts. The library provides sophisticated text handling capabilities including collation based on the [Unicode Collation Algorithm], locale-aware formatting for numbers and dates, and extensive timezone calculations.</p><p>The framework offers both C++ (ICU4C) and Java (ICU4J) implementations. ICU4C fills critical gaps in C/C++ environments that lack robust Unicode support, while ICU4J extends Java’s built-in internationalization capabilities with enhanced performance and newer Unicode standard compliance. The C/C++ versions are used as bridges to ICU in <a href="https://icu.unicode.org/related" rel="nofollow">many other programming languages</a>.</p><p>Lots of familiar names rely heavily on ICU, including:</p><p>Apple integrates it across macOS, iOS, watchOS, and tvOS<br>Google employs it in Chrome/ChromeOS, Android, and core web services<br>Microsoft uses it in Visual Studio Code and Windows Bridge for iOS<br>Adobe implements it throughout Creative Cloud and Document Cloud</p><p>The upcoming <a href="https://unicode-org.github.io/icu/download/76.html" rel="nofollow">ICU 76</a> introduces significant improvements, including direct formatting support for java.time types and modernized C++ and Java patterns. The release also achieves near-perfect alignment between <a href="https://cldr.unicode.org/index/cldr-spec/collation-guidelines" rel="nofollow">CLDR</a> and Unicode default sort orders.</p><p>In today’s Bonus Drop, we’re covering a few resources that make use of ICU.</p><p>TL;DR</p><p>(This is an AI-generated summary of today’s Drop using Ollama + llama 3.2 and a custom model.)</p><p>This Drop proved somewhat challenging to my custom TL;DR model on the 16GB M1 Mac Mini’s Ollama server. It did the job, but the number of input tokens — and, very likely, the giant bullet list and big blocks of source code — caused it to operate very slowly. I’ll be glad to get it re-setup on the forthcoming M4 Mini (which comes next week while, sadly, I’m AFK).</p><p><a href="https://github.com/typho/opstr" rel="nofollow">opstr</a> is a command-line utility that provides convenient access to common string operations, including Unicode-aware manipulations.<br>The <a href="https://github.com/dolthub/go-icu-regex/tree/main" rel="nofollow">go-icu-regex</a> project is a Go implementation of ICU regular expressions, providing a drop-in replacement for Go’s standard regexp package.<br>The <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat" rel="nofollow">Intl.NumberFormat</a> in JavaScript provides robust support for formatting numeric output, including various notation styles and currency formats.</p><p>opstr</p><p><a href="https://github.com/typho/opstr" rel="nofollow">opstr</a> is a command-line utility written in Rust that provides convenient access to common string operations. The tool let us perform Unicode-aware string manipulations directly from the shell without resorting to icky Python scripts or bloated web applications.</p><p>It accepts UTF-8 strings as input and offers locale-aware operations when configured with proper Unicode data. It can be installed via Cargo or downloaded as a pre-built binary (for some platforms) from the project’s releases page.</p><p>The tool’s behavior can be customized through environment variables rather than command-line flags. These include settings for output radix, hexadecimal case formatting, color schemes, and locale preferences. For locale-specific operations, you’ll need to generate your own locale data using <a href="https://crates.io/crates/icu4x-datagen" rel="nofollow">icu4x-datagen</a>, as the default installation only supports en-US to help keep the binary size as small as possible. The README provides an example, but note that said tool is also deprecated. I haven’t poked at the equivalent in <a href="https://docs.rs/icu_segmenter/latest/icu_segmenter/" rel="nofollow">its replacement</a>, since I don’t really need to do much outside of what it supports by default.</p><p>Incantations with it take a bitof getting used to, such as how you get stdin to the operations:</p><p>$ opstr --op lorem-ipsum 4 | \ opstr --stdin-as-arg 1 --op base64-encode 1TG9yZW0gaXBzdW0gaXVudSBwdHVsb3IgZXJlb2x1c3RlIHVtZGV0ai4K</p><p>And, whilt --stdin-as-arg works in many of the --op contexts, you sometimes have to do things lke this:</p><p>$ opstr --op join ", " $(opstr --op lorem-ipsum 4)Lorem, ipsum, oremau, yadi, miut, etum.</p><p>We’re covering the tool since it has a bonkers number of ops:</p><p>base64-decode: base64 decoding of provided hexadecimal string <a href="/tags/1/" rel="tag">#1</a><br>base64-encode: base64 encoding of provided string <a href="/tags/1/" rel="tag">#1</a><br>base64-url-safe-decode: base64 decoding of provided string <a href="/tags/1/" rel="tag">#1</a> with URL-appropriate representation (c.f. RFC 3548)<br>base64-url-safe-encode: base64 encoding of provided string <a href="/tags/1/" rel="tag">#1</a> with URL-appropriate representation (c.f. RFC 3548)<br>camelcase: turn <a href="/tags/1/" rel="tag">#1</a> to lowercase and replace the ASCII character after ‘ ‘ or ‘_’ sequences with an uppercase letter<br>center: put string <a href="/tags/1/" rel="tag">#1</a> in the middle of string of width <a href="/tags/2/" rel="tag">#2</a> (default 80) repeating char <a href="/tags/3/" rel="tag">#3</a> (default #) on both sides<br>codepoint-frequencies: return the frequency analysis per codepoint of string <a href="/tags/1/" rel="tag">#1</a><br>codepoint-lookup: given the Unicode name as string <a href="/tags/1/" rel="tag">#1</a> (e.g. “LATIN SMALL LETTER A”), return its UTF-8 representation (or an empty string, if unknown)<br>codepoints: represent string <a href="/tags/1/" rel="tag">#1</a> with Unicode codepoints as integers, e.g. [72, 105, 10069]<br>codepoints-names: look up the Unicode name (or ‘unknown-name’ if unknown) of each codepoint of string <a href="/tags/1/" rel="tag">#1</a>, e.g. [“LATIN SMALL LETTER H”, “LATIN SMALL LETTER DOTLESS ”]<br>codepoints-unotation: represent string <a href="/tags/1/" rel="tag">#1</a> with Unicode codepoints, e.g. [“U+0048”, “U+0069”]<br>concatenate: concatenate all provided strings<br>count-codepoints: return the number of Unicode scalars in the Unicode string <a href="/tags/1/" rel="tag">#1</a><br>count-grapheme-clusters: return number of “Grapheme clusters” in string <a href="/tags/1/" rel="tag">#1</a> according to Unicode Standard Annex 29 “Unicode Text Segmentation”<br>count-substring: how often does string <a href="/tags/2/" rel="tag">#2</a> non-overlappingly occur in string <a href="/tags/1/" rel="tag">#1</a>?<br>count-utf16-bytes: encode string <a href="/tags/1/" rel="tag">#1</a> in UTF-16 and return its number of bytes<br>count-utf8-bytes: encode string <a href="/tags/1/" rel="tag">#1</a> in UTF-8 and return its number of bytes<br>dedent: identify and remove common indentation among all non-empty lines of string <a href="/tags/1/" rel="tag">#1</a><br>dedent-with-substring: remove prefix string <a href="/tags/2/" rel="tag">#2</a> at the beginning of every line of string <a href="/tags/1/" rel="tag">#1</a><br>digest-md5: generate the MD5 hexadecimal digest of the given UTF-8 string <a href="/tags/1/" rel="tag">#1</a><br>digest-sha1: generate the SHA1 hexadecimal digest of the given UTF-8 string <a href="/tags/1/" rel="tag">#1</a><br>digest-sha256: generate the SHA256 hexadecimal digest of the given UTF-8 string <a href="/tags/1/" rel="tag">#1</a><br>digest-sha3-256: generate the SHA3-256 hexadecimal digest of the given UTF-8 string <a href="/tags/1/" rel="tag">#1</a><br>emoji-by-name: given a Emoji Sequence Data (UTS <a href="/tags/51/" rel="tag">#51</a>) description string <a href="/tags/1/" rel="tag">#1</a> return the corresponding emoji (e.g. ‘smiling face with halo’ returns ‘😇’)<br>format: replace {placeholders} in string <a href="/tags/1/" rel="tag">#1</a> with consecutive arguments <a href="/tags/2/" rel="tag">#2</a>, <a href="/tags/3/" rel="tag">#3</a>, …<br>grapheme-clusters: return “Grapheme clusters” of string <a href="/tags/1/" rel="tag">#1</a> according to Unicode Standard Annex 29 “Unicode Text Segmentation”<br>guarantee-prefix: if string <a href="/tags/1/" rel="tag">#1</a> does not start with string <a href="/tags/2/" rel="tag">#2</a>, prepend it<br>guarantee-suffix: if string <a href="/tags/1/" rel="tag">#1</a> does not end with string <a href="/tags/2/" rel="tag">#2</a>, append it<br>human-readable-bytes: represent integer <a href="/tags/1/" rel="tag">#1</a> (as 1024-based count of bytes) in a human-readable manner likely with two decimal points<br>indent-with-substring: concatenate string <a href="/tags/2/" rel="tag">#2</a> with every non-empty line in string <a href="/tags/1/" rel="tag">#1</a>, keep other lines<br>is-ascii: does this string <a href="/tags/1/" rel="tag">#1</a> only contain ASCII characters?<br>is-caseinsensitively-equal: do all Unicode strings have the same byte sequence after ASCII lowercasing?<br>is-contained: does string <a href="/tags/1/" rel="tag">#1</a> contain string <a href="/tags/2/" rel="tag">#2</a>?<br>is-crlf-lineterminated: is (U+000D CARRIAGE RETURN)(U+000A LINE FEED) the only sequence causing line breaks in string <a href="/tags/1/" rel="tag">#1</a>?<br>is-empty: does this string <a href="/tags/1/" rel="tag">#1</a> have length zero?<br>is-equal: do all Unicode strings have the same byte sequence?<br>is-lf-lineterminated: is U+000A LINE FEED the only character causing line breaks in string <a href="/tags/1/" rel="tag">#1</a>?<br>is-prefix: does string <a href="/tags/1/" rel="tag">#1</a> start with string <a href="/tags/2/" rel="tag">#2</a>?<br>is-suffix: does string <a href="/tags/1/" rel="tag">#1</a> end with string <a href="/tags/2/" rel="tag">#2</a>?<br>is-whitespace: does the provided string <a href="/tags/1/" rel="tag">#1</a> only contain codepoints in the Unicode Whitespace category?<br>is-whitespace-agnostically-equal: are all strings equal if we ignore any whitespace characters?<br>join: join all following strings with string <a href="/tags/1/" rel="tag">#1</a><br>length-maximum: return the first string among the longest strings<br>length-minimum: return the first string among the shortest strings<br>levensthein-distance: levensthein distance between strings <a href="/tags/1/" rel="tag">#1</a> and <a href="/tags/2/" rel="tag">#2</a><br>linebreak-before: linebreak long lines in (text <a href="/tags/1/" rel="tag">#1</a>) before they reach (integer <a href="/tags/2/" rel="tag">#2</a>) codepoints<br>lines-shortened: shorten lines in string <a href="/tags/1/" rel="tag">#1</a>, if necessary, not to exceed width <a href="/tags/2/" rel="tag">#2</a><br>lorem-ipsum: generate (int <a href="/tags/1/" rel="tag">#1</a>) words of an Lorem Ipsum text<br>lowercase-for-ascii: get locale-independent/ASCII lowercase version of string <a href="/tags/1/" rel="tag">#1</a><br>normalize-with-nfc: NFC-normalize Unicode string <a href="/tags/1/" rel="tag">#1</a> which applies canonical decomposition followed by canonical composition (c.f. UAX <a href="/tags/15/" rel="tag">#15</a>)<br>normalize-with-nfd: NFD-normalize Unicode string <a href="/tags/1/" rel="tag">#1</a> which applies canonical decomposition (c.f. UAX <a href="/tags/15/" rel="tag">#15</a>)<br>normalize-with-nfkc: NFKC-normalize Unicode string <a href="/tags/1/" rel="tag">#1</a> which applies compatibility decomposition followed by canonical composition (c.f. UAX <a href="/tags/15/" rel="tag">#15</a>)<br>normalize-with-nfkd: NFKD-normalize Unicode string <a href="/tags/1/" rel="tag">#1</a> which applies compatibility decomposition followed by canonical composition (c.f. UAX <a href="/tags/15/" rel="tag">#15</a>)<br>regex-search: does regex pattern <a href="/tags/1/" rel="tag">#1</a> occur anywhere inside <a href="/tags/2/" rel="tag">#2</a>? if so, return matching substring, otherwise empty string<br>remove-ansi-escape-sequences: remove any ANSI X3.64 (also found in ECMA-48/ISO 6429) sequences in string <a href="/tags/1/" rel="tag">#1</a> starting with U+001B ESCAPE<br>repeat: repeat string <a href="/tags/1/" rel="tag">#1</a> several (integer <a href="/tags/2/" rel="tag">#2</a>) times<br>replace: replace string <a href="/tags/2/" rel="tag">#2</a> with string <a href="/tags/3/" rel="tag">#3</a> in string <a href="/tags/1/" rel="tag">#1</a><br>sentence-clusters: return “Sentence clusters” according to Unicode Standard Annex <a href="/tags/29/" rel="tag">#29</a> “Unicode Text Segmentation”<br>similarity: indicate similarity (0 = not, 100 = equal) of two strings with a number between 0 and 100<br>skip-prefix: remove string <a href="/tags/2/" rel="tag">#2</a> from the beginning of string <a href="/tags/1/" rel="tag">#1</a> if it exists<br>skip-suffix: remove string <a href="/tags/2/" rel="tag">#2</a> from the end of string <a href="/tags/1/" rel="tag">#1</a> if it exists<br>sort: sort the strings provided<br>sort-lexicographically: sort the strings provided lexicographically by their Unicode codepoints<br>split: split string <a href="/tags/1/" rel="tag">#1</a> by any of the provided substrings <a href="/tags/2/" rel="tag">#2</a>, or <a href="/tags/3/" rel="tag">#3</a>, or …<br>split-by-whitespaces: split string <a href="/tags/1/" rel="tag">#1</a> by any character of Unicode category Whitespace<br>split-by-whitespaces-limited-at-end: split at most <a href="/tags/2/" rel="tag">#2</a> times from the end of the string <a href="/tags/1/" rel="tag">#1</a> by any character of Unicode category Whitespace<br>split-by-whitespaces-limited-at-start: split at most <a href="/tags/2/" rel="tag">#2</a> times at the start of the string <a href="/tags/1/" rel="tag">#1</a> by any character of Unicode category Whitespace<br>strike-through: add U+0336 COMBINING LONG STROKE OVERLAY before each codepoint resulting in strike-through text<br>strip-codepoints: strip codepoints found in string <a href="/tags/2/" rel="tag">#2</a> from start or end of string <a href="/tags/1/" rel="tag">#1</a><br>strip-codepoints-at-end: strip codepoints found in string <a href="/tags/2/" rel="tag">#2</a> from end of string <a href="/tags/1/" rel="tag">#1</a><br>strip-codepoints-at-start: strip codepoints found in string <a href="/tags/2/" rel="tag">#2</a> from start of string <a href="/tags/1/" rel="tag">#1</a><br>strip-whitespaces: strip whitespaces from start and end of string <a href="/tags/1/" rel="tag">#1</a><br>strip-whitespaces-at-end: strip whitespaces from end of string<br>strip-whitespaces-at-start: strip whitespaces from start of string<br>subscript: return the subscript version of the provided string <a href="/tags/1/" rel="tag">#1</a><br>substring-byte-indices: return the byte indices where string <a href="/tags/2/" rel="tag">#2</a> can be found in string <a href="/tags/1/" rel="tag">#1</a><br>superscript: return the superscript version of the provided string <a href="/tags/1/" rel="tag">#1</a><br>uppercase-for-ascii: get locale-independent/ASCII uppercase version of string <a href="/tags/1/" rel="tag">#1</a><br>utf16-big-endian-bytes: encode string <a href="/tags/1/" rel="tag">#1</a> in UTF-16 and return its bytes in big endian order<br>utf16-little-endian-bytes: encode string <a href="/tags/1/" rel="tag">#1</a> in UTF-16 and return its bytes in little endian order<br>utf8-bytes: encode string <a href="/tags/1/" rel="tag">#1</a> in UTF-8 and return its bytes<br>word-clusters: return “Word clusters” of string <a href="/tags/1/" rel="tag">#1</a> according to Unicode Standard Annex 29 “Unicode Text Segmentation”<br>xml-decode: replace the 5 pre-defined XML entities with their unescaped characters &<>”‘ in string <a href="/tags/1/" rel="tag">#1</a><br>xml-encode: replace the 5 characters &<>”‘ with their pre-defined XML entities in string <a href="/tags/1/" rel="tag">#1</a></p><p>It also has some guidelines for folks who want to add more ICU ops.</p><p>This is the CLI equivalent to R’s spiffy {stringi} library, which I use pretty much every day at work.</p><p>go-icu-regex</p><p>The <a href="https://github.com/dolthub/go-icu-regex/tree/main" rel="nofollow">go-icu-regex</a> project is a Go implementation of ICU regular expressions that provides a drop-in replacement for Go’s standard regexp package. This library is hand for when we need Unicode-aware regular expressions that behave consistently across different platforms and programming languages. In other news, it’s 2024 and I still have to re-remember what types of regex are supported in each of the languages I use in a given week (if I want to avoid extra dependencies). This is why we can’t have nice things.</p><p>The package maintains API compatibility with Go’s regexp while implementing the ICU regular expression specification. This means we can use it as a direct replacement in existing Go code that uses the standard library’s regex implementation.</p><p>The implementation wraps the ICU4C library’s regular expression engine. It includes support for Unicode Technical Standard <a href="/tags/18/" rel="tag">#18</a> (Unicode Regular Expressions) and maintains compatibility with other ICU implementations across different programming languages.</p><p>This library is especially useful when:</p><p>We need consistent regex behavior across multiple programming languages<br>Our apps requires advanced Unicode support beyond Go’s native capabilities<br>We’re porting applications that rely on ICU regex behavior to Go</p><p>Since this is a wrapper around ICU4C, there may be some performance overhead compared to Go’s native implementation. However, this tradeoff is often worth it when Unicode compliance and cross-platform consistency are primary requirements. It also means it’s not a “pure Go” library. So much for CISA’s “Use memory-safe languages, like Go” annoying mantra (both Rust and Go can be as unsafe as C/C++).</p><p>Intl.NumberFormat</p>Photo by Black ice on <a href="https://www.pexels.com/photo/lots-of-numbers-1314543/" rel="nofollow">Pexels.com</a><p>I cannot count the number of times I’ve made functions, across many modern languages, to format numeric output. The ICU-powered <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat" rel="nofollow">Intl.NumberFormat</a> in JavaScript (and, in different forms in some other languages) provides robust support for such operations.</p><p>I’ve included a bunch in the remainder of this section which was generated from <a href="https://rud.is/dl/numfmt.ibynb" rel="nofollow">this notebook</a>. To get the same output locally — assuming you have Jupyter instaleld — you can do the following:</p><p>$ # get Deno from <a href="https://deno.land/$" rel="nofollow"><span class="invisible">https://</span>deno.land/$</a> # install the kernel$ deno jupyter --unstable --install$ cd to-somewhere-safe-to-download-things$ curl --silent --output numfmt.ibynb <a href="https://rud.is/dl/numfmt.ibynb$" rel="nofollow"><span class="invisible">https://</span>rud.is/dl/numfmt.ibynb$</a> # prbly shld make sure I'm not pwning you by viewing the notebook$ # never run untrusted code without looking at the source, first$ jupyter \ nbconvert \ --to markdown \ --execute \ --ExecutePreprocessor.kernel_name=deno \ numfmt.ipynb \ --stdout</p><p>macOS folk may need to do:</p><p>$ ln -s /opt/homebrew/share/jupyter/nbconvert ~/Library/Jupyter</p><p>if you encounter errors.</p><p>Basic number formatting:</p><p>const nf = new Intl.NumberFormat('en');console.log(nf.format(123456.789));console.log(nf.formatToParts(123456.789));</p><p>123,456.789[ { type: "integer", value: "123" }, { type: "group", value: "," }, { type: "integer", value: "456" }, { type: "decimal", value: "." }, { type: "fraction", value: "789" }]</p><p>Notation styles:</p><p>const std = new Intl.NumberFormat('en', { notation: 'standard'});console.log(std.format(9876543.21));</p><p>9,876,543.21</p><p>Sign display:</p><p>const signs = new Intl.NumberFormat('en', { style: 'unit', unit: 'celsius', signDisplay: 'always'});console.log(signs.format(23.5));console.log(signs.format(-5));console.log(signs.format(0));</p><p>+23.5°C-5°C+0°C</p><p>BigInt formatting:</p><p>const bigFormatter = new Intl.NumberFormat('fr');console.log(bigFormatter.format(987654321098765432n));</p><p>987 654 321 098 765 432</p><p>Currency with accounting:</p><p>const money = new Intl.NumberFormat('en', { style: 'currency', currency: 'EUR', signDisplay: 'exceptZero', currencySign: 'accounting'});console.log(money.format(42.42));console.log(money.format(-42.42));console.log(money.format(0));</p><p>+€42.42(€42.42)€0.00</p><p>Units:</p><p>const bytes = new Intl.NumberFormat('en', { style: 'unit', unit: 'megabyte'});console.log(bytes.format(42.5));</p><p>42.5 MB</p><p>const speed = new Intl.NumberFormat('en', { style: 'unit', unit: 'kilometer-per-hour'});console.log(speed.format(88));</p><p>88 km/h</p><p>const compact = new Intl.NumberFormat('en', { notation: 'compact'});console.log(compact.format(9876543.21));</p><p>9.9M</p><p>const scientific = new Intl.NumberFormat('en', { notation: 'scientific'});console.log(scientific.format(9876543.21));</p><p>9.877E6</p><p>const engineering = new Intl.NumberFormat('en', { notation: 'engineering'});console.log(engineering.format(9876543.21));</p><p>9.877E6</p><p>FIN</p><p>Remember, you can follow and interact with the full text of The Daily Drop’s free posts on Mastodon via <span class="h-card"><a href="https://dailydrop.hrbrmstr.dev" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>dailydrop.hrbrmstr.dev</span></a></span> ☮️</p><p><a href="https://dailydrop.hrbrmstr.dev/2024/11/03/bonus-drop-66-2024-11-03-eye-sea-ewe/" rel="nofollow" class="ellipsis" title="dailydrop.hrbrmstr.dev/2024/11/03/bonus-drop-66-2024-11-03-eye-sea-ewe/"><span class="invisible">https://</span><span class="ellipsis">dailydrop.hrbrmstr.dev/2024/11</span><span class="invisible">/03/bonus-drop-66-2024-11-03-eye-sea-ewe/</span></a></p><p><a href="/tags/1/" rel="tag">#1</a> <a href="/tags/15/" rel="tag">#15</a> <a href="/tags/18/" rel="tag">#18</a> <a href="/tags/2/" rel="tag">#2</a> <a href="/tags/29/" rel="tag">#29</a> <a href="/tags/3/" rel="tag">#3</a> <a href="/tags/51/" rel="tag">#51</a></p>
<a href="/tags/snac/" rel="tag">#snac</a> / activitypub noob <a href="/tags/question/" rel="tag">#question</a>:<br><br><p>job fifo size (cur): 655<br>job fifo size (peak): 1291<br>thread <a href="/tags/0/" rel="tag">#0</a> state: waiting<br>thread <a href="/tags/1/" rel="tag">#1</a> state: output<br>thread <a href="/tags/2/" rel="tag">#2</a> state: output<br>thread <a href="/tags/3/" rel="tag">#3</a> state: output<br></p>This number is decreasing over some minutes after I made a post,<br>I assume it is my instance delivering this to all subscribers, is that correct?<br>And the last thread will stay idle to maybe wait for incoming requests, so that they can be answered too?<br>I've never seen another status then waiting or output so far.<br><br>I guess if I post a picture that might then happen and all workers will be busy? Maybe even too busy to keep up?<br><br>Is that assumption about how the waiting worker and what it is for correct?<br><br>If yes I guess I'll increase the threads, if they are intentional low for low ram systems, that's not my issue with snac. (I've not much ram, but I assume snac is by default tuned to be very very very conservative?)<br><br>(adding Pic to simultaneously test my theory)<br><br><a href="/tags/snac2/" rel="tag">#snac2</a><br><br>
<p>finished listening <a href="https://neodb.social/search?r=1&q=https://neodb.social/album/3oBUHJDQdEpgWYb5XAmn3Y" rel="nofollow">Radio DDR</a> 🌕🌕🌕🌕🌕 <br>Feels only right to disqualify this from 2025 Counterforce Mag Best-Of Contendership considering it was my 2024 <a href="/tags/1/" rel="tag">#1</a>, but these Vespa-riding dandies sure made it worth scooping up for a second time. Three more tracks (including the all-time youth banger "I Can't Stop"), and the art looks even better all blown up, all courtesy of the almighty Perennial Records. </p><p>Luckily, the dropped an all new LP, so I suppose I'll settle for dat.<br></p>
<p>读过 <a href="https://neodb.social/search?r=1&q=https://neodb.social/book/25QidPlYhi9dGXY61LrbpO" rel="nofollow">Fantastic Four by Ryan North Vol. 1: Whatever Happened to the Fantastic Four?</a> 🌕🌕🌕🌕🌑 <br><a href="/tags/1/" rel="tag">#1</a>-3特别棒,<a href="/tags/4/" rel="tag">#4</a>-6稍微逊色一些,但整体还是很好看、很抓人,非常适合作为starting point来看<br></p>
<p>finished watching <a href="https://neodb.social/search?r=1&q=https://neodb.social/tv/season/2c5QBUV1feGwuCMiwkMATL" rel="nofollow">Love, Death & Robots Season 3</a> 🌕🌕🌕🌕🌑 <br>Really liked episode <a href="/tags/1/" rel="tag">#1</a> and <a href="/tags/7/" rel="tag">#7</a><br></p>
<p>看过 <a href="https://neodb.social/search?r=1&q=https://neodb.social/movie/2DBlM0xJpwANlES7GyKMXW" rel="nofollow">女友的男友</a> 🌕🌕🌕🌕🌕 <br><a href="/tags/1/" rel="tag">#1</a>.16江南分馆#看得我小脸通红,喜欢,实在是太喜欢了<br></p>
