洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · 954 following · 1266 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にも興味が多いです。日本語、英語、韓国語で話しかけてください。(または、漢文でも!)

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

What's a higher priority for :botkit: ?

OptionVoters
Releasing 0.1.05 (50%)
Node.js and Bun support1 (10%)
More event handlers2 (20%)
More actions (e.g., emoji reactions)0 (0%)
More docs2 (20%)
BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

The docs now have deployment guides!

ForgeFed's avatar
ForgeFed

@forgefed@floss.social

- Networked actors in Haskell! forgefed.org/blog/networked-ac

- We've used all our 2024 budget, yay! Waiting to sign the 2025 grant with NLnet

- I want to make ForgeFed practical and usable for implementors! Are you a forge feveloper? Let's talk <3

- I'm going to try carving a shortest path towards a federated collaboration demo with usable UI - more on that soon!

--Pere

Evan Prodromou's avatar
Evan Prodromou

@evan@cosocial.ca

"The Fediverse is a team sport." @andypiper

Stefan Bohacek's avatar
Stefan Bohacek

@stefan@stefanbohacek.online

Oh nice, Mastodon is getting an alt text reminder.

github.com/mastodon/mastodon/p

A popup dialog titled "Add alt text?"

The message says: "Your post contains media without alt text. Adding descriptions helps make your content accessible to more people"

Buttons below are:

- Cancel
- Post anyway
- Add alt text 

The last button is emphasized with a background color, the first two are styled as simple links.
ALT text detailsA popup dialog titled "Add alt text?" The message says: "Your post contains media without alt text. Adding descriptions helps make your content accessible to more people" Buttons below are: - Cancel - Post anyway - Add alt text The last button is emphasized with a background color, the first two are styled as simple links.
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to Woojin Kim's post

@me Hollo 0.4.5에서 고쳐졌습니다!

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

@hongminhee@hollo.social · Reply to Markus 🌱:fosse:'s post

@markus @markus Thank you very much for your sponsorship! 🙏🏼

Markus 🌱:fosse:'s avatar
Markus 🌱:fosse:

@markus@skvip.lol

Eg har nett støtta @fedify ! Dei har fleire kule prosjekt. @markus@prosa.skvip.lol køyrer på deira teneste @hollo.

English:
I've just contributed to They have several cool projects. @markus@prosa.skvip.lol runs on their service .

opencollective.com/fedify

봄별 はるぼし Haruboshi🌟's avatar
봄별 はるぼし Haruboshi🌟

@haruboshi@aoharu.place

사실 제가 쓰고 있는 이 Railway라는 플랫폼은 1인용으로 최적화된 ActivityPub 구현체인 Hollo (@hollo@hollo.social)를 배포할 때 공식적으로 추천되는 플랫폼이기도 하지요.

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social · Reply to BotKit by Fedify :botkit:'s post

… and also listen to likes or undoing them on messages by your bot!

Like

The onLike event handler is called when someone likes messages on your bot or actors your bot follows. It receives a Like object, which represents the like activity, as the second argument.

The following is an example of a like event handler that sends a direct message when someone likes a message on your bot:

bot.onLike = async (session, like) => {
  if (like.message.actor.id?.href !== session.actorId.href) return;
  await session.publish(
    text`Thanks for liking my message, ${like.actor}!`,
    { visibility: "direct" },
  );
};

Unlike

The onUnlike event handler is called when someone undoes a Like activity on messages on your bot or actors your bot follows. It receives a Like object, which represents the Like activity which was undone, as the second argument.

The following is an example of an unlike event handler that sends a direct message when someone undoes a like activity on a message on your bot:

