logo
Код и Капуста
Про программирование для всех
logo
0
читателей
Код и Капуста  Про программирование для всех
О проекте Просмотр Уровни подписки Фильтры Статистика Обновления проекта Поделиться Метки
Все проекты
О проекте
Рассказываю про программирование, делюсь интересными ссылками. Разрабатываю плагины для игр и приложений
Публикации, доступные бесплатно
Уровни подписки
Единоразовый платёж

Безвозмездное пожертвование без возможности возврата. Этот взнос не предоставляет доступ к закрытому контенту.

Помочь проекту
Трактористы 300₽ месяц
Доступны сообщения

Серьезные люди обкашливают серьезные делишки

Оформить подписку
JSONо укладчики 500₽ месяц 5 100₽ год
(-15%)
При подписке на год для вас действует 15% скидка. 15% основная скидка и 0% доп. скидка за ваш уровень на проекте Код и Капуста
Доступны сообщения

Если вы зарабатываете в ИТ, то 500 рублей на развитие проекта подкинуть не зазорно

Оформить подписку
Фильтры
Статистика
Обновления проекта
Контакты
Поделиться
Читать: 12+ мин
logo Код и Капуста

COBOL на инвалидной коляске

1


Все ‎началось‏ ‎с ‎обсуждения ‎в ‎баре ‎о‏ ‎том, ‎как‏ ‎информационные‏ ‎технологии ‎развиваются ‎и‏ ‎накапливают ‎собственное‏ ‎историческое ‎наследие. ‎Когда ‎человек‏ ‎получает‏ ‎высшее ‎художественное‏ ‎образование, ‎он‏ ‎обязательно ‎изучает ‎Историю ‎Искусств(History ‎of‏ ‎Art). Это‏ ‎имеет ‎огромное‏ ‎значение, ‎потому‏ ‎что ‎современные ‎достижения ‎не ‎возникают‏ ‎вдруг,‏ ‎они‏ ‎— ‎результат‏ ‎долгого ‎и‏ ‎сложного ‎процесса‏ ‎эволюции.‏ ‎Аналогично ‎и‏ ‎с ‎информационными ‎технологиями: ‎их ‎развитие‏ ‎— ‎это‏ ‎эволюционный‏ ‎процесс. ‎Каждая ‎новая‏ ‎разработка ‎опирается‏ ‎на ‎опыт, ‎накопленный ‎предшествующими.‏ ‎Уже‏ ‎сегодня ‎в‏ ‎учебных ‎заведениях‏ ‎нужно ‎преподавать ‎не ‎только ‎Компьютерные‏ ‎Науки(Computer‏ ‎Science), ‎но‏ ‎и ‎Историю‏ ‎Компьютерных ‎Технологий(History ‎of ‎Computer ‎Science).‏ ‎Исследование‏ ‎старых‏ ‎вычислительных ‎технологий‏ ‎может ‎приносить‏ ‎не ‎только‏ ‎удовольствие,‏ ‎но ‎и‏ ‎быть ‎источником ‎идей ‎для ‎разработки‏ ‎чего-то ‎нового.

Или‏ ‎нас‏ ‎ждет ‎новая ‎религия‏ ‎и ‎поклонение‏ ‎технологиям ‎древних


В ‎конце ‎концов,‏ ‎разговор‏ ‎в ‎баре‏ ‎навеял ‎воспоминания‏ ‎о ‎проекте ‎под ‎названием ‎«COBOL‏ ‎на‏ ‎инвалидной ‎коляске». Это‏ ‎джаст ‎фор‏ ‎фан ‎веб ‎фреймворк ‎на ‎COBOL.‏ ‎Сегодня‏ ‎мы‏ ‎создадим ‎на‏ ‎этом ‎фреймворке‏ ‎бэкенд, ‎который‏ ‎будет‏ ‎генерировать ‎JSON.‏ ‎Такой ‎бэкенд ‎вполне ‎пригодится ‎для‏ ‎любого ‎мобильного‏ ‎приложения.‏ ‎Посмотрим ‎как ‎технологии‏ ‎прошлого ‎работают‏ ‎с ‎технологиями ‎современными.

Кратко ‎про‏ ‎COBOL

COBOL‏ ‎расшифровывается ‎как‏ ‎COmmon ‎Business-Oriented‏ ‎Language. ‎Язык ‎программирования ‎COBOL ‎начал‏ ‎разрабатываться‏ ‎в ‎1959‏ ‎году ‎и‏ ‎был ‎выпущен ‎в ‎1969 ‎году.‏ ‎На‏ ‎момент‏ ‎написания ‎статьи‏ ‎ему ‎исполнилось‏ ‎65 ‎лет.‏ ‎Обычно‏ ‎люди, ‎которые‏ ‎умеют ‎на ‎нем ‎программировать, ‎примерно‏ ‎того ‎же‏ ‎возраста.‏ ‎Несмотря ‎на ‎это,‏ ‎COBOL ‎продолжает‏ ‎использоваться ‎в ‎некоторых ‎крупных‏ ‎банках.‏ ‎Вполне ‎возможно‏ ‎что ‎код,‏ ‎который ‎до ‎сих ‎пор ‎обслуживает‏ ‎пользователей,‏ ‎пережил ‎большинство‏ ‎своих ‎создателей.

