洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · 954 following · 1269 followers

An intersectionalist, feminist, and socialist guy 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 메인테이너. , , , 等으로 自由 소프트웨어 만듦.

()

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

@hongminhee@hollo.social

Hello, I'm an open source software engineer in my late 30s living in , , and an avid advocate of and the .

I'm the creator of @fedify, an server framework in , @hollo, an ActivityPub-enabled microblogging software for single users, and @botkit, a simple ActivityPub bot framework.

I'm also very interested in East Asian languages (so-called ) and . Feel free to talk to me in , (), or (), or even in Literary Chinese (, )!

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

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

安寧(안녕)하세요, 저는 서울에 살고 있는 30() 後半(후반) 오픈 소스 소프트웨어 엔지니어이며, 自由(자유)·오픈 소스 소프트웨어와 聯合宇宙(연합우주)(fediverse)의 熱烈(열렬)支持者(지지자)입니다.

저는 TypeScript() ActivityPub 서버 프레임워크인 @fedify 프로젝트와 싱글 유저() ActivityPub 마이크로블로그인 @hollo 프로젝트와 ActivityPub 봇 프레임워크인 @botkit 프로젝트의 製作者(제작자)이기도 합니다.

저는 ()아시아 言語(언어)(이른바 )와 유니코드에도 關心(관심)이 많습니다. 聯合宇宙(연합우주)에서는 國漢文混用體(국한문 혼용체)를 쓰고 있어요! 제게 韓國語(한국어)英語(영어), 日本語(일본어)로 말을 걸어주세요. (아니면, 漢文(한문)으로도!)

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

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

こんにちは、私はソウルに住んでいる30代後半のオープンソースソフトウェアエンジニアで、自由・オープンソースソフトウェアとフェディバースの熱烈な支持者です。名前は洪 民憙ホン・ミンヒです。

私はTypeScript用のActivityPubサーバーフレームワークである「@fedify」と、ActivityPubをサポートする1人用マイクロブログである 「@hollo」と、ActivityPubのボットを作成する為のシンプルなフレームワークである「@botkit」の作者でもあります。

私は東アジア言語(いわゆるCJK)とUnicodeにも興味が多いです。日本語、英語、韓国語で話しかけてください。(または、漢文でも!)

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

@hongminhee@hollo.social

I had a medical checkup and my cholesterol level was so high that I'm forced to eat only salads from now on. 😇

tesaguri 🦀🦝's avatar
tesaguri 🦀🦝

@tesaguri@fedibird.com

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

Hollo :hollo:'s avatar
Hollo :hollo:

@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

Fedify: ActivityPub server framework's avatar
Fedify: ActivityPub server framework

@fedify@hollo.social

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.

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

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

It's been an hour and a half and it's still only at 85%… 😇

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

@hongminhee@hollo.social · Reply to Hyoung-Won Park's post

@dalcrose.hyoungwonpark.net 달크로즈 님도 새해 복 많이 받으세요!

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

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

皆様、明けまして御芽出度う御座います!

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

@hongminhee@hollo.social

여러분, 새해 () 많이 받으세요! 올 한 해도 잘 付託(부탁)드리며, 尹錫悅(윤석열)은 어서 監獄(감옥)에 가길 바랍니다…

잉어구이's avatar
잉어구이

@everclear@hollo.ingyeo.net

  1. 많은 일이 있었지만 잘 버텨냈어요.
  2. 그래도 집 밖에 좀 나갔어요.
  3. 홀로 세팅했어요.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Cloning the Akkoma source code, and it's taking a long time here… 😇

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

@hongminhee@hollo.social · Reply to Scammo's post

@scammo Thank you too!

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

@hongminhee@hollo.social · Reply to モナコ広告 :fedibird1: @技術・雑談's post

@monaco_koukoku 二つ以上のバージョンの@js-temporal/polyfillパッケージがロードされたかも知れないですね。🤔

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

@hongminhee@hollo.social

同時(동시)에 만들고 싶은 게 너무 많아서 뭐부터 해야할지 모르겠다.

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

@hongminhee@hollo.social · Reply to Chee Aun 🤔's post

@cheeaun Oh, I haven't thought that's text copy, but decoration.

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

@hongminhee@hollo.social · Reply to Chee Aun 🤔's post

@cheeaun Yes!

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

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

It's actually a vector illustration drawn by Inkscape.