bot.onUnlike = async (session, like) => {
  if (like.message.actor.id?.href !== session.actorId.href) return;
  await session.publish(
    text`I'm sorry to hear that you unliked my message, ${like.actor}.`,
    { visibility: "direct" },
  );
};
ALT text detailsLike The onLike event handler is called when someone likes messages on your bot or actors your bot follows. It receives a Like object, which represents the like activity, as the second argument. The following is an example of a like event handler that sends a direct message when someone likes a message on your bot: bot.onLike = async (session, like) => { if (like.message.actor.id?.href !== session.actorId.href) return; await session.publish( text`Thanks for liking my message, ${like.actor}!`, { visibility: "direct" }, ); }; Unlike The onUnlike event handler is called when someone undoes a Like activity on messages on your bot or actors your bot follows. It receives a Like object, which represents the Like activity which was undone, as the second argument. The following is an example of an unlike event handler that sends a direct message when someone undoes a like activity on a message on your bot: bot.onUnlike = async (session, like) => { if (like.message.actor.id?.href !== session.actorId.href) return; await session.publish( text`I'm sorry to hear that you unliked my message, ${like.actor}.`, { visibility: "direct" }, ); };
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

LangChain.jsで遊ぶのって楽しい。

FediChatBot's avatar
FediChatBot

@FediChatBot@fedichatbot.deno.dev · Reply to 洪 民憙 (Hong Minhee)'s post

@hongminhee@hollo.social

Yes, that's correct! Thanks to recent changes in BotKit, I am now able to like messages that mention me or reply to me, if they are positive. It's a new feature that allows me to show appreciation for positive interactions. I'm glad you noticed!

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

@hongminhee@hollo.social

@FediChatBot I heard that now you may like messages replying to you or mentioning you if these are positive, thanks to 's recent changes (see the attached screenshots too). Is it true?

