Тег ‘программирование’

Game Engine Black Books

С удовольствием прочитал две книжки с подробными описаниями процесса разработки и технических решений Wolfenstein 3D и Doom:

http://fabiensanglard.net/gebb/index.html

Сочетание PC-шного и не очень (в частности, довольно подробно описывается NeXT, на котором разрабатывался Doom) “железа”, разнообразных хитрых приемов для рендеринга графики, оригинальных алгоритмических решений и просто программистских трюков – это очень круто, рекомендую. Для полного удовольствия от книжек крайне желательно знать Си и иметь представление о том, что рассказывается в стандартном курсе по “алгоритмам” – иначе такие штуки, как BSP, просто пройдут мимо.

Еще немного про Java, обучение программированию и все такое

Продолжу недавнюю запись про определение палиндромов на Java. Для начала, поступило довольно обоснованное замечание, что “в старой Java” класс String был устроен так, что методы типа trim и substring не копировали буфер строки, а работали с тем же (благо в Java строки “иммутабельны”) – поэтому квадратичной сложности тут не будет и в целом есть даже шансы, что все это дооптимизируется до почти правильного решения.

Что могу возразить? Во-первых, курс называется не “недокументированные возможности старой джавы”, а “общая информатика”, и читается отнюдь не в ПТУ для быдлокодеров. Я не берусь сказать, как именно будет реализован строковый тип в том языке программирования, который станет основным для выпускников через пять лет – да и вообще, будет ли это Java или что-то еще. Во-вторых – во вводном курсе программирования более ценно не умение обращаться с готовыми методами из класса String, а умение работать с массивами, например. Задачки наподобие “определите, является ли строка палиндромом (без учета пробелов)” – это абсолютная классика задач на работу с одномерным массивом.

И вот тут мы переходим к следующей части – а в чем так сказать, педагогическая ценность этого задания? Выполнить несколько почти тривиальных шагов, засунув их внутрь цикла? Неплохо для обучения Java junior по современным понятиям, но… Более традиционные (и результативные!) подходы предполагают обучение программированию “сержантским методом” (в терминологии [info]ailev) – много-много мелких, но содержательных задач, часть из которых объясняется преподавателем, а часть – остается для самостоятельного решения. Палиндромы, strrev, все что угодно – самостоятельной ценности у этих задач может в общем случае и не быть (хотя надо быть всегда готовым написать собственный left-pad), но их должно быть много, и они должны иметь разную сложность.

В том курсе, о котором я пишу, “сержантским методом” и не пахнет – задач предлагается смехотворно мало, а часть из них – в духе немецкого программистского образования – больше похожи на тесты для умственно отсталых, вот в духе “есть листочек, на листочке нарисованы паровоз, пароход, печка и самолет, что лишнее?” От того, что задача сформулирована в виде “изобразите UML-диаграмму для классов SteamLocomotive, SteamBoat, Furnace, LocalhostFurnace, Plane, BF109, BF109G”, она не становится более интеллектуальной, а от написания 10-20 строчек кода в неделю Fundamental programming skills, обещанные в описании курса, не появляются.

Несколько лет назад ни один околопрограммистский срач не обходился без ссылки на Джоэля Спольски – не буду изменять хорошей традиции и даже приведу целый абзац из Perils of Java Schools:

OOP in school consists mostly of memorizing a bunch of vocabulary terms like “encapsulation” and “inheritance” and taking multiple-choice quizzicles on the difference between polymorphism and overloading. Not much harder than memorizing famous dates and names in a history class, OOP poses inadequate mental challenges to scare away first-year students. When you struggle with an OOP problem, your program still works, it’s just sort of hard to maintain. Allegedly. But when you struggle with pointers, your program produces the line Segmentation Fault and you have no idea what’s going on, until you stop and take a deep breath and really try to force your mind to work at two different levels of abstraction simultaneously.

