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

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

3493

Напильником по кофейным зёрнам

Я три года пишу на .NET и всем несказанно доволен. Опыт и знание технологии позволяют развивать околокосмическую скорость разработки. Но не всё так сладко: нелёгкая заставила вплотную столкнуться с Java. В такие моменты начинаешь переосмыслять философию мира: самые привычные вещи переворачиваются с ног на голову, ибо «кофейный» подход воспринимается с колокольни .NET как безграничный набор костылей. Давно уже ходят холиворы вида «Java vs .NET», но общественность не пришла к окончательному решению. Вероятно, мое нехитрое субъективное сравнение поможет склониться некоторым адептам тех или иных технологий к определенному решению.

.NET: «Нам нужен робот. Отлично. Голова, туловище, конечности — руки и ноги по две штуки, зеркально отражённые. Собираем».

Java: «Нам нужно нечто такое, чтобы работало. Типа робота. Так. У нас есть голова, но там надо покопаться в конфигах, допилить правое ухо и нос. Есть опенсорсная прошивка, но она не позволяет анализировать изображение с глаз. Ладно, разбёремся.

Туловище. В общем, есть несколько реализаций туловища: одно без коннекторов для рук, другое без коннекторов для ног. Третье вообще без коннекторов. Ладно, возьмём третье и допилим коннекторы от рук и ног из второго.

Руки и ноги. Есть левая рука и левая нога. Чтобы их развернуть, нужно скачать исходники, посмотреть, как писалась левая рука и аналогично написать правую, только наоборот. С ногой аналогично. Но аппаратная реализация коннекторов из туловища позволяет подключать большой палец от правой ноги только к пятке. Надо сделать дырку в нужном месте и прикрутить туда палец. А на пятке... ладно, пусть будет. Скажем в документации, что так получилось».

3492

Гражданская война

Задолбали программисты! Вечное противостояние IT-отдела и бухгалтерии — сущие пустяки и мелкие недоразумения по сравнению с тем, что происходит между программистами и электронщиками. Безрукий эмбрион, раздутая самомнением инфузория, научившаяся отправлять два байта в COM-порт без exception error, гордо пишет в своём резюме: «Программы, которые работают с оборудованием (модемы, принтеры, микроконтроллеры и т. п.) на низком уровне, через порты COM/LPT». Их извилины, принявшие форму четырёхцветного флага, порождают такой бред, что индусы заливаются слезами от зависти и, полностью осознавая глубину собственной ничтожности, идут пасти священных коров. Билл, дружище, если можешь, закрой API для таких форм жизни! Криворукость гоблинов, помноженная на индусский код, даёт удивительный эффект.

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

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

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

3484

Это начало конца

Техническое задание от аналитика:

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

Как прикажете такое реализовывать?

3476

Пошатнувшиеся столпы мироздания

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

#define NBBY 8 /* number of bits in a byte */

3468

Вы выезжаете из американского сектора

Как-то в бытность свою молодым самоучкой-программистом изучал я строение разделов диска и файловой системы, для чего понадобилось сдампить с винчестера первые секторы. Для этих целей я быстренько наваял программку на Си со вставкой на ассемблере с обращением к биосовскому прерыванию int 13h и вызовом соответствующей функции чтения сектора. Программа готова, работа пошла. И тут до меня медленно доходит, что вместо номера функции чтения я вроде бы вставил номер функции записи. Быстро останавливаю программу, гляжу в исходник. Так и есть: загрузочный сектор, таблица разделов и первые мегабайты винта тупо затёрты рандомными данными. Винда пока работает, но уже ясно, что повторно загрузиться не сможет.

В дверях появился заядлый друг с острым желанием поиграть в Half-Life, свежий шедевр игростроя. Мне надо было убегать, и я предупредил друга: «Играй, но комп не перезагружай ни под каким видом!» Я не успел сохранить самые нужные данные: документы и исходники (в ту пору всё, скачанное из инета, бережно хранилось на винте).

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

3399

Процесс важнее результата

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

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

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

С утра бот продолжал летать. Остановили процесс, кликнули на ангар посмотреть, сколько насобиралось добра. Разочарование: при активности только на карте звёздного неба коннект с игрой терялся. Получалось, что кораблик летал на карте из кеша, и никаких данных на сервер не передавалось.

Была написана версия цикла 3.0. Добавлены клики на переключение окон Мозиллы, клик на меню ангара, клик на главную, переключение на вкладку с картой, продолжение сбора коробок. Все ошибки, зависящие от игры, были учтены.

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

3386

Псевдодедуктор

Летняя сессия. Внезапно в полный рост встала необходимость сдавать курсовую работу. Вообще-то на неё отводилось два месяца, но всё это время ваш покорный слуга проводил, как истинный студент, а именно пинал балду. Пояснительная записка с никому не нужной теоретической ерундой у меня была (на неё я время когда-то выделил), а вот программы не было совсем. До сдачи пять дней. Тема работы, к слову, была достаточно серьёзная: анализ данных с помощью искусственных нейронных сетей. Предполагалось, что тему эту я изучу сам (своего рода исследовательская работа в рамках курсовой). На тот момент я имел представление только о том, как работа этой самой сети выглядит со стороны — ознакомился на примере пакета Deductor.

