Истории с тегом: программизмы

Всего историй: 900

5126

Re: Требую запасной PgDn

Админ сайта, который я поддерживаю, решил сделать рассылку новогодних поздравлений всем пользователям. CMS сайта самописная.

— Слушай, есть ещё одна просьба. У меня есть в админке «Рассылка»: выбираешь группы и рассылаешь всем сообщения. Текст сообщения я добавляю с пропусками строк (для выделения абзацев в теле сообщения), но эти пропуски при доставке писем не сохраняются, и получается полнейшая каша.

Я поглядел код, разобрался, добавил одну строчку:

$Data['message'] = nl2br($Data['message']);

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

Так и есть: в спешке я добавил эту строчку в цикл по пользователям. Желаю, чтобы в 2011 году в жизни каждого человека было меньше пробелов!

5119

Пусть будет

Копался в скриптах игры «DCS: Ка-50 Чёрная Акула», чтобы настроить вывод картинки на два монитора, и напоролся на такой отрывок в скрипте ночного видения:

dcl_2d s0 ;diffuse map

dcl_2d s1 ;noise mask

dcl_2d s2 ;main mask

dcl_2d s3 ;mask (HZ nahua nuzhna)

Так у нас всё и делается.

5083

И ещё немножечко шьёт

Явление первое. Я и клиент.

— Сделаете репорт к веб-шопу в формате CSV?

— Сделаю.

Явление второе. Я и секретарша клиента.

— У меня для вас две новости: хорошая и плохая. Хорошая: ваш репорт работает. Плохая: все заказы изменили статус.

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

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

5073

Экономим нервы и такты

Вот все говорят: женская логика, женская логика... Мол, неописуемое и непонятное явление. А если проявить сообразительность? Да ещё не простую, а нашу, айтишную? Поясню на примере.

Давеча договариваюсь по аське со знакомой о встрече.

— Как сделаем: я тебе позвоню или буду ждать от тебя эсемеску?

— Да, так сделаем.

Казалось бы, вот он, яркий пример этой самой женской логики. Вот какой вариант она имела ввиду? Я спросил — оказалось, тот, в котором я ей позвоню.

Теперь берём учебник по С++. В разделе «Логические операции» читаем:

Логические операции сокращённого вычисления:

— сокращённая конъюнкция (conditional-AND) &&;

— сокращённая дизъюнкция (conditional-OR) ||.

Правый операнд сокращённых операций вычисляется только в том случае, если от него зависит результат операции: если левый операнд конъюнкции имеет значение true или левый операнд дизъюнкции имеет значение false.

Рассуждаем. В описанном выше примере имеем операцию дизъюнкции, которая должна обязательно вернуть true (так как один из предложенных вариантов должен быть выбран). Ответ знакомой — это передаваемое значение операнда. Читаются выражения слева направо — значит, значение присваивается левому операнду. А если левый операнд дизъюнкции равен true, правый уже не рассматривается, что придаёт ответу однозначность.

Логично? Логично. Ничуть не сложнее, чем в компьютере. Так-то! Читайте мануалы, товарищи.

5060

Всё, что движется

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

При тестовом прогоне мира всплыла такая картина. Высокий утёс, на утёсе два тушкана. Встретились, полюбились — и прыг с утёса в разные стороны. Ну, в лепёшку, конечно. Тоже не дело: а вдруг дети малые увидят? Внесли ещё правку, запретив тушканам прыгать с большой высоты.

Очередной тестовый прогон. Летит гриф, на нём сидит тушкан, и они размножаются. Тушкан-то спрыгнуть не может, а, как выяснилось, ему что гриф, что тушканиха — всё едино...

5039

Код-самоед

Ведём разработку на ПЛИС известной компании. С появлением встраиваемых процессоров возможности построения цифровых систем стали практически безграничными. Работа сложная и интересная. Приходится совмещать изменения железа и софта: переконфигурировал процессор или шину памяти — переписывай программу. А уж насколько богатые возможности для глюков, когда не поймёшь, где проблема...

