洪 民憙 (Hong Minhee) :nonbinary:'s avatar

洪 民憙 (Hong Minhee) :nonbinary:

@hongminhee@hollo.social

1,113 following1,903 followers

An intersectionalist, feminist, and socialist living in Seoul (UTC+09:00). @tokolovesme's spouse. Who's behind @fedify, @hollo, and @botkit. Write some free software in , , , & . They/them.

서울에 사는 交叉女性主義者이자 社會主義者. 金剛兔(@tokolovesme)의 配偶者. @fedify, @hollo, @botkit 메인테이너. , , , 等으로 自由 소프트웨어 만듦.

()

Pinned

@hongminhee@hollo.social

Hello! I'm Hong Minhee (洪 民憙), an open source software engineer in my late 30s, living in Seoul, Korea. I'm bisexual and non-binary (they/them), and an enthusiastic advocate of free/open source software and the fediverse.

I work full-time on @fedify, an ActivityPub server framework in TypeScript, funded by @sovtechfund. I'm also the creator of @hollo, a single-user ActivityPub microblog; @botkit, an ActivityPub bot framework; Hackers' Pub, a fediverse platform for software developers; and LogTape, a logging library for JavaScript and TypeScript.

I have a long interest in East Asian languages (CJK) and Unicode. I post mostly in English here, though occasionally in Japanese or in mixed-script Korean (國漢文混用體), a traditional writing style that interleaves Chinese characters with the native Korean alphabet. Wanting to write in that style was actually one of the reasons I joined the fediverse. Feel free to talk to me in English, Korean, Japanese, or even Literary Chinese!

en.wikipedia.org

Korean mixed script - Wikipedia

Pinned

はじめまして!ソウル在住の30代後半のオープンソースソフトウェアエンジニア、洪 民憙ホン・ミンヒと申します。バイセクシュアル(bisexual)・ノンバイナリー(non-binary)で、自由・オープンソースソフトウェア(F/OSS)とフェディバース(fediverse)の熱烈な支持者です。

STF(@sovtechfund)の支援を受け、TypeScript用ActivityPubサーバーフレームワーク「@fedify」の開発に専念しています。他にも、おひとり様向けのActivityPubマイクロブログ「@hollo」、ActivityPubボットフレームワーク「@botkit」、ソフトウェア開発者向けフェディバースプラットフォームHackers' Pub、JavaScript・TypeScript用ロギングライブラリLogTapeなどの制作者でもあります。

東アジア言語(いわゆるCJK)とUnicodeにも興味があります。このアカウントでは主に英語で投稿していますが、時々日本語や国漢文混用体(漢字ハングル混じり文)の韓国語でも書いています。実はこの文体で書きたくてフェディバースを始めた、という経緯もあります。日本語、英語、韓国語、漢文でも気軽に話しかけてください!

speakerdeck.com

国漢文混用体からHolloまで

本発表では、韓国語の「国漢文混用体」(漢字ハングル混じり文)を自分のフェディバース投稿に実装したいという小さな目標から始まった旅路を共有します。 この目標を達成するために、ActivityPubのJSON-LDの複雑さやHTTP Signatures、WebFingerなどの仕様を理解する必要性に…

Pinned

安寧(안녕)하세요! 저는 서울에 살고 있는 30() 後半(후반)의 오픈 소스 소프트웨어 엔지니어 洪民憙(홍민희)입니다. 兩性愛者(양성애자)(bisexual)이자 논바이너리(non-binary)이며, 自由(자유)·오픈 소스 소프트웨어(F/OSS)와 聯合宇宙(연합우주)(fediverse)의 熱烈(열렬)支持者(지지자)이기도 합니다.

STF(@sovtechfund)의 支援(지원)을 받아 TypeScript() ActivityPub 서버 프레임워크 @fedify 開發(개발)專業(전업)으로 ()하고 있습니다. 그 ()에도 싱글 유저() ActivityPub 마이크로블로그 @hollo, ActivityPub 봇 프레임워크 @botkit, 소프트웨어 開發者(개발자)를 위한 聯合宇宙(연합우주) 플랫폼 Hackers' Pub, JavaScript·TypeScript() 로깅 라이브러리 LogTape ()製作者(제작자)이기도 합니다.

()아시아 言語(언어)(이른바 CJK)와 Unicode에도 關心(관심)이 많습니다. 이 計定(계정)에서는 ()英語(영어)로 포스팅하지만, 때때로 日本語(일본어)國漢文混用體(국한문 혼용체) 韓國語(한국어)로도 씁니다. 聯合宇宙(연합우주)에 오게 된 動機(동기) () 하나가 바로 國漢文混用體(국한문 혼용체)로 글을 쓰고 싶었기 때문이기도 하고요. 韓國語(한국어), 英語(영어), 日本語(일본어), 아니면 漢文(한문)으로도 말을 걸어주세요!

logtape.org

LogTape

Unobtrusive logging library with zero dependencies—library-first design for Deno, Node.js, Bun, browsers, and edge functions