COBOL‏ ‎стал ‎первым ‎языком, ‎который ‎оказался‏ ‎идеально‏ ‎подходящим‏ ‎для ‎своих‏ ‎задач. ‎В‏ ‎определённом ‎смысле‏ ‎COBOL‏ ‎стал ‎той‏ ‎искрой, ‎которая ‎зажгла ‎нашу ‎современную‏ ‎компьютерную ‎эру.‏ ‎До‏ ‎появления ‎COBOL ‎разработчики‏ ‎приходилось ‎использовать‏ ‎к ‎различные ‎версии ‎ассемблера,‏ ‎что‏ ‎не ‎очень-то‏ ‎удобно.

В ‎1959‏ ‎году ‎программистка ‎Мэри ‎Хоуэс ‎пришла‏ ‎к‏ ‎выводу, ‎что‏ ‎отрасли ‎требуется‏ ‎язык ‎программирования, ‎который ‎позволит ‎легко‏ ‎писать‏ ‎программы‏ ‎и ‎будет‏ ‎универсально ‎совместим‏ ‎с ‎любой‏ ‎машиной.‏ ‎Для ‎этого‏ ‎она ‎организовала ‎комитет ‎экспертов, ‎включая‏ ‎представителей ‎только‏ ‎зарождающегося‏ ‎сектора ‎бизнес-компьютеров, ‎для‏ ‎работы ‎над‏ ‎созданием ‎такого ‎языка ‎под‏ ‎эгидой‏ ‎Министерства ‎обороны.‏ ‎Цель ‎заключалась‏ ‎в ‎разработке ‎языка, ‎который ‎мог‏ ‎бы‏ ‎быть ‎понятен‏ ‎и ‎доступен‏ ‎любому ‎менеджеру ‎компании, ‎даже ‎если‏ ‎он‏ ‎не‏ ‎имеет ‎программного‏ ‎образования.

Спустя ‎десятилетие‏ ‎работы, ‎активно‏ ‎продвигаемой‏ ‎множеством ‎женщин-суперзвёзд‏ ‎этой ‎отрасли, ‎например, ‎пионеркой ‎компьютерных‏ ‎наук ‎Джин‏ ‎Саммет,‏ ‎был ‎создан ‎простой‏ ‎в ‎понимании‏ ‎язык. ‎Например, ‎для ‎сложения‏ ‎двух‏ ‎чисел ‎можно‏ ‎было ‎написать‏ ‎ADD ‎Num1, ‎Num2 ‎GIVING ‎Result.‏ ‎Чтобы‏ ‎выполнить ‎вычисление‏ ‎три ‎раза,‏ ‎нужно ‎было ‎написать ‎PERFORM ‎3‏ ‎TIMES.

Программы‏ ‎на‏ ‎COBOL

Начнем ‎сразу‏ ‎с ‎примера‏ ‎и ‎попробуем‏ ‎разобраться‏ ‎что ‎в‏ ‎этом ‎примере ‎происходит

000100 IDENTIFICATION ‎DIVISION.
‎000200‏ ‎PROGRAM-ID. ‎HELLOWORLD.‏
‎000300*‏ ‎--- ‎Это ‎пустая‏ ‎строчка. ‎---‏
‎000400 ‎ENVIRONMENT ‎DIVISION.
‎000500‏ ‎DATA‏ ‎DIVISION.
‎000600‏ ‎PROCEDURE ‎DIVISION.‏
‎000700 ‎BEGIN.
‎000800          ‎DISPLAY ‎"Hello‏ ‎World!".‏
‎000900          ‎STOP‏ ‎RUN.

‎

Начнем‏ ‎со ‎строк ‎в ‎COBOL. ‎Все‏ ‎строки‏ ‎программы‏ ‎состоит ‎из‏ ‎80 ‎символов.

  • Символ‏ ‎1-6: ‎номер‏ ‎строки‏ ‎(необязателен)
  • Символ ‎7:‏ ‎«индикатор»:

* — строка ‎комментарий,

 — строка ‎«продолжение»,

D — строка ‎debug.

  • Символ ‎8‏ ‎— ‎11:‏ ‎Зона‏ ‎А. ‎В ‎ней‏ ‎должны ‎начинаться‏ ‎DIVISION’ы, ‎SECTION’ы, ‎имена ‎и‏ ‎заголовки‏ ‎параграфов, ‎а‏ ‎также ‎индикаторы‏ ‎и ‎номера ‎«уровней» ‎(это ‎все‏ ‎рассмотрим‏ ‎позже).
  • Символ ‎12-72:‏ ‎Зона ‎Б.‏ ‎Тут ‎непосредственно ‎размещаются ‎выражения ‎«кода».
  • Символ‏ ‎73-80:‏ ‎Зона‏ ‎комментария. ‎Не‏ ‎обрабатывается ‎компилятором‏ ‎и ‎полностью‏ ‎предоставлена‏ ‎програмисту.