Из последнего: обратили внимание на неполадки с памятью в стандартной конфигурации. Запустили тест памяти — всё зависло. Посмотрели размер адресного пространства: 64 МБ, а на плате физически присутствуют только 32. Тут у нас возникли некоторые подозрения. Оказалось, что в примере от производителя, кроме неверного размера памяти, ещё и банки памяти адресованы вперемешку. Выходит, что тест памяти стирает из неё сам себя, и процессор исполняет какие-то случайные инструкции. Интересно, что будут писать о глюках через десять лет, если подобная технология станет повсеместной?

5037

Извилистые дорожки и стройные ножки

Благополучно отучился на отделении информатики физфака. Был и курс «Введение в системы автоматического проектирования радиоэлектронных устройств» (разводка печатных плат, проще говоря), и с микросхемами элементарной логики мы знакомились как в теории, так и на лабораторных. В дипломной работе я использовал микроконтроллер, то есть был не понаслышке знаком с тем, что можно получить, накодив на C несколько сотен строк. Одногруппник, которому больше нравилось высокоуровневое программирование, взял меня в напарники для разработки светоматрицы — платки 8×12 светодиодов, которая должна была управляться с компьютера. Ни у него, ни у меня не было абсолютно никакого опыта, не считая вышеописанного обучения в университете, поэтому неудивительно, что даже с чисто организаторской стороны было много факапов. Однако я хочу рассказать о моих программно-железячных косяках. Мало ли, вдруг кому пригодится.

Free Serial Port Monitor — хорошая программа. Но показывает она не то, что пришло в буфер COM-порта, а то, что прочитала использующая его программа. Поэтому надо было не покупать новую микросхему MAX232, решив, что предыдущая сгорела, а просто добавить в отладочную программу чтение.

Altium Designer — тоже хорошая программа. Только вот все библиотеки в ней созданы в расчёте на английскую систему мер. Если вы используете десять деталей из стандартной библиотеки и одну свою, подумайте о том, обязательно ли делать её в СИ. На чертеже очень трудно заметить, что четыре проводка к пятивыводному разъёму подцепились, а один остался в полупикселе от положенного места. В итоге на плате не оказалось одной дорожки. Хорошо, что использовалась она только для программирования! Спасла конструкция «проволока, с одной стороны прикрученная к штырьку для программирования, иголка и рука, тыкающая в малюсенькую ножку микросхемы».

От аппаратных глюков никто не застрахован, даже если микросхемы покупались у поставщика, работающего напрямую с производителем. Прежде чем десятый раз просматривать собственный код, который идеален, пишите тестовые программы. В моём случае проблема была в том, что при замыкании одной из ножек на землю микроконтроллер начинал слать в USART мусор (точнее, циклический мусор: каждые три байта всё повторялось, но от этого не легче). Хорошо, были свободные ножки, так что ситуацию спасло припаивание проводка, разрезание дорожки и исправление программы.

Если во всей партии из сорока микроконтроллеров глючат одни и те же четыре ножки, это не значит, что вам подсунули эксклюзивно подобранный брак. Надо просто почитать документацию и выяснить, что, помимо используемого вами интерфейса SPI, есть ещё и JTAG, который работает именно через эти ножки. Его можно отключить, но по умолчанию он включён.

А ещё источник постоянного тока (5 В, 12 А) не любит, когда от него требуют то 0 А, то 2 А (не говоря уж обо всех двенадцати) с частотой всего полкилогерца, да ещё не по синусоиде, а ступеньками. Нет, сам источник не сгорел. Но вот напряжение от таких скачков чувствовало себя нестабильно, а вместе с ним и блютус-модуль, в результате чего связь с компьютером терялась. Эта проблема оказалась самой лёгкой: я впаял перед модулем диод, чтобы заряд обратно не утекал, а падение напряжение на полвольта скомпенсировал уменьшением токоограничительного сопротивления, и всё заработало. Интересно, что микроконтроллерам ATmega16 скачки были нипочём, хотя по документации они должны были отключаться раньше модуля.

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

