Я представлял себе, что такое CRC, но когда понадобилось вычислить его самому, оказалось, что представлял я слишком туманно. CRC -- один из видов контрольных сумм (хэшей) часто используемый для проверки целостности данных.
Оказалось, что црц даже одинакового размера (CRC-8, 16, 32) могут иметь разные параметры, поэтому надо точно знать, какой алгоритм применяется. Разнообразие можно оценить тут: crccalc.com/
К счастью, добрые люди уже написали функцию подсчёта нужного мне црц, поэтому я просто сунул её к себе в код. Тип входных данных там использовался -- UCHAR. В стандартной библиотеке такого типа нет, но по названию было понятно, что это, наверное, синоним для unsigned char. У меня же все данные традиционно были обычными (signed) char. Ну я посмотрел в код, там вроде используются только побитовые операции. А им всё равно, знаковое число или беззнаковое. Сделаю-ка для однообразия вместо UCHAR обычный (signed) char.
Сделал. Не работает.
После того, как я когда-то несколько раз выстрелил себе в ногу, налепив где не надо unsigned, я решил, что по умолчанию лучше всегда использовать signed. Но теперь случилась ситуация, когда решение использовать signed было ошибочным. В чём же была проблема?
В моей невнимательности. Исходный код содержал в себе не только побитовые операции. Там была такая, например, строчка:
iIndex = ucCRCLo ^ *( pData++ );
Где же использовался этот индекс далее? Он использовался при индексации массива, содержащего подготовленные промежуточные данные. Массив имел размер 256 байт и индексы от 0 до 255. Очевидно, что при работе с unsigned char iIndex будет как раз иметь нужный диапазон индексов. Но при работе с signed char... результат тоже будет знаковый. То есть -- от -128 до +127.
Я выходил за границы массива и что-то там шуровал.
Меня, кстати, спросили, что это вообще за телеграм премиум, и что значит. Телеграм премиум сводится к двум вещам: -- вам увеличивают число смайликов и -- вам увеличивают технические ограничения типа числа категорий чатов (folders), числа публичных каналов, которые могут быть на вас записаны, и т.п. За деньги, разумеется.
И вот ещё одно наблюдение про телеграм премиум.
На многих сайтах, а также в условно-бесплатном ПО, часто встречается такое поведение. Есть кнопка, ссылка, поле ввода, которое обозначает определённый функционал. Например, вам предлагают оставить комментарий. Однако при щелчке на кнопке "комментировать", на поле ввода, а иногда и на кнопке "отправить" уже после составления комментария, отображается сообщение, суть которого сводится к тому, что для того, чтобы откомментировать, необходимо зарегистрироваться. Для условно-бесплатного ПО в аналогичных случаях можно видеть окна оплаты.
То есть, создаётся видимость доступного функционала, однако он не работает, а все органы управления выполняют совершенно иную функцию.
Нечто похожее присутствует и в случае телеграм премиум.
Как известно, с технической точки зрения сообщение с прикреплённой картинкой не является обычным текстовым сообщением. Это именно сообщение-картинка (альбом), и у него есть "заголовок" (подпись). Размер этой подписи сильно ограничен. Если размер обычного сообщения может достигать 4000 символов, то размер подписи под картинкой может составлять всего 1000 символов. Раньше в этот лимит можно было легко упереться, внезапно обнаружив, что символы перестают вводиться.
Как вы уже догадались, телеграм премиум позволяет увеличить размер подписи в два раза. Так что же, если у вас не куплен премиум, вы будете упираться в 1000 символов, как раньше?
Нет. Вам дадут ввести до 2000 символов. Но при попытке отправки вы получите сообщение: "размер подписи превышен на Х символов". И две кнопки: "окей" и "купить премиум". Ну, хорошо хоть мне пишут, на сколько символов превышено. Однако об этом можно узнать только при нажатии на кнопку "отправить". Текущего счётчика символов нет. Сиди вот и подбирай длину.
Устаревший способ прокрутки новостных и иных подобных сайтов -- постраничная. Долистал до конца -- нажал "следующая".
Современный способ -- это автоматическая подгрузка. С одной стороны -- это удобно, но с другой -- ты как в бездонную яму падаешь. Вертишь, вертишь -- и непонятно, сколько пролистал. То есть, на сайтах с котиками можно и так надолго зависнуть, а автоматическая подгрузка дополнительно усугубляет ситуацию.
Что же остаётся делать? Наверное, засекать время по часам. Но лучшая защита -- это, конечно, не заходить на сайты с котиками вовсе.
Чем продолжится, и чем кончится история с Телеграм Премиум -- пока неясно.
По этому вопросу я хочу пока прокомментировать только один момент. Спонсоры получают в профиле звёздочку. Звёздочка неотключаемая.
Причина, почему звёздочка есть, и почему она неотключаемая -- совершенно понятна. Те, кто не в курсе про подписку, будут спрашивать у звёздочников о том, что это такое. Это форма рекламы.
Я не пользуюсь премиум, и вряд ли буду. Но мне кажется, что не все будут рады публично сообщать о том, что они поддерживают телеграм финансово. Причины для этого могут быть разными.
Пример я могу привести очень старый, с такого сайта, как nnm-club. Там те, которые поддерживали трекер деньгами, получали лычку "Меценат". И одна знакомая, будучи спонсором, была этим очень недовольна. Почему -- она не сказала. Она вышла на связь с администрацией, и ей, в качестве исключения, лычку убрали.
Начальник говорит: Надо сделать поддержку устройства Х. Я спрашиваю: А вы можете обещать, что нам не придётся подключать ДВА таких устройства?
И уже бывало, что даже если начальник обещает, то через пару лет оказывается, что это всё-таки нужно.
В этом смысле есть некоторое философское противоречие в архитектуре ПО. С одной стороны, система должна быть расширяемой. С другой стороны -- сделать абсолютно универсальную систему невозможно. Есть аппаратные и программные ограничения.
Поэтому при реализации новых фич я обычно не делаю полную поддержку расширяемости. Но я: 1. Думаю о том, где расширяемость может понадобиться. 2. Думаю о том, легко ли будет её сделать. 3. Если есть возможность сделать быстрый и дешёвый задел под расширение -- я его делаю.
Несмотря на это, у меня всё равно бывают места, которые захардкожены. Увы.
После этого курса вы перестанете верить: -- в бога -- в магию -- в любовь -- в свободу воли
Курс состоит из двух частей. В первой части рассматриваются куски биологии -- генетика, гормоны, строение мозга. Во второй части уже рассматривается поведение на примере агрессии, сексуального поведения, психических заболеваний и кое-чего ещё. Всё это сравнивается с поведением животных. В середине второй части зачем-то включены две лекции по теории хаоса и эмерджентности.
Что мне понравилось, так это обилие примеров. Каждый раз, когда он говорит "было проведено исследование" или "есть такая болезнь", то думаешь -- ого, сейчас расскажет что-нибудь интересненькое.
А что мне не понравилось... ну, когда тебе рассказывают о том, о чём у тебя только базовые представления, то слушаешь всё это с открытым ртом. Но когда в разделе про хаос он стал говорить про что-то, о чём у меня есть собственная информация, то я стал сомневаться, а всё ли он говорит правильно? И если он где-то неправ в этом разделе, то очень может быть, что он не прав и в остальных?
Он сам предупреждал в первых лекциях, что результаты исследований надо изучать очень внимательно. Сделанные выводы могут быть слабее, чем кажутся, либо вообще противоречить исходным данным. По первой части курса у меня вопросов практически нет, поскольку всё, что он говорит -- гуглится. А вот вторую, гораздо более интересную, так просто не проверить.
Отдельного внимания заслуживает лекция "биология религиозности", которую Сапольски в последние годы не записывал на видео "по некоторой причине", однако сохранилась видеозапись, сделанная лет за десять до основного курса, который доступен на ютьюбе. Её и опубликовали переводчики.
В первую очередь курс хорош для поднятия общей эрудированности, чтобы заниматься интеллектуальным мачизмом. Всем теперь рассказывают про пирамидную и экстрапирамидную системы. Ну а чтобы всё уложить в голове... думаю, надо переслушать курс ещё раз.
Когда я был в командировке в Ростове-на-Дону, я как-то раз ехал на электричке вдоль реки. А река там большая -- Дон. По ней ходят корабли. У некоторых смешные названия типа "Механик Петухов". И вот я еду на электричке мимо одного такого корабля. На нём несколько огромных вертикальных цистерн. На каждой по надписи, но я пока вижу только одну:
НЕ
Я думаю: ого, гелий перевозят! И тут вижу следующую цистерну:
ОП
Я думаю, наверное это опечатка. Должно было быть НЕОН. Неон, значит, перевозят. Тоже неплохо. Но всё-таки не может быть, чтобы так опечатались.
Потом я вижу остальные цистерны. И вот что получается:
Чувак с работы, которого я теперь буду называть тут Владимир, захотел себе собрать домой десктоп. Спрашивает, чё как. Как компоненты выбирать?
Ну подобрал я ему кое-какой комплект. Он смотрел-смотрел, в итоге на следующий день мне сказал, что выбрал другое.
Я вздохнул с облегчением -- подбирал ему я невнимательно, и особо указал, чтобы он мою сборку проверил у нашего специалиста по подбору компонентов (честно говоря, я не знаю, почему он сразу к нему не обратился). А если Владимир всё поменял, то я типа буду не при чём, если что-то будет не так.
И действительно, кое-что оказалось не так. Владимир всё собрал, комп включил, изображения на мониторе нет. В голову мне закралась невероятная догадка.
ОКАЗАЛОСЬ
что Владимир выбрал процессор без видеоядра (у интела такие процессоры заканчиваются на F). И не купил видеокарту.
Но этот пост не о том, что Владимир -- лох. Я открыл список тех компонентов, что подобрал я и... та-дам! В том списке процессор тоже был без видеоядра. А видеокарту я ему не выбирал, потому что рассчитывал на встроенное видеоядро.
Так что, если бы Владимир меня послушался -- я бы оказался в затруднительном положении.
Разводной ключ -- инструмент очень крутой, но в машине кроме него я держу и набор обычных тоже. В результате, как правило, разводной ключ я применяю, когда нужны два ключа одинакового размера.
Разводной ключ -- это имба, потому что он один заменяет все. Но у него два серьёзных недостатка, из-за которых применять его во многих случаях становится сложно, неудобно или неприятно.
1. Разводные ключи толще обычных, поэтому в некоторые места становится сложно подлезть. 2. Разводные ключи, блин, всё время болтаются! Ты только настроил размер, покрутил -- и уже хуже работает. Начинаешь подстраивать -- а он не лезет.
Уже не первый раз встречаю такую ситуацию, но данный инцидент мне показался достаточно ярким.
У меня неоднозначное отношение к автоматическому обновлению ПО, да и к обновлению ПО вообще. Сейчас же я наблюдаю ситуации, когда ПО меняет поведение НЕ проводя обновления. Вариантов тут может быть несколько: 1. Функционал был уже заложен, а активировался по внешней команде. 2. Обновление происходит без моего ведома. 3. Часть ПО всегда работает на сервере, поэтому модификация серверной части приводит к модификации поведения клиентской.
Все варианты мне не нравятся.
Что я конкретно пронаблюдал. ВотсАпп. Долгое время я страдал от того, что он перестаёт работать на компе, когда у телефона села батарейка. А бывает, что и без причины перестаёт работать, пока не включишь у телефона экран. Это было очень неудобно.
И тут вдруг около недели назад а) все логины на компах у меня вылетели б) после перелогина вотсапп стал работать независимо от телефонов, причём на всех компах сразу, без переключения.
Вообще-то, раньше при обновлении ВотсАппа мне приходилось качать и устанавливать файл. Но сейчас, по-видимому, это не требуется.
***
Ну и вот. Теперь я не в курсе, когда у телефона батарейка садится, потому что ВотсАпп работает всегда. Вот уж не думал, что буду недоволен тем, чего сам давно хотел.
В одном из телефонов у меня очень старая симка, в ней ещё включён пин-код. Но при этом этот телефон почти никогда не выключается. Он довольно долго показывает Low Battery, успеваю его подключить.
И вот он всё-таки вырубился. Включаю -- введите ПИН.
Я его не вводил... сколько? Полгода?
Я почувствовал, как у меня в мозгу разверзлась бездна, и там были разные пин-коды. От банковских карт. От домофонов. От других телефонов.
Каждый год в июне я играю в NetHack. И вот что произошло там со мной вчера.
Зоопарком называют специальную комнату подземелья, каждая клетка которой занята случайным монстром.
И вот зашёл я в зоопарк, расположенный в конце сокобана. Там все спали. И так бы мне и тихо всех зачистить по одному, но я дошёл до угла и обнаружил там монстра по названием shrieker (крикун).
Монстр почти безвреден, не атакует, но может кричать. Скорость у него 1/12, т.е. в среднем он может кричать один раз в 12 ходов. И вот зачем-то я решил его убить, хотя были и более важные цели. Думал я, что убью его за один ход. В крайнем случае, за два. Он не успеет закричать. Это была ошибка. Полагаться на такие шансы не следует, когда есть возможность этого избежать.
Даже после второго удара он не умер -- зато закричал. И он разбудил ВСЕХ. Этих всех было штук тридцать. Я был в неправильной позиции, меня окружили. Телепортация и другие предметы для аварийной эвакуации в сокобане не работают. Что делать?
После кучи рассуждений решил написать на полу Elbereth, чтобы мобы от меня отошли (они боятся этой надписи), и я смог выйти из зоопарка. Но с первой попытки написать не получилось, а потом меня ослепил ворон! А если ты слеп, то шансы написать Элберет ниже, чем если ты зрячий.
Тогда я вспомнил, что у меня есть освящённая волшебная лампа, а из неё можно вытрясти желание. Я собирался пожелать особый артефакт (The Eye of The Aethiopica), при помощи которого я смог бы сбежать даже оттуда. Идея была плохая, поскольку каждая попытка потереть лампу имеет всего 1/3 шанс того, что появится джинн. Придётся тереть несколько раз. А кроме того, даже когда джинн появится, шанс на получение желания 80%. Мне пришлось тереть раз пять, прежде чем я вытряс джинна. Броня (AC) у меня была -12, поэтому попадали по мне редко, и в принципе я держался.
Лучше бы это время я потратил на банальное убийство мобов. Джинна из лампы я вытряс, но он не дал желания, а вместо этого стал ручным! Это бы помогло мне убить монстров, если бы он был посильнее.
После этого я понял, что мне остаётся только пробиваться грубой силой. Сначала я стукнул по ворону, который меня ослепил, и обнаружил, что я бью лампой, потому что при вытрясании джинна лампу берёшь в руку. Я потерял ход. Тогда я убрал лампу из рук -- и потерял ещё один ход. Потом я всё таки стукнул по ворону нормально руками (я играю за монаха, и я уже гранд мастер рукопашного боя), и он умер с одного удара. Слава яйцам, с этого и надо было начинать! Потом я стал убивать кого-то ещё, но вдруг обнаружил, что клетка, расположенная перед выходом из комнаты, освободилась. Я на неё встал, и через пару ходов смог выйти.
После этого я зачищал всех уже по одному, в дверях. Это прошло нормально. А призом за зачистку зоопарка оказалась волшебная сумка (bag of holding), которая у меня и так уже была. Эх...
Выводы:
0. Зоопарк сокобана -- опасное место 1. Не бить шрикера когда все спят. Я никогда не воспринимал всерьёз этого монстра, потому что почти в любых других обстоятельствах он безвреден. 2. Надо было в первую очередь бить ворона. Тогда бы я смог написать Элберет. 3. Оказалось что улучшенное зелье лечения (extra healing) лечит слепоту, поэтому после убийства ворона надо было пить экстра хилинг. А я выпил до его убийства, поэтому следующим ходом он снова меня ослепил! 4. Большие залы с мобами (таких в нетхаке есть достаточно) в случае, если все спят, надо зачищать не рядами, а полуокружностями, сначала близко к двери, потом всё дальше и дальше, чтобы всегда был путь отхода. Потому что проснуться все могут и по другим причинам, в том числе и от игрока не зависящим.
Появились два кока-кола-заменителя, "кола -- черноголовка" и cool cola (очаковский комбинат).
На работе кто-то купил черноголовскую, а я купил cool, а потом ещё купил обычную кока-колу и пепси-колу, и все их сравнил. Состав на упаковках почти одинаковый, а вот вкусовые различия имеются.
1. "Кола -- черноголовка" -- это вообще не кола. Это немного модифицированный "Байкал". Лучше уж Байкал купить. 2. Кул-кола похожа по вкусу на то, что надо, но из оставшихся троих имеет самый слабый вкус. Немного кислее. 3. Пепси-кола самая газированная, и самая сладкая. 4. Кока-кола самая горькая.
Пару раз встречал тезисы в духе "кока-кола это замечательно, а пепси-кола это говно" и наоборот. Кто-нибудь знает, откуда это пошло?
Надо было обратиться в техподдержку одной железки. Несколько лет назад я с ней общался через чат на сайте. Захожу -- там всё по-другому, и чата нет.
Придётся звонить. Звоню, рассказываю, что к чему, а потом говорю -- что же вы на сайте чат отключили?
А мне говорят -- не отключали, на месте чат.
И тогда до меня дошло. У меня же в браузере по разным причинам работают скрипты только из белого списка. Я запустил другой браузер, где все скрипты наоборот, разрешены, и там чат действительно появился. Там-то я с ними и пообщался. В общем, ССЗБ.
Я уже не первый раз убеждаюсь, что киберпанк наступил.
Первый раз звонил Сбербанк, сказал следующее:
-- Здравствуйте, вам звонят из Сбербанка, Иван (пауза, далее с повышением интонации) Иванович... это вы? -- Говорите. -- Хотим вам предложить...
Потом до меня дошло, что это робот. Прошла пара дней. Опять. -- Здравствуйте, вам звонят из Сбербанка, Иван (пауза, далее с повышением интонации) Иванович... это вы? -- А вы робот или человек? -- С технической точки зрения я робот, но сделан с душой.
:-О
Реализовать такое несложно, но всё равно было неожиданно.