
pkg update
@pkgupdt@hl.pkgu.net
@enbay 아 복사 문제도 있겠군요. 알려주셔서 감사합니다. 😊 SDK도 불안정하고 해서 다른 시스템을 찾아봐야 할 거 같습니다.;
@pkgupdt@hl.pkgu.net · 109 following · 89 followers
A hobbyist photographer, football fan and ex software engineer.
This account is for my personal records. I mostly post in Korean, but I can communicate in English and Japanese.
I use #photo #photography #사진 #写真 tags for my photo posts.
Bluesky | Blog/Profile |
---|---|
@pkgu.net |
@pkgupdt@hl.pkgu.net
@enbay 아 복사 문제도 있겠군요. 알려주셔서 감사합니다. 😊 SDK도 불안정하고 해서 다른 시스템을 찾아봐야 할 거 같습니다.;
@pkgupdt@hl.pkgu.net · Reply to pkg update's post
이런 수준이면 Ryzen AI는 사면 안 되겠는데... 경쟁사들에 비해서 지원할 생각이 있는지 궁금할 지경.
@pkgupdt@hl.pkgu.net
AMD APU openCL 지원은... 정말 열악하구만. 깡 cpu로 미는 것보다 느린 경우도 생기네. 외장 GPU compute 쪽에서 이렇게 밀리지는 않던데, 인텔에 비함 apu는 그냥 라이트 게임만 돌리란 건가. -_-;;
@pkgupdt@hl.pkgu.net
망원 STM 나오는 거 보고 별 거? 없으면 걍 70-200 F4 가야지.
@gameguard.moe@gameguard.moe
아이폰 벨소리로 만든거 공유합니다
윈도우 10에서는 Apple TV, Apple Music, Apple Device 앱이 설치되어있다면 제거하셔야합니다.
iTunes 를 실행 후 기기를 연결하고 소리 부분에 드래그하신뒤에 동기화하시면 사용 가능합니다.
Driftveil City - Pokémon / Toothless (Marimba Ringtone)
https://drive.google.com/file/d/1kjXtncFL8fiMZHIQt1bfmdVkA_UPPg6y/view?usp=sharing
@pkgupdt@hl.pkgu.net
그러고보니 비행기에서 영화 파묘를 봤었다.
뛰어난 화면 연출과 형편 없는 캐릭터들이 얽혀서 아쉬움이 짙게 남았었다. 그 배우들로도 아예 어긋난 인물을 연기하기란 무척 어려웠을 것이다. 감독에게 허술한 각본을 채울 능력이 없었는데, 다행히 흥행한만큼 몇 번의 기회가 더 주어질테니 각본가를 잘 만나야 할 듯.
몇몇 장면은 정말 대단했지만 전체를 보면 헛웃음만 나오는 영화였다.
@pkgupdt@hl.pkgu.net
내 노트 정리 순서는 블루 펜 -> 연필로 가필 -> 스캔(종이는 파쇄) -> 필요시 디지털로 가필 후 태깅 및 아카이빙, 인데 너무 단계가 많은 거 같기도 하고. 흠...
@mumumuphoto@misskey.io
@pkgupdt@hl.pkgu.net
창의 아름다움은 그 그림자에서 잘 드러난다. 얼마나 많이 궁리했을지, 보며 감탄 하고 있었다.
@hongminhee@hollo.social
Don't build #ActivityPub from scratch! It's complex. See why using the #Fedify framework is the smarter way to develop for the fediverse in my new post:
@hongminhee@hackers.pub
So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool!
But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard.
That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel.
This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.
At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start.
First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note
, Article
), profiles (Person
, Organization
), actions (Create
, Follow
, Like
, Announce
)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors.
Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:
Note
objects mean the same thing regarding the name
property:// No name property
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"content": "…"
}
// Equivalent to:
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"name": [],
"content": "…"
}
content
property here:// Single value
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"content": "Hello"
}
// Equivalent to:
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"content": ["Hello"]
}
Announce
activities are semantically equivalent (assuming the URIs resolve correctly):{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Announce",
// Embedded objects:
"actor": {
"type": "Person",
"id": "http://sally.example.org/",
"name": "Sally"
},
"object": {
"type": "Arrive",
"id": "https://sally.example.com/arrive",
/* ... */
}
}
// Equivalent to:
{
"@context":
"https://www.w3.org/ns/activitystreams",
"type": "Announce",
// URI references:
"actor": "http://sally.example.org/",
"object": "https://sally.example.com/arrive"
}
Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation.
Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags
) always return arrays, functional properties (like content
) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()
) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.
Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger
capable of parsing resource queries (like acct:
URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self
link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible.
Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher()
method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle()
or mapAlias()
callbacks. You focus on defining your actors; Fedify handles making them discoverable.
// Example: Define how to find actors
federation.setActorDispatcher(
"/users/{username}",
async (ctx, username) => { /* ... */ }
);
// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!
Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json
) but HTML for browsers (Accept: text/html
). Handling incoming activities at the inbox endpoint involves validating POST
requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox
, followers
, etc.) with correct pagination adds another layer.
Fedify streamlines all of this. Its core request handler (via Federation.fetch()
or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher()
and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners()
lets you define handlers per activity type (e.g., .on(Follow, ...)
), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()
); you provide logic to fetch a page of data, and Fedify constructs the correct Collection
or CollectionPage
with pagination.
// Define inbox handlers
federation.setInboxListeners("/inbox", "/users/{handle}/inbox")
.on(Follow, async (ctx, follow) => { /* Handle follow */ })
.on(Undo, async (ctx, undo) => { /* Handle undo */ });
// Define followers collection logic
federation.setFollowersDispatcher(
"/users/{handle}/followers",
async (ctx, handle, cursor) => { /* ... */ }
);
Sending an activity requires more than a simple POST
. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible.
Fedify addresses reliability and scalability using its MessageQueue
abstraction. When configured (highly recommended), Context.sendActivity()
enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy
). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.
// Configure Fedify with a persistent queue (e.g., Deno KV)
const federation = createFederation({
queue: new DenoKvMessageQueue(/* ... */),
// ...
});
// Sending is now reliable and non-blocking
await ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);
Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly.
Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher()
. It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.
The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities.
Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformer
s to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher()
.
Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential.
Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify
CLI is a powerful companion designed to streamline common development tasks.
You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init
.
For debugging interactions and verifying data, fedify lookup
is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:
$ fedify lookup @fedify-example@fedify-blog.deno.dev
Will first show progress messages and then output the structured representation of the actor, similar to this:
// Output of fedify lookup command (shows parsed object structure)
Person {
id: URL "https://fedify-blog.deno.dev/users/fedify-example",
name: "Fedify Example Blog",
published: 2024-03-03T13:18:11.857Z, // Simplified timestamp
summary: "This blog is powered by Fedify, a fediverse server framework.",
url: URL "https://fedify-blog.deno.dev/",
preferredUsername: "fedify-example",
publicKey: CryptographicKey {
id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key",
owner: URL "https://fedify-blog.deno.dev/users/fedify-example",
publicKey: CryptoKey { /* ... CryptoKey details ... */ }
},
// ... other properties like inbox, outbox, followers, endpoints ...
}
This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed.
Testing outgoing activities from your application during development is made much easier with fedify inbox
. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:
$ fedify inbox
✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/
✔ Sent follow request to @<some_test_account>@activitypub.academy.
╭───────────────┬─────────────────────────────────────────╮
│ Actor handle: │ i@<unique_id>.lhr.life │
├───────────────┼─────────────────────────────────────────┤
│ Actor URI: │ https://<unique_id>.lhr.life/i │
├───────────────┼─────────────────────────────────────────┤
│ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │
├───────────────┼─────────────────────────────────────────┤
│ Shared inbox: │ https://<unique_id>.lhr.life/inbox │
╰───────────────┴─────────────────────────────────────────╯
Web interface available at: http://localhost:8000/
You then configure your developing application to send an activity to the Actor inbox
or Shared inbox
URI provided. When an activity arrives, fedify inbox
only prints a summary table to your console indicating that a request was received:
╭────────────────┬─────────────────────────────────────╮
│ Request #: │ 2 │
├────────────────┼─────────────────────────────────────┤
│ Activity type: │ Follow │
├────────────────┼─────────────────────────────────────┤
│ HTTP request: │ POST /i/inbox │
├────────────────┼─────────────────────────────────────┤
│ HTTP response: │ 202 │
├────────────────┼─────────────────────────────────────┤
│ Details │ https://<unique_id>.lhr.life/r/2 │
╰────────────────┴─────────────────────────────────────╯
Crucially, the detailed information about the received request—including the full headers (like Signature
), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox
. This web UI allows you to thoroughly inspect incoming activities during development.
When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel
can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.
Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application.
Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try!
Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name
.
Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!
@c1@misskey.io
@atLuminon@byeolvit.space
のどかだね。
📸 : Voigtländer BESSA-R, CANON Serenar 50mm f/1.8 I
🎞 : KODAK Professional PORTRA 160
🏙️ : Kokurakita-ku, Kitakyushu City, Japan
#사진토돈 #사진 #Photography #写真 #マストドン写真部 #Misskey写真部 #마스토돈사진부 #미스키사진부
@pkgupdt@hl.pkgu.net
톱카프 궁전 제4중정에서 바라본 보스푸르스 해협 전경. 지금도 식량 수급과 국제 정세를 쥐고 있는 바다다.
@boknews.bsky.social@bsky.brid.gy
“오늘 못한 운동, 주말에 몰아 해도 되나요?”···당뇨병 유병률 살펴봤더니
www.khan.co.kr/article/2025...
"주말에 운동을 집중적으로 몰아서 하는 집단과 평일에 규칙적으로 운동하는 집단의 당뇨병 유병률 감소 효과는 유의미한 차이가 없었다."
“오늘 못한 운동, 주말에 몰아 해도 되나요?”···당...
@pkgupdt@hl.pkgu.net
https://docs.darktable.org/usermanual/4.8/en/module-reference/processing-modules/filmic-rgb/
Darktable에는 filmic rgb 라는 모듈이 있는데, 미드 톤의 색과 컨트라스트를 중심으로 이미지 픽셀들의 RGB 정보를 remap하는 기능이다. 노출을 조정해서 미드 톤을 내가 원하는 부분으로 맞춘 다음에 적용하면 편리하다. 커브를 직접 만지거나 Tone EQ를 사용하는 것보다 더 자연스러워서 혹은 필름 비슷해서 좋다. 편해요.😅
근데 왜 내 라이젠 PC에서는 opencl 에러가 나는 걸까.;;
@pkgupdt@hl.pkgu.net · Reply to 루미논카노네스🌨️'s post
@atLuminon 읽어주셔서, 그리고 멋진 사진 보여주셔서 감사합니다! 저도 앞으로 더 많이 이야기하고 싶네요. 😁 OVF의 매력은 미러리스 쓰면서도 계속 아쉬운 부분이에요. 아예 외장 뷰파인더를 하나 살까 고민이 되기도 합니다. 😅
@pkgupdt@hl.pkgu.net
군이 폭주하기 전의 제국은 이렇게 아름다웠을 거야! 상상을 해 보자!
... 그럴 리가 있나. 그 놈들이 뭘 보고 배워서 그랬겠냐. -_-;
@pkgupdt@hl.pkgu.net
다이쇼 데모크라시는 일본 민중이 정부에게 열강으로서의 권리 즉 이익 확보(+우리 몫)을 강력히 요구하는 움직임이기도 했습니다. 내부의 빈곤, 불평등을 해외 착취로 해결하려는 시도는 결국 중일, 태평양 전쟁 그리고 제국의 파멸로 이어집니다.
일제를 메이지-다이쇼-쇼와로 분리해서 이해할 수는 없습니다. 다이쇼 시대의 도쿄에 긍정적인 면들도 있지만, 무엇보다도 빈곤에 고통 받던 민중이 침략을 요구하기 시작한 시대임 또한 분명히 할 필요가 있습니다. 전쟁은 군부 특히 육군 엘리트 일부가 벌인 일이 아니죠.
정확히 말하자면 메이지 시대에도 열강으로서의 욕심은 있었지만, 그 때는 간땡이들이 덜 부어서. ㅋㅋㅋ
이 시대의 이러한 흐름 때문에, 다이쇼 로망에서는 많은 경우 일본 군인이 등장하고 긍정적으로 그려집니다. 물론 당시 일본군에서는 폭력과 부조리가 만연했지만 그런 거 사실적으로 그리면 로망이 아니겠죠.; 심하면 재벌도 미화되죠. -_-;;
실제 당시 그 일본을 위해 얻어맞으며 쌀 내주고 노동력 내주고 땅도 뺏기던 한반도 사람들(의 후손들)이 그거 빨아간 일본 사람들 로망 있게... 사는 모습 묘사 보고 짜증 내는 건, 어찌 보면 당연한 일입니다. 다이쇼 로망은 한국에서 선호되는 장르일 수가 없습니다.
@Nadir_RL@misskey.io
絵に描いたような花畑
@atLuminon@byeolvit.space
개화.
📸 : Panasonic Lumix S9, SIGMA 24-70mm F2.8 DG DN II Ⓐ Art
🏙️ : Gasan Digital Complex, Seoul, Korea Rep.
#사진토돈 #사진 #Photography #写真 #マストドン写真部 #Misskey写真部 #마스토돈사진부 #미스키사진부
@pkgupdt@hl.pkgu.net
Darktable 써 보고 있는데 Rawtherapee보다 느리긴 해도 나름대로 강점이 확실히 있네.
요즘 시대에는 DT가 더 나을지도 모르겠다.
@pkgupdt@hl.pkgu.net
바둑이가 대선 출마 선언 했다고.
... 누구나 나올 수 있는 선거라지만 윤석열이 복권해준 여론조작범이 바로 얼굴 쳐 들고 나온다니, 윤가놈 노림수가 (그 생각보다는 빨랐겠지만) 적중했네.
바둑이 김경수씨는 자중하라. 할 거라 기대는 안 한다만 누구 좋자고 저리 경거망동하나.
@pkgupdt@hl.pkgu.net
오늘은 여행기 시리즈 마무리 해야지.
@Native@pointless.chat
신한은행 전산오류로 인해 피해를 입은 것에 대한 기록 https://blog.native.cat/post/86
@NAES@madost.one
짤로 쪄슴
RE: https://madost.one/notes/8k0z6ejo2p
@NAES@madost.one
전차 하나가 진입하고 있고
그대로 내버려 두면
선로 위에 묶인 다섯 명의 사람을
마법소녀로 만들 수 있습니다
그러나 당신이 레버를 당긴다면
당신이 마법소녀가 됩니다
야후!
@mumumuphoto@misskey.io
@pkgupdt@hl.pkgu.net
올해 벚꽃도 지나갔네. 올해는 좋은 기억이 많아지기를.
@pkgupdt@hl.pkgu.net · Reply to :vrchat_full: Gameguard's post
@gameguard.moe 저도 당하고서야 알았습니다. 잘 해결하시길 빌게요. T_T
@pkgupdt@hl.pkgu.net · Reply to :vrchat_full: Gameguard's post
@gameguard.moe RUFUS 등으로 윈도 ISO에서 설치 USB를 만들 때 NTFS로 포맷해서 만들면 설치 되는 디스크에 EFI 부트로더 파티션을 안 만들더군요. USB에 있는 걸로 부팅되도록 설치됩니다.
MS 공식 설치 매체 도구를 쓰시거나 FAT32/exFAT으로 만들고 다시 설치하시면 정상적으로 될 겁니다.
@pkgupdt@hl.pkgu.net
터보 엔진 차의, 엑셀을 내려밟았을 때 토크가 터져나오기까지 걸리는 터보 랙이 좋다. 디젤은 진동이 먼저 와서 약간 맛이 덜하고 가솔린 터보가 가장 즐거움. 자연흡기의 빠른 반응도 좋지만 역시 터보 터질 때의 토크감이 최고야. 토크는 전기차도 좋지만 얘네는 리니어해서 감각이 다르고.
V8, V6 좋긴 한데 역시 터보로 직렬 4기통을 쥐어짜는 감각이 더 좋음. 이건 내가 WRC를 좋아해서 그런 거겠지만. 거기 요즘 인기가 시들해서 슬퍼...; 현대차 힘내라, 하는 김에 i20 한국 발매도 좀 안 될까? ㅎㅎ;