4980

Археологические раскопки в Древней Индии

Итак, все ругают плохо написанный код. Давайте-ка посмотрим...

Если в коде много goto, возможно, программу перетащили с Фортрана; чем их больше, тем древнее версия.

Если в названиях идентификаторов присутствуют дикие сочетания букв, разбавленные подчёркиванием, возможно, исходно это был Фортран БЭСМ-6, где позволялись русские буквы.

Если все переменные в программе глобальные — скорее всего, программа «познакомилась» с третьей версией микрософтовского Фортрана, где надо было распихать переменные по 64-килобайтным common-блокам.

Если сишный код плохо отформатирован, скорее всего, код был знаком как с Борландом (три пробела на отступ), так и с Микрософтом (одна табуляция).

Если в коде на С++ много указателей на функции, значит, изначально код был сишным.

Если системные вызовы завёрнуты во множество вложенных «обёрток», которые просто перекладывают параметры из пустого в порожнее и ничего не делают, это годовые кольца: их столько, сколько платформ сменил продукт.

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

Если всё сказанное выше замешано в крутой коктейль с кусками вменяемого кода, значит, пытались рефакторить.

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

Если встречается эмуляция RTTI и интерпретируемого кода, в предках кода было что-то типа Клиппера.

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

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

4973

Высшая школа неучей

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

Первые являются непробиваемыми танками. Выдвигают тезис работы без более-менее подробного описания задания. На просьбы уточнить задание повторяют то же самое, но другими словами — это может продолжаться довольно долго. Примерно понимаешь, что ему нужно, объясняешь, как написать заданную прогу, но тут же сталкиваешься со стеной непонимания: «А мы такого не проходили». Ладно, Ктулху с тобой, пишешь код с краткими комментариями для этого балбеса, но тот опять ничего не понимает! Несколько минут исступлённо бьёшься головой об стену, пишешь полные, разжёванные до мельчайших подробностей комментарии. Это чудо сдаёт работу, получает оценку. Всё, я помог человеку!

Вторые воспринимают помощь как должное. Обычно пишут: «Очень срочно!!!» и «HELP» (всё это с кучей смайлов и восклицательных знаков). Вот этим объяснения не нужны: просто не поймут. Пишешь код, они его удачно копипастят и на «отлично» сдают работу. От таких даже «спасибо» не дождёшься.

Как часто бесит это недопонимание и расхлябанность! Ты попросил помощи, и я, рассчитывая на то, что страждущий — подготовленный человек, объясняю проблему... по сто раз. И не стыдно вам, товарищи студенты из крупных городов с хорошо развитой структурой образования, что материал вам втолковывает пятнадцатилетний мальчишка из маленького дальневосточного городка? Вы же будущие программисты! Научитесь отличать FASM от TASM, научитесь более-менее грамотно писать на C++, а то ваши посты «Где ошибка (прога выдаёт неправильный результат)?» смотрятся очень глупо: в них код, который в принципе не смог бы скомпилироваться.

4941

Желаете заложить фамильный замок?

Сидим с девушкой, пишем ей программу по учёбе — карточную игру. Пользователь имеет некоторый начальный бюджет, делает ставку, если угадывает карту — получает выигрыш.

Тестовый прогон. Ставим все деньги и успешно их проигрываем. Программа участливо спрашивает: «Желаете сыграть ещё?» В непонятках нажимаем «Да». Следующее сообщение заставило нас искренне забиться в истерике: «Удачи!»

Я ярко представил, как бы это выглядело в реальном казино. Проигравшему только что все деньги джентльмену крупье вежливо предлагает: «Не желаете ли сыграть ещё?» — и после утвердительного ответа выталкивает мужичка из-за стола со словами: «А вот фиг вам!»

Конечно, ошибка была элементарной: проверку на нулевой баланс разместили не в том месте.