What is Hackers' Pub?

Hackers' Pub is a place for software engineers to share their knowledge and experience with each other. It's also an ActivityPub-enabled social network, so you can follow your favorite hackers in the fediverse and get their latest posts in your feed.

0
0
0
0
0
0
0
0
0

Liebes Fedi, ich hab ein Buch geschrieben.

Es ist Cripplepunk Science Fantasy mit Umgangssprache und Neopronomen. Chronisch kranke Hauptcharaktere, Queerness, Behinderung, Freundschaft und Abenteuer.

Ich kann euch nicht versprechen, dass es das beste Buch ist, das ihr dieses Jahr lesen werdet, aber ich kann versprechen, dass ihr so ein Buch noch nie gelesen habt.

Kaufen kann man es auf der Lieblings-Buchplattform oder hier:
buchshop.bod.de/die-traeume-si

Buchcover. skye gänseblum, Die Träume sind kaputt. Das Coverbild ist in knalligen Farben gehalten, gelb weiß lila schwarz wie die Nonbinary Pride Flag. Abgebildet ist eine bunte Stadt mit seltsam geformten Gebäuden, inklusive einer Kirche, deren Kreuz gerade herunterfällt. Darüber schwebt ein stäbchenförmiges Gebilde, umklammert von einem dunklen Tentakelmonster. Im Hintergrund schwirren Augenpaare herum. Alles ist in einfachen Formen und großen Flächen gleicher Farben gehalten.
0
0
0

Bist du die nächsten Wochen regelmäßig in unterwegs, z.B. mit dem ÖPNV oder in der Innenstadt – irgendwo, wo es Werbebildschirme gibt? Hast du dabei oft eine Kamera (z.B. Handy) in der Hand?

Dann brauche ich deine Hilfe.

In ein paar Wochen beginnt @/hhwerbefrei@bewegung.social mit Stimmensammeln. Jetzt läuft eine Kampagne, die Werbung für Werbung macht.

Ich brauche Fotos von den verschiedenen Claims dieser Werbekampagne. Von dem mit der Tafel hab ich schon eins:

Werbescreen am Bahnsteig. Text: Mehr als Werbung! Danke für 40.000 satte Menschen in der Stadt. Mats Regenbogen ist 1. Vorsitzender der Hamburger Tafel. Außenwerbung macht's möglich. Daneben ein Foto von einem lächelnden weißen Mann.
0
0
0
0
0

Bist du die nächsten Wochen regelmäßig in unterwegs, z.B. mit dem ÖPNV oder in der Innenstadt – irgendwo, wo es Werbebildschirme gibt? Hast du dabei oft eine Kamera (z.B. Handy) in der Hand?

Dann brauche ich deine Hilfe.

In ein paar Wochen beginnt @/hhwerbefrei@bewegung.social mit Stimmensammeln. Jetzt läuft eine Kampagne, die Werbung für Werbung macht.

Ich brauche Fotos von den verschiedenen Claims dieser Werbekampagne. Von dem mit der Tafel hab ich schon eins:

Werbescreen am Bahnsteig. Text: Mehr als Werbung! Danke für 40.000 satte Menschen in der Stadt. Mats Regenbogen ist 1. Vorsitzender der Hamburger Tafel. Außenwerbung macht's möglich. Daneben ein Foto von einem lächelnden weißen Mann.
0
0
0
0
0
0

meson/ninja are relatively recent, but apparently they don't do checks ahead of time to ensure that the current process has enough permissions to write to the install target

instead, it tries, lets it fail, and shows a stack trace. why?

ninja build log. there's a big python traceback, finishing with:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/x86_64-linux-gnu'

ERROR: Unhandled python OSError. This is probably not a Meson bug, but an issue with your build environment.
0
0

One of the most exhausting things about being a (perceived) woman working in computational physics is dealing with men who don't think women can do physics and men who don't think women can code (there is a lot of overlap here). Things men have tried to 'explain' to me recently:
- Basic coding practices
- A topic I have published papers on
- How to debug a code ("have you tried adding print statements")
- How code releases work
- My own ideas 😫

0
0
0
0
0

関東大震災における朝鮮人等虐殺はおろか、七三一部隊が人体実験をおこなったことも、公文書が残っているにもかかわらず政府は歴史的事実と認めないというのか。恥を知れ。

戦後80年を問う 「731部隊」について 2025.3.21
youtu.be/Bz1lzkKtbHY

0
0
0
0

1/10 🚨 The 🇬🇧UK regulator’s final report is out and it’s clear: Apple’s browser engine ban harms competition.

Forcing all iOS browsers to use WebKit hurts developers, users, and the web itself.

Change is coming. 🧵

open-web-advocacy.org/blog/uk-

0
0
0
0
0
0
0

Simon 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 or Error): 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 not RuntimeException): These must either be caught with try/catch blocks or declared in the method signature with throws. 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:

  1. Handle the exception with a try-catch block
  2. 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.

Read more →
0
0
3
0
0
0
0
0
0
0

Die Selbstplastifizierung des Menschen

Wir Menschen sind ja bisweilen geradezu rührend naiv. Da ersäufen wir einerseits den gesamten Lebensraum in Plastikmüll und sind andererseits erstaunt, dass wir uns damit selbst vermüllen, so als hätten wir nichts mit unserem Lebensraum zu tun. Untersuchungen zeigen: In unseren Gehirnen finden sich mittlerweile 5 Mikrogramm Plastik auf 1g Gehirnmasse, Tendenz steigend.

Illustration: ein Mann un schwarz mit Zylinder mit geneigtem Haupt trägt gelbe Säcke. Textzeile: Wenn die Menschen weiter so viel Mikroplastik aufnehmen, werden Beerdigungen in gelben Säcken nötig.
0
0
0
0
0
0
0

@nightside 滿多的,基本上都是在抨擊他只有玩0.3小時就留負評這件事
然後有些只有一句,有些打了一長串但內容也是複製貼上
可以參考這個負評

steamcommunity.com/profiles/76

@Cactaceae_OvOb貓與貓喵(`・∀・)b
以這個負評的回覆來說,我反而沒看到你截圖的那一句……
倒是發現有兩個回覆是完全一模一樣的,這個就滿像有人給範本去留言的,特別其中一個帳號很明顯應該是簡中帳號。

另外我也不太喜歡以DEI來批評這款遊戲的評論,在我看來,這款遊戲的問題(不符史實的黑人主角)恰巧是違反DEI政策的,它很明顯沒有採納日本員工(如果有的話)的觀點。

0
0
0

The UK government, famous for its good digital web services, recommends their official native app to apply for an ETA apply-for-an-eta.homeoffice.go

You can use *web,* but the app lets you “complete your application quicker” and “get a faster decision”. From my extensive experience with UK Home Office procedures, I learned to jump into whatever hoop they present. App it is, I guess.

0
0
0
0
0
0
0
0

昨年の文藝年鑑で、ヒューゴースキャンダルの責任を曖昧にして中国の検閲をちらつかせたことで、民主主義と自由の困難な国はワールドコンが開催できなくなるだろう。抵抗の文学でもあるSFが抑圧の下から伸ばされた手を握らないのか?? それでいいのか? という文を書いたのだが、まさかアメリカが困難な国に成り下がるとは思ってもいなかった。

0