Каждая ‎программа‏ ‎на ‎COBOL ‎состоит ‎из ‎четырех‏ ‎разделов, ‎которые‏ ‎называются‏ ‎DIVISION. ‎Эти ‎разделы‏ ‎расположены ‎в‏ ‎строгом ‎порядке ‎и ‎содержат‏ ‎определённые‏ ‎компоненты. ‎Внутри‏ ‎DIVISION ‎разделы‏ ‎делятся ‎на ‎секции ‎(Section) ‎и‏ ‎абзацы‏ ‎(Paragraph).

IDENTIFICATION ‎DIVISION. — описывает‏ ‎программу ‎и‏ ‎содержит ‎такие ‎параграфы, ‎как

        PROGRAM-ID. ‎Helloworld.‏
        ‎AUTHOR.‏ ‎Beginner.‏
        ‎INSTALLATION. ‎MyLocalCobolComputer.‏
        ‎DATE-WRITTEN. ‎19/03/2011.‏
        ‎DATE-COMPILED. ‎19/03/2011.‏
        ‎SECURITY.‏ ‎Iwillnottellanybodythiscode.

‎

Содержимое‏ ‎этих ‎параграфов ‎представляет ‎собой ‎обычный‏ ‎комментарий ‎и‏ ‎в‏ ‎принципе ‎записать ‎туда‏ ‎можно ‎хоть‏ ‎«2024 ‎год ‎от ‎Рождества‏ ‎Христова».

ENVIRONMENT‏ ‎DIVISION. ‎ как‏ ‎следует ‎из‏ ‎названия, ‎описывает ‎среду, ‎в ‎которой‏ ‎создаётся‏ ‎программа. ‎Этот‏ ‎раздел ‎включает‏ ‎в ‎себя ‎две ‎секции.

  • CCONFIGURATION ‎SECTION включает‏ ‎в‏ ‎себя‏ ‎параграфы ‎SOURCE-COMPUTEROBJECT-COMPUTER и‏ ‎SPECIAL-NAMES. Первые ‎два‏ ‎параграфа ‎выполняют‏ ‎комментирующую‏ ‎функцию, ‎указывая,‏ ‎на ‎каком ‎компьютере ‎написана ‎программа‏ ‎и ‎для‏ ‎какого‏ ‎компьютера ‎она ‎предназначена.‏ ‎Параграф ‎SPECIAL-NAMES представляет‏ ‎собой ‎более ‎сложную ‎тему,‏ ‎которую‏ ‎тут ‎мы‏ ‎рассматривать ‎не‏ ‎будем(или ‎вы ‎можете ‎самостоятельно ‎поискать‏ ‎информацию‏ ‎на ‎эту‏ ‎тему).
  • INPUT-OUTPUT ‎SECTION описывает‏ ‎процессы ‎ввода-вывода. ‎Эта ‎секция ‎является‏ ‎крайне‏ ‎необходимой‏ ‎и ‎важной.‏ ‎В ‎рамках‏ ‎этой ‎статьи‏ ‎мы‏ ‎ее ‎тоже‏ ‎не ‎коснемся, ‎но ‎можно ‎посмотреть‏ ‎реализацию ‎в‏ ‎самом‏ ‎фреймворке. ‎Она ‎включает‏ ‎в ‎себя‏ ‎параграфы ‎FILE-CONTROL и ‎I-O-CONTROL.

DATA ‎DIVISION. — содержит‏ ‎описания‏ ‎всех ‎переменных.‏ ‎Включает ‎в‏ ‎себя ‎4 ‎секции:

  • FILE ‎SECTION. описывает ‎структуру‏ ‎файлов.
  • WORKING-STORAGE‏ ‎SECTION. описывает ‎переменные.
  • LOCAL-STORAGE‏ ‎SECTION. описывает ‎переменные,‏ ‎которые ‎создаются ‎и ‎инициализируются ‎каждый‏ ‎раз‏ ‎при‏ ‎выполнении ‎(поподробней‏ ‎в ‎следующие‏ ‎разы).
  • LINKAGE ‎SECTION. описывает‏ ‎данные,‏ ‎которые ‎мы‏ ‎получаем ‎при ‎вызове ‎других ‎программ.

PROCEDURE‏ ‎DIVISION. ‎— включает‏ ‎в‏ ‎себя ‎основную ‎часть‏ ‎программы. ‎Эта‏ ‎часть ‎состоит ‎из ‎пользовательских‏ ‎секций‏ ‎и ‎параграфов,‏ ‎которые ‎содержат‏ ‎сами ‎выражения. ‎В ‎нашем ‎случае‏ ‎имеется‏ ‎только ‎один‏ ‎параграф:

BEGIN. пользовательский ‎параграф.

        DISPLAY‏ ‎"Hello ‎World!".
        ‎STOP ‎RUN. ‎Собственно‏ ‎сами‏ ‎выражения.‏

