Короткие заметки


20240724 03:48:30 CEST

И опять логарифмы!

Двоичный логарифм, как это не удивительно, часто юзается вместе с вызовами realloc().

Частая задача -- вы читаете что-то там в буфер и буфер постепенно расширяется. Очень часто, есть просто начальный размер буфера вроде 4096, потом, если не хватает места, он умножается на 2 при каждой итерации.

Кол-во вызовов realloc() примерно равняется двоичному логарифму от размера итогового буфера.

Например, из ядра Линуха:

buffer_len = buffer_len ? buffer_len * 2 : 4096;
next_buffer = realloc(buffer, buffer_len);

( src )

Еще:

log_buf_size = max((size_t)BPF_LOG_BUF_SIZE, log_buf_size * 2);
tmp = realloc(log_buf, log_buf_size);

( src )

Но есть побочный эффект. Если загружаемый файл размером 1GIB + 1 байт, придется выделить буфер размером 2GiB. 1GiB = 2**30, 1GiB+1 = 2**30+1, 2GiB = 2**31.

А как иначе? Можно выделять более мелкими кусочками, но тогда будет большой overhead на вызовы менеджера памяти. Например, каждый раз, вы увеличиваете буфер на 1 килобайт. Тогда, для чтения файла размером в 1 мег, надо будет ~1000 раз вызвать менеджер памяти для перевыделения буфера.


20240723 03:45:38 CEST

Раннее.

Когда-то очень давно, в районе 1996-1997, у меня на работе была фидошная нода, круглосуточно работающая. А в моде тогда у фидошников была OS/2 (полуось), она работала куда надежнее (тогда) сырой Винды. И был у меня на работе чувак, тоже читавший фидо. А компы у нас тогда были не очень-то персональные, скорее, коммунальные. И чтобы он не лез своими кривыми руками в мою систему, да и прочие на работе, у меня полуось была залочена паролем (десктоп т.е.).

Через время этот чувак её взломал. И вот как. OS/2 Warp (3.0, как я помню, тогда была) загружалась медленно у меня, да и вообще, всё тормозило, проц был хорошо если 80386, мозгов -- хорошо если 4 метра (а не гига). Всё часто свопилось.

Чувак этот приходил на работу, жал ресет, OS/2 стартовала, на десктопе появлялись иконки, он быстро успевал мышью нажать на иконку DOS Navigator-а, открывалось окно, и только потом полуось лочила десктоп. А поверх этого оставалось открытое окно Navigator-а, где он находил фидошную читалку (GoldED) и запускал её.

Причем, не сказать, чтобы он был особо одаренный 'хацкер'. Просто он настырно ресетил комп и тыкал мышью куда попало. И в конце концов, он нашел слабое место. Упорство оказалось важным.

Полуось медленно лочила потому что вообще медленно работала, из-за моего тормозного компа.

Так вот, именно для этого у девайсов опускают тактовую частоту, для взлома, да и экспериментов.


20240721 02:53:43 CEST

Раннее.

Довольно много головоломок это просто NP-проблемы. Вплоть до тетриса.

Если вы возьмете самые популярные головоломки на смартфонов, заметите, что всё это они. Наверное в этом есть какая-то психология. Мозгу интересно решать такие проблемы, а проблемы проще (вроде простой сортировки чисел) -- скучно.

Если бы я задался целью забацать еще одну игру-головоломку для смартфонов, я бы просто рылся в книгах об NP-проблемах. Там идей -- огромное море. Ну, еще можно рыться в книгах Мартина Гарднера.


20240720 03:25:19 CEST

Перл это один из самых плохих ЯП в мире. Хуже Перла только Похапень.

А разгадка проста. Ларри Уолл просто юзал AWK и ему его не хватило, и он начал расширять его. Но AWK был хорош, и сейчас тоже хорош, потому что там все сбалансировано и гармонично. Перл вышел Франкенштейном, в очень плохом смысле.

У меня на лоб глаза полезли, когда я читал про "сигилы". Я знаю только один такой другой ЯП с "сигилами", а именно олдовый Бейсик. Но в Бейсике была потребность в этом. Они работали на 8-битных компах с очень маленьким размером памяти. И программер должен был подсказывать инетрпретатору тип переменной. А зачем это всунули в Перл, я вообще не врубаюсь.

Кто-то раньше юзал Перл ради либ из CPAN, но в наше время у какого-нибудь Питона этих либ тоже достаточно.

Так что, Питон всяко лучше Перла, во всех аспектах. Перлистам я не рукоподаю ни разу. Питонистам я рукоподаю стабильно.

Еще про Перл.

А если вам дико интересен заумный ЯП, то посмотрите в сторону APL/J/K -- этот действительно может исполнять какой угодно случайный поток символов.

А почему же Перл такой популярный? (Был?) Спросите вы? Но это слабый аргумент: argumentum ad populum. Шаурму на улице тоже многие едят, и майонезик там, но никто и не считает это полезной едой. И Макдональдсов вокруг много и кока-колы тоже. Ну и курят-бухают.

