백준 관련해서 보다가 이런저런 프로젝트들이 많길래 모아놓는 저장소를 하나 팠다.

Juntai Park
@arkjun@hackers.pub · 65 following · 82 followers
中年의 中小企業 開發者, 90年代 Console Gamer. 좋은 하루를 繼續해 나아간다. 좋은 하루가 모이면 좋은 人生이 된다.
韓国人のプログラマー、40代、小学生の息子とゲームするのが幸せ😃💕龍が如く 、ゼルダの伝説、マリオ、ピクミン好き
「いい1日を続ける」
いい1日を続けていけば、いい人生になる!
threads
- @rkjun
x
- @rkJun
uri.life
- @arkjun@uri.life
GitHub
- @arkjun
디지털 가드닝에 관심이 많은 개발자입니다.
- 특히 위키 형식의 문서 관리, knowledge graph 구조의 시각화에 관심이 있어요.
- kodingwarrior.github.io/wiki
Neovim 이라는 텍스트 에디터에 굉장히 꽂혀있습니다.
- 과몰입한 나머지 플러그인까지 개발해본 경험이 있어요.
- 한국어권 개발자를 위한 Vim 디스코드를 운영중입니다 (vim.kr)
프로그래밍을 하는 행위 자체를 좋아합니다.
- 프로그래밍으로 퍼즐을 푸는 행위를 좋아했고, 비슷한 흔적을 가진 사람들에게 친밀감을 느낍니다.
해커스펍을 더 흥하게 할 수 있는 아이디어가 하나 더 생각났다,, 다음주 주말쯤에 보따리 봉인 풀어야지 캬캬캬
개발자 한 100명 정도 해커스펍에 오면 사실상 트위터 개발자 타임라인이랑 비슷한 리젠율 찍을듯
HackersPub을 통해 개발자들 위주로 연합우주 타임라인이 계속 핫해질듯...!!!
그동안(10+년;;) git이 엄청 잘만든 물건 같지는 않다고 생각하며 대충 쓰고있었는데, 요즘 branch 개념 자체가 근본적인 실수란 생각이 들기 시작했다. branch 대신에 변경의 시작과 끝, 양 끝점을 가지는 interval을 쓰는게 맞는거 같다(카테고리 이론의 작은 교훈: primitive는 양 끝점을 가지는게 좋다).
git을 쓰면 히스토리 길어진다고 squash merge 등을 하는데, (나도 하지만) 사실 기껏 만들어놓은 히스토리를 뭉개버리는 말도 안되는 동작이다. 만약 interval을 쓴다면 히스토리는 그대로 남기고 UI 단에서 fold/unfold 등을 해줄수 있을 것이다.
Darcs 등이 interval에 기초하는데, 지금은 일이 너무 바빠서 시도할 여유가 없다. 한번 숨고를 시간이 주어지면 멀쩡한 VCS를 탐색하는 시간을 가질것이다.
해커펍은 퍼머링크로 아카이빙 참조하기 최적이라 생각해서 앞으로 기술을 다루며 기록 및 참조하는 용도로 잘 사용하려고 합니다.
트위터는 나중에 다른 사람에게 보여줄 참조용으로 쓰기에는 너무 정보 대비 소음이 많은 특성 때문에 잘 맞지 않는다고 생각합니다.
📢 Hackers' Pub 초대 시스템 오픈!
Hackers' Pub에 초대 시스템이 적용되었습니다. 이제 설정 → 초대 페이지에서 지인들을 초대할 수 있습니다.
주요 내용:
- 초대장 3장 지급: 기존 회원분들께 3장의 초대장이 지급되었습니다.
- 초대 방법: 설정 → 초대 페이지에서 초대 링크를 생성하여 공유하거나, 이메일 주소를 입력하여 초대할 수 있습니다.
- 추가 초대: 초대장은 향후 비정기적으로 추가될 예정입니다.
- 자동 팔로: 초대자와 피초대자는 자동으로 상호 팔로됩니다. (언팔로 가능.)
Hackers' Pub의 퀄리티를 유지하고, 더욱 풍성한 기술 논의를 위해 신중한 초대를 부탁드립니다.
궁금한 점이나 건의사항은 답글로 남겨주세요.
Hackers' Pub 커뮤니티 성장에 많은 참여 부탁드립니다!
📢 Hackers' Pub 招待システムオープン!
Hackers' Pub に招待システムが適用されました。これで設定→招待ページから知人を招待できます。
主な内容:
- 招待状3枚支給:既存会員の皆様には3枚の招待状が支給されました。
- 招待方法:設定→招待ページで招待リンクを作成して共有するか、メールアドレスを入力して招待できます。
- 追加招待:招待状は今後不定期に追加される予定です。
- 自動フォロー:招待者と被招待者は自動的に相互フォローされます。(フォロー解除可能)
Hackers' Pub のクオリティを維持し、より豊かな技術議論のために慎重な招待をお願いいたします。
ご不明な点やご要望は、この投稿への返信としてお寄せください。
Hackers' Pub コミュニティの成長にご協力をお願いいたします!
📢 Hackers' Pub 초대 시스템 오픈!
Hackers' Pub에 초대 시스템이 적용되었습니다. 이제 설정 → 초대 페이지에서 지인들을 초대할 수 있습니다.
주요 내용:
- 초대장 3장 지급: 기존 회원분들께 3장의 초대장이 지급되었습니다.
- 초대 방법: 설정 → 초대 페이지에서 초대 링크를 생성하여 공유하거나, 이메일 주소를 입력하여 초대할 수 있습니다.
- 추가 초대: 초대장은 향후 비정기적으로 추가될 예정입니다.
- 자동 팔로: 초대자와 피초대자는 자동으로 상호 팔로됩니다. (언팔로 가능.)
Hackers' Pub의 퀄리티를 유지하고, 더욱 풍성한 기술 논의를 위해 신중한 초대를 부탁드립니다.
궁금한 점이나 건의사항은 답글로 남겨주세요.
Hackers' Pub 커뮤니티 성장에 많은 참여 부탁드립니다!
@curry박준규 확장이 하도 많아서 뭐가 있는지 다 알기가 어려운 것 같아요… 😂
@hongminhee洪 民憙 (Hong Minhee) 이런 표현이 있습니다.
GHC has more flags than the UN.
https://github.com/dahlia/hackerspub/pull/12
해커스펍의 멘션 기능에 가독성 개선이 필요할 것 같아서 제안하는 느낌으로 PR은 올렸는데, 다른 분들도 어떤 의견을 가지고 계실지 모르겠다
仮名もハングルも表音文字だから日本語の文章をハングルで表記できそうと思ったらそれっぽいのがもうあった
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E3%83%8F%E3%83%B3%E3%82%B0%E3%83%AB%E8%A1%A8%E8%A8%98
Juntai Park shared the below article:
Revisiting Java's Checked Exceptions: An Underappreciated Type Safety Feature

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
Despite their bad reputation in the Java community, checked exceptions provide superior type safety comparable to Rust's Result<T, E>
or Haskell's Either a b
—we've been dismissing one of Java's best features all along.
Introduction
Few features in Java have been as consistently criticized as checked exceptions. Modern Java libraries and frameworks often go to great lengths to avoid them. Newer JVM languages like Kotlin have abandoned them entirely. Many experienced Java developers consider them a design mistake.
But what if this conventional wisdom is wrong? What if checked exceptions represent one of Java's most forward-thinking features?
In this post, I'll argue that Java's checked exceptions were ahead of their time, offering many of the same type safety benefits that are now celebrated in languages like Rust and Haskell. Rather than abandoning this feature, we should consider how to improve it to work better with modern Java's features.
Understanding Java's Exception Handling Model
To set the stage, let's review how Java's exception system works:
-
Unchecked exceptions (subclasses of
RuntimeException
orError
): These don't need to be declared or caught. They typically represent programming errors (NullPointerException
,IndexOutOfBoundsException
) or unrecoverable conditions (OutOfMemoryError
). -
Checked exceptions (subclasses of
Exception
but notRuntimeException
): These must either be caught withtry
/catch
blocks or declared in the method signature withthrows
. They represent recoverable conditions that are outside the normal flow of execution (IOException
,SQLException
).
Here's how this works in practice:
// Checked exception - compiler forces you to handle or declare it
public void readFile(String path) throws IOException {
Files.readAllLines(Path.of(path));
}
// Unchecked exception - no compiler enforcement
public void processArray(int[] array) {
int value = array[array.length + 1]; // May throw ArrayIndexOutOfBoundsException
}
The Type Safety Argument for Checked Exceptions
At their core, checked exceptions are a way of encoding potential failure modes into the type system via method signatures. This makes certain failure cases part of the API contract, forcing client code to explicitly handle these cases.
Consider this method signature:
public byte[] readFileContents(String filePath) throws IOException
The throws IOException
clause tells us something critical: this method might fail in ways related to IO operations. The compiler ensures you can't simply ignore this fact. You must either:
- Handle the exception with a try-catch block
- Propagate it by declaring it in your own method signature
This type-level representation of potential failures aligns perfectly with principles of modern type-safe programming.
Automatic Propagation: A Hidden Advantage
One often overlooked advantage of Java's checked exceptions is their automatic propagation. Once you declare a method as throws IOException
, any exception that occurs is automatically propagated to the caller without additional syntax.
Compare this with Rust, where you must use the ?
operator every time you call a function that returns a Result
:
// Rust requires explicit propagation with ? for each call
fn read_and_process(path: &str) -> Result<(), std::io::Error> {
let content = std::fs::read_to_string(path)?;
process_content(&content)?;
Ok(())
}
// Java automatically propagates exceptions once declared
void readAndProcess(String path) throws IOException {
String content = Files.readString(Path.of(path));
processContent(content); // If this throws IOException, it's automatically propagated
}
In complex methods with many potential failure points, Java's approach leads to cleaner code by eliminating the need for repetitive error propagation markers.
Modern Parallels: Result Types in Rust and Haskell
The approach of encoding failure possibilities in the type system has been adopted by many modern languages, most notably Rust with its Result<T, E>
type and Haskell with its Either a b
type.
In Rust:
fn read_file_contents(file_path: &str) -> Result<Vec<u8>, std::io::Error> {
std::fs::read(file_path)
}
When calling this function, you can't just ignore the potential for errors—you need to handle both the success case and the error case, often using the ?
operator or pattern matching.
In Haskell:
readFileContents :: FilePath -> IO (Either IOException ByteString)
readFileContents path = try $ BS.readFile path
Again, the caller must explicitly deal with both possible outcomes.
This is fundamentally the same insight that motivated Java's checked exceptions: make failure handling explicit in the type system.
Valid Criticisms of Checked Exceptions
If checked exceptions are conceptually similar to these widely-praised error handling mechanisms, why have they fallen out of favor? There are several legitimate criticisms:
1. Excessive Boilerplate in the Call Chain
The most common complaint is the boilerplate required when propagating exceptions up the call stack:
void methodA() throws IOException {
methodB();
}
void methodB() throws IOException {
methodC();
}
void methodC() throws IOException {
// Actual code that might throw IOException
}
Every method in the chain must declare the same exception, creating repetitive code. While automatic propagation works well within a method, the explicit declaration in method signatures creates overhead.
2. Poor Integration with Functional Programming
Java 8 introduced lambdas and streams, but checked exceptions don't play well with them:
// Won't compile because map doesn't expect functions that throw checked exceptions
List<String> fileContents = filePaths.stream()
.map(path -> Files.readString(Path.of(path))) // Throws IOException
.collect(Collectors.toList());
This forces developers to use awkward workarounds:
List<String> fileContents = filePaths.stream()
.map(path -> {
try {
return Files.readString(Path.of(path));
} catch (IOException e) {
throw new UncheckedIOException(e); // Wrap in an unchecked exception
}
})
.collect(Collectors.toList());
3. Interface Evolution Problems
Adding a checked exception to an existing method breaks all implementing classes and calling code. This makes evolving interfaces over time difficult, especially for widely-used libraries and frameworks.
4. Catch-and-Ignore Anti-Pattern
The strictness of checked exceptions can lead to the worst possible outcome—developers simply catching and ignoring exceptions to make the compiler happy:
try {
// Code that might throw
} catch (Exception e) {
// Do nothing or just log
}
This is worse than having no exception checking at all because it provides a false sense of security.
Improving Checked Exceptions Without Abandoning Them
Rather than abandoning checked exceptions entirely, Java could enhance the existing system to address these legitimate concerns. Here are some potential improvements that preserve the type safety benefits while addressing the practical problems:
1. Allow lambdas to declare checked exceptions
One of the biggest pain points with checked exceptions today is their incompatibility with functional interfaces. Consider how much cleaner this would be:
// Current approach - forced to handle or wrap exceptions inline
List<String> contents = filePaths.stream()
.map(path -> {
try {
return Files.readString(Path.of(path));
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
// Potential future approach - lambdas can declare exceptions
List<String> contents = filePaths.stream()
.map((String path) throws IOException -> Files.readString(Path.of(path)))
.collect(Collectors.toList());
This would require updating functional interfaces to support exception declarations:
@FunctionalInterface
public interface Function<T, R, E extends Exception> {
R apply(T t) throws E;
}
2. Generic exception types in throws clauses
Another powerful enhancement would be allowing generic type parameters in throws
clauses:
public <E extends Exception> void processWithException(Supplier<Void, E> supplier) throws E {
supplier.get();
}
This would enable much more flexible composition of methods that work with different exception types, bringing some of the flexibility of Rust's Result<T, E>
to Java's existing exception system.
3. Better support for exception handling in functional contexts
Unlike Rust which requires the ?
operator for error propagation, Java already automatically propagates checked exceptions when declared in the method signature. What Java needs instead is better support for checked exceptions in functional contexts:
// Current approach for handling exceptions in streams
List<String> contents = filePaths.stream()
.map(path -> {
try {
return Files.readString(Path.of(path));
} catch (IOException e) {
throw new RuntimeException(e); // Lose type information
}
})
.collect(Collectors.toList());
// Hypothetical improved API
List<String> contents = filePaths.stream()
.mapThrowing(path -> Files.readString(Path.of(path))) // Preserves checked exception
.onException(IOException.class, e -> logError(e))
.collect(Collectors.toList());
4. Integration with Optional<T>
and Stream<T>
APIs
The standard library could be enhanced to better support operations that might throw checked exceptions:
// Hypothetical API
Optional<String> content = Optional.ofThrowable(() -> Files.readString(Path.of("file.txt")));
content.ifPresentOrElse(
this::processContent,
exception -> log.error("Failed to read file", exception)
);
Comparison with Other Languages' Approaches
It's worth examining how other languages have addressed the error handling problem:
Rust's Result<T, E>
and ?
operator
Rust's approach using Result<T, E>
and the ?
operator shows how propagation can be made concise while keeping the type safety benefits. The ?
operator automatically unwraps a successful result or returns the error to the caller, making propagation more elegant.
However, Rust's approach requires explicit propagation at each step, which can be more verbose than Java's automatic propagation in certain scenarios.
Kotlin's Approach
Kotlin made all exceptions unchecked but provides functional constructs like runCatching
that bring back some type safety in a more modern way:
val result = runCatching {
Files.readString(Path.of("file.txt"))
}
result.fold(
onSuccess = { content -> processContent(content) },
onFailure = { exception -> log.error("Failed to read file", exception) }
)
This approach works well with Kotlin's functional programming paradigm but lacks compile-time enforcement.
Scala's Try[T]
, Either[A, B]
, and Effect Systems
Scala offers Try[T]
, Either[A, B]
, and various effect systems that encode errors in the type system while integrating well with functional programming:
import scala.util.Try
val fileContent: Try[String] = Try {
Source.fromFile("file.txt").mkString
}
fileContent match {
case Success(content) => processContent(content)
case Failure(exception) => log.error("Failed to read file", exception)
}
This approach preserves type safety while fitting well with Scala's functional paradigm.
Conclusion
Java's checked exceptions were a pioneering attempt to bring type safety to error handling. While the implementation has shortcomings, the core concept aligns with modern type-safe approaches to error handling in languages like Rust and Haskell.
Copying Rust's Result<T, E>
might seem like the obvious solution, but it would represent a radical departure from Java's established paradigms. Instead, targeted enhancements to the existing checked exceptions system—like allowing lambdas to declare exceptions and supporting generic exception types—could preserve Java's unique approach while addressing its practical limitations.
The beauty of such improvements is that they'd maintain backward compatibility while making checked exceptions work seamlessly with modern Java features like lambdas and streams. They would acknowledge that the core concept of checked exceptions was sound—the problem was in the implementation details and their interaction with newer language features.
So rather than abandoning checked exceptions entirely, perhaps we should recognize them as a forward-thinking feature that was implemented before its time. As Java continues to evolve, we have an opportunity to refine this system rather than replace it.
In the meantime, next time you're tempted to disparage checked exceptions, remember: they're not just an annoying Java quirk—they're an early attempt at the same type safety paradigm that newer languages now implement with much celebration.
What do you think? Could these improvements make checked exceptions viable for modern Java development? Or is it too late to salvage this controversial feature? I'm interested in hearing your thoughts in the comments.
자바의 체크드 예외 재고찰: 저평가된 타입 안전성 기능
------------------------------
## 주요 내용 요약
* 자바의 체크드 예외가 커뮤니티에서 널리 비판받는 기능임에도 타입 안전성 측면에서 뛰어난 장점 보유.
* Rust의 Result<T, E>
나 Haskell의 Either a b
와 개념적으로 유사한 타입 안전성 메커니즘 제공.
* 체크드 예외가 메서드 시그니처에 잠재적 실패 가능성을 명시적으로 표현하…
------------------------------
https://news.hada.io/topic?id=19877&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
모든 자바스크립트 개발자들이 단 하나의 패키지 매니저와 단 하나의 빌드 시스템, 단 하나의 모듈 시스템을 사용하면 좋겠다고 진심으로 생각한다
모든 자바스크립트 개발자들이 단 하나의 패키지 매니저와 단 하나의 빌드 시스템, 단 하나의 모듈 시스템을 사용하면 좋겠다고 진심으로 생각한다
@parksbSimon Park 사견으로는 그냥 다들 Deno를 썼으면 좋겠네요…
- 처음 써 보는 조용한 공개. 조용한 공개는 일반 공개와 뭐가 다를까. 연합 우주에는 올라가지 않는 거려나?
- 블스 연동을 했는데 hackers.pub 프로필에 쓴 텍스트가 블스 프로필로는 다 옮겨지지 않는다. 글자 수 제한이 있는 걸까요.
- 앱 지면을 무슨 아마존처럼 탐험하며 여기도 광고 넣을 수 있겠다! 저기도! 하는 흐름에 현기증이 난다. 이게 우리 회사 임원인지 사모펀드인지⋯.
- 마라톤 행사만 끝나고 나면 이것저것 해 보고 싶은 게 많은데.
@linear “조용한 공개”는 “공개”와 거의 모든 면에서 같지만 로그인 안 했을 때 Hackers' Pub 첫 화면에서 보이지 않는다는 점, 외부 연합우주 서버에서 “연합 타임라인”에 뜨지 않는다는 점만 달라요.
이제 단문에 포함된 대표 링크에 대해 Open Graph 메타데이터를 추출하여 표시하게 되었습니다. 또한, 링크에 fediverse:creator
메타데이터가 있을 경우, 저자의 연합우주 프로필까지 하단에 표시하게 됩니다.
참고로 Hackers' Pub은 대부분의 경우 Fedify의 bleeding edge 버전을 쓰고 있습니다.
오늘 하려던 Fedify 작업은 얼추 끝내서, 다시 Hackers' Pub 작업에 손을 댑니다.
저는 AI에게 감사 인사를 하는 데에도 돈이 든다는 걸 깨달아버려서, 이제는 감사도 표하지 않는 삭막한 인간이 되고야 말았습니다.
오늘 하루는 Fedify 작업을 해야 해서 아마도 Hackers' Pub 개발은 못 할 것 같습니다.
…라고 썼지만, Fedify의 신기능을 테스트하기 위해 Hackers' Pub에 적용해 보고 있습니다. ㅎㅎㅎ
오픈소스 프로젝트를 시작하는 비법은 특별한게 아니다.
일정 주기(일, 주, 월, 년 등) 반복되는 동일한 수기 또는 수동 작업 -> 공통범주로 최대한 묶음 -> 적정한 수준의 자동화 계획 -> 코드로 구현 -> 오픈소스 라이선스 붙여서 공개
이게 곧 프로젝트가 되는거임.
…라고 썼지만, Fedify의 신기능을 테스트하기 위해 Hackers' Pub에 적용해 보고 있습니다. ㅎㅎㅎ
참고로 Hackers' Pub은 대부분의 경우 Fedify의 bleeding edge 버전을 쓰고 있습니다.
그동안 동료들한테 Cursor 쓰자고했는데 그들이 오소독스 Emacs 매니아들이란 문제가 있었다.
작년에 Nix로 nvidia gpu 지원까지 포함해서 구축해놓은 k3s 클러스터에다가, 오늘 아침에 1시간만에 aider로 쓸수있게 DeepSeek R1을 띄웠고 한번 써보자고 했다. 최근에 한 것 중 가장 가성비 좋은 작업인듯 하다.
대-AI 시대가 열렸으면 내가 낯선 언어라도 린터, 컴파일러만 잘 되어 있으면 그걸로 피드백 줘서 PoC 하나 뚝딱할 수 있겠지? 싶어서 ReScript로 쇼기 만들어보고 있는데 아쉽게도 LLM 친구들이 ReScript를 잘 못한다
- IT 관련 관심 있는 주제 아무거나 골라서 3~5분 정도 발표하는 자리가 생겼는데 fediverse 와 small web 중 뭘로 할지 아직도 고민중.
- Swift만 8년을 쓰다가 정말 간만에 html/css 쓰려니까 작업 속도가 굼벵이가 따로 없다. 이것만큼은 나도 주니어. GitHub Pages 쓰면서 jekyll 이 익숙해져서 일단은 개인 블로그도 jekyll 로 만들었는데 요즘은 Hugo가 대세라는 것 같아 언젠가는 찍먹을 해 볼지도.
- 폴더 내의 모든 파일에 대해 단어 replace 하기 :
sed -i '' -e 's/old_word/new_word/g' *
- 누가 iOS 개발 어떻냐고 물어볼 때마다 "애플이 만든 프로그램 위에 애플이 만든 언어로 코드를 짜서 애플이 제작한 기기 위에 동작하는 모바일 앱을 만들 건데 그게 애플이 관리하는 마켓 심사를 통과해야 하는 게 참으로 문제"라고 우스갯소리처럼 말해 왔는데 돌이켜보면 그건 내 직군에 대한 꽤 근본적인 불만이었는지도. URL만 있으면 누구나 어디서든 접속할 수 있는 웹의 힘이 막강하다고 느낀다. 진작 이쪽으로 사이드 프로젝트 파 볼 걸 그랬나? 싶고. 누군가는 모바일의 힘을 더 크게 생각하겠지만⋯.
오랜만에 소프트웨어 프로그래머로 일하고 있는 고등학교 동창을 만나서 몇 시간 즐겁게 수다도 떨고 자극도 받고 왔다. 취미로 분산 데이터베이스를 만드는 등 자기 계발을 아주 열심히 하고 있어서 본받아야겠다고 생각했다.
집에서 회사에 있는 WSL에 SSH로 접근하려고 삽질을 좀 했는데 결론만 적는다. 우선 구성은 다음 그림과 같다.
이때 다음과 같이 하면 macOS에서 WSL에 SSH로 접근이 가능하다.
- Windows에 SSH 서버 필요 없음
- Windows에
netsh interface portproxy
명령어로 포트 프록시 이용 - WSL에서
sshd_config
파일에GatewayPorts yes
설정 필요
그리고 macOS의 Visual Studio Code에서 Remote - SSH 플러그인을 이용하면 macOS에서 쾌적하게(?) 회사 WSL에 접근해서 코딩할 수 있다.
@curry박준규 저는 WSL 안에서
sshd
랑 tailscaled
깔아서 바로 접속했었어요.
집에서 회사에 있는 WSL에 SSH로 접근하려고 삽질을 좀 했는데 결론만 적는다. 우선 구성은 다음 그림과 같다.
이때 다음과 같이 하면 macOS에서 WSL에 SSH로 접근이 가능하다.
- Windows에 SSH 서버 필요 없음
- Windows에
netsh interface portproxy
명령어로 포트 프록시 이용 - WSL에서
sshd_config
파일에GatewayPorts yes
설정 필요
그리고 macOS의 Visual Studio Code에서 Remote - SSH 플러그인을 이용하면 macOS에서 쾌적하게(?) 회사 WSL에 접근해서 코딩할 수 있다.
슬슬.... 계약도 끝이 보이고 해서 취업준비 모드로 들어가려고 하는데, 이미 꼬여버린 커리어니까 다시 새 출발한답시고 어떤 방향으로 진로를 잡을지 생각중이다. 당장은 웹개발 쪽으로 가는걸 지향하는데? 백/프론트 둘 다 해본 입장에서 백엔드로 갈지 프론트엔드로 갈지 애매한 입장이다. MLOps나 DevOps도 열려있긴 하다. 사실 다 찍먹해볼 수 있는 인공지능 잘 쓰는 회사에서 일하게 된다면 정말 좋을 것 같다.
취준 공부 전략은.... 당장 내가 써먹을 수 있는 방향으로 전이될 수 있는 방향으로 가는 것이 좋을 것 같다. 인공지능에 관심이 생기긴 했으니, 통계나 ML 관련 지식은 어느 정도 감잡을 정도로 곁다리로 공부는 할 것 같다. 메인 분야를 하나 잡고 준비하는게 베스트이긴 한데, 준비할 수 있는 시간은 많으니 메인 분야는 프론트엔드로 잡고 가지 않을까 싶다. 돈이 되는 개발을 하려면 프론트엔드로 가는게 맞더라는게 이리 구르고 저리 구르다가 내린 결론이다.
뭐부터 공부할지 우선순위 정하는 것도 역시 나한테 당장 도움이 되고 바로 써먹을 수 있는 것들 중심으로 가중치를 매겨야 할텐데, 소프트웨어 설계 전략, 추상화, 시스템 디자인, javascript 런타임, 웹 퍼포먼스 등등 주제는 다양하게 있고, roadmap.sh에서도 몇가지 키워드를 주워담고 있다. 지금 밥벌이하는 동안에는 프론트엔드가 중심인 풀스택의 관점에서 접근하게 될 것 같다. 풀스택이 힘든길이 되겠지만... 전반적인 사이클 한바퀴 돌리고 개발하는게 익숙하다.
개인 프로젝트를 만들면서 포폴을 만들어나갈 것 같은데, 밀어붙이고 싶은 스택은 Django/Vue/Flutter 정도? 사실은 어떤 스택이든 상관은 없다. 먹고사니즘을 위해서라면 뭐라도 해야지... 내가 좋아하는 것을 깊게 팔 수 있으면 베스트지만, 상황이 따라주지 않는다면 그냥 하던거나 깊게하면서 내가 좋아하는 기술에 지식이 전이될 수 있는 방향으로 깊게 파볼까 싶다.
타임라인과 RSS 피드에 단문 없이 게시글만 보는 필터를 추가했습니다.
아직 招待制이긴 하지만 Hackers' Pub도 velog의 代案입니다! 게다가 ActivityPub도 支援하기 때문에 Mastodon이나 Misskey 等 다른 聯合宇宙(fediverse)와도 아무 問題 없이 相互 疏通 可能하답니다.
velog의 새로운 대안
https://until.blog/
Juntai Park shared the below article:
rel="me" 메모
Lee Dogeon @moreal@hackers.pub
Hackers' Pub의 프로필 링크 인증 기능이 제대로 작동하지 않아, GitHub 링크를 추가했음에도 체크 표시가 나타나지 않는 문제를 해결하기 위한 여정을 담고 있습니다. `rel="me"` 속성이 HTML 링크 요소에서 어떤 역할을 하는지 MDN 문서를 통해 알아보고, GitHub 프로필 설정에서 Hackers' Pub 링크를 추가할 때 `rel="me"` 속성이 자동으로 추가되는 것을 확인합니다. Hackers' Pub의 오픈 소스 코드를 분석하여 인증 마크가 표시되는 과정을 파악하고, GitHub에 Hackers' Pub 링크를 추가한 후 프로필 설정을 다시 저장하면 인증 체크 표시가 나타나는 것을 확인합니다. 이 글은 `rel="me"` 속성의 역할과 Hackers' Pub의 링크 인증 과정을 이해하고, 문제 해결 방법을 제시하여 독자들이 유사한 문제를 겪을 때 도움을 받을 수 있도록 합니다.
Read more →마스토돈이 다른 계정의 팔로잉/팔로워를 잘 보여주는 것도 아니고, 그렇다고 팔로우할만한 계정을 잘 추천해주는 것도 아니라서 꽤 발품을 팔아아 했다. 그래서 '읽기는 트위터에서, 쓰기는 마스토돈에서' 해왔는데, 요즘엔 hackers.pub 덕분에 피드에 읽을거리가 많이 늘어났다.
이제 프로필의 링크에 인증 여부가 보이게 됩니다. 링크를 인증하기 위해서는, 링크된 페이지 측에서도 Hackers' Pub 프로필을 rel="me"
속성과 함께 링크해야 합니다. Mastodon이나 GitHub 같은 경우 프로필에 링크를 추가하면 rel="me"
속성이 추가되게 되어 있으니, Mastodon이나 GitHub 프로필 링크를 추가하면 인증은 자동으로 될 겁니다. 개인 웹사이트가 있으신 분들은 Hackers' Pub 프로필을 rel="me"
속성과 함께 링크하면 인증이 됩니다.
참고로 인증은 프로필 설정을 저장할 때 이뤄집니다. 이미 Mastodon이나 GitHub 프로필을 링크해 두신 분들은 인증 표시가 안 뜰 수도 있는데, 그럼 프로필 설정에 들어가셔서 저장 버튼을 한 번 눌러주시면 인증 버튼이 붙을 겁니다.
Juntai Park shared the below article:
Hacker's Pub
daisuke @dai@hackers.pub
この投稿では、Fediverseの分散型フィードを統合的に表示するための、4つのタブで構成されたカスタムビューアーが紹介されています。このビューアーは、指定した言語(例:`en-US`, `zh-CN`, `ja-JP`, `ko-KR`)以外の投稿を薄く表示する機能を持ち、ユーザーが興味のある言語のコンテンツに集中できるよう設計されています。最後に、GhostのFediverse Betaアカウントがリクエスト制である可能性について触れられています。このビューアーは、分散型ソーシャルネットワークの情報を整理し、効率的にアクセスしたいユーザーにとって、興味深い解決策となるでしょう。
Read more →Hackers' Pub의 숨은 기능 하나. 어떤 페이지에서든 URL의 쿼리 문자열에 lang=ko
처럼 ISO 639-1 언어 코드를 지정하면 그 페이지가 해당 언어로 표시됩니다. 이렇게 지정된 언어는 계정의 언어 설정이나 브라우저의 언어 설정보다 우선합니다. 제가 개발할 때 번역 잘 적용되나 확인하려고 만든 기능이랍니다.
Hackers' Pub에 rel=me
속성으로 본인 링크인지 확인하는 로직은 처음부터 만들어 놨는데, UI에서만 표시가 안 되고 있는 중… 안 그래도 지금 프로필의 링크 목록이 조금만 많아져도 난잡해 보이는데, 좀 정리도 할 겸 인증 마크도 추가해야겠다.
Claude Code, 소프트웨어 번역에도 아주 편리하다. 번역 항목을 추가하게 되면 내가 잘 모르는 언어의 번역 파일을 어떻게 해야 하나 언제나 고민이었는데 (여태까지는 자동 번역기를 쥐어짜서 어떻게든 채워 넣었다), 이제는 내가 아는 언어의 번역 파일에만 항목을 추가한 다음에 Claude Code에게 내가 모르는 언어의 번역 파일에도 누락된 항목을 채워달라고 부탁만 하면 된다. 단, 이게 잘 동작하려면 번역 파일에 용어 사전(glossary)가 어느 정도 구축되어 있고 기존 번역에서도 용어가 일관성 있게 쓰여 있어야 한다.
Hackers' Pub에서도 중국어 번역을 그런 식으로 채워서 커밋해 보았다.
JS로 짜여진, join이 되는 reactive한 로컬 DB가 필요한데요. RxDB, SignalDB는 join이 안 돼서 탈락입니다. join을 안하면 되지 않냐 할수 있는데 어떤 특이한 로직 때문에 꼭 필요합니다. 지금은 직접 sqlite 호출하는 누더기 코드로 돌아가고 있는데요.
그 코드를 리팩토링해서 제대로 된걸 만들까 말까 고민중인데, 사실 잘만들어진게 있으면 그걸 쓰고 싶습니다. 제 요구사항을 만족하는 라이브러리가 있을까요?
@dwndiaowinner 님 덕분애 Hackers' Pub에 중국어 번역이 추가되었습니다!
또한, 언어 설정이 추가되어, 자신이 선호하는 복수의 언어를 선택할 수 있게 되었습니다. 이 설정은 당장은 팔로 추천에만 쓰이고 있지만, 앞으로 자동 번역이나 알고리즘 타임라인 등에 요긴하게 쓰일 예정입니다.
그린 소프트웨어 - 지속 가능한 소프트웨어 개발과 운영 (앤 커리, 세라 수, 사라 베리만 (지은이), 차건회 (옮긴이) / 제이펍 / 2025-04-05 / 30,000원) https://feed.kodingwarrior.dev/r/ZqIErD
http://www.aladin.co.kr/shop/wproduct.aspx?ItemId=360839350&partner=openAPI&start=api
https://snix.dev/ 저는 Rust를 못해서 기여를 못하지만 유망한 프로젝트라고 생각합니다. Rust 고수분들이 관심가져주시면 좋겠네요.
이番에 @lqezPark Hyunwoo 님의 《우리의 코드를 찾아서》에 出演하여 #페디버스, #ActivityPub, #Fedify, #Hollo 等에 關해 이야기를 나눴습니다. Fedify와 Hollo의 開發 祕話 같은 게 궁금하시다면 한 番 보셔도 재밌을지도 모르겠습니다. ㅎㅎㅎ
漢字文化圈 사람들이 자주 틀리는 英語 句讀法들.
여는 括弧 앞에 띄어쓰기를 안 하는 것
英語에서는 여는 括弧 앞에 띄어쓰기를 한다.
틀림:
Here is an example(of wrong parentheses).
맞음:
Here is an example (of correct parentheses).
範圍를 나타낼 때 물결標를 쓰는 것
英語에서는 範圍를 나타낼 때 엔 대시(en dash)를 쓴다.
틀림:
10~20 meters
맞음:
10–20 meters
콜론 앞에 띄어쓰기를 하는 것
英語에서는 콜론 앞은 붙여 쓰고 뒤는 띄어 쓴다.
틀림:
foo : bar
foo:bar
맞음:
foo: bar
쉼標 뒤에 띄어쓰기를 안 하는 것
英語에서는 쉼標 앞에서는 붙여 쓰고 뒤에서 띄어쓰기를 한다.
틀림:
foo,bar
foo , bar
맞음:
foo, bar
웨이터, Vitest. 온 더 락으로.
사람들이 잘 모르는 Markdown 명세 하나. CommonMark, 즉 표준 Markdown에서 URL은 자동으로 링크되지 않는다. 대부분의 Markdown 구현체들이 이를 옵션으로 지원하고, Markdown을 지원하는 웹사이트들이 이 옵션을 켜놓고 있기 때문에 모르는 사람들이 많다. CommonMark에서 URL이나 메일 주소를 링크하려면 <
와 >
로 주소를 감싸야 한다.
이를 잘 이용하면 URL의 앞 뒤에 띄어쓰기를 하지 않고도 링크를 걸 수 있다는 장점도 된다.
Hackers' Pub에 RSS 기능을 추가했습니다. 정확히는 RFC 4287, 일명 Atom 명세를 구현했습니다. RSS 디스커버리도 구현했기 때문에, Hackers' Pub 사용자의 프로필 페이지 링크를 RSS 앱에 추가하면 구독이 가능합니다. 확실한(?) 피드 링크를 알고 싶으시면 프로필 링크 뒤에 /feed.xml을 붙이시면 됩니다. 예를 들어, 제 피드 링크는 https://hackers.pub/@hongminhee/feed.xml입니다.
🚀 Deno v2.2.4 is released:
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage)
- Built-in OTel tracing for node:http.request
- LSP now starts the TypeScript server lazily
other improvements in the release notes:
https://github.com/denoland/deno/releases/tag/v2.2.4