Уж очень мне нравится тут фразочка про inadequate mental challenges – и хочу обратить внимание, что какое-то обучение возможно только тогда, когда решаемые задачи достаточно сложны (а в некоторых вариациях “сержантского метода” – когда в каждом задании есть настолько сложные задачи, что никто не может их решить). Здесь же в своем “упрощенчестве” докатились до предела – задачи настолько тупы, что их решение просто не дает никаких полезных знаний.

PS Между прочим, некоторое количество вполне себе содержательных задач по программированию вместе с азами ООП содержатся в простом задании – “напишите свою реализацию класса java.lang.String”, или некоторого его подмножества. Для развлечения – можно предложить написать две реализации – одну в стиле “старой Java”, без копирования строкового буфера в методах типа substring, а вторую – с копированием, и сравнить производительность.

Вечер фейспалмов продолжается

А вот мне рассказали, чему учат юных джавистов в TU D-stadt. Задание простое – проверить, является ли текстовая строка палиндромом (без учета пробелов) – скажем, таковыми будут “шалаш” или “оголи жопу пожилого” (привет Пенсионному фонду). Ну как это делает нормальный человек? Заводим указатели на начало и конец строки, двигаем их навстречу друг другу, пропуская пробелы, и сравниваем буквы.

palindrom

Так вот, сейчас студентов учат немного другому. Надо сначала выполнить метод trim(), отрезав от строки пробелы в начале и в конце, потом сравнить первую букву с последней, затем выполнить метод substring() и повторить это с обрезанной строкой. Прикольно, да? Не знаю, как у вас, а я не могу обойтись без слов “пиздец”, “охуеть” и “ебланы”, когда рассказываю об этом.

Очередной привет Texas Instruments

Интересно, почему мне примерно каждые две недели хочется безудержно материть софтовую поддержку Texas Instruments? Вот и в этот раз нарвался на известный уже многим баг (точнее, адов набор багов) в порте lwIP на микроконтроллеры серии Tiva:

https://e2e.ti.com/support/microcontrollers/other/f/908/t/370852

Смотреть на файл и делать многочисленные фейспалмы можно тут:

https://github.com/yuvadm/tiva-c/blob/master/third_party/lwip-1.4.1/ports/tiva-tm4c129/sys_arch.c

Честное слово, иногда кажется, что выложенные каким-то чуваком самописные примеры работы с lwIP на, прости Господи, 1986ВЕ3Т тестировались куда тщательнее творчества техасовских индусов.

Да, для решения большинства проблем с sys_arch.c из комплекта TivaWare при работе с FreeRTOS достаточно просто подменить этот файл на более нормальный, аппаратно-зависимого там ничего нет, так что берите из любого другого порта lwIP под FreeRTOS.

Смешного вот напишу

На прошлой неделе три дня промучился с отладкой вроде бы простейшей прошивки для очередного девайса. Если просто – приборчик должен был делать что-то несложное по прерыванию на одном из входов CC2541 и одновременно работать Bluetooth-beacon’ом – казалось бы, что может быть проще? Но я допустил совершенно идиотскую ошибку – перепутал номер порта в обработчике прерывания, написав вместо

HAL_ISR_FUNCTION( drdyHandler, P0INT_VECTOR )

вот такую штуку:

HAL_ISR_FUNCTION( drdyHandler, P1INT_VECTOR )

Что забавно – обработчик прерывания работал (и поэтому был вне подозрений), а вот Bluetooth порой валился с совершенно невнятными ошибками. Все дело в том, что векторы прерываний портов идут подряд, просто “по умолчанию” на месте вектора прерывания оказывается вполне себе допустимая инструкция

MOV R7,A

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

О – Оптимизм

osal_isr_register

Комментарию про “when functionality is complete” – уже семь лет. Впрочем, не первый раз замечаю за Texas Instruments такой подход – выкинуть “в окружающую среду” какие-то элементарные примеры работы с их микроконтроллерами, а на развитие и поддержку этого всего забить.

Как просрать 30 килобаксов на Firebase

Замечательную историю про программистов-недоучек нашел:

https://medium.com/@PurpleGreenLemon/how-not-to-get-a-30k-bill-from-firebase-37a6cb3abaca

Ребята знают модные слова Angular и Firebase, но не привыкли задумываться об алгоритмической сложности – пока не столкнулись с задачей, где буковки O(n2) превращаются во вполне реальные доллары.

Наконец-то объяснили разницу!

admin-vs-devops

Чтобы не пропало

Вот я тут в комментах у [info]mbr в очередной раз обосрал школьную информатику – но чтобы не пропало, вынесу сюда списочек “что должен знать интересующийся предметом старшеклассник”.

За “обязательный минимум” можно принять, скажем, COS 109 – курс Брайана Кернигана по “компьютерной грамотности” для студентов “нетехнических” специальностей в университете Принстона. Специально даю ссылку не на книгу (Understanding the Digital World), а на страничку курса – там есть довольно полезные “лабораторные работы” и наборы задач. В эти “лабораторные работы” входит, скажем, простой HTML, рисование фотожаб, работа с электронными таблицами, представление о программировании.

В этот минимум хорошо бы добавить еще умение пользоваться текстовым редактором и текстовым процессором (и понимание разницы между ними), какими-нибудь “мультимедийными” программами типа аудио- или видеоредакторов, 3D-редакторами, “переустановить винду” и вообще пользовательскую грамотность (не только применительно к ПК, но и для “мобильных устройств” с iOS или Android – как “перекинуть фоточки” и все такое).

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

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

- знакомство с двумя-тремя (а может, и побольше) достаточно разными языками программирования; к примеру, я в старших классах, помимо стандартного школьного Паскаля, “пощупал” пару вариантов QBasic, Visual Basic, Delphi, C (и даже написал пару-тройку сравнительно больших программ под Windows), PHP (по статьям в журнале Ксакеп), пару “игрушечных” языков (из этой книжки) (RL – диалект Лиспа и “игру в схемы” – своеобразный HDL);
- к предыдущему пункту – знакомство, пусть даже поверхностное, на уровне “а это тоже можно программировать”, с парой разных “платформ” – скажем, можно пощупать “десктопные” приложения, браузерный Javascript, CGI-приложения, приложения для мобильников, прошивки микроконтроллеров;
- представление о различных алгоритмах и структурах данных – то есть все эти стандартные “сортировки пузырьком”, “красно-белые деревья” и все такое (к этому же пункту отнесу и “теоретическую информатику”, но возможно – в сильно урезанном даже по сравнению со школьной программой виде);
- представление о том, что такое реляционные базы данных, ER-модель, умение написать простой SQL-запрос;
- понимать, как работает современный веб – где выполняется Javascript, что такое веб-сервер, как работают CGI-приложения, как это все связано вместе;
- к предыдущему пункту – какие-то основы сетей – знать, что такое TCP, IP и еще куча буковок, уметь настроить WiFi-роутер и с помощью Wireshark подрезать чужой пароль;
- элементарные навыки работы/администрирования Unix-образных систем (”переустановить винду” относим к компьютерной грамотности) – поставить две ОС на одну машину, знать основные команды в терминале, уметь настроить веб-сервер, поставить Wordpress, вот это вот все;
- “практика с железом” – раньше я написал бы сюда “умение сделать нуль-модемный кабель для игры в Doom”, сейчас даже не знаю, что можно считать аналогичным – но что-то все равно надо;
- “как это все сломать” – условно говоря, основы хакинга – от SQL injection и cross-site scripting до использования ошибок типа переполнения буфера;
- знать полное собрание сочинений Дани Шеповалова.

Вот как-то так :)

Чуваки, я охуел

Вот на хабре статейка, в которой чувак описывает найденную им “пасхалку” в Android и последующее заваленное собеседование в Google:

https://habr.com/ru/post/442872/

