vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2023-04-26 10:09 pm

Календарь Снупи за 1969 год

Кто читал статью "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

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org