Hacker Newsnew | past | comments | ask | show | jobs | submit | rav's commentslogin

> For example, it would be interesting to incorporate Ghost Font into CAPTCHA systems, as most systems are easily solved by AI today.

It seems to me like it should be easy enough to take Ghost Font, apply normal video compression techniques, and analyze the compressed signal to recover the visual outline of the letters, which you would then analyze with OCR (or an AI I guess ...). In other words, a novel CAPTCHA technique but not necessarily "fundamentally more difficult" than existing CAPTCHA techniques, once the cat-and-mouse game gets going.


I took just two screenshots and applied some filters and got

https://fingswotidun.com/images/GhostFont_2_samples.jpg

https://fingswotidun.com/images/GhostFont_b_2_samples.jpg

An AI would be able to take consecutive frames rather than hamfistedly pressing the screenshot button, then accumulate enough samples to clearly make out the text from a clip shorter than the time it would take for a human to read it.


"Written in ghost font" is the decoy message. Your filters got those words.

The real message is "only a human can read this" and your filters didn't get these words.

(But I think there should be a way to catch them)


That’s the only message I can see.

Am I… am I an AI?


I.e. there’s an ffmpeg incantation out there to do it.


An LLM can output it pretty quick, I imagine.


Yes, it may be useful to replace current CAPTCHA, but this does not provide the positive side-effects of CAPTCHA where user-submitted data is used to train the unknown images or reinforce the labelling of existing image segments.


It’s been years since captcha was contributing to labeling.


Indeed, they don't contribute to labeling. The self driving companies figured out long ago that machine learning is way too expensive. Instead, Google is using its large network of willing humans to inform automated driving decisions in real time.

So the next time you're asked to click the pictures with the bicycles or traffic lights? Please do so before it's too late.

(/s, if that's necessary)


Reference for today's lucky 10.000:

https://xkcd.com/1897/


Today I learned that jq -Rrj is a shorter command line for doing the same as tr -d '\n'.


IIRC you don’t even need the -r flag since -j incorporates its behavior (minus newlines).


Not the first time that a Nature publication's "too good to be true" results turn out to be based on simple programming errors... Nature 532, 210 (2016) was retracted after it was shown that a hand-coded gradient function, used in gradient descent, had a simple sign error (details in arXiv 2003.05808).


There's a note at the end:

> As always, this blog post is written by me, without any AI, so all errors are my own.

However, the illustrations in the post are clearly made by generative AI, are they not?


The author claims the POST is WRITTEN by them. They did not claim the ILLUSTRATIONS were DRAWN by them. Most of us are not artists. Sometimes its hard to find the right illustrations.

But what did you think of the article itself?


Why does AI want to stress me with that cup about to fall off the desk


My SO is on the spectrum and likes to align cups and things along the edges of tables. I ask her not to be an edgelord in the most egregious cases, but I've also gotten better at not stressing over "it's on the edge".

That cup is still not ok lol.


Yes, but I don’t read blog posts for the art. As placeholders they’re not terrible.


> Of course, if you're implementing POSIX vi, there are quite a few features that have aged poorly, like roff/troff macros and line-editing

What do you mean by "roff/troff macros"?

EDIT: Ah, you're probably talking about the "section-wise" movements, defined in POSIX with language like "A line whose first character is a <period> and whose second and third characters match a two-character pair in the 'sections' edit option (see ex)" - that's the first time I've stumbled upon the 'sections' and 'paragraphs' options in the Vim manual ... Very quaint!


Yep, those are the ones! There's also the oddity of the [[ and ]] motions. In the POSIX standard, those are the only two-character motions. I was using a state-machine to implement motion commands, and that single command threw a wrench in the works. Of course, vim took two character commands and ran with it, so in vim [ can be followed by a whole host of characters that all do different things. Since g was not mapped in vi they also did the same thing there.


Looking in dev console reveals that the issue is an error response from https://cdn.skypack.dev/canvas-confetti - at the moment that URL returns:

        A server error has occurred

        FUNCTION_INVOCATION_FAILED

        sfo1::qcpj5-1777386477345-b792e22509f4


Looks like there's an outage currently: https://status.skypack.dev/


Given a commit that both refactors (A) and adds a feature (B), you can go into the codebase and remove the new feature by hand (B^-1), commit the feature removal, and immediately revert the feature removal. This leads to three commits: (A B), B^-1, and B. Squash the first two commits to obtain a commit that only refactors, and another commit that only adds the new feature. I've written more about this technique ("the Hammer") here: https://github.com/Mortal/gittalk


In TypeScript it's called "bivariance", which sounds very programming language theory like, but is not a term typically used in academic contexts, since it is unsound almost by default. It's described here: https://www.typescriptlang.org/docs/handbook/type-compatibil...


Key sentence in their justification seems to be:

"allowing this enables many common JavaScript patterns"

Honestly at this point they should make a new strict "no js" mode, as the ecosystem likely has reached a tipping point where you can get by without mixing typed and untyped js at compile time. Wonder if targeting wasm directly would help ensure those boundaries are ensured...


https://www.assemblyscript.org/ is pretty darn close, but it would probably be better to converge and not split communities


How is it "50-90%" savings? If a given application doesn't repeat its queries, surely there's nothing to save by caching the responses?


Hey, Thanks for the great feedback! You're raising valid point.

Actually, this package started based on a hackathon project where I was burning the Anthropic API credits for our hackathon project which was RAG (internal documentation) + MCP.

There were question which were getting repeated several times. The 50% + comes from this experience. So, based on this, I was thinking of some of the use cases like this:

Multi-User Support/FAQ Systems: - How do I reset my password? - Reset password steps? - Forgot my password help - Password reset procedure

RAG based: - How to configure VM? - How to deploy? - How to create a network?

Educational/Training Apps Developer Testing scenarios, etc

You're absolutely right that apps with unique queries won't see these benefits - this won't help in - Personalized Content - Real-Time Data - User-Specific Queries - Creative Generation and other scenarios

I think I should clarify this in the docs. Thanks for the great feedback. This is my first opensource package and first conversation in hackernews. Great to interact and learn from all of you


You can rewrite it using let-or-else to get rid of the unwrap, which some would find to be more idiomatic.

    let value = Some(param.as_ref()) else {
      // Handle, and continue, return an error etc
    }
    // Use `value` as normal.


Small nit: the Some() pattern should go on the left side of the assignment:

    let Some(value) = param.as_ref() else {
      // Handle, and continue, return an error etc
    }
    // Use `value` as normal.


That part intrigued me about the article: I hadn't heard of that syntax! Will try.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: