• Числа №4. Натуральные дроби

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

    Натуральная дробь — это отношение двух целых чисел, например 1/2, 1/3, 4/9 и так далее. Их достоинство в том, что иногда из них можно выйти обратно к целым числам. Например, кто-то меняет коров на лошадей по курсу 2/3, то есть за две коровы — три лошади. В случае с флоатами курс был бы 0.666666… или 0.(6) в периоде. Далее нам дают 6 лошадей. Умножаем 6 на 0.66666… и получаем 3.999996 коровы. Округляем до четырех и совершаем обмен. Но если учесть, что:

    • коров и лошадей может быть много;
    • операции совершаются часто;
    • операции строятся в цепочку: коровы на лошадей, лошади на кур и все это по разным курсам,

    то погрешность рано или поздно даст о себе знать.

    Если хранить курс обмена в виде натуральной дроби 2/3, то умножение на 6 даст целое число:

    2   6   12
    - * - = -- = 4
    3   1    3
    

    Легко написать класс для работы с натуральными дробями. Это пара целых чисел. Операции над парой повторяют школьную программу. Чтобы сложить две дроби, их проводят к общему знаменателю. Например, чтобы сложить 1/6 и 1/12, мы:

    • приводим 1/6 к знаменателю 12 и получаем 2/12;
    • складываем числители;
    • сокращаем дробь.
    1    1    2    1    3   1
    - + -- = -- + -- = -- = -
    6   12   12   12   12   4
    

    Вычитание — то же самое, только меняется знак. Умножение несложное: перемножаем числители и знаменатели, затем сокращаем результат. Деление аналогично, только вторая дробь переворачивается.

    Для всех этих действий нужны две вещи: наименьшее общее кратное (НОК) и наибольший общий делитель (НОД). Принцип их поиска был найден еще греками.

    В Кложе из коробки идет тип Ratio, который устроен как пара чисел BigInteger. Если я поделю одно целое на другое, и результат дает остаток, то получу дробь:

    (/ 2 3)
    2/3 ;; clоure.lang.Ratio
    

    Умножив дробь на целое, которое сокращает знаменатель, я получу целое:

    (* (/ 2 3) 6)
    4 ;; clоjure.lang.BigInt
    

    Никаких 3.999996 коровы, все честно. Здесь Рич Хикки ничего не придумал, а взял реализацию из Common Lisp, который еще до вашего рождения считал натуральные дроби из коробки.

    Понимаю, что примеры с лошадьми звучат забавно. Но есть область, где натуральные дроби в высшей степени оправданы — недвижимость. Доли собственников хранятся в натуральных дробях, например у Васи — 1/2, у Пети — 1/3, у Маши — 1/6. В сумме они дают единицу. Предположим, Вася поделил свою долю 1/2 между Колей и Жорой: каждый получил по 1/4 от общей площади. Сумма долей по-прежнему дает единицу.

    В недвижимости бывают и более сложные доли. Скажем, недавно я участвовал в сделке, где моя доля была 49/125. Так получилось в результате наследства, выкупа долей у других собственников и так далее.

    Приступая к делению, подумайте: можно ли выразить его натуральной дробью. Не всегда это возможно, но если все-таки да, вы обезопасите себя от проблем, связанных с флотами. Об этих проблемах мы поговорим в следующих заметках.

  • Числа №3. Сложение

    Продолжаем тему чисел, на этот раз – что-то более серьезное. Поговорим, как компьютеры складывают числа. На эту тему написаны хорошие статьи и книги, поэтому в формате заметки изложить тему невозможно. Напишу только то, что считаю наиболее важным.

    Мы, люди, учимся считать в десятичной системе счисления. Если нужно сложить два числа, мы делаем это в столбик. Мы складываем разряды, при этом может случиться переполнение, например 5 + 7 = 12. В текущем разряде останется 2, а старший переедет к следующему, и нужно учесть его при сложении. Покажем это на примере:

       1 1
      23.55
      12.97
      -----
      36.52
    

    Мы складываем по две десятичные цифры за раз: 2 и 3, 4 и 9 и так далее. Компьютер делает то же самое, но в двоичном виде. Он не может сложить 2 и 3 за один машинный такт – это невозможно. Его система счисления доведена до предела: в ней только нули и единицы. Такой подход следует из природы полупроводников и транзисторов: они принимают два сигнала и выдают один. Были машины на троичной логике, но они не получили распространения.

    Чтобы сложить два бита, для начала проектируют полусумматор. Это логический элемент, который состоит из других элементов проще. Полусумматор принимает два бита (входы) и возвращает бит результата. Если подать нули, результат будет ноль, если 0 и 1 или наоборот, то 1.

    Почему “полу”? Потому что если подать 1 и 1, мы должны получить 0 (результат) и 1 (бит переноса). У полусумматора нет переноса, поэтому бит 1 пропадет. Чтобы этого не случилось, из двух полусумматоров делают полный. Он принимает не два, а три входа: два бита (входы) и перенос, который, возможно, образовался при сложении прошлого разряда.

    Множество сумматоров объединяют в каскад, и можно складывать многобитные числа: 4-, 8-, 16- и 32-битные. Пусть вас не смущают четырехбитные числа: такие архитектуры были в старых калькуляторах. Обратите внимание, что последний флаг переноса никуда не делся: складывая числа, мы должны быть готовы к тому, что последний разряд переполнился, и с этим нужно что-то делать.

    Проблему последнего переноса решают так: этот бит подключается к специальному регистру флагов. У процессора есть регистр, где каждый бит означает особое состояние. Один из них определяет, был ли перенос в последнем разряде (carry flag). Есть особая команда семейства jump, которая переходит на нужный адрес, если флаг не ноль. В высокоуровневых языках по этому адресу находится код, который возбуждает исключение.

    До сих пор я использовал слова “перенос” и “переполнение” вместе, но на самом деле это разные вещи. Перенос (carry) используется для беззнаковых чисел, а для знаковых мы говорим о переполнении (overflow). В регистре флагов это два разных бита и две разные команды jump.

    В целом процессор складывает числа как мы: столбиком по разрядам. Разница в том, что размерность разряда минимальна: всего два значения. Перенос работает как в школьной математике. Последний перенос заносится в регистр флагов, чтобы после условной команды ADD AX BX мы могли бы проверить, был ли выход за последний разряд. Понимание этих принципов пригодится нам в следующих заметках.

    Картинки взяты из замечательной книги “Код: тайный язык информатики”. Горячо рекомендую ее к прочтению.

  • Числа №2. Арабские числа

    В современном мире пользуются арабскими числами. Они удобны и не зря вытеснили другие системы счисления. Есть у них, однако, момент, на который редко обращают внимание: мы читаем их не слева направо, а справа налево.

    Вы, конечно, скажете: Иван, ты несешь ахинею. Арабские числа читаются слева направо, например 12.423 читается как двенадцать тысяч четыреста двадцать три. Но чтобы прочитать тысячи, сотни и так далее, сперва нужно распрасить их. Встретив число, сперва мы переходим в конец и шагаем по три цифры, чтобы определить сотни, тысячи, миллионы и так далее. Только потом, распарсив, мы читаем число.

    На коротких числах это незаметно, и уж тем более, если кто-то расставил разделители: точки, полупробелы. Но попробуйте прочесть это число:

    5512346134
    

    У вас не получится. Сначала вы мысленно добавите разделители:

    5 512 346 134
    

    и таким образом поймете, что первая 5 – это миллиарды. Только теперь число можно прочесть.

    Я уж не говорю о том, что нельзя прочитать число, если его конец неизвестен.

    Сами арабы не страдали от проблем с написанием. В арабском и его диалектах слова читаются справа налево, и числа тоже читались справа налево. Другими словами, порядок чтения арабских цифр был нативным: он совпадал с направлением письма.

    Пример: составим фразу “У меня 125 овец”. Сильно упрощая, на арабском она выглядела бы так:

    .цево 125 янем У
    

    Когда носитель арабского читает эту фразу, он воспринимает цифру 125 как пять единиц, два десятка и одна сотня.

    При этом число записано одинаково: в обоих случаях это 125. Однако его чтение отличается: арабы начинают с младшего порядка и идут по нарастанию. Западный человек читает от старшего ко младшему, при этом он либо распознает порядки, если число короткое, либо мысленно вставляет их.

    Если бы мы изменили порядок арабских чисел в соответствии с направлением письма, получилось бы так: “У меня 521 овец”: пять единиц, два десятка и одна сотня. Это удобно для длинных чисел. Мы уже выяснили, что число 5512346134 нельзя прочитать, пока не расставишь разделители. Но если бы оно было записано задом наперед:

    4316432155
    

    , то вот как я бы его прочел: четыре тридцать сто шесть сорок триста тысяч два десять пятьсот миллионов пять миллиардов. Один проход.

    Ясно, что хватились мы поздновато: вряд ли кто-то будет менять направление чисел. Вдобавок и мы, и арабы используем одну и ту же запись, что довольно удобно. Представьте, если бы в зависимости от языка нужно было бы зеркалить цифры! Поэтому то, что сейчас, хорошо. Просто не мешает иной раз посмотреть на привычное под другим углом.

  • Чистка компа

    Заметка самому себе. Если у вас стационарный комп, чистите его каждые два года, а в идеале – каждый год. Заодно меняйте термопасту.

    Дело в том, что в компьютере много вентиляторов. Пара сзади, пара спереди, кулер на процессоре, пара мелких на материнке, два-три на видеокарте, и еще блок питания. В сумме их где-то десять. Все они засасывают пыль, волосы, шерсть. Пыль изнашивает вентили, удерживает тепло и так далее.

    Базовую пыль можно убрать пылесосом с тонкой насадкой. Но есть много мест, куда ему не добраться. Поэтому самое лучшее – разобрать комп на части и протереть каждую из них. Заодно скрутить материнку и очистить пыль за ней.

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

    Пригодится пинцет: просуньте его между лопастями и выдерните клочки пыли из радиатора. Также удалите пыль, застрявшую между шлейфами – ее там тоже немало.

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

    Если вы не знали – пыль неплохо горит и порой становится причиной пожара.

    Термопаста тоже деградирует. Покупайте марку М6, а лучше М8. Старую сотрите салфеткой; не используйте ватные палочки, потому что они оставляют волоски. Новой пасты должно быть с горошину. Не размазывайте ее как варенье по хлебу, потому что возникнут пустоты с воздухом.

    Спонтанные выключения компа – один из признаков, что пора менять термопасту. Об этом легко забыть: я несколько месяцев тупил, не понимая, что делать, прежде чем вспомнил – термопаста! Конечно, могут быть и другие причины, но в моем случае все исправилось чисткой. Не забывайте об этой простой процедуре.

    PS: на самом деле комп целиком почистил мой сын, а я просто умничаю.

  • Глава 3. JSON в таблицах

    Главы

    1. Введение в документы
    2. Базовые возможности JSON
    3. JSON в таблицах
    4. Индексирование JSON
    5. Ссылки и ограничения в документах
    6. Язык путей JSONPath
    7. Отчеты и функции
    8. Функции на языке Python
    9. Версионирование и архивация документов
    10. Релевантный поиск

    Содержание

    До сих пор мы работали с документами, которые не превышали нескольких строк. На практике документы объемны и занимают сотни килобайт. В этой главе мы обсудим, как хранить JSON в таблицах, читать его, изменять и удалять – полностью и частично.

    Для начала обсудим задачи, которые выполним ниже по тексту. План таков:

    1. мы определим сущность, с которой будем работать до конца книги. Ее структура повторяет аналог из проекта, в котором работал автор. Сущность содержит разные типы данных и вложенные поля. На ней мы опробуем техники, которые уже рассмотрели, и многое другое.

    2. Подготовим таблицу для документов. Здесь же мы рассмотрим сжатие типов (compression) и понятие множественности (cardinality).

    3. Запишем в базу миллион документов. Это будут не клоны одной и той же записи, а псевдослучайные данные. Пороги случайности мы определим сами.

    4. Выполним простые запросы: поиск по ключу, поиск по реквизитам, обновление, вставку с конфликтом и другие частые операции.

    Цель – получить миллион разнообразных документов и опробовать на них все, что мы изучили.

    Read more →

  • Числа №1. Счет на пальцах

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

    Мы привыкли разгибать пальцы при счете. На две руки приходится десять пальцев, а этого мало – хотелось бы больше.

    У каких-то шумеров или Майя (не помню точно) был счет на фалангах. Берем все пальцы кроме большого, у каждой три фаланги. На одной руке их двенадцать. Считают, прикладывая большой палец фаланге. Можно слева направо и вниз, можно снизу вверх и направо – как душе угодно.

    Две руки — 24 единицы! Почти в два с половиной раза больше, чем обычно.

    Когда я прочитал про эту систему, то некоторое время ей пользовался. Привыкаешь быстро – это дело механики. Когда подходишь к десяти, возникает странное чувство – вроде бы много, а пальцы не кончились! И даже руку не сменил.

    Счет на фалангах – один из частных случаев счета на пальцах. Разные народы придумали способы, чтобы обойти лимит в десять пальцев. Ознакомьтесь в Википедии.

  • Мульты №4

    Может быть, вы не смотрели “Трио из Бельвилля”. Если так, уделите ему время. Мульт необычный, он не похож ни на что другое, очень самобытная вещь. Вышел в 2003 году, завоевал множество премий.

    На юге Франции живут бабушка и внук (родителей можно увидеть на фотографиях, но что с ними – неясно). Внук любит велосипед, становится велогонщиком. Во время “Тур де Франс” он сходит с маршрута, и его похищают странные личности. Бабушка отправляется в погоню, пересекает океан и оказывается в мегаполисе Бельвилль – очевидно, копии Нью-Йорка. Всюду толстяки и неприветливость. Здесь же обосновалась итальянская мафия, которая похищает спортсменов и устраивает подпольные ставки. Бабушке предстоит разрушить планы мафии, спасти внука и вернуться во Францию.

    Необычность в том, что главным героем становится бабушка, а не внук. Внимание приковано к мальчику, и когда он пропадает, кажется, что это на пять минут. Но именно бабушка пересекает океан на катамаране, находит мафию и карает наркобосса.

    В мультике почти нет разговоров, и это дает особый шарм. Бабушка и внук, пока еще вместе, настолько понимают друг друга, что ничего не говорят: каждый знает, что нужно другому, и потому слова излишни. Детали не проговариваются, их нужно читать с предметов: картин, фотографий, одежды.

    Замечательно проработаны персонажи. У каждого свои привычки, которым они следуют на протяжении всего фильма. Бабушка поправляет очки одним и тем же жестом. Пес Бруно лает на поезда, потому что в детстве паровозик наехал ему на хвост. Оказавшись на другом конце земного шара, он по-прежнему подстерегает электрички, чтобы полаять на них. Постоянство этих привычек делает персонажей живыми.

    В мультике мало звукового сопровождения, в основном шумы: скрип полов, звон посуды, гул улицы. Но шумы, напротив, только усиливают погруженность. В некоторых моментах играет Великая месса Моцарта.

    Трудно понять, чему учит “Трио”. Мультфильм очень самобытный, и каждый извлечет из него что-то свое. Режиссер посвятил его родителям: возможно, этим он пытался сказать, как многим мы им обязаны. В последнем кадре мы видим постаревшего внука; он слышит голос бабушки из начала фильма. Это напоминание, что благодаря ей он прожил долгую жизнь.

    Я бы не предложил “Трио” в кандидаты на лучший мультфильм, но ознакомится с ним стоит.

  • Мульты №3

    Еще один незаслуженно забытый мульт, о котором хотелось бы рассказать — это “Титан: после гибели Земли”. Вышел в 2000 году, в оригинале называется Titan A.E. Буквы A.E означают After Earth и подразумевают эру подобно BC и AD.

    Будущее, человечество осваивает космос. Герой — мальчик, отец которого работает над секретным проектом. На Землю нападают дреджи — пришельцы, похожие на протоссов из Старкрафта. За считанные минуты они уничтожают планету. Лишь немногие успевают улететь включая мальчика. Отец спасает проект, и судьба его неизвестна.

    Проходят годы. Люди живут на космических станциях в положении бомжей, а то и рабов. Без своей планеты они никто. Мальчик вырос, работает техником на станции, получает люлей от других рас. Отец оставил послание: он работал над кораблем “Титан”, который может построить планету. На борту содержатся геномы всех организмов и растений, источник энергии для первого поселения. Словом — бекап Земли. Отец его спрятал, осталось найти и включить. Парень отправляется на поиски.

    Финал грандиозен: корабль спрятан среди ледяных колец, к нему устремляются все стороны конфликта. Происходят бои, предательства, жертвы и так далее. В последнюю секунду Титан запускают, и он дает люлей флоту дреджей. Затем формирует из мусора планету, пригодную для обитания. На нее слетаются люди, начинается новая эра летоисчисления — AE.

    Такой вот сюжет, а реализация подкачала. При всем масштабе мульт провалился в прокате. Сборы были такими низкими, что фильм досрочно сняли с программы. По этой же причине свернули одноименную игру для Playstation, к которой уже приступили.

    Трудно понять, отчего фильм постигла такая неудача. Даже если найти отдельные недостатки, у него прочный хребет — сюжет, где все герои приходят в финалу. У героя есть внешний конфликт (пришельцы) и внутренний (отец многое держал в тайне). Есть любовная линия: парень и девушка конфликтуют, но становятся парой. Наставник героя оказывается предателем, раскаивается и жертвует собой. Злодеи повержены. При таком сюжете, то есть когда закрыты все вопросы, фильм просто не может получиться провальным.

    Я не пересматривал “Титан” с детьми, а просто вспомнил о нем. Привожу его как образец отлично выполненной работы, которая по каким-то причинам не зашла зрителю. Увы, такое бывает. Жаль.

    Мультик напоминает, как хрупка наша планета и какая участь ждет того, кто ей не дорожит.

  • Мульты №2

    Еще один мульт, о котором хочется сказать добрые слова – это “Стальной гигант” (The Iron Giant). Вышел в 1999 году, студия Warner Brothers.

    Америка, 1958 год. Холодная война, СССР только что запустили спутник. Возле крохотного городка из космоса падает огромный робот. Его находит мальчик и прячет сперва в лесу, а потом на свалке металлолома. Робот дружелюбный, но с особенностью: если в него стрелять, он атакует в ответ. Мальчик сталкивается с этим, когда играет с роботом в войну и чуть не гибнет из-за ответки.

    Детектив из Вашингтона раскрывает робота и вызывает вояк. Те стреляют, и робот становится машиной для убийства. Мальчик, рискуя жизнью, заставляет робота вспомнить их дружбу и того отпускает – он становится добрым как прежде. По ошибке вояки выпускают ракету в то место, где люди. Робот жертвует собой, сбивая ее в воздухе.

    Мульт поучительный: он напоминает, к чему приводит гонка вооружений и мнительность. На примере робота показано, как агрессия порождает агрессию, и только дружба способна ее остановить.

    Хорошо переданы настроения и уклад американского общества того времени. Везде газеты о советском спутнике, разговоры про ядерную войну. Детектив уверен, что робота создали китайцы или русские, чтобы уничтожить Америку. В школе проводят “разговоры о важном”: атомный холокост, как выжить при ядерном взрыве и так далее.

    Итого – есть над чем подумать. Хороший мульт на нестареющую тему, обязательно посмотрите с детьми.

  • Мульты №1

    Заметки о Постгресе не то чтобы надоели, но хочется их чем-то разбавить. Скопилась гора заметок, которые я не писал из-за Постгреса — и пора уделить им внимание! Так вот: речь пойдет о мультиках. В детстве я любил мультфильмы, и многие из них пересмотрел с детьми. В этом цикле речь о тех мультах, которые вы скорее всего не смотрели, и я рекомендую это сделать.

    Первый мульт, который мне запомнился — “Планета сокровищ” Диснея. Он особенный, и ниже я объясню почему.

    Как ясно из названия, мульт обыгрывает знаменитую историю — “Остров сокровищ”. Дело происходит в будущем, в мире стимпанка а-ля “межзвездные дирижабли на дровах”. Вся техника аналоговая, но работает в космосе. Звездолеты — в буквальном смысле корабли с мачтами и парусами, которые плывут в магнитном пузыре от планеты к планете.

    Мульт в точности повторяет ключевые сцены книги. Старый пират передает карту Джиму, и за ним начинается охота. Карта попадает доктору и сквайру, они собирают экспедицию. На борту добрый повар Сильвер. Далее заговор, бегство с корабля, обстрел из плазменной пушки, битва за крепость, переговоры Сильвера и так далее. Тот, кто помнит книгу, оценит, как точно переданы акценты, иной раз — отдельные фразы персонажей.

    Сценаристы хорошо передали характер Сильвера и его симпатию к мальчику. Сильвер должен выбирать: быть добрым с Джимом или угождать команде. В мультике это обыграно более линейно, потому все-таки он для детей. Однако тема отношений пирата и юноши идет через весь фильм.

    Теперь главное: что же особого в мультике? Студия была довольна им, и еще до выхода в прокат начались работы над продолжением. Однако в прокате “Планета сокровищ” оказалось крайне неудачной. Сборы были низкими, и работы над второй частью свернули. По этой же причине, я уверен, мало кто из вас слышал про этот мульт.

    В детстве, посмотрев “Планету сокровищ” на видике, я был в восторге. А когда пересмотрел с детьми, задумался, почему провалился прокат. Думаю, дело вот в чем: картина полностью производна от книги. Идти на нее нужно только в том случае, если вы читали “Остров сокровищ” — причем не смотрели другие фильмы, а именно читали книгу. Разумеется, все сотрудники Диснея читали ее, потому что это классика. Фильм оценивали по тому, насколько точно он передает книгу, и по этому критерию он на высоте.

    Мои дети тоже читали книгу (со мной и сами), поэтому мульт им зашел. Но современные американские дети, которые шли в кинотеатры, вряд ли читали “Остров”. В отрыве от книги фильм, хоть красочный, теряет смысловую нагрузку. Книга, пусть и небольшая, не может быть передана целиком за час с лишним. Те или иные сцены подразумевают, что читатель знает контекст из книги.

    Разумеется, это всего лишь догадки: я не знаю наверняка, чем не угодил американскому зрителю этот мульт. Однако это не повод его игнорировать: будет время — посмотрите “Планету сокровищ” с детьми. Уважьте незаслуженно забытый труд.

Страница 3 из 111