Если коротко: при регистрации учетной записи Google на телефоне с Android скачивается небольшой apk-файл, который затем выполняется на устройстве пользователя. При этом гуглу передается довольно много информации, позволяющей этого самого пользователя идентифицировать и (здесь включается профессиональная паранойя) подсунуть ему “особый” исполняемый файл. Можно поступить и хитрее – в этом apk содержится интерпретатор некоего байт-кода, который, опять же, может делать довольно многое.

И вы действительно считаете, что все это придумано исключительно для “борьбы с ботами”?

А вот посоветуйте книжек

Насоветовал тут в фейсбуке кучку книжек по программированию микроконтроллеров:

https://www.facebook.com/tikhonovruslan/posts/2193043937400492

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

  • Что такое микроконтроллер? (опционально – что такое ARM, Cortex, STM32 и так далее)
  • Устанавливаем среду разработки (без нее вот просто никуда, даже светодиодом не поморгать без Keil)
  • Пишем простейшую программу (тут половина читателей отваливается, потому что даже “простейшая” программа требует шаманства в виде настройки тактирования, и идет делать сайты на PHP)
  • Работаем с GPIO
  • Работаем с таймерами
  • Работаем со всякой остальной периферией
  • Тема для продвинутых – что такое DMA и как с ним жить
  • Тема для очень продвинутых – как в CubeMX накликать в проект FreeRTOS

На этом “стандартный” курс заканчивается – но дальше-то что? Рано или поздно в любом проекте на микроконтроллере “вырастает” несложная RTOS (или присутствует там с самого начала). При этом в литературе “для начинающих” это почему-то считается сложной темой, а книг “для продолжающих” почему-то нет. Вот где почитать, например, о том, как написать драйвер периферии или внешнего устройства? Как и когда использовать DMA? Да вот даже какие-то вопросы с потреблением памяти – покажите мне книжку, где было бы достаточно подробно расписано, что происходит со стеком в многозадачной системе во время обработки прерывания?

В общем, что есть хорошего на эту тему “для продолжающих”, с описанием принятых “лучших практик”?

Отупляющие лучи с американских спутников

Посмотрел тут на несколько дискуссий с участием хаброюзера Jef239. Чувак работает в питерской фирме “Фарватер”, занимается там высокоточной навигацией с использованием ГНСС, а параллельно с работой – безвылазно сидит на хабре и строчит длиннющие простыни комментов, в которых либо делится своими взглядами на жизнь, воспитание детей и так далее, либо рассказывает, насколько сложна высокоточная навигация.

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

IT-держава, блядь

Запомните – первый шаг на пути к превращению в хохлостан – это употребление слов “IT-держава” с нескрываемой гордостью (когда гордиться больше как-то нечем):

https://ria.ru/20190217/1550981508.html

Но есть и здравомыслящие СМИ, понимающие место вклавиатурупальцемтыкальщиков в жизни и экономике:

http://ulgrad.ru/?p=177783

Дево-псам слова не давали

А дево-псам слова не давали. К ноге, сука. А еще тяфкнешь – забаню.

Здесь программисты общаются а не нетраханные кроссгендерные собаки.

Отсюда: https://vitus-wagner.dreamwidth.org/2061060.html?thread=51686148#cmt51686148

Проникся еще большим уважением к [info]vitus_wagner, большому мастеру слова.

Про malloc() и фрагментацию памяти

А вот чуваки придумали, как можно сильную фрагментацию памяти использовать для собственной выгоды – и сократили ее потребление Firefox’ом на 16%, заменив обычный системный malloc() на собственную реализацию:

https://arxiv.org/abs/1902.04738

Development and Deployment of Multiplayer Online Games

Посмотрел “бета-версию” будущей книжки Development and Deployment of Multiplayer Online Games: from social games to MMOFPS, with stock exchanges in between.

dnd-of-mog

Разумеется, она не столько про мультиплеерные игры, сколько про распределенные системы “вообще” – к таковым можно отнести, например, всякие там биржевые системы (автор, Сергей Игнатченко, упоминается тут, как один из разработчиков торговой системы РТС). Рассматривается буквально все – от нюансов программирования на C++ (вплоть до всевозможных заблуждений) до архитектуры “в целом“. Очень понравились главы про сетевое взаимодействие, выбор между TCP и UDP, некоторые неочевидные нюансы этих протоколов.

