Search
Write a publication
Pull to refresh
@Alpha_Cephread⁠-⁠only

Я не знаю неудач, потому что я — Альфач

Send message

Интуитивно: у такого большого орнитоптера будут гигантские энергозатраты на разгон и торможение крыльев, совершающих возвратно-поступательные перемещения с частотой 50+ Гц, а сделаны крылья должны быть из адамантия, чтобы не развалиться при ускорении. Впрочем, торможение может быть рекуперативным. Здесь те же проблемы, что у поршневых моторов: чем больше ход поршня, тем до большей скорости он, поршень, должен быть разогнан при одной и той же частоте вращения коленвала.

- buf_ix = (buf_ix + 1) % 2;
+ buf_ix ^= 1;

До 24.02 курс был "рыночным"? Полтриллиона ЗВР появились путём занижения курса рубля. Это 1-2 годовых объёмов сырьевого экспорта страны. Что-то я не помню, чтобы до 24.02 кто-либо возмущался нарисованным курсом.

Clang делает тучу проверок, никак не прописанных в стандарте языка: например, кидает ворнинг на присваивание вида

if (a = b) /*...*/ ;

Предупреждение глушится парой дополнительных скобок:

if ((a = b)) /*...*/ ;

Мне не кажется, что из-за подобных проверок Clang перестаёт быть компилятором C.

https://www.foreca.com/ru/

Мой провайдер интернета подсовывает рекламу на страницах без https:

Снимок экрана

Ещё есть вариант использовать наушники со встроенной памятью / карт-ридером.

Где можно посмотреть на этот чудесный switch на сотню case'ов, с которым ничего особо сделать нельзя?

У меня друг спрашивает, он такое любит.

За полгода никто так и не посчитал нужным предъявить мне за то, что я 100 млн. раз постучался по произвольному индексу в гигабайтную UTF-8 строку (build_tree.rb).

Тем временем, я хочу похвалить Ruby за то, что он смог отсортировать 100 млн. int'ов за 1 минуту (normalize.rb), это лишь в 4-5 раз медленнее, чем qsort() из glibc. Оптимизация работает так: перед сортировкой Ruby сканирует массив, и если все значения попадают в диапазон C-шного int'а, то копирует все значения в C-массив, вызывает на нём qsort(), и уже упорядоченные значения копирует обратно в изначальный Ruby-массив.

Звучит правдеподобно.

Вероятно, фантазии о стоимости ифраструктуры основаны на habr.com/post/551346/#comment_22899208

А уж про пропускную способность. Ну, начнем с того, что в секунду «любой системник» при размере базы в миллион записей сможет отдать 20-30 ответов, и это будет еще хорошо. Даже при оптимистичном 50 записей в секунду — 180000 запросов в час.

LAMP-овые DNS-серверы? Звучит как RGB-мечта проставщиков «железа».
Есть принципиальная разница между дистрибуцией через торговое предприятие и через транспортное: торговое предприятие, как правило, требует процент от стоимости товара, оплата услуг логистической конторы зависит только от массо-габаритных характеристик распространяемых ништяков (англ. «goods»).
за услуги хранения и транспортировки.

Как прекрасны мечты о мире, где уважающий себя потребитель не позволяет торговому люду паразитировать, где купечество заменено «сервис-провайдерами» услуг хранения и траспортировки…

Ах, мечты, мечты…
государство (это кстати кто?)

Не «кто», а «что»: владение государя, как поместье у помещика. Все земли и людишки, включая тех же помещиков.
Над преобразованием Tmp -> Node придётся подумать самостоятельно.
github.com/alantudyk/Trie
Не в чистом виде: число узлов превысит число паспортов.

У меня получился гибрид: первые 8 символов — в префиксном дереве, остальные 2 — в битовых массивах в листьях.

normalize.rb
#!/bin/ruby

STDERR.puts Time.now

b = []

while s = gets
    s.gsub! /\D/, ''
    b << s.to_i if s.size == 10
end

STDERR.puts Time.now

b.sort!

STDERR.puts Time.now

b.each do | i |
    print '%010d' % [i]
end

STDERR.puts Time.now
$ ./normalize.rb < list_of_expired_passports.csv > normalized.txt
2021-02-06 03:37:34 +0300
2021-02-06 03:46:05 +0300
2021-02-06 03:47:08 +0300
2021-02-06 03:49:32 +0300
build_tree.rb
#!/bin/ruby