‎

Кстати, ‎в‏ ‎COBOL ‎300‏ ‎ключевых ‎слов.‏ ‎Для‏ ‎сравнения, ‎в‏ ‎Go ‎всего ‎25

И ‎напоследок. ‎Каждое‏ ‎выражение ‎должно‏ ‎заканчиваться‏ ‎«точкой», ‎а ‎регистр‏ ‎выражений ‎не‏ ‎важен.

REST ‎для ‎динозавров

Мы ‎уже‏ ‎овладели‏ ‎искусством ‎написания‏ ‎простых ‎программ‏ ‎на ‎языке ‎COBOL, ‎сделали ‎первые‏ ‎уверенные‏ ‎шаги ‎в‏ ‎этом ‎направлении.‏ ‎Пора ‎перейти ‎к ‎изучению ‎того,‏ ‎на‏ ‎что‏ ‎способен ‎фреймворк‏ ‎COBOL ‎on‏ ‎Wheelchair. ‎На‏ ‎этом‏ ‎этапе, ‎для‏ ‎того ‎чтобы ‎начать ‎работать ‎с‏ ‎фреймворком, ‎необходимо‏ ‎сперва‏ ‎скопировать ‎проект ‎на‏ ‎свой ‎компьютер.‏ ‎Это ‎позволит ‎нам ‎с‏ ‎головой‏ ‎окунуться ‎в‏ ‎изучение ‎его‏ ‎возможностей ‎и ‎потенциала.

git ‎clone ‎github.com/azac/cobol-on-wheelchair

Дальше‏ ‎можно‏ ‎воспользоваться ‎инструкцией и‏ ‎настроить ‎.htaccess‏ ‎в ‎Apache ‎самостоятельно. ‎Но ‎кто‏ ‎в‏ ‎2024‏ ‎помнит ‎как‏ ‎настраивать ‎Apache?‏ ‎Нам ‎повезло‏ ‎и‏ ‎в ‎проект‏ ‎уже ‎добавили ‎Dockerfile. ‎Достаточно ‎просто‏ ‎собрать ‎и‏ ‎запустить‏ ‎контейнер

docker ‎build ‎-t‏ ‎cobol ‎.‏
‎docker ‎run ‎--rm ‎-p‏ ‎8888:80‏ ‎cobol:latest

‎

Как‏ ‎все ‎это‏ ‎организовано? ‎Apache ‎использует ‎модуль ‎mod_cgid,‏ ‎чтобы‏ ‎через ‎CGI‏ ‎(Common ‎Gateway‏ ‎Interface) ‎запускать ‎как ‎скрипты, ‎так‏ ‎и‏ ‎скомпилированные‏ ‎программы. ‎Если‏ ‎в ‎начале‏ ‎2000-х ‎годов‏ ‎вы‏ ‎создавали ‎сайты‏ ‎на ‎PHP, ‎то ‎у ‎вас,‏ ‎вероятно, ‎сейчас‏ ‎возникают‏ ‎флешбэки ‎из ‎тех‏ ‎времен. ‎Могу‏ ‎вас ‎понять.

Посмотрим ‎структуру ‎базового‏ ‎проекта

/controllers‏    ‎<- ‎тут‏ ‎все ‎логика‏ ‎на ‎COBOL
‎/views          ‎<- ‎тут‏ ‎живут‏ ‎шаблоны ‎для‏ ‎рендеринга

‎config.cbl‏      ‎<- ‎файл ‎конфигурации ‎для ‎определения‏ ‎роутов‏
‎cow.cbl‏         ‎<- ‎основной‏ ‎код ‎фреймворка‏ ‎CoW 
‎downhill.sh‏     ‎<-‏ ‎скрипт ‎для‏ ‎компиляции
‎the.cow         ‎<- ‎скомпилированный ‎CoW‏ ‎проект

‎

Роутинг

Конечно,‏ ‎в‏ ‎COBOL ‎мы ‎не‏ ‎можем ‎просто‏ ‎замапить ‎наши ‎модели ‎и‏ ‎получить‏ ‎готовый ‎REST‏ ‎как ‎в‏ ‎какой-нибудь ‎Java. ‎Нам ‎придется ‎описывать‏ ‎каждый‏ ‎роут ‎отдельно,‏ ‎как ‎в‏ ‎Go. ‎Все ‎роутны ‎описываются ‎в‏ ‎файле‏ ‎config.cbl

move‏ ‎4 ‎to‏ ‎nroutes.

‎move‏ ‎"/"                           ‎to‏ ‎routing-pattern(1).‏
‎move ‎"indexweb"‏                    ‎to ‎routing-destiny(1).

‎move ‎"/showsum/%value1/%value2"    ‎to‏ ‎routing-pattern(2).
‎move‏ ‎"showsum"‏                     ‎to ‎routing-destiny(2).

‎move‏ ‎"/example/%value"             ‎to‏ ‎routing-pattern(3).
‎move ‎"example"                     ‎to‏ ‎routing-destiny(3).‏

