HN user

kazinator

34,896 karma

Working on the TXR language: https://nongnu.org/txr

Want to talk to me? Drop me an e-mail:

125-888-0378@kylheku.com

This could change without notice; check the profile.

Git repositories: https://www.kylheku.com/cgit

Mastodon: @Kazinator@mstdn.ca

LinkedIn: https://www.linkedin.com/in/kaz-kylheku-8a8b94197/

meet.hn/city/49.2608724,-123.113952/Vancouver

Socials: - kazinator.at.hn

---

Posts114
Comments19,849
View on HN
alexkenis.wordpress.com 13d ago

"Blade" type guitar pickups don't pick up horizontal vibration (2015)

kazinator
2pts1
www.youtube.com 4mo ago

2011-2026 time lapse: rebuilding after Tōhoku earthquake and tsunami [video]

kazinator
1pts1
en.wikipedia.org 6mo ago

The Silver Ratio

kazinator
7pts1
github.com 8mo ago

Show HN: Constantine Bytensky's 9x20 Font

kazinator
1pts0
news.ycombinator.com 8mo ago

Show HN: My personal Gerrit dash: can you improve it?

kazinator
1pts2
en.wikipedia.org 8mo ago

Sun 386i

kazinator
5pts0
postimg.cc 1y ago

HN Algolia search fast and loose with numbers?

kazinator
2pts1
lists.gnu.org 1y ago

Beta release of GNU Awk 5.3.2 available

kazinator
2pts0
www.kylheku.com 1y ago

Show HN: Cdlog: nicer directory navigation for Bash

kazinator
2pts0
superuser.com 1y ago

TTY char injection helps solve less pager issue

kazinator
1pts0
www.youtube.com 1y ago

Smooth Jazz Took Over The '90s [video]

kazinator
2pts0
www.kylheku.com 1y ago

Show HN: Mnpgr: use Vim for reading man pages

kazinator
2pts0
news.ycombinator.com 1y ago

Ask HN: Why did collaborative web annotation never take off?

kazinator
6pts6
en.wikipedia.org 1y ago

Wetting Current

kazinator
3pts0
news.ycombinator.com 1y ago

Ask HN: HN in Weird Time Slip?

kazinator
2pts1
www.polyware.nl 2y ago

Pauline Middelink [2000]

kazinator
1pts0
web.archive.org 2y ago

Nerdcore rap about AI lyricist vs. Human (2006)

kazinator
2pts1
web.archive.org 2y ago

MCPlus+: CS-themed rap ("nerdcore") (2006)

kazinator
1pts0
de.wikipedia.org 2y ago

Useful ISO 646 variants table [German Wikipedia]

kazinator
1pts0
nvlpubs.nist.gov 2y ago

ANSI C 89 with Rationale [pdf]

kazinator
5pts2
www.kylheku.com 2y ago

Show HN: cdlog: better "cd" Navigation for Bash

kazinator
1pts0
www.textnow.com 2y ago

TextNow in Canada: Why isn't wireless service available?

kazinator
1pts0
www.kylheku.com 2y ago

Show HN: Cygnal: Cygwin Native Application Library

kazinator
3pts0
lists.gnu.org 2y ago

Merry GNUsmas, Friends

kazinator
3pts1
kitten-technologies.co.uk 2y ago

Magic Pipes: operate on structured data with Unix pipes

kazinator
2pts0
www.kylheku.com 2y ago

Show HN: Mnpgr: Use Vim for reading man pages

kazinator
3pts0
news.ycombinator.com 2y ago

Tell HN: TIL: GNU Make .DELETE_ON_ERROR

kazinator
51pts14
www.kylheku.com 2y ago

Basta: Terminal status line in 153 lines of Bash

kazinator
3pts2
www.kylheku.com 2y ago

Basta Persistent Bash Status Line

kazinator
2pts2
news.ycombinator.com 2y ago

Show HN: Try my new Bash prompt

kazinator
4pts6