A screenshot of an Inkscape workspace with the BotKit logo prototype.
ALT text detailsA screenshot of an Inkscape workspace with the BotKit logo prototype.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@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 detailsA prototype of a logo for BotKit. It's an unassembled plastic model kit of a cute dinosaur. It's labeled with “BotKit by Fedify.”
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@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 detailsimport { 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;
NTSK's avatar
NTSK

@ntek@hl.oyasumi.dev

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

pkg update's avatar
pkg update

@pkgupdt@hl.pkgu.net

현재 @pkgupdt 으로부터 계정 이전 중입니다.

불편을 끼쳐드려 죄송합니다.

역보's avatar
역보

@yeokbo.bsky.social@bsky.brid.gy

윤석열 오늘 식사 메뉴

서울구치소 12월 식단표
ALT text details서울구치소 12월 식단표
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Misskeyプロジェクトはマージ権を持つ人がsyuiloさんしかいないのですか?

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

@hongminhee@hollo.social

Speak, 日本(일본) 市場(시장)에도 進出(진출)했구나. 몰랐다.

https://fedibird.com/@GabbingDog/113744920079525287

ガブ's avatar
ガブ

@GabbingDog@fedibird.com

話題のAI英会話アプリのSpeakを試してみた。

一応、レッスンとしては自己紹介とか趣味の話題とか決まっているようだが、こちらの返答については割と自由に回答しても、すぐに間違いを修正して正しい表現を教えてくれる。さすがChat-GPTという感じだ。何か表現を間違うと、その部分を取りだしてドリルみたいに何度も練習するようになっている。

Chat-GPTみたいなAIは何となく避けて使ってこなかったが、こういう用途には向いていて、適任だと思った。

そもそも日常会話の話題を考えるのが日本語でも下手なので、ある程度AI側が会話を主導してこっちの回答を引き出してくれるのは助かるし、日常会話の切り出し方も教わってるw

:rss: 全体 : hankyoreh japan's avatar
:rss: 全体 : hankyoreh japan

@japan_hani_kr_arti@rss-mstdn.studiofreesia.com

【速報】裁判所、内乱容疑の尹錫悦大統領に逮捕状発付…韓国現職大統領で初
japan.hani.co.kr/arti/politics

Hollo :hollo:'s avatar
Hollo :hollo:

@hollo@hollo.social · Reply to Hollo :hollo:'s post

Hollo 0.4.1及び0.4.2をリリースしました。このバージョンでは、幾つかの連合関連の問題を解決しましたので、Hollo 0.4.0をお使いの方は、早速0.4.2にアップデートすることをお勧めします。

Hollo :hollo:'s avatar
Hollo :hollo:

@hollo@hollo.social · Reply to Hollo :hollo:'s post

Hollo 0.4.10.4.2를 릴리스했습니다. 두 버전에서는 몇 가지 연합 관련 이슈를 해결하였으니, Hollo 0.4.0을 쓰고 계신 분들께서는 조속히 0.4.2로 업데이트하실 것을 권합니다.

Hollo :hollo:'s avatar
Hollo :hollo:

@hollo@hollo.social

Released Hollo 0.4.1 and 0.4.2. These versions fixed few federation issues. Recommend to update to 0.4.2 now if you're using Hollo 0.4.0!

pkg update's avatar
pkg update

@pkgupdt@ap.sanwon.kr

hollo 0.4.0으로 업그레이드. 메모리 사용량이 40% 수준으로 줄었다. 조금 더 테스트해보고 이 계정을 이동할 예정.

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

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

Okay, it seems to work when I configured Node.js's default DNS resolution order to "ipv6first"… 🤔

Welcome to Node.js v23.5.0.
Type ".help" for more information.
> const dns = await import("node:dns");
undefined
> dns.setDefaultResultOrder("ipv6first");
undefined
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Response {
  status: 200,
  statusText: 'OK',
  headers: Headers {
    'alt-svc': 'h3=":443"; ma=2592000',
    'cache-control': 'public, max-age=15',
    'content-length': '10828',
    'content-security-policy': "default-src 'self' 'unsafe-inline'; img-src *; media-src *; frame-ancestors *",
    'content-type': 'text/html; charset=utf-8',
    date: 'Mon, 30 Dec 2024 16:32:22 GMT',
    server: 'Caddy',
    'strict-transport-security': 'max-age=15552000; preload',
    vary: 'Origin, Accept',
    'x-frame-options': 'DENY'
  },
  body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true },
  bodyUsed: false,
  ok: true,
  redirected: false,
  type: 'basic',
  url: 'https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci'
}
>
ALT text detailsWelcome to Node.js v23.5.0. Type ".help" for more information. > const dns = await import("node:dns"); undefined > dns.setDefaultResultOrder("ipv6first"); undefined > await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci"); Response { status: 200, statusText: 'OK', headers: Headers { 'alt-svc': 'h3=":443"; ma=2592000', 'cache-control': 'public, max-age=15', 'content-length': '10828', 'content-security-policy': "default-src 'self' 'unsafe-inline'; img-src *; media-src *; frame-ancestors *", 'content-type': 'text/html; charset=utf-8', date: 'Mon, 30 Dec 2024 16:32:22 GMT', server: 'Caddy', 'strict-transport-security': 'max-age=15552000; preload', vary: 'Origin, Accept', 'x-frame-options': 'DENY' }, body: ReadableStream { locked: false, state: 'readable', supportsBYOB: true }, bodyUsed: false, ok: true, redirected: false, type: 'basic', url: 'https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci' } >
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to Chris​‌​‬ Hayes‌​​​'s post

