И опять логарифмы!
Двоичный логарифм, как это не удивительно, часто юзается вместе с вызовами 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 раз вызвать менеджер памяти для перевыделения буфера.
Когда-то очень давно, в районе 1996-1997, у меня на работе была фидошная нода, круглосуточно работающая. А в моде тогда у фидошников была OS/2 (полуось), она работала куда надежнее (тогда) сырой Винды. И был у меня на работе чувак, тоже читавший фидо. А компы у нас тогда были не очень-то персональные, скорее, коммунальные. И чтобы он не лез своими кривыми руками в мою систему, да и прочие на работе, у меня полуось была залочена паролем (десктоп т.е.).
Через время этот чувак её взломал. И вот как. OS/2 Warp (3.0, как я помню, тогда была) загружалась медленно у меня, да и вообще, всё тормозило, проц был хорошо если 80386, мозгов -- хорошо если 4 метра (а не гига). Всё часто свопилось.
Чувак этот приходил на работу, жал ресет, OS/2 стартовала, на десктопе появлялись иконки, он быстро успевал мышью нажать на иконку DOS Navigator-а, открывалось окно, и только потом полуось лочила десктоп. А поверх этого оставалось открытое окно Navigator-а, где он находил фидошную читалку (GoldED) и запускал её.
Причем, не сказать, чтобы он был особо одаренный 'хацкер'. Просто он настырно ресетил комп и тыкал мышью куда попало. И в конце концов, он нашел слабое место. Упорство оказалось важным.
Полуось медленно лочила потому что вообще медленно работала, из-за моего тормозного компа.
Так вот, именно для этого у девайсов опускают тактовую частоту, для взлома, да и экспериментов.
Довольно много головоломок это просто NP-проблемы. Вплоть до тетриса.
Если вы возьмете самые популярные головоломки на смартфонов, заметите, что всё это они. Наверное в этом есть какая-то психология. Мозгу интересно решать такие проблемы, а проблемы проще (вроде простой сортировки чисел) -- скучно.
Если бы я задался целью забацать еще одну игру-головоломку для смартфонов, я бы просто рылся в книгах об NP-проблемах. Там идей -- огромное море. Ну, еще можно рыться в книгах Мартина Гарднера.
Перл это один из самых плохих ЯП в мире. Хуже Перла только Похапень.
А разгадка проста. Ларри Уолл просто юзал AWK и ему его не хватило, и он начал расширять его. Но AWK был хорош, и сейчас тоже хорош, потому что там все сбалансировано и гармонично. Перл вышел Франкенштейном, в очень плохом смысле.
У меня на лоб глаза полезли, когда я читал про "сигилы". Я знаю только один такой другой ЯП с "сигилами", а именно олдовый Бейсик. Но в Бейсике была потребность в этом. Они работали на 8-битных компах с очень маленьким размером памяти. И программер должен был подсказывать инетрпретатору тип переменной. А зачем это всунули в Перл, я вообще не врубаюсь.
Кто-то раньше юзал Перл ради либ из CPAN, но в наше время у какого-нибудь Питона этих либ тоже достаточно.
Так что, Питон всяко лучше Перла, во всех аспектах. Перлистам я не рукоподаю ни разу. Питонистам я рукоподаю стабильно.
А если вам дико интересен заумный ЯП, то посмотрите в сторону APL/J/K -- этот действительно может исполнять какой угодно случайный поток символов.
А почему же Перл такой популярный? (Был?) Спросите вы? Но это слабый аргумент: argumentum ad populum. Шаурму на улице тоже многие едят, и майонезик там, но никто и не считает это полезной едой. И Макдональдсов вокруг много и кока-колы тоже. Ну и курят-бухают.
Было смешное скандинавское кино "Большинство людей живёт в Китае". Там родитель грузит дочку о том, как делает "большинство людей", а не так, как она. Бойкая нагловатая девочка тут же отвечает, перебивая: "большинство людей живёт в Китае!" И действительно, из-за того что большинство людей живет в Китае, это не значит, что мы должны разговаривать на китайском, юзать юани, итд.
Так вот про Перл. Вероятно дело в том, что в начале 1990-х был спрос на ЯП с динамической типизацией и алголовским синтаксисом. Конечно же, был уже Лисп, но там "скобочки" -- это многих пугает, ну и learning curve у Лиспа круче (т.е., steeper). Питона и Ruby еще не было на горизонте. Вот Перл и попал в струю.
Позже раскрутился Питон и Ruby, но уже в нулевых годах. Эти ЯП практически Лиспы и есть, только с алголовским синтаксисом. Говорят что и JS это тоже почти что Лисп, впрочем я не спец.
На мой взгляд, Питон таки лучше Ruby, потому что Юкихиро Мацумото фанат Перла и натащил фичей Перла к себе в Ruby. И это очень странно. Японец явно хорошо соображает, вне всяких сомнений. Зачем ему Перл? "Месье знает толк в извращениях"? Во всяком случае, это меня отпугнуло в Ruby. А Питон имеет более-менее удачный баланс фич, IMHO.
(Тестирую 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 цифр.
Пока сетапил syncthing... Он позволяет делать директории, которые будут расшарены не по всем вашим девайсам а только по некоторым. Это имеет смысл, например, надо с андроида закачать на определенный сервер, но при этом, не нужно, чтобы файлы копировались на все подряд гаджеты. Лично у меня такие директории называются вроде gadgetname1_gadgetname2, чтобы сразу видно было, который из гаджетов подключен.
Сколько есть вариантов таких "шар"? Директориев?
В математике это называется powerset. Это множество всех возможмных подмножеств.
Есть 4 гаджета, к примеру. Тогда есть \( 2^4=16 \) возможных комбинаций гаджетов. Т.е., как бы 4 бита и каждый бит показывает, подключен ли каждый конкретный к директорию.
Powerset order = \( 2^{set order} \).
Почему \( \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} \).
Но первый вариант быстрее считать!
Так проще запомнить это правило.
Лайфхак для бекапов. Давно я заимел привычку, вместо удаления файла или директория, прибавлять к его имени префикс "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 потом.
Люди юзают логарифмы несознательно, сами того не зная.
Например, умножаем 30 на 500. Многие просто умножат 3 на 5, получится 15. Потом складывают кол-во нулей. 1 ноль плюс 2 нуля, будет 3 нуля. Прибавляем 15 и 3 нуля - 15000.
Вот именно так и работает умножение чисел с плавающей точкой в процу. Умножаем мантиссы и складываем экспоненты.
Ну как так можно писать в википедии?
Карбиды — соединения металлов и неметаллов с углеродом.
Так и хочется спросить, а что еще можно соеденить с этим вашим углеродом, кроме металлов и неметаллов (и самого углерода)? Может быть, полуметаллы?
В математике, есть разница между необходимым условием и достаточным (necessary and sufficient). Эти понятия часто путают.
Майонезик для оливьешки -- необходимое, но не достаточное. Достаточное -- все ингриденты и сила воли для сборки блюда.
В RE4B я писал про старую игру под MS-DOS из 90-х -- "Марьяж". И о том, что были слухи, что игра жульничает.
Что значит "жульничает"? Может ли она подсматривать в карты противника, и в прикуп? Здравый смысл подсказывает, что конечно же может -- ведь у этой игры есть доступ ко всей информации, в т.ч., к вашим картам.
Всё это так, да не совсем.
Игра может быть честной, если ГПСЧ используется для раздачи карт и ф-ция для принятия решений не использует информацию о картах противника. Хотя (технически) может и использовать.
Как узнать? В примере том я показывал, как открыть карты прикупа, т.е., там можно проследить путь от ГПСЧ до места в памяти где хранится инфа о прикупе. Далее следить, будет ли кто-то читать эту информацию, позже. Потенциально это возможно было бы сделать и в 90-ые при помощи отладчика SoftICE.
В наше время есть DosBox с фичей LOGCPU -- дампит каждую исполненную инструкцию и состояние регистров.
Эта задача напоминает taint analysis.
Если сильно заморочиться, то это можно узнать.
Люди мира! А объясните тупому, на кой хер до сих пор в кабаках и гостиницах выставляют пароль на wifi-роутеры?
Инет в наше время уже дешевле некуда. А если это такая сверхмудрая защита от "хацкеров", то ведь никто не помешает "хацкеру" спросить у бармена пароль и потом "хакерить"...
Кста и вот еще. А почему инет-провы вместо того чтобы разводить по квартирам витую пару и ставить роутеры, не выдают всем Wi-Fi? Вроде дешевле было бы. Поставил один Wi-Fi-рутер (более-менее мощный) на несколько этажей сразу, раздал пароли, ну и стриги капусту...