‎move ‎"/showname/%value"‏            ‎to ‎routing-pattern(4).‏
‎move ‎"showname"                    ‎to ‎routing-destiny(4). 

‎

Таблица‏ ‎роутов‏ ‎может ‎хранить‏ ‎99 ‎элементов.‏ ‎В ‎первой ‎строке ‎move ‎4‏ ‎to‏ ‎nroutes‏ ‎указываем ‎сколько‏ ‎роутов ‎будет‏ ‎в ‎нашей‏ ‎программе.

routing-pattern‏ ‎— ‎тут‏ ‎хранятся ‎все ‎наши ‎паттерны ‎путей‏ ‎outing-destiny ‎—‏ ‎а‏ ‎туту ‎все ‎обработчики‏ ‎роутов. ‎По‏ ‎сути, ‎это ‎названия ‎програм,‏ ‎который‏ ‎описаны ‎в‏ ‎файлах ‎.cbl‏ ‎в ‎папке ‎controllers

Контроллеры

COBOL ‎— ‎это‏ ‎несложный‏ ‎язык, ‎однако‏ ‎требует ‎внимания‏ ‎к ‎некоторым ‎его ‎особенностям. ‎Например,‏ ‎все‏ ‎переменные‏ ‎должны ‎быть‏ ‎определены ‎в‏ ‎строго ‎определённых‏ ‎частях‏ ‎программы, ‎а‏ ‎изменение ‎структуры ‎самой ‎программы ‎невозможно.‏ ‎Но ‎как‏ ‎только‏ ‎мы ‎адаптируемся ‎к‏ ‎этим ‎ограничениям,‏ ‎разработка ‎веб-приложений ‎на ‎COBOL‏ ‎будет‏ ‎похода ‎на‏ ‎написание ‎стихотворений.

Посмотрим‏ ‎на ‎самый ‎простой ‎контроллер ‎example.cbl

       identification‏ ‎division.‏
       ‎program-id. ‎hello.‏

       ‎data ‎division.‏
       ‎working-storage ‎section.

       ‎01 ‎the-vars.

          ‎03‏  ‎COW-vars‏ ‎OCCURS‏ ‎99 ‎times.‏
        
            ‎05 ‎COW-varname‏       ‎pic ‎x(99).‏
            ‎05‏ ‎COW-varvalue      ‎pic‏ ‎x(99).    

       ‎linkage ‎section.

       ‎01 ‎the-values.‏

          ‎05 ‎COW-query-values‏           ‎occurs‏ ‎10 ‎times.
            ‎10‏ ‎COW-query-value-name     ‎pic‏ ‎x(90).
            ‎10 ‎COW-query-value          ‎pic‏ ‎x(90).‏


       ‎procedure ‎division‏ ‎using ‎the-values.‏


           ‎MOVE ‎"username" ‎to ‎COW-varname(1).
           ‎MOVE‏ ‎COW-query-value(1)‏ ‎to ‎COW-varvalue(1).‏   

           ‎call ‎'cowtemplate'‏ ‎using ‎the-vars ‎"hello.cow".

      
       ‎goback.

       ‎end‏ ‎program‏ ‎hello.‏

‎

Постараемся ‎разобраться‏ ‎что ‎тут‏ ‎происходит. ‎Начнем‏ ‎с‏ ‎секции ‎working-storage‏ ‎section. ‎Тут ‎мы ‎получаем ‎переменные‏ ‎из ‎запроса‏ ‎и‏ ‎складываем ‎их ‎в‏ ‎таблицу ‎COW-query-values.‏ ‎Ключ ‎этой ‎таблицы ‎COW-query-value-name,‏ ‎а‏ ‎значение ‎COW-query-value.‏ ‎Всего ‎таблица‏ ‎может ‎содержать ‎10 ‎переменных

pic ‎x(90)‏

‎

Это‏ ‎код ‎выделяет‏ ‎память ‎под‏ ‎строку ‎на ‎90 ‎символов. ‎В‏ ‎COBOL‏ ‎мы‏ ‎указываем ‎не‏ ‎размерность ‎типа‏ ‎в ‎битах,‏ ‎а‏ ‎количество ‎символов,‏ ‎которые ‎будут ‎хранится ‎в ‎этой‏ ‎переменной. ‎Например,‏ ‎операция‏ ‎pic ‎x(90) ‎говорит,‏ ‎что ‎переменная‏ ‎будет ‎содержать ‎строку ‎в‏ ‎10‏ ‎символов, ‎а‏ ‎pic ‎9(3)‏ ‎говорит ‎что ‎в ‎переменной ‎будет‏ ‎хранится‏ ‎число ‎с‏ ‎3 ‎разрядами.

Теперь‏ ‎перейдем ‎к ‎секции ‎working-storage ‎section.‏ ‎Тут‏ ‎мы‏ ‎определяем ‎таблицу‏ ‎переменных, ‎которые‏ ‎будут ‎рендерится‏ ‎в‏ ‎шаблоне. ‎В‏ ‎этой ‎таблице ‎COW-varname ‎— ‎это‏ ‎название ‎переменной,‏ ‎а‏ ‎COW-varvalue ‎— ‎это‏ ‎значение.