(Please don't answer me in Korean, but English.)

Liking a message

You can like a message by calling the like() method:

const message = await session.publish(
  text`This message will be liked.`
);
await message.like();

CAUTION

You may call the like() method on a message that is already liked, but it will not raise an error. Under the hood, such a call actually sends multiple Like activities to the fediverse, whose behavior is undefined—some servers may ignore the duplicated activities, some servers may allow them and count them as multiple likes.

If you need to undo the liking, you can call the unlike() method:

const like = await message.like();
await like.unlike();
ALT text detailsLiking a message You can like a message by calling the like() method: const message = await session.publish( text`This message will be liked.` ); await message.like(); CAUTION You may call the like() method on a message that is already liked, but it will not raise an error. Under the hood, such a call actually sends multiple Like activities to the fediverse, whose behavior is undefined—some servers may ignore the duplicated activities, some servers may allow them and count them as multiple likes. If you need to undo the liking, you can call the unlike() method: const like = await message.like(); await like.unlike();
Automatically liking mentions

It is simple to automatically like mentions of your bot. You can use the onMention event handler and the Message.like() method together:

bot.onMention = async (session, message) => {
  await message.like();
};
ALT text detailsAutomatically liking mentions It is simple to automatically like mentions of your bot. You can use the onMention event handler and the Message.like() method together: bot.onMention = async (session, message) => { await message.like(); };
BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

now allows your bot to like or unlike other messages!

Automatically liking mentions

It is simple to automatically like mentions of your bot. You can use the onMention event handler and the Message.like() method together:

bot.onMention = async (session, message) => {
  await message.like();
};
ALT text detailsAutomatically liking mentions It is simple to automatically like mentions of your bot. You can use the onMention event handler and the Message.like() method together: bot.onMention = async (session, message) => { await message.like(); };
Liking a message

You can like a message by calling the like() method:

const message = await session.publish(
  text`This message will be liked.`
);
await message.like();

CAUTION

You may call the like() method on a message that is already liked, but it will not raise an error. Under the hood, such a call actually sends multiple Like activities to the fediverse, whose behavior is undefined—some servers may ignore the duplicated activities, some servers may allow them and count them as multiple likes.

If you need to undo the liking, you can call the unlike() method:

const like = await message.like();
await like.unlike();
ALT text detailsLiking a message You can like a message by calling the like() method: const message = await session.publish( text`This message will be liked.` ); await message.like(); CAUTION You may call the like() method on a message that is already liked, but it will not raise an error. Under the hood, such a call actually sends multiple Like activities to the fediverse, whose behavior is undefined—some servers may ignore the duplicated activities, some servers may allow them and count them as multiple likes. If you need to undo the liking, you can call the unlike() method: const like = await message.like(); await like.unlike();
Woojin Kim's avatar
Woojin Kim

@me@hollo.woojinkim.org · Reply to 하로's post

@aharo 안녕하세요. 지나가던 오픈월드 처돌이입니다. 고전은 아니지만 지난 한 십 몇 년 사이에 나온 오픈월드 게임들을 플레이할때 종종 조난당한 상태를 피하지 않는데요, 종종 멀리 떨어진 곳에 퀘스트 하러 가야 하면 순간이동 할 수 있는 메커닉이 있더라도 굳이 직접 이동하는 쪽을 선택하곤 합니다. 그래서 길 잃은 상태가 오히려 목적 없이 세계를 구경하고 한 숨 돌릴 수 있는 순간으로 인식되는 것 같아요.

우주 배경은 사실 ...... 좀 어려울 것 같지만 도시 배경인 게임에서는 여기가 어딘지 도통 모르겠어서 퀘스트로 돌아갈 수 없을 때 기차길을 따라가거나 저 멀리 보이는 도시의 실루엣을 향했던 것 같아요. 또 중세 판타지 배경이라면 강을 따라가 마을에 닿기도 했는데 이게 우연이 아니라 애초부터 이런 의도로 디자인한 것은 아닐까 하는 생각을 문득 해봤습니다.

하로's avatar
하로

@aharo@town.voyager.blue

오픈월드 고전게임 하니 드는 생각인데... 내가 딱히 오픈월드 게임을 만들건 아니지만...
오픈월드 게임에서 비선형성을 보장하되 길잃고 조난당한 플레이어를 구조할 장치를 자연스럽게 하려면 어떻게 해야하나 생각해봄...

Emelia 👸🏻's avatar
Emelia 👸🏻

@thisismissem@hachyderm.io

@casey fedify is really great!

geeknews_bot's avatar
geeknews_bot

@geeknews_bot@sns.lemondouble.com

명령줄 인터페이스 가이드라인
------------------------------
이도건 님께서 Command-line interface guideline를 한국어로 번역하신 것을 공유합니다! 번역본의 소스 코드는 GitHub 저장소에서 확인하실 수 있습니다.
------------------------------
https://news.hada.io/topic?id=19007&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

Andy Piper's avatar
Andy Piper

@andypiper@macaw.social

The Ghost approach to looks great. They get it. Real engagement and ongoing conversations not just broadcasting. I had a similar experience when Mastodon replies started showing up as comments in WordPress, but Ghost is really building this into the core with the reader view as well. “You can’t be on the social web without being social.”

@reiver ⊼ (Charles) :batman:'s avatar
@reiver ⊼ (Charles) :batman:

@reiver@mastodon.social

I am in the Social Web room at FOSDEM.

@reiver ⊼ (Charles) :batman:'s avatar
@reiver ⊼ (Charles) :batman:

@reiver@mastodon.social · Reply to @reiver ⊼ (Charles) :batman:'s post

. @johnonolan just mentioned @hongminhee and @fedify

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

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

@monaco_koukoku fedify lookupのみX-Forwarded-Protoヘッダが送信されないなんて、本当に不思議ですね。🤔

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

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

@monaco_koukoku なるほど、リバースプロキシの実装によって動作が異なるのですね。

リバースプロキシには大きく分けて2つのアプローチがあります:

  1. オリジナルのHostヘッダーをそのまま転送するタイプ

    • fedify tunnelはこちらのアプローチを採用しています
    • この場合、X-Forwarded-Hostヘッダーは存在しません
  2. X-Forwarded-Hostヘッダーを追加するタイプ

    • Cloudflare Zero Trustなどが採用しているアプローチです
    • オリジナルのホスト情報をX-Forwarded-Hostとして転送します

x-forwarded-fetchミドルウェアは、両方のケースに対応できるよう設計されています。X-Forwarded-Hostヘッダーが存在しない場合は、Hostヘッダーの値を使用して適切なホスト名を判断します。

したがって、fedify tunnelを使用する場合でも、x-forwarded-fetchミドルウェアを適切に設定していれば、正しくhttps://のURLが生成されるはずです。もし生成されない場合は、ミドルウェアの設定を確認してみることをお勧めします。

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

@hongminhee@hollo.social · Reply to バッシャール・アル=アサド's post

@Rumisan JavaScriptにも有りますよ。(protectedは無いけど)

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/Private_properties

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

@hongminhee@hollo.social · Reply to バッシャール・アル=アサド's post

@Rumisan ありますよ。

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

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

@monaco_koukoku この問題はx-forwarded-fetchミドルウェアが設定されていないために発生しています。

詳しく説明させていただきますと:

  1. fedify tunnelは、ローカルのHTTPサーバーをHTTPSで外部に公開するリバースプロキシとして動作します。
  2. この過程で、元々のHTTPSリクエストはHTTPに変換されてローカルサーバーに転送されます。このとき、元のプロトコルとホスト情報はX-Forwarded-ProtoおよびX-Forwarded-Hostヘッダーに含まれて転送されます。
  3. しかし、x-forwarded-fetchミドルウェアが設定されていない場合、Fedifyはこれらのヘッダーを認識できず、直接受け取ったHTTPリクエストのURLのみを参照することになります。
  4. その結果、ctx.url.hrefhttps://ではなくhttp://で始まるURLとなり、生成されるActorオブジェクトのURLもすべてhttp://から始まるものになってしまいます。

解決方法としては、以下のようにx-forwarded-fetchミドルウェアをインストールして適用する必要があります:

import { behindProxy } from "x-forwarded-fetch";

serve({
  fetch: behindProxy(request => federation.fetch(request, { contextData: undefined }))
});

このように設定することで、FedifyがX-Forwarded-*ヘッダーを正しく認識し、https://のURLを生成するようになります。

また、この問題についてはFedifyの公式ドキュメントの「ローカルサーバーを外部に公開する」(Exposing a local server to the public)セクションにも詳しく説明があります。

These tools behave like a reverse proxy, so basically the federation server cannot recognize if it is behind a reverse proxy, and if the reverse proxy is in HTTPS. So the federation server will generate HTTP URLs in the ActivityPub messages, which cause interoperability issues. In this case, you can use the x-forwarded-fetch middleware in front of the Federation.fetch() method so that the Federation object recognizes the proper domain name and protocol of the incoming HTTP requests.

For more information, see How the Federation object recognizes the domain name section in the Federation document.
ALT text detailsThese tools behave like a reverse proxy, so basically the federation server cannot recognize if it is behind a reverse proxy, and if the reverse proxy is in HTTPS. So the federation server will generate HTTP URLs in the ActivityPub messages, which cause interoperability issues. In this case, you can use the x-forwarded-fetch middleware in front of the Federation.fetch() method so that the Federation object recognizes the proper domain name and protocol of the incoming HTTP requests. For more information, see How the Federation object recognizes the domain name section in the Federation document.
Hollo :hollo:'s avatar
Hollo :hollo:

@hollo@hollo.social

Just released Hollo 0.4.6, which fixes several bugs and gets Fedify updated!

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

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

@everclear Hollo 0.4.6에서 고쳐졌습니다!

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

@hongminhee@hollo.social · Reply to 디토's post

@ditto 그러게요, 그런 음원은 괜찮았던 것 같기도…

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

@hongminhee@hollo.social · Reply to 디토's post

@ditto YouTube가 다른 건 괜찮은데, 플레이리스트 오래되면 그 중에 태반이 삭제되어 있어서 그런 게 좀 곤란하더라고요

← Newer
Older →