bird

(no subject)

Всякие cv.notify() пробуждают одного ждущего. Всегда есть вариант notifyAll(), это понятно. Иногда есть вариант одним вызовом пробудить нескольких, это не очень понятно (ну разве что для случая одновременного добавления толстой пачки заданий в очередь). Но не видно другого: где-то важно пробуждение в FIFO порядке, а где-то полезнее в LIFO (особенно во всяких пулах нитей, когда лучше передать новую задачу самой последней из завершившихся - её состояние ещё закэшировано, и всё такое).

Ожидаю увидеть интерфейс типа:

notifyFirst(count = 1)
notifyLast(count = 1)
notifyAll()

но нигде такого не видел. Почему? This entry was originally posted at https://netch80.dreamwidth.org/50991.html. Please comment there using OpenID.
bird

braces...

Когда в C++ не хватило трёх видов скобок, на шаблоны применили <>. Выглядело в начале хорошо, но получилось в итоге ужасно (грабли парсинга знают все, кто писал на C++, C# и ещё куче потомков).
По-нормальному нужно наперёд придумать до десятка новых видов скобок и добавить их в Unicode, чтобы хватило на все извращения. Но нужен художник, чтобы придумать оригинально (в смысле отличия от букв-цифр, от старых скобок и друг от друга). У меня хватает фантазии только дорисовать колечки и завитушки.

Параллельно обсуждение в FB. This entry was originally posted at https://netch80.dreamwidth.org/50814.html. Please comment there using OpenID.
bird

(no subject)

Обновление фряхи потребовало спецдвижений, ибо:

# df /
Filesystem Size Used Avail Capacity Mounted on
/dev/ada0s1a 771M 581M 128M 82% /

# ls -l /usr/bin/clang
-r-xr-xr-x 6 root wheel 70607108 Sep 5 00:02 /usr/bin/clang

===> usr.bin/clang/clang (install)
install -SCc -s -o root -g wheel -m 555 clang /usr/bin/clang
strip: creation of /usr/bin/INS@Mdos failed: No space left on device
install: strip command strip failed on /usr/bin/INS@Mdos

требовать двойного размера для strip от столь убойного бинаря это пять. косяков.

надо бы с ней радикально что-то решать, но лень и карантин... This entry was originally posted at https://netch80.dreamwidth.org/50375.html. Please comment there using OpenID.
finch

(no subject)

Убедился, что старое правило "своп не менее двух RAM" актуально и сейчас, и особенно для лаптопа, в котором всего 8GB оперативки. Было 8GB свопа, и я не успевал замечать, как всё выедалось браузерами и начинался тяжёлый OOM. С 24, надеюсь, тормоза придут раньше. Или при NVMe надо умножать на 5?

Это в продолжение предыдущей заметки про выжирание памяти... клин начинался таки с исчерпания свопа. This entry was originally posted at https://netch80.dreamwidth.org/50109.html. Please comment there using OpenID.
bird

(no subject)

На лаптопе открыть фейсбук почти гарантированно приводит к выжиранию всей памяти (даже OOM не помогает), так что сейчас стараюсь в него поменьше ходить. Единственная разница с домашним и рабочим десктопом - объём RAM: 8GB против 16 и 32. А цены на RAM не падают с 12-го года.
От того, что пишу на Питоне, начинаю чувствовать себя преступником. This entry was originally posted at https://netch80.dreamwidth.org/49736.html. Please comment there using OpenID.
bird

(no subject)

Consider a binary search tree (AVL, red-black, whatever). The goal "find the least key strictly greater than the specified one" ("upper_bound" in C++ STL, higherEntry//higherKey in Java, etc.) can be implemented in manner (Java-like pseudocode):

current = root;
bestsofar = null;
while (current != null) {
  if (example_key < current.key) {
    bestsofar = current;
    current = current.left;
  } else {
    current = current.right;
  }
}
// return for KV extracting
return bestsofar;


This can be improved with optimizations (e.g. C5 adds special processing case without comparings if found exact match), but the main principle remains that we use single pass from the root to a leaf.

But Java TreeMap implementation uses strange variant (the same at least in versions 8...13):

    Entry<K,V> p = root;
    while (p != null) {
        int cmp = compare(key, p.key);
        if (cmp < 0) {
            if (p.left != null)
                p = p.left;
            else
                return p;
        } else {
            if (p.right != null) {
                p = p.right;
            } else {
                Entry<K,V> parent = p.parent;
                Entry<K,V> ch = p;
                while (parent != null && ch == parent.right) {
                    ch = parent;
                    parent = parent.parent;
                }
                return parent;
            }
        }
    }
    return null;


so, in some cases it backtracks using "parent" link to find the place it started passing only left-side links before final right-side dead end. (Really, all 4 key-based inexact searches utilizes this way, with minor differences and mirrored conditions.)

What case is being optimized with this approach?

This entry was originally posted at https://netch80.dreamwidth.org/49623.html. Please comment there using OpenID.
  • Current Mood
    amused amused
finch

(no subject)

Хочу странного.
Про виртуализацию в линии IBM S/370...zSeries говорят, что она имеет чрезвычайно мелкие накладные расходы и позволяет делать до 3-4 уровней вложенности без заметной просадки производительности.
Но не могу понять, как они этого достигают.
Документ "Principles of operation" свободно доступен, но именно эта тема превращается в "смотрю в книгу, вижу фигу" в завале подробностей глав типа "ASN translation".
Внятные описания стиля howto не гуглятся.
Или я не по тем словам ищу?

This entry was originally posted at https://netch80.dreamwidth.org/48481.html. Please comment there using OpenID.