Нам ‎нужно‏ ‎перенести ‎значение ‎из ‎переменных‏ ‎запроса‏ ‎в ‎переменные‏ ‎для ‎рендеринга.‏ ‎Для ‎этого ‎выполняем ‎инструкции

MOVE ‎"username"‏ ‎to‏ ‎COW-varname(1).
‎MOVE‏ ‎COW-query-value(1) ‎to‏ ‎COW-varvalue(1).

‎

Теперь ‎все ‎наши ‎переменные‏ ‎можно‏ ‎передать‏ ‎в ‎шаблон‏ ‎и ‎использовать‏ ‎их ‎для‏ ‎рендеринга.‏ ‎Мой ‎пример‏ ‎шаблона ‎называется ‎example.cow

<html>
    ‎<head>
        ‎<title>‏
            ‎Hello ‎{{username}}.‏
        ‎</title>‏
    ‎</head>
    ‎<body>

        ‎<h2>‏ ‎Hello ‎{{username}}!‏ ‎</h2>  

    ‎</body>
‎</html>

‎

Все‏ ‎эти‏ ‎сложности ‎с‏ ‎таблицами ‎нужны,‏ ‎чтобы ‎можно ‎было ‎удобно ‎использовать‏ ‎названия‏ ‎в ‎шаблонах

Рендерим‏ ‎JSON

Чтобы ‎сделать‏ ‎что-то ‎похожее ‎на ‎API, ‎достаточно‏ ‎отрендерить‏ ‎данные‏ ‎в ‎JSON‏ ‎шаблон. ‎Тут‏ ‎ничего ‎сложного.‏ ‎Создаем‏ ‎файл ‎example-json.cow‏ ‎и ‎готовим ‎будущий ‎JSON:

{
    "name": ‎"{{name}}"‏
‎}

‎

Чтобы‏ ‎браузер‏ ‎понял ‎что ‎нам‏ ‎нужно, ‎необходимо‏ ‎правильно ‎отдавать ‎заголовок. ‎Для‏ ‎этого‏ ‎в ‎файле‏ ‎cow.cbl ‎нужно‏ ‎найти ‎строку

"content-type: ‎text/html; ‎charset=utf-8"

‎

И‏ ‎заменить‏ ‎ее ‎на‏ ‎нужный ‎заголовок:

"content-type:‏ ‎application/json; ‎charset=utf-8"

‎

Теперь ‎у ‎нас‏ ‎есть‏ ‎все,‏ ‎чтобы ‎построить‏ ‎на ‎COBOL‏ ‎стильное, ‎модное‏ ‎и‏ ‎молодежное ‎API

Ссылки


Читать: 1+ мин
logo Школа SoWa

Знакомство

Привет, ‎друзья!‏ ‎

Меня ‎зовут ‎Андрей, ‎я ‎основатель‏ ‎инди-студии ‎и‏ ‎школы‏ ‎SoWa ‎Solutions. ‎

Живу‏ ‎в ‎Самаре,‏ ‎на ‎берегу ‎Волги. ‎Женат,‏ ‎ращу‏ ‎сыночка ‎и‏ ‎дочку. ‎Дом‏ ‎охраняет ‎верный ‎питбуль. ‎

Мне ‎42‏ ‎года,‏ ‎и ‎30‏ ‎лет ‎из‏ ‎них ‎я ‎занимаюсь ‎кодингом. ‎Опыт‏ ‎длиной‏ ‎в‏ ‎целую ‎жизнь‏ ‎?

С ‎детства‏ ‎пишу ‎рассказы‏ ‎и‏ ‎повести. ‎Мои‏ ‎романы ‎"Тысяча ‎шагов ‎на ‎север"‏ ‎и ‎"Дом‏ ‎у‏ ‎горизонта" ‎были ‎опубликованы‏ ‎в ‎электронном‏ ‎виде ‎на ‎многих ‎площадках‏ ‎под‏ ‎эгидой ‎издательства‏ ‎"Эксмо", ‎а‏ ‎роман ‎"Кома" ‎вышел ‎в ‎редакторской‏ ‎серии‏ ‎RED ‎Fantasy.‏ ‎

Моей ‎страстью‏ ‎с ‎детства ‎были ‎видеоигры, ‎а‏ ‎мечтой‏ ‎-‏ ‎научиться ‎их‏ ‎создавать. ‎

Теперь‏ ‎я ‎хочу‏ ‎помочь‏ ‎вам. ‎Мой‏ ‎опыт ‎и ‎мои ‎навыки ‎-‏ ‎это ‎то,‏ ‎чем‏ ‎я ‎с ‎огромной‏ ‎радостью ‎поделюсь‏ ‎с ‎вами. ‎

Подписывайтесь, ‎и‏ ‎уже‏ ‎совсем ‎скоро‏ ‎вы ‎начнете‏ ‎создавать ‎собственные ‎миры! ‎

