Skip to content

Instantly share code, notes, and snippets.

View wjkoh's full-sized avatar
🎯
Focusing

Woojong Koh wjkoh

🎯
Focusing
View GitHub Profile
@wjkoh
wjkoh / muos_collection.md
Created March 23, 2026 15:31
muOS Collections & Tags Architecture

muOS Collections & Tags Architecture

Through an analysis of the muOS frontend source code, we have identified the underlying architecture for how muOS manages Collections and Tags.

This document outlines how to programmatically generate Collections to bypass the need for manual core assignment when using custom folder structures (like our "Mood-Based" curation).

The Core Assignment Problem

muOS relies heavily on the physical directory structure (e.g., /mnt/mmc/ROMS/snes/) to automatically assign RetroArch cores to games when they are booted for the first time.

If you create custom, flat directories (e.g., /mnt/mmc/ROMS/1. The Foundations/) and place a .sfc file inside, muOS automatic detection will fail, and the user will be presented with a confusing menu asking them to manually select a core.

@wjkoh
wjkoh / casio_sauna_watch_san_100h.md
Last active February 28, 2026 09:45
Casio Sauna Watch

Casio sauna watch (SAN-100H)

μ˜¬λ €μ£Όμ‹  μΉ΄μ‹œμ˜€(CASIO) μ‚¬μš°λ‚˜ μ „μš© μ‹œκ³„(λͺ¨λ“ˆ 5726)의 μ„€λͺ…μ„œλ₯Ό λ°”νƒ•μœΌλ‘œ 핡심 μ‚¬μš©λ²•κ³Ό μ£Όμ˜μ‚¬ν•­μ„ μ•ŒκΈ° μ‰½κ²Œ 정리해 λ“œλ¦΄κ²Œμš”.

이 μ‹œκ³„λŠ” 일반적인 μ‹œκ³„μ™€ 달리 μ‚¬μš°λ‚˜ ν™˜κ²½μ— 맞좰 λ””μžμΈλœ λ…νŠΉν•œ μ œν’ˆμž…λ‹ˆλ‹€.


⚠️ κ°€μž₯ μ€‘μš”ν•œ μ‚¬μš°λ‚˜ μ‚¬μš© μ£Όμ˜μ‚¬ν•­

@wjkoh
wjkoh / cowork_ai_hiring.md
Created January 7, 2026 15:45
Cowork AI와 ν•¨κ»˜ν•  Go μ—”μ§€λ‹ˆμ–΄λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

Cowork AI와 ν•¨κ»˜ν•  Go μ—”μ§€λ‹ˆμ–΄λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

저희 Cowork AIλŠ” μ¦κΆŒμ‚¬μ™€ λ³΄ν—˜μ‚¬λ₯Ό μœ„ν•œ AI μ—μ΄μ „νŠΈλ₯Ό κ°œλ°œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΅œκ·Όμ—λŠ” Fred MCPλΌλŠ” μ œν’ˆμ„ μΆœμ‹œν•˜μ—¬ 본격적인 λΉ„μ¦ˆλ‹ˆμŠ€ ν™•μž₯에 λ‚˜μ„œκ³  μžˆμŠ΅λ‹ˆλ‹€. 저희가 μ§€ν–₯ν•˜λŠ” 기술 λ°©ν–₯성은 μ•„λž˜ 데λͺ¨ 링크λ₯Ό 톡해 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ €ν¬λŠ” 이런 Go μ—”μ§€λ‹ˆμ–΄λ₯Ό μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€:

  • Go의 standard νŒ¨ν‚€μ§€λ₯Ό 깊이 있게 ν™œμš©ν•˜λ©° x-repo νŒ¨ν‚€μ§€λ“€λ„ μ‚΄νŽ΄λ³Έ κ²½ν—˜μ΄ μžˆλŠ” λΆ„
@wjkoh
wjkoh / unix_time.go
Created November 12, 2025 08:52
Go: How to Unmarshal Unix Time from JSON Correctly
type UnixTime struct{ time.Time }
func (t *UnixTime) UnmarshalJSON(b []byte) error {
if string(b) == "null" {
t.Time = time.Time{}
return nil
}
var value any
if err := json.Unmarshal(b, &value); err != nil {
return err
@wjkoh
wjkoh / the_grug_brained_developer_ko.md
Last active November 10, 2025 01:58
그럭 λ‡Œ 개발자: 자각 μžˆλŠ” μž‘μ€ λ‡Œμ²˜λŸΌ μƒκ°ν•˜κΈ° μœ„ν•œ 평신도 μ•ˆλ‚΄μ„œ by Carson Gross

Important

This is an unofficial Korean translation of The Grug Brained Developer by Carson Gross.

grug

그럭 λ‡Œ 개발자: 자각 μžˆλŠ” μž‘μ€ λ‡Œμ²˜λŸΌ μƒκ°ν•˜κΈ° μœ„ν•œ 평신도 μ•ˆλ‚΄μ„œ

μ±… | μƒν’ˆ

μ†Œκ°œ

@wjkoh
wjkoh / buffered_iterator.go
Last active November 7, 2025 10:17
Go: BufferedIterator uses a goroutine and a buffered channel to pre-fetch the next page of data while the current page is being processed, optimizing for slow network calls.
// BufferedIterator returns an iterator over data pages.
//
// This implementation uses a goroutine and a buffered channel
// to pre-fetch the next page of data while the current page
// is being processed, optimizing for slow network calls.
//
// This version starts the producer goroutine *lazily* (only when
// iteration begins) to prevent resource leaks if the
// iterator is created but never used.
func BufferedIterator(ctx context.Context, releaseID int) iter.Seq2[*Data, error] {
@wjkoh
wjkoh / fx_sort_by.sh
Created October 29, 2025 08:46
fx: How to Sort JSON array in-place
#!/usr/bin/env bash
fx ./data/podcasts.json '{...x, podcasts: sortBy(x => x.title)(x.podcasts)}' save
@wjkoh
wjkoh / unix_time.go
Created October 18, 2025 07:21
Go: UnixTime
type UnixTime struct{ time.Time }
func (t *UnixTime) UnmarshalJSON(b []byte) error {
if string(b) == "null" {
t.Time = time.Time{}
return nil
}
var timestamp float64
if err := json.Unmarshal(b, &timestamp); err != nil {
return err
@wjkoh
wjkoh / job_manager.go
Created October 10, 2025 17:24
Go: Background Job Manager
package main
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"log/slog"
"sync"
@wjkoh
wjkoh / sqlite_lru_cache.go
Last active October 2, 2025 06:07
Go: SQLite-based, On-disk LRU Cache
package fred
import (
"context"
"database/sql"
"errors"
"log/slog"
"time"
)