ActivityPub Viewer

A small tool to view real-world ActivityPub objects as JSON! Enter a URL or username from Mastodon or a similar service below, and we'll send a request with the right Accept header to the server to view the underlying object.

Open in browser →
{ "@context": [ "https://www.w3.org/ns/activitystreams", { "ostatus": "http://ostatus.org#", "atomUri": "ostatus:atomUri", "inReplyToAtomUri": "ostatus:inReplyToAtomUri", "conversation": "ostatus:conversation", "sensitive": "as:sensitive", "toot": "http://joinmastodon.org/ns#", "votersCount": "toot:votersCount" } ], "id": "https://ruby.social/users/nick_evans/outbox?min_id=0&page=true", "type": "OrderedCollectionPage", "next": "https://ruby.social/users/nick_evans/outbox?max_id=109344569058578740&page=true", "prev": "https://ruby.social/users/nick_evans/outbox?min_id=110227552740911876&page=true", "partOf": "https://ruby.social/users/nick_evans/outbox", "orderedItems": [ { "id": "https://ruby.social/users/nick_evans/statuses/110227552740911876/activity", "type": "Announce", "actor": "https://ruby.social/users/nick_evans", "published": "2023-04-19T21:16:16Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://hackers.town/users/requiem", "https://ruby.social/users/nick_evans/followers" ], "object": "https://hackers.town/users/requiem/statuses/110183960079867420" }, { "id": "https://ruby.social/users/nick_evans/statuses/110226913806801341/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-04-19T18:33:46Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/110226913806801341", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/nick_evans/statuses/110226889588902172", "published": "2023-04-19T18:33:46Z", "url": "https://ruby.social/@nick_evans/110226913806801341", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/110226913806801341", "inReplyToAtomUri": "https://ruby.social/users/nick_evans/statuses/110226889588902172", "conversation": "tag:ruby.social,2023-04-19:objectId=20663950:objectType=Conversation", "content": "<p>But it looks like I&#39;ll need to invoke some black magic (e.g. using a C extension or fiddle) to get access to locals captured by a define_method block, e.g:</p><p>re = dynamically_generated_regexp<br />define_method(:bar) {|baz| foo.match? baz }</p><p>I&#39;d hoped they&#39;d be accessible like they are on Proc, via `method.binding` or `method.to_proc.binding`.</p>", "contentMap": { "en": "<p>But it looks like I&#39;ll need to invoke some black magic (e.g. using a C extension or fiddle) to get access to locals captured by a define_method block, e.g:</p><p>re = dynamically_generated_regexp<br />define_method(:bar) {|baz| foo.match? baz }</p><p>I&#39;d hoped they&#39;d be accessible like they are on Proc, via `method.binding` or `method.to_proc.binding`.</p>" }, "attachment": [], "tag": [], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/110226913806801341/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/110226913806801341/replies?min_id=110227725935380009&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/110226913806801341/replies", "items": [ "https://ruby.social/users/nick_evans/statuses/110227725935380009" ] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/110226913806801341/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/110226913806801341/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/110226889588902172/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-04-19T18:27:37Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/110226889588902172", "type": "Note", "summary": null, "inReplyTo": null, "published": "2023-04-19T18:27:37Z", "url": "https://ruby.social/@nick_evans/110226889588902172", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/110226889588902172", "inReplyToAtomUri": null, "conversation": "tag:ruby.social,2023-04-19:objectId=20663950:objectType=Conversation", "content": "<p>I wrote a simple thing to collect most of the regexps defined in a module, to test them with ruby 3.2&#39;s `Regexp.linear_time?`. This could be useful for finding and preventing ReDoS vulnerabilities. In addition to consts it finds hard-coded regexp literals in method defs, even when dynamically defined with eval.<br /><a href=\"https://github.com/ruby/net-imap/blob/master/test/net/imap/regexp_collector.rb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">github.com/ruby/net-imap/blob/</span><span class=\"invisible\">master/test/net/imap/regexp_collector.rb</span></a></p>", "contentMap": { "en": "<p>I wrote a simple thing to collect most of the regexps defined in a module, to test them with ruby 3.2&#39;s `Regexp.linear_time?`. This could be useful for finding and preventing ReDoS vulnerabilities. In addition to consts it finds hard-coded regexp literals in method defs, even when dynamically defined with eval.<br /><a href=\"https://github.com/ruby/net-imap/blob/master/test/net/imap/regexp_collector.rb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">github.com/ruby/net-imap/blob/</span><span class=\"invisible\">master/test/net/imap/regexp_collector.rb</span></a></p>" }, "attachment": [], "tag": [], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/110226889588902172/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/110226889588902172/replies?min_id=110226913806801341&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/110226889588902172/replies", "items": [ "https://ruby.social/users/nick_evans/statuses/110226913806801341" ] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/110226889588902172/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/110226889588902172/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/110170924682757187/activity", "type": "Announce", "actor": "https://ruby.social/users/nick_evans", "published": "2023-04-09T21:15:00Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://eigenmagic.net/users/NewtonMark", "https://ruby.social/users/nick_evans/followers" ], "object": "https://eigenmagic.net/users/NewtonMark/statuses/110110829343753411" }, { "id": "https://ruby.social/users/nick_evans/statuses/109841691373036569/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-02-10T17:46:38Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/joeldrapper" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109841691373036569", "type": "Note", "summary": null, "inReplyTo": null, "published": "2023-02-10T17:46:38Z", "url": "https://ruby.social/@nick_evans/109841691373036569", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/joeldrapper" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109841691373036569", "inReplyToAtomUri": null, "conversation": "tag:ruby.social,2023-02-10:objectId=16898311:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@joeldrapper\" class=\"u-url mention\">@<span>joeldrapper</span></a></span> Whether or not that makes it into ruby, it works very well in your use case IMO. I occasionally use refinements for code like that, where it makes code easier to read in the local use case. E.g, this Regexp#- refinement <a href=\"https://github.com/ruby/net-imap/blob/e5aeeb01e29357267da67e6a4f04ef32e2e0db2f/lib/net/imap/response_parser.rb#L63-L68\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">github.com/ruby/net-imap/blob/</span><span class=\"invisible\">e5aeeb01e29357267da67e6a4f04ef32e2e0db2f/lib/net/imap/response_parser.rb#L63-L68</span></a> wouldn&#39;t be the right implementation for stdlib, but it works well here, IMO.</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@joeldrapper\" class=\"u-url mention\">@<span>joeldrapper</span></a></span> Whether or not that makes it into ruby, it works very well in your use case IMO. I occasionally use refinements for code like that, where it makes code easier to read in the local use case. E.g, this Regexp#- refinement <a href=\"https://github.com/ruby/net-imap/blob/e5aeeb01e29357267da67e6a4f04ef32e2e0db2f/lib/net/imap/response_parser.rb#L63-L68\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">github.com/ruby/net-imap/blob/</span><span class=\"invisible\">e5aeeb01e29357267da67e6a4f04ef32e2e0db2f/lib/net/imap/response_parser.rb#L63-L68</span></a> wouldn&#39;t be the right implementation for stdlib, but it works well here, IMO.</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/joeldrapper", "name": "@joeldrapper" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109841691373036569/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109841691373036569/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109841691373036569/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109841691373036569/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109841691373036569/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109841592092583361/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-02-10T17:21:24Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/noelrap", "https://mastodon.social/users/sparker" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109841592092583361", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/noelrap/statuses/109841573707821614", "published": "2023-02-10T17:21:24Z", "url": "https://ruby.social/@nick_evans/109841592092583361", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/noelrap", "https://mastodon.social/users/sparker" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109841592092583361", "inReplyToAtomUri": "https://ruby.social/users/noelrap/statuses/109841573707821614", "conversation": "tag:ruby.social,2023-02-10:objectId=16901078:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> However modern irb&#39;s tab-completion menu make the &quot;alternate input method&quot; unnecessary. That makes debugging🔍 more usable (yay), but also extremely_dangerous💣 (oh well).</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> However modern irb&#39;s tab-completion menu make the &quot;alternate input method&quot; unnecessary. That makes debugging🔍 more usable (yay), but also extremely_dangerous💣 (oh well).</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/noelrap", "name": "@noelrap" }, { "type": "Mention", "href": "https://mastodon.social/users/sparker", "name": "@sparker@mastodon.social" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109841592092583361/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109841592092583361/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109841592092583361/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109841592092583361/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109841592092583361/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109841566231180218/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-02-10T17:14:49Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/noelrap", "https://mastodon.social/users/sparker" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109841566231180218", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/noelrap/statuses/109841360682083441", "published": "2023-02-10T17:14:49Z", "url": "https://ruby.social/@nick_evans/109841566231180218", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/noelrap", "https://mastodon.social/users/sparker" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109841566231180218", "inReplyToAtomUri": "https://ruby.social/users/noelrap/statuses/109841360682083441", "conversation": "tag:ruby.social,2023-02-10:objectId=16901078:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> <br />Since it makes me smile to read it, but I&#39;ve been reluctant to use in production code, how about for special circumstances code that you want people to think twice about using... force them to copy/paste or use an alternate input method:</p><p>def experimental🧪 = :incomplete_spikes_and_hacks<br />def debugging🔍 = :inspecting_internal_details<br />def extremely_dangerous💣 = someone set up us the 💣</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> <br />Since it makes me smile to read it, but I&#39;ve been reluctant to use in production code, how about for special circumstances code that you want people to think twice about using... force them to copy/paste or use an alternate input method:</p><p>def experimental🧪 = :incomplete_spikes_and_hacks<br />def debugging🔍 = :inspecting_internal_details<br />def extremely_dangerous💣 = someone set up us the 💣</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/noelrap", "name": "@noelrap" }, { "type": "Mention", "href": "https://mastodon.social/users/sparker", "name": "@sparker@mastodon.social" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109841566231180218/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109841566231180218/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109841566231180218/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109841566231180218/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109841566231180218/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109841512325564024/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-02-10T17:01:06Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.online/users/swindsor", "https://ruby.social/users/noelrap" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109841512325564024", "type": "Note", "summary": null, "inReplyTo": "https://mastodon.online/users/swindsor/statuses/109841213353578351", "published": "2023-02-10T17:01:06Z", "url": "https://ruby.social/@nick_evans/109841512325564024", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.online/users/swindsor", "https://ruby.social/users/noelrap" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109841512325564024", "inReplyToAtomUri": "https://mastodon.online/users/swindsor/statuses/109841213353578351", "conversation": "tag:ruby.social,2023-02-10:objectId=16901078:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.online/@swindsor\" class=\"u-url mention\">@<span>swindsor</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> it&#39;s a perfectly valid ruby identifier. _any_ non-ASCII chars will work.<br />irb(main):001:0&gt; def foo‽ = :bar‽<br />=&gt; :foo‽<br />irb(main):002:0&gt; foo‽<br />=&gt; :bar‽</p><p>But... none of the recommended constrains in <a href=\"https://unicode.org/reports/tr31/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"\">unicode.org/reports/tr31/</span><span class=\"invisible\"></span></a> are implemented. Wanna be evil and use U+2063 (Invisible Separator)?</p><p>irb(main):004:0&gt; :foo == :foo⁣<br />=&gt; false</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.online/@swindsor\" class=\"u-url mention\">@<span>swindsor</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> it&#39;s a perfectly valid ruby identifier. _any_ non-ASCII chars will work.<br />irb(main):001:0&gt; def foo‽ = :bar‽<br />=&gt; :foo‽<br />irb(main):002:0&gt; foo‽<br />=&gt; :bar‽</p><p>But... none of the recommended constrains in <a href=\"https://unicode.org/reports/tr31/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"\">unicode.org/reports/tr31/</span><span class=\"invisible\"></span></a> are implemented. Wanna be evil and use U+2063 (Invisible Separator)?</p><p>irb(main):004:0&gt; :foo == :foo⁣<br />=&gt; false</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://mastodon.online/users/swindsor", "name": "@swindsor@mastodon.online" }, { "type": "Mention", "href": "https://ruby.social/users/noelrap", "name": "@noelrap" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109841512325564024/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109841512325564024/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109841512325564024/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109841512325564024/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109841512325564024/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109841324391762513/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-02-10T16:13:19Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/sparker", "https://ruby.social/users/noelrap" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109841324391762513", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/nick_evans/statuses/109841314802281184", "published": "2023-02-10T16:13:19Z", "url": "https://ruby.social/@nick_evans/109841324391762513", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/sparker", "https://ruby.social/users/noelrap" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109841324391762513", "inReplyToAtomUri": "https://ruby.social/users/nick_evans/statuses/109841314802281184", "conversation": "tag:ruby.social,2023-02-10:objectId=16901078:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> I&#39;ve occasionally considered using emoji in identifiers in production code... but so far I&#39;ve resisted that temptation... so far 😜</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> I&#39;ve occasionally considered using emoji in identifiers in production code... but so far I&#39;ve resisted that temptation... so far 😜</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://mastodon.social/users/sparker", "name": "@sparker@mastodon.social" }, { "type": "Mention", "href": "https://ruby.social/users/noelrap", "name": "@noelrap" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109841324391762513/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109841324391762513/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109841324391762513/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109841324391762513/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109841324391762513/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109841314802281184/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2023-02-10T16:10:52Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/sparker", "https://ruby.social/users/noelrap" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109841314802281184", "type": "Note", "summary": null, "inReplyTo": "https://mastodon.social/users/sparker/statuses/109841204080026112", "published": "2023-02-10T16:10:52Z", "url": "https://ruby.social/@nick_evans/109841314802281184", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/sparker", "https://ruby.social/users/noelrap" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109841314802281184", "inReplyToAtomUri": "https://mastodon.social/users/sparker/statuses/109841204080026112", "conversation": "tag:ruby.social,2023-02-10:objectId=16901078:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> snowman is a valid identchar!</p><p>from parse.c, is_identchar: rb_enc_isalnum((unsigned char)*ptr, enc) || *ptr == &#39;_&#39; || !ISASCII(*ptr);</p><p>irb(main):001:0&gt; def 😉(☃️ ) = puts ☃️ <br />=&gt; :😉<br />irb(main):002:0&gt; 😉 &quot;hello world&quot;<br />hello world</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@sparker\" class=\"u-url mention\">@<span>sparker</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@noelrap\" class=\"u-url mention\">@<span>noelrap</span></a></span> snowman is a valid identchar!</p><p>from parse.c, is_identchar: rb_enc_isalnum((unsigned char)*ptr, enc) || *ptr == &#39;_&#39; || !ISASCII(*ptr);</p><p>irb(main):001:0&gt; def 😉(☃️ ) = puts ☃️ <br />=&gt; :😉<br />irb(main):002:0&gt; 😉 &quot;hello world&quot;<br />hello world</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://mastodon.social/users/sparker", "name": "@sparker@mastodon.social" }, { "type": "Mention", "href": "https://ruby.social/users/noelrap", "name": "@noelrap" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109841314802281184/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109841314802281184/replies?min_id=109841324391762513&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109841314802281184/replies", "items": [ "https://ruby.social/users/nick_evans/statuses/109841324391762513" ] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109841314802281184/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109841314802281184/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109706748313218290/activity", "type": "Announce", "actor": "https://ruby.social/users/nick_evans", "published": "2023-01-17T21:48:51Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/collin", "https://ruby.social/users/nick_evans/followers" ], "object": "https://ruby.social/users/collin/statuses/109691274777714888" }, { "id": "https://ruby.social/users/nick_evans/statuses/109467309250950126/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-12-06T14:56:21Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/olleolleolle" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109467309250950126", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/olleolleolle/statuses/109465712672385884", "published": "2022-12-06T14:56:21Z", "url": "https://ruby.social/@nick_evans/109467309250950126", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/olleolleolle" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109467309250950126", "inReplyToAtomUri": "https://ruby.social/users/olleolleolle/statuses/109465712672385884", "conversation": "tag:ruby.social,2022-12-06:objectId=12300664:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@olleolleolle\" class=\"u-url mention\">@<span>olleolleolle</span></a></span> I noticed this yesterday. Big release and big news! But I haven&#39;t looked into why the dependabot branch build is failing yet... :)</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@olleolleolle\" class=\"u-url mention\">@<span>olleolleolle</span></a></span> I noticed this yesterday. Big release and big news! But I haven&#39;t looked into why the dependabot branch build is failing yet... :)</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/olleolleolle", "name": "@olleolleolle" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109467309250950126/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109467309250950126/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109467309250950126/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109467309250950126/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109467309250950126/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109427664184751811/activity", "type": "Announce", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-29T14:54:05Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://dair-community.social/users/KimCrayton1", "https://ruby.social/users/nick_evans/followers" ], "object": "https://dair-community.social/users/KimCrayton1/statuses/109426620395621582" }, { "id": "https://ruby.social/users/nick_evans/statuses/109406868081320274/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-25T22:45:22Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/tenderlove", "https://mastodon.social/users/headius" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109406868081320274", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/nick_evans/statuses/109405876746365201", "published": "2022-11-25T22:45:22Z", "url": "https://ruby.social/@nick_evans/109406868081320274", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/tenderlove", "https://mastodon.social/users/headius" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109406868081320274", "inReplyToAtomUri": "https://ruby.social/users/nick_evans/statuses/109405876746365201", "conversation": "tag:mastodon.social,2022-11-21:objectId=338841363:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@tenderlove\" class=\"u-url mention\">@<span>tenderlove</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@headius\" class=\"u-url mention\">@<span>headius</span></a></span> for what it&#39;s worth, I had a little bit of spare time so I just hacked this &quot;nameprep&quot; implementation in termux on my phone (no tests, no punycode, etc): <a href=\"https://github.com/ruby/net-imap/pull/83/files\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">github.com/ruby/net-imap/pull/</span><span class=\"invisible\">83/files</span></a></p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@tenderlove\" class=\"u-url mention\">@<span>tenderlove</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@headius\" class=\"u-url mention\">@<span>headius</span></a></span> for what it&#39;s worth, I had a little bit of spare time so I just hacked this &quot;nameprep&quot; implementation in termux on my phone (no tests, no punycode, etc): <a href=\"https://github.com/ruby/net-imap/pull/83/files\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">github.com/ruby/net-imap/pull/</span><span class=\"invisible\">83/files</span></a></p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://mastodon.social/users/tenderlove", "name": "@tenderlove@mastodon.social" }, { "type": "Mention", "href": "https://mastodon.social/users/headius", "name": "@headius@mastodon.social" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109406868081320274/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109406868081320274/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109406868081320274/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109406868081320274/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109406868081320274/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109405876746365201/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-25T18:33:15Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/tenderlove", "https://mastodon.social/users/headius" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109405876746365201", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/nick_evans/statuses/109405842948018415", "published": "2022-11-25T18:33:15Z", "url": "https://ruby.social/@nick_evans/109405876746365201", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/tenderlove", "https://mastodon.social/users/headius" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109405876746365201", "inReplyToAtomUri": "https://ruby.social/users/nick_evans/statuses/109405842948018415", "conversation": "tag:mastodon.social,2022-11-21:objectId=338841363:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@tenderlove\" class=\"u-url mention\">@<span>tenderlove</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@headius\" class=\"u-url mention\">@<span>headius</span></a></span> I only really needed it for SASL (SCRAM-* and ANONYMOUS), so I stopped after implementing the `saslprep` and `trace` profiles. By my count, there are at least three (incomplete) SASL implementations in stdlib and another half dozen in various gems, which... kinda defeats the purpose of SASL. After I finish my net-imap SASL updates, I hope to port to net-smtp and net-pop.</p><p>It would be nice if the stringprep bits found wider applicability too.</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@tenderlove\" class=\"u-url mention\">@<span>tenderlove</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@headius\" class=\"u-url mention\">@<span>headius</span></a></span> I only really needed it for SASL (SCRAM-* and ANONYMOUS), so I stopped after implementing the `saslprep` and `trace` profiles. By my count, there are at least three (incomplete) SASL implementations in stdlib and another half dozen in various gems, which... kinda defeats the purpose of SASL. After I finish my net-imap SASL updates, I hope to port to net-smtp and net-pop.</p><p>It would be nice if the stringprep bits found wider applicability too.</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://mastodon.social/users/tenderlove", "name": "@tenderlove@mastodon.social" }, { "type": "Mention", "href": "https://mastodon.social/users/headius", "name": "@headius@mastodon.social" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109405876746365201/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109405876746365201/replies?min_id=109406868081320274&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109405876746365201/replies", "items": [ "https://ruby.social/users/nick_evans/statuses/109406868081320274" ] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109405876746365201/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109405876746365201/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109405842948018415/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-25T18:24:39Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/tenderlove", "https://mastodon.social/users/headius" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109405842948018415", "type": "Note", "summary": null, "inReplyTo": "https://mastodon.social/users/tenderlove/statuses/109385714491299479", "published": "2022-11-25T18:24:39Z", "url": "https://ruby.social/@nick_evans/109405842948018415", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://mastodon.social/users/tenderlove", "https://mastodon.social/users/headius" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109405842948018415", "inReplyToAtomUri": "https://mastodon.social/users/tenderlove/statuses/109385714491299479", "conversation": "tag:mastodon.social,2022-11-21:objectId=338841363:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@tenderlove\" class=\"u-url mention\">@<span>tenderlove</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@headius\" class=\"u-url mention\">@<span>headius</span></a></span> I&#39;m guessing (and a quick code search seems to confirm) that it&#39;s used for i18n domain names. I don&#39;t have any real experience with IDNA, punycode, nameprep, etc, but I did recently need a pure ruby saslprep. That led to a partial implementation of stringprep... which now ships with the latest `net-imap` release.</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@tenderlove\" class=\"u-url mention\">@<span>tenderlove</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@headius\" class=\"u-url mention\">@<span>headius</span></a></span> I&#39;m guessing (and a quick code search seems to confirm) that it&#39;s used for i18n domain names. I don&#39;t have any real experience with IDNA, punycode, nameprep, etc, but I did recently need a pure ruby saslprep. That led to a partial implementation of stringprep... which now ships with the latest `net-imap` release.</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://mastodon.social/users/tenderlove", "name": "@tenderlove@mastodon.social" }, { "type": "Mention", "href": "https://mastodon.social/users/headius", "name": "@headius@mastodon.social" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109405842948018415/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109405842948018415/replies?min_id=109405876746365201&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109405842948018415/replies", "items": [ "https://ruby.social/users/nick_evans/statuses/109405876746365201" ] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109405842948018415/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109405842948018415/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109354052923780606/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-16T14:53:46Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/postmodern" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109354052923780606", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/nick_evans/statuses/109354046712729005", "published": "2022-11-16T14:53:46Z", "url": "https://ruby.social/@nick_evans/109354052923780606", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/postmodern" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109354052923780606", "inReplyToAtomUri": "https://ruby.social/users/nick_evans/statuses/109354046712729005", "conversation": "tag:ruby.social,2022-11-16:objectId=10670400:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@postmodern\" class=\"u-url mention\">@<span>postmodern</span></a></span> <br />Between stdlib and popular gems, I see many different implementations of buffered io transforms: IO (twice for encoding) and StringIO of course. But also: OpenSSL::Buffering, Net::BufferedIO (in &#39;net/protocol&#39;), socket/init.c literally has a comment &quot;copied from io.c&quot;, IRB::Locale &amp; IRB::InputMethod, Zlib, Excon::Socket, Dalli::Socket, Net::SSH::Buffer, pg&#39;s C ext codec, rubyzip&#39;s zip/ioextras/abstract_{input,output}_stream, async&#39;s Wrapper and async-io&#39;s IO::Generic, etc...</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@postmodern\" class=\"u-url mention\">@<span>postmodern</span></a></span> <br />Between stdlib and popular gems, I see many different implementations of buffered io transforms: IO (twice for encoding) and StringIO of course. But also: OpenSSL::Buffering, Net::BufferedIO (in &#39;net/protocol&#39;), socket/init.c literally has a comment &quot;copied from io.c&quot;, IRB::Locale &amp; IRB::InputMethod, Zlib, Excon::Socket, Dalli::Socket, Net::SSH::Buffer, pg&#39;s C ext codec, rubyzip&#39;s zip/ioextras/abstract_{input,output}_stream, async&#39;s Wrapper and async-io&#39;s IO::Generic, etc...</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/postmodern", "name": "@postmodern" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109354052923780606/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109354052923780606/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109354052923780606/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109354052923780606/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109354052923780606/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109354046712729005/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-16T14:52:11Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/postmodern" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109354046712729005", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/postmodern/statuses/109353781602497727", "published": "2022-11-16T14:52:11Z", "url": "https://ruby.social/@nick_evans/109354046712729005", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/postmodern" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109354046712729005", "inReplyToAtomUri": "https://ruby.social/users/postmodern/statuses/109353781602497727", "conversation": "tag:ruby.social,2022-11-16:objectId=10670400:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@postmodern\" class=\"u-url mention\">@<span>postmodern</span></a></span> I&#39;ve often wished stdlib IO had built-in versions of IO/reader/writer combinators, e.g the kinds of methods that are in go&#39;s io and bufio or dart&#39;s StreamTransformer, Converter, etc. I&#39;ve written &quot;toy&quot; versions of PipeSpy, TeeReader (&amp; TeeWriter), ReadWriter, etc, some of these more than once.</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@postmodern\" class=\"u-url mention\">@<span>postmodern</span></a></span> I&#39;ve often wished stdlib IO had built-in versions of IO/reader/writer combinators, e.g the kinds of methods that are in go&#39;s io and bufio or dart&#39;s StreamTransformer, Converter, etc. I&#39;ve written &quot;toy&quot; versions of PipeSpy, TeeReader (&amp; TeeWriter), ReadWriter, etc, some of these more than once.</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/postmodern", "name": "@postmodern" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109354046712729005/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109354046712729005/replies?min_id=109354052923780606&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109354046712729005/replies", "items": [ "https://ruby.social/users/nick_evans/statuses/109354052923780606" ] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109354046712729005/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109354046712729005/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109349225519733686/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-15T18:26:06Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/getajobmike", "https://ruby.social/users/solnic" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109349225519733686", "type": "Note", "summary": null, "inReplyTo": "https://ruby.social/users/getajobmike/statuses/109348985932840335", "published": "2022-11-15T18:26:06Z", "url": "https://ruby.social/@nick_evans/109349225519733686", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://ruby.social/users/getajobmike", "https://ruby.social/users/solnic" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109349225519733686", "inReplyToAtomUri": "https://ruby.social/users/getajobmike/statuses/109348985932840335", "conversation": "tag:ruby.social,2022-11-15:objectId=10605217:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@getajobmike\" class=\"u-url mention\">@<span>getajobmike</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@solnic\" class=\"u-url mention\">@<span>solnic</span></a></span> IMO this falls under the category of &quot;easier to test&quot;: it can be easier to debug and get diagnostic data from a Method Object, then add or expose methods that are useful for playing with on the console or in tests, even if nowhere else in the code base interacts with any method besides &quot;call&quot;. </p><p>You _can_ return diagnostics in a status or result object. That can be wasteful unless lazy loaded. At some level of complexity, a (possibly memoized) instance can be simpler.</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@getajobmike\" class=\"u-url mention\">@<span>getajobmike</span></a></span> <span class=\"h-card\" translate=\"no\"><a href=\"https://ruby.social/@solnic\" class=\"u-url mention\">@<span>solnic</span></a></span> IMO this falls under the category of &quot;easier to test&quot;: it can be easier to debug and get diagnostic data from a Method Object, then add or expose methods that are useful for playing with on the console or in tests, even if nowhere else in the code base interacts with any method besides &quot;call&quot;. </p><p>You _can_ return diagnostics in a status or result object. That can be wasteful unless lazy loaded. At some level of complexity, a (possibly memoized) instance can be simpler.</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://ruby.social/users/getajobmike", "name": "@getajobmike" }, { "type": "Mention", "href": "https://ruby.social/users/solnic", "name": "@solnic" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109349225519733686/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109349225519733686/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109349225519733686/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109349225519733686/likes", "type": "Collection", "totalItems": 1 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109349225519733686/shares", "type": "Collection", "totalItems": 0 } } }, { "id": "https://ruby.social/users/nick_evans/statuses/109344569058578740/activity", "type": "Create", "actor": "https://ruby.social/users/nick_evans", "published": "2022-11-14T22:41:54Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://epistolary.org/users/vees" ], "object": { "id": "https://ruby.social/users/nick_evans/statuses/109344569058578740", "type": "Note", "summary": null, "inReplyTo": "https://epistolary.org/users/vees/statuses/109343944718636729", "published": "2022-11-14T22:41:54Z", "url": "https://ruby.social/@nick_evans/109344569058578740", "attributedTo": "https://ruby.social/users/nick_evans", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://ruby.social/users/nick_evans/followers", "https://epistolary.org/users/vees" ], "sensitive": false, "atomUri": "https://ruby.social/users/nick_evans/statuses/109344569058578740", "inReplyToAtomUri": "https://epistolary.org/users/vees/statuses/109343944718636729", "conversation": "tag:epistolary.org,2022-11-14:objectId=108482:objectType=Conversation", "content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://epistolary.org/@vees\" class=\"u-url mention\">@<span>vees</span></a></span> 👋 🙂</p>", "contentMap": { "en": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://epistolary.org/@vees\" class=\"u-url mention\">@<span>vees</span></a></span> 👋 🙂</p>" }, "attachment": [], "tag": [ { "type": "Mention", "href": "https://epistolary.org/users/vees", "name": "@vees@epistolary.org" } ], "replies": { "id": "https://ruby.social/users/nick_evans/statuses/109344569058578740/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://ruby.social/users/nick_evans/statuses/109344569058578740/replies?only_other_accounts=true&page=true", "partOf": "https://ruby.social/users/nick_evans/statuses/109344569058578740/replies", "items": [] } }, "likes": { "id": "https://ruby.social/users/nick_evans/statuses/109344569058578740/likes", "type": "Collection", "totalItems": 0 }, "shares": { "id": "https://ruby.social/users/nick_evans/statuses/109344569058578740/shares", "type": "Collection", "totalItems": 0 } } } ] }