Было смешное скандинавское кино "Большинство людей живёт в Китае". Там родитель грузит дочку о том, как делает "большинство людей", а не так, как она. Бойкая нагловатая девочка тут же отвечает, перебивая: "большинство людей живёт в Китае!" И действительно, из-за того что большинство людей живет в Китае, это не значит, что мы должны разговаривать на китайском, юзать юани, итд.

Так вот про Перл. Вероятно дело в том, что в начале 1990-х был спрос на ЯП с динамической типизацией и алголовским синтаксисом. Конечно же, был уже Лисп, но там "скобочки" -- это многих пугает, ну и learning curve у Лиспа круче (т.е., steeper). Питона и Ruby еще не было на горизонте. Вот Перл и попал в струю.

Позже раскрутился Питон и Ruby, но уже в нулевых годах. Эти ЯП практически Лиспы и есть, только с алголовским синтаксисом. Говорят что и JS это тоже почти что Лисп, впрочем я не спец.

На мой взгляд, Питон таки лучше Ruby, потому что Юкихиро Мацумото фанат Перла и натащил фичей Перла к себе в Ruby. И это очень странно. Японец явно хорошо соображает, вне всяких сомнений. Зачем ему Перл? "Месье знает толк в извращениях"? Во всяком случае, это меня отпугнуло в Ruby. А Питон имеет более-менее удачный баланс фич, IMHO.

20240717 11:17:08 CEST

(Тестирую MathJax.)

В раздумьях об A057839. Сколько надо бит для libgmp чтобы представить в памяти число \( 10^{2026728077} \)? В Питоне не получается подсчитать, слишком большое число.

Хотя эти могут считать.

Тогда, мы можем изменить базу числа вида \( b^x \) с 10 на 2:

>>> x
2026728077
>>> b
10
>>> x*math.log(b)/math.log(2)
6732644939.683338

Т.е., 6732644939 бит или 841580617 байт или 841MB, что худо-бедно терпимо.


Также подбешивает, когда про RSA Factoring Challenge пишут что-то вроде "RSA-120", но не указывают, это кол-во бит или кол-во десятичных знаков?

Например, RSA-170, это 170 десятичных знаков. А сколько это в битах? Переводим:

>>> 170*math.log(10)/math.log(2)
564.7277761308517

А если (публичный) RSA-ключ имеет 768 бит, то сколько это десятичных знаков? Переводим:

>>> 768*math.log(2)/math.log(10)
231.19103666993752

Сколько 16-ричных цифр (nibbles) будет занимать число длиной 10 в 10-чной форме? Можно даже запомнить коэффициент - 1.2 (это math.log(16)/math.log(10)) 10/1.2=~8.3

Сколько 10-чных цифр будет занимать число длиной 8 в 16-ричной форме? 8*1.2=~9.6. То есть, 2^32 = ~4.7 миллиарда (один DVD), и в числе 4700000000 10 цифр.


20240704 23:33:55 CEST

Пока сетапил syncthing... Он позволяет делать директории, которые будут расшарены не по всем вашим девайсам а только по некоторым. Это имеет смысл, например, надо с андроида закачать на определенный сервер, но при этом, не нужно, чтобы файлы копировались на все подряд гаджеты. Лично у меня такие директории называются вроде gadgetname1_gadgetname2, чтобы сразу видно было, который из гаджетов подключен.

Сколько есть вариантов таких "шар"? Директориев?

В математике это называется powerset. Это множество всех возможмных подмножеств.

Есть 4 гаджета, к примеру. Тогда есть \( 2^4=16 \) возможных комбинаций гаджетов. Т.е., как бы 4 бита и каждый бит показывает, подключен ли каждый конкретный к директорию.

Powerset order = \( 2^{set order} \).


20240704 16:49:39 CEST

Почему \( \frac{x+y}{z} = \frac{x}{z} + \frac{y}{z} \)?

Поехал я как-то в соседний город по делам. Потратил столько гривен: 115 + 590 + 115. А сколько это в баксах? (По тогдашнему курсу 26 грн за бакс.)

Можно считать так: \( \frac{115 + 590 + 115}{26} \).

Но это то же что и: \( \frac{115}{26} + \frac{590}{26} + \frac{115}{26} \).

Но первый вариант быстрее считать!

Так проще запомнить это правило.


20240703 17:36:57 CEST

Лайфхак для бекапов. Давно я заимел привычку, вместо удаления файла или директория, прибавлять к его имени префикс "2k ". Что означает "to kill". Спасло мне это много нервов, когда я мог запороть файл(ы) а бекапов не было. Потом, удаляете самые старые файлы с префиксом "2k " для чистки.

Еще: emacs при сохранении файла переименовывает предыдущий в #fname#.


Ругали когда-то ЯП Бейсик, в былые времена.

А с другой стороны, а что делать? 8-битные маломощные процы, оч.мало памяти. Какой еще интерпретируемый ЯП с возможностью отладки там можно было юзать? На ум приходит только Лисп, но это не оч. гуманно для нубов. Может быть, Форт, но я с ним не знаком толком.