新年を迎えて再びHackers' Pubの作業を再開した。今日は共有された投稿を誰が共有したかを表示する様にした。(まだ共有をする事は出来ないが、他のActivityPubサーバーのアカウントが共有した投稿を見る事は出来る)

スクリーンショットに引用しているのは @genya0407 さんの下の投稿:

https://social.genya0407.link/@genya0407/113751089421389307

genya0407さんの投稿がHackers' Pubに共有された様子。「洪 民憙 (Hong Minhee)さんが共有」と書かれている。
ALT text

genya0407さんの投稿がHackers' Pubに共有された様子。「洪 民憙 (Hong Minhee)さんが共有」と書かれている。

@genya0407@social.genya0407.link

hollo は実際いい感じだと思う。mastodon からの引越しを検討するレベル。

새해를 맞이해서 Hackers' Pub 作業(작업)을 조금 했다. 이제 共有(공유)(부스트)한 글은 누가 共有(공유)했는지 表示(표시)된다. (아직 共有(공유)를 할 수는 없고, 다른 ActivityPub 서버의 計定(계정)共有(공유)한 글을 볼 수는 있다.)

스크린숏에 引用(인용)된 글은 @everclear 님의 아래 글:

https://hollo.ingyeo.net/@everclear/01941d3a-d277-72de-afab-902fa6910f1c

잉어구이 님의 글이 共有된 모습. 「洪 民憙 (Hong Minhee) 님이 공유」라고 表示되어 있다.
ALT text

잉어구이 님의 글이 共有된 모습. 「洪 民憙 (Hong Minhee) 님이 공유」라고 表示되어 있다.

@ssig33@pub.ssig33.com

教えて頂いた hollo ってやつがめっちゃよさそうだな、何が一番いいかというと Bun を捨てたという判断に共感した、これにします

@genya0407@social.genya0407.link

hollo は実際いい感じだと思う。mastodon からの引越しを検討するレベル。

@hongminhee@hollo.social

I prototyped a logo for . What do you think? Does it look okay?

https://hollo.social/@hongminhee/019410c4-07cd-7ed0-bb0e-efb0b6dd88c5

A prototype of a logo for BotKit. It's an unassembled plastic model kit of a cute dinosaur. It's labeled with “BotKit by Fedify.”
ALT text

A prototype of a logo for BotKit. It's an unassembled plastic model kit of a cute dinosaur. It's labeled with “BotKit by Fedify.”

@hongminhee@hollo.social

I'm currently brainstorming a framework for creating fediverse bots called , based on . It's less flexible than Fedify, but the goal is to make it possible to create simple fediverse bots with much less code. What do you think?

import { createBot, mention, text } from "@fedify/botkit";
import { RedisKvStore } from "@fedify/redis";
import { Redis } from "ioredis";

// Create a bot instance:
const bot = createBot({
  // The bot will have fediverse handle "@greetbot@mydomain":
  username: "greetbot",
  // Set the profile icon (avatar):
  icon: new URL("https://mydomain/icon.png"),
  // Set the bio:
  bio: text`Hi, there! I'm a simple fediverse bot created by ${
    mention("@hongminhee@hollo.social").}`,
  // Use Redis as a key-value store:
  kv: new RedisKvStore(new Redis()),
  // Use Redis as a message queue:
  queue: new RedisMessageQueue(() => new Redis()),
});

// A bot can respond to a mention:
bot.on(/hi|hello|what'?s\s+up/i, (ctx) => {
  return ctx.reply(text`Hi, ${ctx.actor}!`);
});