@chris_hayes Hmm, interesting! I'm trying to configure User-Agent header!

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

@hongminhee@hollo.social

I'm troubleshooting a mysterious TypeError: fetch failed exception when using .js's built-in fetch() function. When I make the same request in or , it responds fine. Anyone know why this only happens in Node.js?

Deno 2.1.4
exit using ctrl+d, ctrl+c, or close()
REPL is running with all permissions allowed.
To specify permissions, run `deno repl` with allow flags.
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Response {
  body: ReadableStream { locked: false },
  bodyUsed: false,
  headers: Headers {
    "alt-svc": 'h3=":443"; ma=2592000',
    "cache-control": "public, max-age=15",
    "content-length": "10828",
    "content-security-policy": "default-src 'self' 'unsafe-inline'; img-src *; media-src *; frame-ancestors *",
    "content-type": "text/html; charset=utf-8",
    date: "Mon, 30 Dec 2024 15:59:09 GMT",
    server: "Caddy",
    "strict-transport-security": "max-age=15552000; preload",
    vary: "Origin, Accept",
    "x-frame-options": "DENY"
  },
  ok: true,
  redirected: false,
  status: 200,
  statusText: "OK",
  url: "https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci"
}
>
ALT text detailsDeno 2.1.4 exit using ctrl+d, ctrl+c, or close() REPL is running with all permissions allowed. To specify permissions, run `deno repl` with allow flags. > await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci"); Response { body: ReadableStream { locked: false }, bodyUsed: false, headers: Headers { "alt-svc": 'h3=":443"; ma=2592000', "cache-control": "public, max-age=15", "content-length": "10828", "content-security-policy": "default-src 'self' 'unsafe-inline'; img-src *; media-src *; frame-ancestors *", "content-type": "text/html; charset=utf-8", date: "Mon, 30 Dec 2024 15:59:09 GMT", server: "Caddy", "strict-transport-security": "max-age=15552000; preload", vary: "Origin, Accept", "x-frame-options": "DENY" }, ok: true, redirected: false, status: 200, statusText: "OK", url: "https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci" } >
Welcome to Bun v1.1.42
Type ".help" for more information.
[!] Please note that the REPL implementation is still experimental!
    Don't consider it to be representative of the stability or behavior of Bun overall.
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Response {}
>
ALT text detailsWelcome to Bun v1.1.42 Type ".help" for more information. [!] Please note that the REPL implementation is still experimental! Don't consider it to be representative of the stability or behavior of Bun overall. > await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci"); Response {} >
Welcome to Node.js v23.5.0.
Type ".help" for more information.
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Uncaught TypeError: fetch failed
    at node:internal/deps/undici/undici:13484:13
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async REPL1:1:33 {
  [cause]: AggregateError [ETIMEDOUT]:
      at internalConnectMultiple (node:net:1139:18)
      at internalConnectMultiple (node:net:1215:5)
      at Timeout.internalConnectMultipleTimeout (node:net:1739:5)
      at listOnTimeout (node:internal/timers:616:11)
      at process.processTimers (node:internal/timers:549:7) {
    code: 'ETIMEDOUT',
    [errors]: [ [Error], [Error] ]
  }
}
>
ALT text detailsWelcome to Node.js v23.5.0. Type ".help" for more information. > await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci"); Uncaught TypeError: fetch failed at node:internal/deps/undici/undici:13484:13 at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async REPL1:1:33 { [cause]: AggregateError [ETIMEDOUT]: at internalConnectMultiple (node:net:1139:18) at internalConnectMultiple (node:net:1215:5) at Timeout.internalConnectMultipleTimeout (node:net:1739:5) at listOnTimeout (node:internal/timers:616:11) at process.processTimers (node:internal/timers:549:7) { code: 'ETIMEDOUT', [errors]: [ [Error], [Error] ] } } >
← Newer
Older →