До ‎встречи!‏ ‎

Читать: 3+ мин
logo Информатика с Натальей Массальской

Python: выводим слова введённой строки, отсортированные по длине

Словами ‎будем‏ ‎считать ‎последовательности ‎букв, ‎разделённых ‎пробелами.‏ ‎Знаки ‎препинания‏ ‎не‏ ‎являются ‎частью ‎слова.

ПРИМЕР:‏ ‎если ‎мы‏ ‎ввели ‎строку

Моя ‎головная ‎боль:‏ ‎математика,‏ ‎физика, ‎информатика.‏

‎

программа ‎должна‏ ‎вывести:

Моя
‎боль
‎физика
‎головная
‎математика‏
‎информатика‏

‎

1. Вводим ‎строку:

s‏ ‎= ‎input()‏

‎

2. Чтобы ‎разбить ‎строку ‎на ‎элементы,‏ ‎используем‏ ‎метод‏ ‎.split(), причём ‎без‏ ‎аргумента, ‎потому‏ ‎что ‎разбивать‏ ‎будем‏ ‎по ‎пробелу.

wrds‏ ‎= ‎s.split()

‎

Переменная ‎wrds ‎теперь‏ ‎— ‎это‏ ‎список‏ ‎строк. ‎Каждая ‎строка‏ ‎— ‎слово,‏ ‎причём ‎со ‎знаком ‎препинания‏ ‎в‏ ‎конце, ‎если‏ ‎он ‎там‏ ‎был. ‎Например, ‎«физика, ‎„.

3. Давайте ‎удалим‏ ‎последний‏ ‎символ ‎каждой‏ ‎подстроки, ‎если‏ ‎это ‎знак ‎препинания. ‎Конечно, ‎мы‏ ‎могли‏ ‎бы‏ ‎сделать ‎это‏ ‎«в ‎лоб»:

# для‏ ‎всех ‎подстрок‏ ‎списка‏
‎for ‎i‏ ‎in ‎range(len(wrds)):
    ‎# ‎если ‎последний‏ ‎символ ‎—‏ ‎знак‏ ‎препинания
    ‎if ‎wrds[i][-1]‏ ‎in ‎'.,:‏ ‎; ‎-?! ‎':
        ‎#‏ ‎заменяем‏ ‎строку ‎на‏ ‎неё ‎без‏ ‎последнего ‎символа
        ‎# ‎(фактически ‎ДО‏ ‎последнего‏ ‎символа)
        ‎wrds[i]‏ ‎= ‎wrds[i][:‏ ‎-1]

‎

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

А‏ ‎во-вторых,‏ ‎знак ‎может ‎быть‏ ‎и ‎в‏ ‎начале ‎слова ‎— ‎та‏ ‎же‏ ‎скобка.

Используем ‎метод‏ ‎.isalpha(), который ‎возвращает‏ ‎True, ‎если ‎аргумент ‎состоит ‎только‏ ‎из‏ ‎букв. ‎И‏ ‎будем ‎проверять‏ ‎с ‎обоих ‎концов ‎слова:

for ‎i‏ ‎in‏ ‎range(len(wrds)):‏
    ‎if ‎not(wrds[i][0].isalpha()):‏ ‎wrds[i] ‎=‏ ‎wrds[i][1:]
    ‎if‏ ‎not(wrds[i][-1].isalpha()):‏ ‎wrds[i] ‎=‏ ‎wrds[i][: ‎-1]

‎

4. Теперь ‎бы ‎надо‏ ‎отсортировать ‎список‏ ‎строк.‏ ‎Но ‎если ‎мы‏ ‎будем ‎делать‏ ‎это ‎запросто:

wrds.sort()

‎

получим ‎(естественно!)‏ ‎сортировку‏ ‎по ‎алфавиту,‏ ‎а ‎это‏ ‎не ‎то, ‎что ‎нам ‎нужно.

Вспомним,‏ ‎что‏ ‎у ‎метода‏ ‎.sort() есть ‎параметр‏ ‎key, позволяющий ‎сортировать ‎элементы ‎списка ‎как‏ ‎угодно:‏ ‎хоть‏ ‎по ‎второму‏ ‎символу ‎строк,‏ ‎хоть ‎по‏ ‎остатку‏ ‎от ‎деления‏ ‎чисел ‎на ‎11.

Причём ‎мы ‎можем‏ ‎функцию-ключ ‎сортировки‏ ‎сделать‏ ‎отдельной ‎функцией, ‎вот‏ ‎так:

def ‎key_func(x):‏
    ‎return ‎len(x)

‎

А ‎можем‏ ‎использовать‏ ‎лямбда-функцию ‎прямо‏ ‎в ‎вызове‏ ‎метода.

Лямбда-функции (напомню) ‎— ‎это ‎крохотные ‎функции‏ ‎без‏ ‎имени, ‎которые‏ ‎реализуются ‎прямо‏ ‎там, ‎где ‎используются.

Наша ‎сортировка ‎по‏ ‎длинам‏ ‎строк‏ ‎будет ‎выглядеть‏ ‎так:

wrds.sort(key=lambda ‎x:‏ ‎len(x))

‎

Параметр‏ ‎лямбда-функции‏ ‎х ‎—‏ ‎это ‎элемент ‎списка, ‎для ‎которого‏ ‎вызывается ‎.sort().‏ ‎То‏ ‎есть ‎в ‎нашем‏ ‎случае ‎—‏ ‎строка.

Что ‎возвращает ‎функция-ключ ‎сортировки‏ ‎—‏ ‎по ‎тому‏ ‎и ‎сортируем.‏ ‎Здесь ‎— ‎по ‎длине ‎строк.

5. Осталось‏ ‎вывести‏ ‎наши ‎строки.‏ ‎Можно, ‎конечно,‏ ‎сделать ‎это ‎попросту:

for ‎x ‎in‏ ‎wrds:‏
    ‎print(x)‏

‎

А ‎можно‏ ‎использовать ‎чуть‏ ‎более ‎мудрёный,‏ ‎но‏ ‎краткий ‎функциональный‏ ‎подход ‎и ‎записать ‎так:

[print(x) ‎for‏ ‎x ‎in‏ ‎wrds]‏

‎

Результат ‎получим ‎один‏ ‎и ‎тот‏ ‎же!

Осталось ‎переписать ‎программу ‎полностью‏ ‎и‏ ‎можно ‎💥‏ ‎сдавать ‎лабу‏ ‎😉

Код ‎программы:

s ‎= ‎input()
‎#‏ ‎разбиваем‏ ‎строку ‎на‏ ‎слова
‎wrds‏ ‎= ‎s.split()

‎# ‎для ‎всех‏ ‎подстрок‏ ‎списка‏
‎for ‎i‏ ‎in ‎range(len(wrds)):‏
    ‎# ‎если‏ ‎последний‏ ‎символ ‎-‏ ‎знак ‎препинания
    ‎if ‎wrds[i][-1] ‎in‏ ‎'.,:;-?!':
        ‎#‏ ‎заменяем‏ ‎строку ‎на ‎неё‏ ‎без ‎последнего‏ ‎символа
        ‎# ‎(фактически ‎ДО‏ ‎последнего‏ ‎символа)
        ‎wrds[i]‏ ‎= ‎wrds[i][:-1]‏

‎# ‎удаляем ‎начальные ‎и ‎конечные‏ ‎знаки‏
‎# ‎препинания‏ ‎из ‎каждого‏ ‎слова
‎for ‎i ‎in ‎range(len(wrds)):‏
    ‎if‏ ‎not(wrds[i][0].isalpha()):‏ ‎wrds[i] ‎=‏ ‎wrds[i][1:]
    ‎if‏ ‎not(wrds[i][-1].isalpha()): ‎wrds[i]‏ ‎=‏ ‎wrds[i][:-1]

‎#‏ ‎сортируем ‎список ‎по ‎длинам ‎строк‏
‎wrds.sort(key=lambda ‎x:‏ ‎len(x))‏
‎# ‎выводим ‎по‏ ‎одному ‎слову‏ ‎на ‎строке
‎[print(x) ‎for‏ ‎x‏ ‎in ‎wrds]‏

‎

Или ‎можете‏ ‎скачать ‎готовым ‎файликом ‎🔽🔽🔽

Смотреть: 18+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 34

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий

Смотреть: 31+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 33

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Читать: 1+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 32.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 37+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 31

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Читать: 1+ мин
logo Лаборатория программирования

Программирование на языке Python. Эпизод 6. Объектные модели и специальные методы. Часть 2

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Эпизод 6. Объектные модели и специальные методы.
Часть 2. Модель "Генератор и итератор".

Читать: 1+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 30

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий

Смотреть: 36+ мин
logo Лаборатория программирования

Программирование на языке Python. Эпизод 6. Объектные модели и специальные методы. Часть 1.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Эпизод 6. Объектные модели и специальные методы.
Часть 1. Теоретическое введение.

Смотреть: 35+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 29

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 25+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 28.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Читать: 1+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 27.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 36+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 26.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 23+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 25.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Читать: 1+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 24.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 45+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 23.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 28+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 22

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других технологий.

Смотреть: 40+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 21.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других сопутствующих технологий.

Смотреть: 40+ мин
logo Лаборатория программирования

Разработка приложений на Python + Qt (PySide6). Сезон 2. Выпуск 20.

Доступно подписчикам уровня
«Вольный слушатель»
Подписаться за 500₽ в месяц

Разработка прикладного программного обеспечения на языке Python с применением библиотеки Qt (PySide6), СУБД PostgreSQL и других сопутствующих технологий.

Показать еще

Обновления проекта

Статистика

Фильтры

Подарить подписку

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

Оплата за этого пользователя будет списываться с вашей карты вплоть до отмены подписки. Код может быть показан на экране или отправлен по почте вместе с инструкцией.

Будет создан код, который позволит адресату получить сумму на баланс.

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

Добавить карту
0/2048