In practice, ld.so is a piece of glibc. If you want to build ld.so from scratch, you have to clone glibc or get a tarball of glibc, and configure and build glibc.

You could make the argument that the glibc developers should split ld.so into its own subprojects. What for? That would just bring the extra responsibility of making sure that variations in glibc version work with variations in ld.so version for whatever reason.

What would happen in practice is that they would keep their version numbers in lock step, and systems integrators would use the same version. While the upstream glibc has to go through a dance of pretending that someone cares about their independence.

ld.so is a component of glibc!

  $ /lib64/ld-linux-x86-64.so.2
  /lib64/ld-linux-x86-64.so.2: missing program name
  Try '/lib64/ld-linux-x86-64.so.2 --help' for more information.
  !1!
  $ /lib64/ld-linux-x86-64.so.2 --version
  ld.so (GNU libc) stable release version 2.34.
  ^^^^^^^^^^^^^^^^
  Copyright (C) 2021 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.
  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
  PARTICULAR PURPOSE.

I don't understand some of the pedestrian passages between the levels. They are way too steep to be escalators or stairs, yet Shinjuku does not have elevators with slanted shafts, does it?!

I think this is more of a schematic in the sense that the vertical dimension is not to scale; the levels are farther apart than actually, which exaggerates the slopes. Also, some of the passages may be indicating elevators with opposite exits. I see one which has two rectangular prisms that are directly above each other, but connected by a slanted line which may be indicating that pedestrians enter/exit on one side of the elevator at the vestibule level, and the opposite level at the platform level.

It would be cool for there to be a slider which controls the vertical scaling. Similar to how that guy did the mechanical watch animation where you can control how exploded the view is, from fully integrated to widely spread.

It works like this in some languages; e.g. Japanese technical terminology is linked word formation originating from Chinese.

Atom: 原子: (genshi) "primitive progeny".

Element: 原素: (genso) "primitive element".

Hydrogen: 水素: (suiso) "water element".

Oxygen: 酸素: (sanso) "acid element".

Carbon: 炭素: (tanso) "charcoal element".

Chlorine: 塩素: (enso) "salt element".

Coal: 石炭: (sekitan) "stone charcoal".

Carbon dioxide: 二酸化炭素 (nisan-ka tanso): "two acid/'oxid' -ized carbon".

Line, ray: 線: line, ray.

Ultraviolet ray: 紫外線 (shigaisen): "purple outside-of ray".

Infrared ray: 赤外線 (sekigaisen): "red outside-of ray".

Deep infrared: 遠赤外線 (ensekigaisen): "far red outside-of ray".

Yamanote train line: 山手線 (yamanotesen). :)

Amplification: 増幅 (zōfuku) "increase width".

Instrument: 器 (ki).

Amplifier: 増幅機 (zōfuku ki) "increase width instrument".

Difference: 差 (sa)

Differential amplifier: 差動増幅器 (sadō zōfukuki) "difference movement increase width instrument"

I regularly see this in chats about a subject area where I'm not the expert. The AI writes something that seems implausible, so I raise a tentative objection. "Oh, you are right, sorry" and then reverses the position on the matter. At that point, I have no idea what is right.

If I had trust in the first place, that trust would be gone. Or maybe it wouldn't, because if I had trust in the fist place, I would be gullible enough to maintain it.

The worst are areas that are dominated by layman online discussions, like say audio electronics. The AI training is full of that nonsense, and so whether your AI chatbot is a crackpot or an engineer depends entirely on what sort of language or angle you use in discussing the subject matter. It's all just a churning toilet bowl of tokens; it has no idea that the audiophile crackpot tokens and electronics engineer tokens are related and one beats the other.

You know what I mean? On the one hand, it offers to help you design the parameters for a Sallen-Key filter, asking you questions like do you want Butterworth or Chebyshev? Next minute it says nonsense like that the capacitor in a low-pass filter "bleeds high frequencies to the ground", or that a bigger filter cap in the plate supply of a tube will tighten up the bottom end for a more aggressive metal sound.