// Or, a bot also can actively publish a post:
setInterval(async () => {
  await bot.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);

export default bot;
ALT text

import { createBot, mention, text } from "@fedify/botkit"; import { RedisKvStore } from "@fedify/redis"; import { Redis } from "ioredis"; // Create a bot instance: const bot = createBot({ // The bot will have fediverse handle "@greetbot@mydomain": username: "greetbot", // Set the profile icon (avatar): icon: new URL("https://mydomain/icon.png"), // Set the bio: bio: text`Hi, there! I'm a simple fediverse bot created by ${ mention("@hongminhee@hollo.social").}`, // Use Redis as a key-value store: kv: new RedisKvStore(new Redis()), // Use Redis as a message queue: queue: new RedisMessageQueue(() => new Redis()), }); // A bot can respond to a mention: bot.on(/hi|hello|what'?s\s+up/i, (ctx) => { return ctx.reply(text`Hi, ${ctx.actor}!`); }); // Or, a bot also can actively publish a post: setInterval(async () => { await bot.publish(text`Hi, forks! It's an hourly greeting.`); }, 1000 * 60 * 60); export default bot;

@deno_land@fosstodon.org

update: Oracle has reached out and asked for an extension to respond to the JavaScript trademark cancellation petition. We've agreed to a 30 day extension - Feb 3.

@tesaguri@fedibird.com

ActivityPubの仕様すらJSON-LDを真面目に扱っていないのだとしたら素人の我々はなおさら雰囲気で扱っても許されるということだろうから勇気づけられる(いいえ)

@hollo@hollo.social

Have you been having trouble fetching accounts or posts from that have custom emojis in ?

This is because they represent an Emoji object as an invalid JSON-LD object. Fortunately, this patch fixes that issue, so keep an eye out for it.

https://hollo.social/@fedify/01941dab-e4c3-7ce0-9307-b5b8c095d521

hollo.social

Are you getting the following …

Are you getting the following error when trying to look up any Activity Streams objects from #Akkoma that contain custom emojis? ``` jsonld.SyntaxError: Invalid JSON-LD syntax; "@id" value must a string. ``` This is because [they represent an `Emoji` object as an invalid JSON-LD object][1]. Fortunately, [this patch][2] fixes that issue, so keep an eye out for it. [1]: https://akkoma.dev/AkkomaGang/akkoma/issues/848 [2]: https://akkoma.dev/AkkomaGang/akkoma/pulls/850

Are you getting the following error when trying to look up any Activity Streams objects from that contain custom emojis?

jsonld.SyntaxError: Invalid JSON-LD syntax; "@id" value must a string.

This is because they represent an Emoji object as an invalid JSON-LD object. Fortunately, this patch fixes that issue, so keep an eye out for it.

akkoma.dev

Completely omit id for anonymous objects

Brings us in line with the proposed AP spec amendment fixing: https://akkoma.dev/AkkomaGang/akkoma/issues/848 *(see commit message for details)* ~~**WIP** since federation effects are completely untested atm and the decision wrt AP spec isn’t final yet~~

Are you getting the following error when trying to look up any Activity Streams objects from that contain custom emojis?

jsonld.SyntaxError: Invalid JSON-LD syntax; "@id" value must a string.

This is because they represent an Emoji object as an invalid JSON-LD object. Fortunately, this patch fixes that issue, so keep an eye out for it.

akkoma.dev

Completely omit id for anonymous objects

Brings us in line with the proposed AP spec amendment fixing: https://akkoma.dev/AkkomaGang/akkoma/issues/848 *(see commit message for details)* ~~**WIP** since federation effects are completely untested atm and the decision wrt AP spec isn’t final yet~~

@hongminhee@hollo.social

I prototyped a logo for . What do you think? Does it look okay?

https://hollo.social/@hongminhee/019410c4-07cd-7ed0-bb0e-efb0b6dd88c5

A prototype of a logo for BotKit. It's an unassembled plastic model kit of a cute dinosaur. It's labeled with “BotKit by Fedify.”
ALT text

A prototype of a logo for BotKit. It's an unassembled plastic model kit of a cute dinosaur. It's labeled with “BotKit by Fedify.”

@hongminhee@hollo.social

I'm currently brainstorming a framework for creating fediverse bots called , based on . It's less flexible than Fedify, but the goal is to make it possible to create simple fediverse bots with much less code. What do you think?

import { createBot, mention, text } from "@fedify/botkit";
import { RedisKvStore } from "@fedify/redis";
import { Redis } from "ioredis";

// Create a bot instance:
const bot = createBot({
  // The bot will have fediverse handle "@greetbot@mydomain":
  username: "greetbot",
  // Set the profile icon (avatar):
  icon: new URL("https://mydomain/icon.png"),
  // Set the bio:
  bio: text`Hi, there! I'm a simple fediverse bot created by ${
    mention("@hongminhee@hollo.social").}`,
  // Use Redis as a key-value store:
  kv: new RedisKvStore(new Redis()),
  // Use Redis as a message queue:
  queue: new RedisMessageQueue(() => new Redis()),
});

// A bot can respond to a mention:
bot.on(/hi|hello|what'?s\s+up/i, (ctx) => {
  return ctx.reply(text`Hi, ${ctx.actor}!`);
});

// Or, a bot also can actively publish a post:
setInterval(async () => {
  await bot.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);

export default bot;
ALT text

import { createBot, mention, text } from "@fedify/botkit"; import { RedisKvStore } from "@fedify/redis"; import { Redis } from "ioredis"; // Create a bot instance: const bot = createBot({ // The bot will have fediverse handle "@greetbot@mydomain": username: "greetbot", // Set the profile icon (avatar): icon: new URL("https://mydomain/icon.png"), // Set the bio: bio: text`Hi, there! I'm a simple fediverse bot created by ${ mention("@hongminhee@hollo.social").}`, // Use Redis as a key-value store: kv: new RedisKvStore(new Redis()), // Use Redis as a message queue: queue: new RedisMessageQueue(() => new Redis()), }); // A bot can respond to a mention: bot.on(/hi|hello|what'?s\s+up/i, (ctx) => { return ctx.reply(text`Hi, ${ctx.actor}!`); }); // Or, a bot also can actively publish a post: setInterval(async () => { await bot.publish(text`Hi, forks! It's an hourly greeting.`); }, 1000 * 60 * 60); export default bot;

@ntek@hl.oyasumi.dev

新幹線乗ったのでHollo更新します