Остальные ЯП в 80-ые и 90-ые -- компилируемые, и это слишком круто для тех маломощных компов.

А Бейсик (который суть упрощенный Фортран) позволял прерваться, посмотреть переменные, модифицировать их, запустить прогу с другого места. Таким был на моей памяти только Лисп.

Да, Паскаль и Си в 90-ые -- это огого по тем временам. Но для этого уже нужны были компиляторы. Которые и были, даже для ZX Spectrum, но генерили код они раздутый (поди попытайся оптимизировать что-то на таком слабом процу) и медленный.


Почему говорят "плавающая точка", "floating number"? Всё дело в маркетинге.

Было время когда девайс работающий с IEEE 754 - это было дорого. Люди постарше вспомнят "сопроцессоры" для процов 8086, 80286 и некоторых 80386 (кажется, SX).

Люди обходились fixed point, т.е., "фиксированной точкой". Просто берете integer, посредине ставите точку. Половина это целая часть, половина -- дробная.

Несколько очень известных софтин это юзали. А именно DOOM. Он шел на процах 80386 без сопроцессора. Важное замечание -- итоговая цель видеоигры это найти на дисплее пиксель и расчитать цвет для него. Для этого fixed point хватало - 32-битный регистр, 16 бит для целой части, 16 для дробной части.

Другая известная софтина это TeX Д.Кнута, начавшаяся в начале 1980-х. Конечно, мало какие компы в то время имели "сопроцессор".

Так до сих пор делают маломощные (микро)котроллеры без сопра. Какой-нибудь промышленный термометр, где работать с вещественными числами нужно, а особая точность не нужна.

Потом, в 90-х, сопроцы относительно дешевели и маркетологи юзали термин "плавающая точка" чтобы отмежеваться от fixed point. Дескать, у нас тут еще и экспонента. А значит точка "плавает" тудой-сюдой (как в Одессе говорят).

Маркетологи так говорили чтобы впаривать компы с сопроцами, или компы поновее -- 80486 уже имел сопер на кристалле, ну и всякие там Pentium потом.


20240628 19:01:22 CEST

Люди юзают логарифмы несознательно, сами того не зная.

Например, умножаем 30 на 500. Многие просто умножат 3 на 5, получится 15. Потом складывают кол-во нулей. 1 ноль плюс 2 нуля, будет 3 нуля. Прибавляем 15 и 3 нуля - 15000.

Вот именно так и работает умножение чисел с плавающей точкой в процу. Умножаем мантиссы и складываем экспоненты.


20240624 15:01:48 CEST

Ну как так можно писать в википедии?

Карбиды — соединения металлов и неметаллов с углеродом.

Так и хочется спросить, а что еще можно соеденить с этим вашим углеродом, кроме металлов и неметаллов (и самого углерода)? Может быть, полуметаллы?


20240601 21:43:54 CEST

В математике, есть разница между необходимым условием и достаточным (necessary and sufficient). Эти понятия часто путают.

Майонезик для оливьешки -- необходимое, но не достаточное. Достаточное -- все ингриденты и сила воли для сборки блюда.


20240601 18:07:32 CEST

В RE4B я писал про старую игру под MS-DOS из 90-х -- "Марьяж". И о том, что были слухи, что игра жульничает.

Что значит "жульничает"? Может ли она подсматривать в карты противника, и в прикуп? Здравый смысл подсказывает, что конечно же может -- ведь у этой игры есть доступ ко всей информации, в т.ч., к вашим картам.

Всё это так, да не совсем.

Игра может быть честной, если ГПСЧ используется для раздачи карт и ф-ция для принятия решений не использует информацию о картах противника. Хотя (технически) может и использовать.

Как узнать? В примере том я показывал, как открыть карты прикупа, т.е., там можно проследить путь от ГПСЧ до места в памяти где хранится инфа о прикупе. Далее следить, будет ли кто-то читать эту информацию, позже. Потенциально это возможно было бы сделать и в 90-ые при помощи отладчика SoftICE.

В наше время есть DosBox с фичей LOGCPU -- дампит каждую исполненную инструкцию и состояние регистров.

Эта задача напоминает taint analysis.

Если сильно заморочиться, то это можно узнать.


20240411 18:07:23 EEST

Люди мира! А объясните тупому, на кой хер до сих пор в кабаках и гостиницах выставляют пароль на wifi-роутеры?

Инет в наше время уже дешевле некуда. А если это такая сверхмудрая защита от "хацкеров", то ведь никто не помешает "хацкеру" спросить у бармена пароль и потом "хакерить"...

Кста и вот еще. А почему инет-провы вместо того чтобы разводить по квартирам витую пару и ставить роутеры, не выдают всем Wi-Fi? Вроде дешевле было бы. Поставил один Wi-Fi-рутер (более-менее мощный) на несколько этажей сразу, раздал пароли, ну и стриги капусту...

→ [back to the main page]