It's basically like a bar hostess who has heard enough political and economic discussions that she can catch a sentence out of a conversation and throw in a clever sounding remark. It's like that, but done at such a scale that it fools some people you used to think had their shit together.

It's just a search engine that finds garden paths through a vast amount of text, biased by the text you put in as a key. Sometimes those garden paths align with reality. The better you are able to verify whether the results are good, and/or the lower the risk if they are not, the better you are able to make use of it.

In mathematics (including information science, CS) there are all sorts of problems that are essentially searches for a solution, and many have the property that the search is computationally difficult, but verifying the solution is relatively cheap. E.g. finding integers such that a^2 + b^2 = c^2 isn't easy, but given a claim that some proposed <a, b, c> satisfies this equation is easy to check. The LLM is like that: it solves a search problem that can be fairly hard. It does so unreliably, but if you can cheaply verify the solution, there is a win there.

The remaining problems of AI are actually people problems; people causing you problems, using AI as a tool or excuse. If you get a garbage security report against your FOSS project, which wastes your time, there is an idiot person behind it, using AI for leverage. Blaming the AI, or just the AI, is a bit misplaced.

I'm skeptical that they not missing at least a week's or so worth of land title registry transactions, if the only thing they have left is offline, because offline backups are not made after every single transaction.

If the hacker was targeting the erasure of a particular recent transaction, they may well have succeeded. And by deleting numerous others, they have plausible deniability in the subsequent dispute over the property. If you just wipe a record that is related to you, and the manipulation is discovered (which it will be, one way or another), you are part of a narrow circle of suspects.

There are no dynamically scoped function bindings in Common Lisp.

Pascal Costanza somehow implemented such a thing. See 2003 paper "Dynamically Scoped Functions as the Essence of AOP", a precursor to work on AspectL and ContextL.

https://dl.acm.org/doi/pdf/10.1145/944579.944587

Dynamically scoped functions are wrappers which indirect to lambdas bound to a special variable; i.e. this is boostrapped out of dynamic variable scope.