Сейчас вышел на бумаге первый том (из планируемых 9), почти готов второй, третий – в состоянии бета-версии (все три есть на Leanpub).

Боятся знать

Вот в твиттере @FelixTheBest – замечательный тред про программистов на C/C++ в сравнении с программистами на Java и Python, и в нем есть занятная формулировка:

люди, которые не знают C/C++ и даже боятся знать

Похоже, слова “боится знать” наилучшим образом описывают одного знакомого мне чувака, который прекрасно пишет что-то на Qt и современном C++ (это что-то в стиле, описанном в видеоролике Stop Teaching C) – но при этом панически боится plain C как “старого и низкоуровневого” языка. Собственно, это даже отвратило его от ардуины – так как там пропагандируется в лучшем случае C with classes. В общем, утащу себе определение.

Адитья Бхаргава, Грокаем алгоритмы

Мельком просмотрел тут одну детскую книжку по “алгоритмам”.

bhargava-algorithms

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

Возможно, это и неплохо для детской книги – даже очень талантливый и старательный семи-восьмиклассник вряд ли будет настолько усидчив, чтобы самостоятельно разрисовать что-то вроде диаграммы стековых вызовов для несложной рекурсивной функции, а здесь она приведена в готовом виде – но есть несколько “сюжетов”, которые при таком подходе очень сильно “повисают в воздухе”. Особенно почему-то досталось O-нотации, которая здесь изложена в виде “как ее понимает средний программист” (а уж подсчет сложности тривиальной сортировки – O(n2) – во второй главе – это просто песня!).

Кратенькое резюме такое – неплохо для семиклассника, читающего под одеялом с фонариком журнал Ксакеп, для взрослого человека скорее бесполезно, в качестве справочника заменяется любым cheatsheet-ом вроде такого:

https://algs4.cs.princeton.edu/cheatsheet/

Вот люди электросчетчик сделали

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

energymon

Разумеется, это “не только счетчик” – раз уж тут стоит микроконтроллер, то его стоит “загрузить” дополнительными задачами, так что здесь есть еще “мост” USB-UART и совместимый с CMSIS-DAP отладчик (а заодно можно использовать устройство в качестве электросчетчика в домике Барби, по масштабу подходит идеально). Это все крутится под управлением довольно нетривиальной прошивки – тут вам и срабатывающий раз в 3 микросекунды АЦП, и выдаваемые с периодичностью в 10-100 миллисекунд данные об энергопотреблении, и обновляемый раз в секунду экранчик – в общем, от написанной в стиле “бесконечный цикл” прошивки DAP42 здесь получается практически настоящая, но очень маленькая RTOS.

Да, не все пока работает идеально гладко (тем более, что основной упор при разработке делался на мониторинг энергопотребления, а мост USB-UART и отладчик – это “бонусы”) – но исходники открыты и выложены на гитхаб, так что при желании в них можно покопаться (чем я и занимаюсь сейчас, пытаясь добиться работы этого всего в полном объеме с некоторыми микроконтроллерами TI):

https://github.com/unwireddevices/dap42

Больше всего мне интересно, конечно, другое – рано или поздно в любом проекте на микроконтроллере “вырастает” несложная RTOS (собственно, с UMDK-ENERGYMON это уже случилось). А вот в какой момент там появится “заново написанная, неспецифицированная, глючная и медленная реализация половины языка Common Lisp”? Впрочем, парсер консольных команд уже есть.

Learn to code

Пишут, что в Штатах “альтернативно правые” издеваются над уволенными из всяких там Баззфидов и прочих Хаффингтон Постов журналистами, предлагая им “научиться программировать”:

https://thinkprogress.org/learn-to-code-decoded-the-campaign-against-laid-off-journalists-is-harassments-new-frontier-20725ddd480a/