Ну что же. За три дня ускоренно изучается загрузка данных из таблиц Экселя с помощью ADO (исходные данные для анализа, пожалованные мне преподавателем, хранились в .xls), пишется оболочка с нехитрым, но солидным интерфейсом, примерно повторяющим виденное в Дедукторе, и прикручивается пара фич для большей напыщенности. В следующие два дня с сайта BaseGroup скачивается прекрасная open-source-библиотека с компонентами, реализующими нейросети в Delphi, быстро вкуривается, прикручивается к проге...

И тут встает вопрос: а каким образом оцифровываются данные перед обработкой? Тем более, что они у меня и числовые, и строковые, и «дата-время». Помедитировав, изобрёл метод: для каждого поля считались все уникальные значения, запоминались порядковые номера этих значений и подавались на вход нейросети. То есть обучающий пример выглядел как-то так: «Если в поле_1 значение №1/5 и в поле_2 значение №2/19, то в поле_3 значение № 3/7». Очень неплохая «оцифровка» вышла! Жутко довольный собой, запускаю это дело на тестовый прогон. Что и требовалось доказать: средняя ошибка расчетов более пяти тысяч, что совсем уж некошерно. Кроме того, на выходе сеть выдаёт значения вида 9,999999 и только на седьмом знаке после запятой начинает варьировать цифры. А я-то думал, она мне сейчас такие же порядковые номера выдаст, как я ей позагружал. Наивный... Понимая, что изучить верный метод оцифровки данных за последнюю ночь я не успею, в дело пускаю что? Конечно, Великий Рандом. Конечно, спрятанный табуляцией куда подальше за экран.

В итоге программа моя честно открывала базу данных, долго и солидно загружала данные, давала настроить параметры нейросети и столь же честно, долго и старательно обучалась на той лабуде, что я ей скармливал своей гениальной «оцифровкой». Когда же доходило до проверки результатов обучения, программа принимала предложенные ей номера значений из входных полей, выполняла честный расчёт результирующего значения, которое потом успешно забывалось, а в выходные поля подставлялись значения, банально выдернутые рандомом из исходной базы. Чтобы не палиться, что на одних и тех же значениях прога выдаёт каждый раз разные результаты, кнопка «Рассчитать» отключалась после каждого клика, а включалась обратно только после смены входных значений.

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

3378

Пробежимся по-быстренькому

Если девушка вам говорит: «Милый, @#$, иди спать уже!», то её нужно слушаться.

Второй час ночи. PHP-код. Цикл, в котором должны выводиться из базы категории товаров. «Должны», потому что на самом деле выводится только последний элемент. Грешил на базу — двадцать минут проверял данные. Поубирал кучу условий выборки, оставив банальное WHERE 1. Потом просто закомментил всё внутри цикла и поставил вывод счётчика. Не помогает! Сношу всё, переписываю с нуля — работает. Возвращаю код назад и вижу такой ужас:

for ($i=0; $i<20; $i++);

Проверяйте наличие пустого оператора после цикла — сэкономит кучу времени!

3352

Два из трёх

Написал форму с иерархическим деревом. Процедура, формирующая дерево, называется BuildTree. Кроме того, есть функция AddChild. Думаю, куда бы присобачить функцию GrowHouse, чтобы состояться как мужчина.

3326

Подставка не под кофе

Был как-то у меня такой предмет в универе — «Архитектура ЭОМ». Смысл заключался в изучении ассемблера. Весь семестр я (как, впрочем, почти все) ничего не делал. Подошла зачётная неделя, и надо было сдать хотя бы пару лаб. Решил я обзавестись компилятором (вернее, интерпретатором) ассемблера и полез поискать в сеть. Быстро нашел нужное ПО, скачал и приступил, так сказать, к работе.

Так как ассемблер на протяжении семестра изучался мною не очень усердно, решил я почитать примеры. Пролистнув пару заумных программ по сто-пятьсот строчек каждая, остановился на одной короткой. Чтобы узнать, что данный код делает, запустил прилагающийся экзешник. На экране появилось окно с кнопками «Да» и «Нет». Машинально жму «Да», инстинктивно полагая, что другой вариант завершит прогу. Окошко закрылось, и через секунду из системника вылез привод. Смысл проги я понял, однако стало интересно, что же за текст был в сообщении — ничего вроде «CD-ROM» я там не заметил. Повторно запускаю программу, на этот раз не спеша щёлкать по кнопкам.

«Нужно дополнительное место для пива?» — вопрошала по-английски программа. Да, прислушиваются программисты к потребностям простых людей!