b = File.read 'normalized.txt'

N = Struct.new :digit, :first_child, :next_sibling
T = N.new
count = 0

Insert = -> t, c do
    if t.first_child == nil
        count += 1
        return (t.first_child = N.new c)
    end
    t = t.first_child
    while t.digit != c && t.next_sibling != nil
        t = t.next_sibling
    end
    return (t.digit == c) ? t : (count += 1; t.next_sibling = N.new c)
end

STDERR.puts Time.now

(0...b.size).step 10 do | i |
    t = T
    b[i, 8].each_char do | c |
        t = Insert.(t, c)
    end
    puts count if i % 1e8.to_i == 0
end

STDERR.puts Time.now

puts count
$ ./build_tree.rb
2021-02-06 04:01:04 +0300
2021-02-06 04:49:37 +0300
3106435
Промежуточная C-структура:
typedef struct Tmp {
    char digit;
    Tmp *first_child;
    Tmp *next_sibling;
    uint8_t[16]
} Tmp;
Компактная финальная:
typedef struct Node {
    uint8_t[16]; // 100 bitarray +
                 //   4 digit +
                 //   1 is_sibling_exists_flag +
                 //  23 index_in_Node_array
} Node;

Над преобразованием Tmp -> Node придётся подумать самостоятельно.

3_106_435 * sizeof(Node) == 49_702_960 байт
25 декабря появилась статья от клиента сервиса, который обнаружил, что цена за поездки на такси, для клиентов имеющих подписку Яндекс.Плюс (своеобразная программа лояльности) выше на 10%, чем цена для клиентов без Плюса.
Прикольная у Gett программа лояльности (2 картинки)
image

Если кто-либо сможет объяснить, что текст из цитаты неприменим к картинкам, я этого человека выслушаю.
ИСО-стандартов

На самом деле, «ИПСО-стандартов» (Интернешнл ПДФ Селлинг Организейшн).
Один CPU поток, т.к. методом не сложных математических вычислений, можно прикинуть, какое latency будет, если алгоритм распарралелить.

Переиспользуемые потоки + массив volatile _Bool'ов для синхронизации = латенси в районе 100 наносекунд на подхват задания потоком. Каждый _Bool действует как переключатель с ровно двумя положениями: «0» — «child читает, main пишет», «1» — «main читает, child пишет». Когда поток, имеющий право на запись меняет значение «переключателя», то он одномоментно (и вполне атомарно) лишает себя права на запись и передаёт это право «напарнику».
умножив ценник памяти этак на 12
Экономика для инженеров
Ценообразование — удивительная штука: единственным объективным фактором, определяющим цену, является необъективное представление продавца о «приемлемом» вознаграждении за товар. Такой объективный показатель, как затраты человеко-часов, не является определяющим: например, пользователь опен-сорса получает ПО за 0 денежных едениц, не потому, что его автор потратил 0 человеко-лет; обратный пример, при котором за абсолютно примитивную фигню автор запрашивает много-много денег, встречается гораздо чаще.

Конкуренция на рынке, конечно же, способствует снижению необоснованно завышенных цен, но никакой конкуренции среди производителей чипов нет: они не сражаются за рынок, они его делят.

Победа «дешёвой» конденсаторной (Dynamic) над «дорогой» транзисторной (Static) RAM случилась примерно так: давно-давно, лет 40 назад, когда частоты CPU измерялись единицами Мегагерц, некий оптимизатор (без кавычек) решил, что тратить на 1 бит RAM лишь 1 транзистор и 1 конденсатор гораздо выгоднее, чем 6 транзисторов; необходимость перезаряжать конденсатор не могла по тем временам как-то значимо отразиться на скорости доступа к RAM или на энергопотреблении. Со временем, частота CPU возросла в 1000 раз, цена на один транзистор упала в 1000 раз, RAM стоит так мало, что каждый потребитель может купить её в большем количестве, чем ему нужно; вроде бы, пора перестать экономить транзисторы и избавиться от конденсаторов, но нет: вместо этого строится многоэтажная иерархия кэшей с суперзамороченным контролем когерентности. Анонсированный перенос многослойной DRAM под одну крышку с CPU всех проблем конденсаторной памяти не решит.

Information

Rating
Does not participate
Registered
Activity