Did you know CL allows keywords to be function names?

  [1]> (setf (symbol-function :add) (function +))
  #<SYSTEM-FUNCTION +>
  [2]> (setf (symbol-function :subtract) (function -))
  #<SYSTEM-FUNCTION ->
  [3]> (setf (symbol-function :multiply) (function *))
  #<SYSTEM-FUNCTION *>
  [4]> (setf (symbol-function :divide) (function /))
  #<SYSTEM-FUNCTION />
  [5]> (reduce (lambda (x y) (funcall (car y) x (cadr y))) '((:add 5) (:multiply 3) (:subtract 4)) :initial-value 0)
  11
This is actually a small benefit of the two namespaces. Keywords can't be variables because they evaluate to themselves, but that is not relevant to the operator position that does not resolve variables.

Kind of. Many dynamic set data structures do not require the set elements to be in some layout inside an array; the storage is abstracted.

When we put the binary tree nodes into an array and move from the parent to children using indexing calculations, rather following pointers that could go anywhere, then it's an explicit part of the data structure.

Lisp-1 has the wart that it models special operators as bindings in a variable name space. So a form like (print let) actually resolves let to a binding to a special operator, and then has to be somehow pronounced as nonsense. And you can block let from working by binding that as a variable name. Allowing variables to shadow the basic operators of the language is quirky.

Would you want to use a weird POSIX shell in which "for x in *.jpg; ..." stopped working because you assigned "for=42"?

Yet Lisp-1 has a notational advantage for programs that work with functional values; programs that indirect upon functions are more succinct, free of "shim" operators for lifting values out of the function binding space, or requesting application of a function value.

In the TXR Lisp dialect, I worked out a way to have the notational convenience, without bringing in the Lisp-1 issue.

1. The substrate, including macro-expansion logic, is thoroughly Lisp-2.

2. When a compound form is written in square brackets, it indicates that immediate elements (those constituents that are symbols) are to be looked up in a single namespace that is a merger of the function and variable namespaces according to precisely documented rules. This is not recursively applied to the form; its arguments that are compound forms are not treated this way unless they use square brackets.

3. Macros are not affected. In a form [a b c ...], the element a is neither recognized as a special operator or as an operator macro. If it is a symbol, it is either a variable, or a symbol macro.

4. [ ... ] is a surface syntax with a straightforward representation: the (dwim ...) operator. The above semantics is thoroughly baked into the macro expander and correctly treated at all necessary levels of the language: the handling of lexical scopes at expansion time and compilation/evaluation.

This system leaves mainly just one small infelicity. The merged 1+2 namespace is not available in certain contexts when it would be handy. Like say we are writing a function that takes a functional argument, that we would like to default:

   (defun my-sort (sequence : (test-fn equal)) ...)   ;; nope!
There is no variable equal. We cannot do this:
   (defun my-sort (sequence : [test-fn equal]) ...)   ;; nope!
because the (test-fn equal) syntax is not a form to be evaluated; it is just notation within the parameter list which has not been equipped with support for the alternative brackets/dwim structure. The way to do this is:
   (defun my-sort (sequence : (test-fn (fun equal))) ...) 
fun* is like Common Lisp's function* operator. It's one of the few instances you ever have to use it, the others also being situations like values in binding constructs such as let. It is not worth complicating things to provide a way to take the fun out these situations.

1. Languages that have all the Lisp features are in the Lisp family. Thus languages that are not in the Lisp familly are ones that don't have all the Lisp features. Once a langauge disappears behind the event horizon of the Lisp family, outsiders no longer distinguish it from any other member of the Lisp family; it's just Lisp.

2. Having some features of Lisp is not the same thing as having those features in that form and integrated in that way.

It's not just the roster of features, but how they blend!

If two features have to speak with each other through some interpretation layer, that spoils everything.

the techniques in the Dragon Book for writing compilers are the real magic.

Can confirm; got a few hints from the 1988 edition when working on the TXR Lisp compiler.

Oh, and also when implementing regexes, not to forget!

However, the Lisp compiler has its own magics that are not exactly covered in the Dragon Book. Some really nice way of doing things.

So basically this whole thing is a ploy to get rid of porn: basically, censorship that vaguely tries not to look like censorship.

1. Instigate a completely impractical, rights-violating scheme for age verification that nobody in their right mind wants to implement.

2. Then, enforce it against whatever porn sites land in your jurisdiction at all, knowing that they, like everyone else, don't do the verification.

Am I close?

Suppose the porn site tries to implement it. How many people are going to hand over their personal info to a shady porn site? Most visitors are there anonymously for whatever free stuff they can watch.

Either way, the porn site is ... screwed. Implement age verification: 99% visitors now back-button out and find another porn site. Don't implement it: blocked or shut down.

The main benefit of the Eytzinger layout is that all values needed for the first steps of the binary search are close together, so they can be cached efficiently: we put the root at index 1 and the two children of the node at index i are at 2i and 2i + 1.

This is exactly what is done in good old binary heaps; though binary heaps do not maintain a balanced binary tree, only the property that key(parent) < key(left_child) and key(parent) < key(right_child). Binary heaps don't support efficient search for a particular key.

I don't remember ever reading a description of binary heaps which mentioned Eytzinger. This is because the layout for binary heaps was discovered without knowledge of Eytzinger. It may have been Knuth who discovered Eytzinger and made the connection?

It's quite obvious that this layout is good for caching. The first few layers of the tree will all fit into a single VM page, the nodes closest to the root into one cache line. Then the subsequent layers are similarly packed in order.

Let's say that k layers of the tree fit into page. If the search path from root to leaf is 3k, it should touch only three pages, right?

But "undefined ops" are not part of the "8080 instruction set"; supporting those would be "binary compatible with the 8080 silicon".

The parity flag is a breaker though; "binary compatible for code only relying on the 8080 instruction set, other than values of the parity flag".

I just got six Schottkys this very morning, 1N5819 40V/1A, to replace the main board rectifier diodes in my Z80-powered ADA MP-1 pre-amp.