2023-04-26

vak: (Default)
Кто читал статью "Real Programmers Don't Use PASCAL" (есть в русском и украинском переводе), заметил, наверное:
  • Taped to the wall is a line-printer Snoopy calendar for the year 1969.
Думаете, литературная гипербола? Почему у каждого программиста на стене висит один и тот же календарь за 69-й год? Как выясняется, этому есть объяснение.

Фортрановские исходники календаря Снупи сохранились. Мало того, они прекрасно компилируются современными фортранами, скажем, GNU Fortran. Единственное - результат надо немного обработать, чтобы получилась печать с наложением (overprint). Скачиваем, компилируем, запускаем:
wget https://cyber.dabamos.de/programming/fortran/snoopy/snpcal.for
wget https://cyber.dabamos.de/programming/fortran/snoopy/snppic.for
wget https://cyber.dabamos.de/programming/fortran/snoopy/SNPCAL.DAT
gfortran -c snppic.for
gfortran -o snpcal snpcal.for snppic.o
./snpcal
Программа считывает файл данных SNPCAL.DAT и записывает результат в SNPCAL.TXT. Смотрим содержимое посредством "less -S" и видим, что в файле оказывается календарь Снупи всё за тот же 1969 год!

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

Попробуем подменить номер года на 2023. В строке 99 видим:
    01  1969    01  1970     1
Заменяем на:
    01  2023    01  2024     1
Снова вызываем snpcal, и можем убедиться, что теперь в SNPCAL.TXT мы получили корректный календарь на 2023 год.

Напечатать календарь будет легче, если сначала преобразовать его в PDF, с учётом наложения строк. Для этого потребуется установить пару дополнительных пакетов:
sudo apt install enscript ghostscript
Теперь преобразуем файл SNPCAL.TXT в PDF. Отдельная подсказка для маководов: тут нужен GNU sed (brew install gnu-sed).
cat SNPCAL.TXT | \
sed 's/^1/\f /' | \
sed -z 's/\n+/\r /g' | \
enscript -Bh -f Courier7 --margins=12:0:144:0 -o - | \
ps2pdf - snpcal.pdf
Готовый календарь Снупи за 2023 год можно скачать здесь: snpcal-2023.pdf