Статья гуляет в интернете уже довольно давно, но, как автор думаю имею право на ее перепост здесь. Многое (если не все) написаное здесь устарело, и может показаться бесполезным с первого взгляда, однако пройдя этот путь, спустя 6 лет могу сказать, это не оказалось лишним. Итак.
В этой статье я хочу рассказать о CGI интерфейсе вообще, его реализации для windows и использовании при написании CGI-программ языка ассемблер в частности. В рамки этой статьи не входит полное описание CGI, так-как в Интернете материала по этому вопросу просто море и пересказывать все это здесь я просто не вижу смысла.
Теория CGI
CGI – (Common Gateway Interface) – Общий Шлюзовый Интерфейс. Как не трудно догадаться интерфейс этот служит шлюзом между сервером (здесь я подразумеваю программу — сервер) и какой-либо внешней программой написанной для ОС на которой этот самый сервер запущен. Таким образом CGI отвечает за то, каким именно образом данные будут переданы от программы-сервера к CGI-программе и обратно. Интерфейс не накладывает никаких ограничений на то, на чем должна быть написана CGI-программа, это может быть как обычный исполнимый файл, так и любой другой файл – главное, чтобы сервер смог его запустить (в среде windows это например может быть файл с расширением, привязанным к какой-либо программе).
С момента когда Вы вызвали (например нажали кнопку формы, к которой привязан вызов CGI-программы) CGI-программу до получения вами результата в окно браузера происходит следующее:
— Вэб-клиент (например браузер) создает подключение к серверу, указанному в URL;
— Вэб-клиент посылает запрос серверу, запрос этот обычно делается с помощью двух методов GET или POST;
— Данные из запроса клиента (например значения полей формы) передаются сервером, используя CGI-интерфейс, CGI-программе, указанной в URL;
— CGI-программа обрабатывает данные клиента, полученные от сервера и генерирует на основе этой обработки ответ клиенту, который она передает по все тому же CGI-интерфейсу серверу, а он в свою очередь передает его уже непосредственно клиенту;
— Сервер разрывает соединение с клиентом.
В стандартной спецификации CGI принято, что сервер может обмениваться с программой следующими способами:
— Переменные окружения – они могут быть установлены сервером при запуске программы;
— Стандартный поток ввода (STDIN) – с его помощью сервер может передать данные программе;
— Стандартный поток вывода (STDOUT) – программа может писать в него свой вывод, передающийся серверу;
— Командная строка – в ней сервер может передать некоторые параметры программе.
Стандартные потоки ввода/вывода весьма удобны и широко используются на UNIX-системах, чего не скажешь о windows, поэтому существует спецификация CGI, разработанная специально для windows-систем так и называемая «Windows CGI». Но, естественно, и стандартные потоки ввода/вывода так же можно использовать в windows CGI программировании.
Здесь я не буду затрагивать стандарт «Windows CGI», и на это существует по крайней мере две причины – первая, и самая главная – на данный момент не все http-сервера под windows поддерживают эту спецификацию (в частности мой любимый Apache 1.3.19). Вторую причину вы можете наблюдать набрав в любой поисковой системе строчку «Windows CGI». Отмечу относительно этого интерфейса лишь общие детали – все данные от сервера к клиенту передаются посредством обычного для windows *.ini файла, имя которого передается программе в командной строке. При этом все данные в файле уже заботливо разбиты по секциям сервером и вам лишь остается используя функции «GetPrivateProfile*» извлечь их оттуда. Ответ серверу передается опять же посредством файла, имя которого указано в соответствующей записи ini-файла.
Какие же данные могут быть переданы клиентом CGI-программе? – практически любые. В общем случае программе передаются значения полей формы, которые заполняет клиент, но это также могут быть и какие-либо двоичные данные, например файл с картинкой или музыкой. Данные могут быть переданы на сервер двумя различными методами – это метод GET и метод POST. Когда мы создаем форму для заполнения на нашей страничке мы явно указываем каким из приведенных методов мы хотим отправить введенные пользователем данные, делается это в основном тэге формы примерно так:
При отправке данных методом GET, данные браузером считываются из формы и помещаются следом за URL скрипта, за знаком вопроса, если значимых полей в форме несколько, то они передаются все через значёк «your_age=90 HTTP/1.0
Использование метода GET имеет сразу несколько слабых сторон – первое и самое главное – т.к. данные передаются в URL то он имеет ограничение на количество этих самых передаваемых данных. Вторая слабость опять же вытекает из URL – это конфиденциальность, при такой передаче данные остаются абсолютно открытыми. Итак, хорошо если у нас в форме 2-3 небольших поля… встает вопрос что же делать если данных больше? Ответ – использовать метод POST!
При использовании метода POST данные передаются серверу как блок данных, а не в URL, что несколько развязывает нам руки для увеличения объема передаваемой информации, для вышеприведенного примера формы POST блок, посылаемый серверу будет примерно такой:
POST /cgi-bin/test.exe HTTP/1.0
Accept: text/plain
Accept: text/html
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 36
your_name=Pupkinyour_age=90
Тебе НЕ НУЖЕН VFX! Как снимать ЛЮБОЕ ВИДЕО, не выходя из дома? Виртуальный продакшен | Unreal Engine
СЦЕНА С ЧЕЛОВЕКОМ-ПАУКОМ ЗА 5 МИНУТ / 50 МИНУТ / 5 ЧАСОВ В BLENDER 3D
- STD_INPUT_HANDLE — для stdin (стандартный ввод);
- STD_OUTPUT_HANDLE — для stdout (стандартный вывод);
- STD_ERROR_HANDLE — для stderr.
Функция возвратит необходимый нам для операций чтения/записи хэндл. Следующее что нам необходимо делать это писать/читать эти потоки. Делается это обычными операциями чтения/записи файлов, т.е. ReadFile и WriteFile. Тут есть одна тонкость, можно подумать, что для этих целей можно использовать WriteConsole/ReadConsole, да это действительно справедливо для консоли и будет прекрасно работать, результаты, так же как и с WriteFile будут выводиться на консоль, но продолжаться это будет пока мы не запустим нашу программу как скрипт на сервере. Происходит это потому что, когда нашу программу запускает сервер хндлы, возвращаемые функцией «GetStdHandle» уже не будут хндлами консоли как таковыми, они будут хэндлами pipe, что необходимо для связи двух приложений.
Вот небольшой пример того, как должна выглядеть CGI-программа на ассемблере:
.386
.model flat,stdcall
includelib import32.lib
.const
PAGE_READWRITE = 4h
MEM_COMMIT = 1000h
MEM_RESERVE = 2000h
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
.data
hStdout dd ?
hStdin dd ?
hMem dd ?
header:
db ‘Content-Type: text/html’,13,10,13,10,0
start_html:
db ‘Окружение CGI-программы выглядит так:
‘,13,10,0
for_stdin:
db ‘STDIN программы содержит:
‘,13,10,0
end_html:
db »,13,10,0
nwritten dd ?
toscr db 10 dup (32)
db ‘ — Тип файла’,0
.code
_start:
xor ebx,ebx
call GetStdHandle,STD_OUTPUT_HANDLE
mov hStdout,eax
call GetStdHandle,STD_INPUT_HANDLE
mov hStdin,eax
call write_stdout, offset header
call write_stdout, offset start_html
call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
mov hMem,eax
mov edi,eax
call GetEnvironmentStringsA
mov esi,eax
next_symbol:
mov al,[esi]
or al,al
jz end_string
mov [edi],al
next_string:
cmpsb
jmp short next_symbol
end_string:
mov [edi],’>rb add edi,3
cmp byte ptr [esi+1],0
jnz next_string
inc edi
stosb
call write_stdout, hMem
call write_stdout, offset for_stdin
call GetFileSize,[hStdin],ebx
mov edi,hMem
call ReadFile,[hStdin],edi, eax,offset nwritten, ebx
add edi,[nwritten]
mov byte ptr [edi],0
call write_stdout, hMem
call write_stdout, offset end_html
call VirtualFree,hMem
call ExitProcess,-1
write_stdout proc bufOffs:dword
call lstrlen,bufOffs
call WriteFile,[hStdout],bufOffs,eax,offset nwritten,0
ret
write_stdout endp
extrn GetEnvironmentStringsA:near
extrn GetStdHandle:near
extrn ReadFile:near
extrn WriteFile:near
extrn GetFileSize:near
extrn VirtualAlloc:near
extrn VirtualFree:near
extrn ExitProcess:near
extrn lstrlen:near
ends
end _start
Исполняемый файл строится командами:
tasm32.exe /ml test.asm
tlink32.exe /Tpe /ap /o test.obj
Не забудьте, что программа должна быть консольной.
Вызывать эту программу можно используя вышеописанную html-форму, нужно только поменять имя test.bat в форме на test.exe и скопировать его в /cgi-bin/ соответственно, при том можно выставить в методе запроса POST, программа его обрабатывает.
Еще хочу отметить, что можно вызывать программу и по-другому, можно создать в каталоге cgi-bin файл например test.cgi с одной единственной строчкой «#!c:/_путь_/test.exe» и вызывать в запросах его, а сервер в свою очередь будет читать первую его строчку и запускать exe-файл, для этого необходимо, чтобы в настройках http-сервера было прописано расширение *.cgi как расширение для скриптов. При таком подходе сервер запустит нашу программу с командной строкой «test.exe путь_к_test.exe» это имеет несколько плюсов – первое, это то, что человек, запускающий наш скрипт не будет даже догадываться на чем скрипт написан, второе – так-как нам передается имя файла с нашей строчкой мы можем например дописать в этот файл какие-либо настройки для нашего скрипта, что упрощает отладку, кстати именно так работают все интерпретаторы – вы успели заметить, что во всех perl/php/итд программах, присутствует подобная строка – указывающая на сам командный интерпретатор. Так вот сервер при запуске cgi-программы, если расширение программы прописано у него как скрипт в настройках читает первую строку файла, и если она оказывается описанного выше формата, то запускает указанную в строчке программу с именем этого файла ч/з пробел, допустим что в строчке указан интерпретатор перла, он получив такой подарок начинает его выполнение, т.к. комментарий в перле это символ «#», то первую строчку он пропускает и идет дальнейшее выполнение скрипта, в общем штука удобная.
Источник: habr.com
Какие программы можно создавать с помощью cgi
CGI (от англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа».
Поскольку гипертекст статичен по своей природе, веб-страница не может непосредственно взаимодействовать с пользователем. До появления JavaScript , не было иной возможности отреагировать на действия пользователя, кроме как передать введенные им данные на веб-сервер для дальнейшей обработки. В случае CGI эта обработка осуществляется с помощью внешних программ и скриптов, обращение к которым выполняется через стандартизованный (см. RFC 3875: CGI Version 1.1) интерфейс — общий шлюз.
Упрощенная модель, иллюстрирующая работу CGI:
Сам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода-вывода. Такими возможностями обладают даже скрипты для встроенных командных интерпретаторов операционных систем, поэтому в простых случаях могут использоваться даже командные скрипты.
Как работает CGI?¶
Обобщенный алгоритм работы через CGI можно представить в следующем виде:
- Клиент запрашивает CGI-приложение по его URI.
- Веб-сервер принимает запрос и устанавливает переменные окружения, через них приложению передаются данные и служебная информация.
- Веб-сервер перенаправляет запросы через стандартный поток ввода (stdin) на вход вызываемой программы.
- CGI-приложение выполняет все необходимые операции и формирует результаты в виде HTML.
- Сформированный гипертекст возвращается веб-серверу через стандартный поток вывода (stdout). Сообщения об ошибках передаются через stderr.
- Веб-сервер передает результаты запроса клиенту.
Области применения CGI¶
Это обеспечивается возможностью подключения CGI-скрипта к базе данных, а также возможностью обращаться к файловой системе сервера. Таким образом CGI-скрипт может сохранять информацию в таблицах БД или файлах и получать ее оттуда по запросу, чего нельзя сделать средствами HTML.
CGI — это не язык программирования! Это простой протокол, позволяющий веб-серверу передавать данные через stdin и читать их из stdout. Поэтому в качестве CGI-обработчика может использоваться любая серверная программа, способная работать со стандартными потоками ввода-вывода.
Примеры¶
Пример на Python:
#!/usr/bin/python print(«»»Content-Type: text/plain Hello, world!»»»)
В этом коде строка #!/usr/bin/python указывает полный путь к интерпретатору Python.
#include int main(void) printf(«Content-Type: text/plainnn»); printf(«Hello, world!nn»); return 0; >
Строка Content-type: text/htmlnn — http-заголовок, задающий тип содержимого (mime-type). Удвоенный символ разрыва строки (nn) — обязателен, он отделяет заголовки от тела сообщения.
Все скрипты, как правило, помещают в каталог cgi (или cgi-bin) сервера, но это необязательно: скрипт может располагаться где угодно, но при этом большинство веб-серверов требуют специальной настройки. В веб-сервере Apache, например, такая настройка может производиться при помощи общего файла настроек httpd.conf или с помощью файла .htaccess в том каталоге, где содержится этот скрипт. Также скрипты должны иметь права на исполнение ( chmod +x hello.py ).
Переменные окружения¶
Все CGI-приложения имеют доступ к переменным окружения, устанавливаемым веб-сервером. Эти переменные играют важную роль при написании CGI-программ. В таблице перечислены некоторые из переменных, доступных CGI.
Пример вывода переменных окружения CGI-скрипта:
1 2 3 4 5 6 7 8
#!/usr/bin/python import os print(«Content-type: text/htmlrnrn») print(«Environment
«) for param in os.environ.keys(): print(» %20s : %s
» % (param, os.environ[param]))
Преимущества CGI¶
- Процесс CGI скрипта не зависит от Веб-сервера и, в случае падения, никак не отразится на работе последнего
- Может быть написан на любом языке программирования
- Поддерживается большинством Веб-серверов
Недостатки CGI¶
Самым большим недостатком этой технологии являются повышенные требования к производительности веб-сервера. Дело в том, что каждое обращение к CGI-приложению вызывает порождение нового процесса, со всеми вытекающими отсюда накладными расходами. Если же приложение написано с ошибками, то возможна ситуация, когда оно, например, зациклится. Браузер прервет соединение по истечении тайм-аута, но на серверной стороне процесс будет продолжаться, пока администратор не снимет его принудительно.
Альтернативы¶
- FastCGI — дальнейшее развитие технологии CGI. Поддерживается многими Веб-серверами, например Nginx.
- Веб-сервера, в которые уже встроена поддержка дополнительных стандартов и протоколов, таких как WSGI (Gunicorn, waitress, uwsgi)
- Веб-сервер, функционал которого расширяется через модули, например, Apache (mod_wsgi, mod_php, mod_fastcgi)
Практика¶
- https://docs.python.org/2/library/cgihttpserver.html
- https://docs.python.org/3/library/http.server.html
Для запуска CGI сервера необходимо перейти в директорию sourcecode и выполнить команду:
python -m CGIHTTPServer 8000
Источник: lectureswww.readthedocs.io
Что такое CGI-графика и как ее создают
CGI — это технология, которая нужна для создания реалистичной графики и спецэффектов.
Анастасия Хамидулина
Автор статьи
7 марта 2023 в 11:44
Если дизайнер освоил векторную графику, разобрался с растровой и овладел навыком 3D-иллюстрации, пришло время для CGI (сиджиай). Спецы, которые работают с этой технологией, создают реалистичные модели, спецэффекты, анимируют объекты. На выходе получают реалистичную картинку. Как в жизни, но созданную на компьютере.
Что такое CGI и где используют
CGI — это технология в дизайне. Спецы-CGI создают статичный или анимированный визуал в компьютерных программах: трехмерных персонажей и сцены, спецэффекты, анимации. Чтобы добавить реалистичности, дизайнеры используют текстуры, накладывают освещение и разные эффекты вроде дыма или дождя.
Пример CGI: драконы, Король Ночи и сами актеры в некоторых сценах сериала «Игра престолов». В разных проектах количество компьютерной графики отличается. Где-то рисуют и анимируют всё — от окружающей обстановки до персонажей, а где-то лишь чуть-чуть штрихуют кожу.
️ Где используют CGI-графику. Фактически везде: от рекламы, архитектуры и инжиниринга до виртуальной реальности и искусства. Может показаться, что CGI-дизайн — дорого. Но гораздо дороже разрабатывать физические миниатюры, нанимать актеров или рисковать безопасностью в попытках воссоздать спецэффекты на киноплощадке.
Кто работает с CGI. Например:
- универсальные дизайнеры;
- художники-мультипликаторы;
- специалисты по мультимедиа;
- художники компьютерной графики;
- киношники;
- архитекторы;
- производители компьютерного программного обеспечения;
- инженеры.
Если интересуетесь дизайном, но хотите начинать не с узкой области вроде CGI, а стать универсальным специалистом, — пройдите практический курс «Графический дизайнер» от Skypro. В программе Photoshop, Figma, Tilda, Illustrator, типографика и верстка в InDesign, UX-копирайтинг, векторная графика, лендинги и многое другое. Освоите новую профессию за 10 месяцев: учиться можно в любое время.
Как в мире появился CGI: краткий экскурс
CGI — это широкий термин для обозначения компьютерной графики. Впервые ее использовали в фильме «Мир Дикого Запада» аж в 1973 году.
В фильме изобразили тепловидение робота-Стрелка
Ранняя компьютерная графика не была хороша по сегодняшним меркам: выглядела нереалистично и грубо, но на неискушенного зрителя производила сильное впечатление.
В 1993 году мир увидел реалистичных динозавров в фильме «Парк Юрского периода». С помощью CGI-технологий они двигались как настоящие, а дизайнеры сделали так, что их кожа была как у живых рептилий. Фильм оставался самым кассовым до выхода «Титаника». Затем в киноиндустрии начали массово использовать технологию.
Фильм «Парк Юрского периода» — пример, что такое CGI-технология в кино: динозавры нарисованы от и до, но выглядят как живые
В 1995 году кинематографисты впервые использовали компьютерную графику для создания целого фильма «История игрушек». Реалистичные компьютерные персонажи — Вуди, Базз и Рекс — поразили публику. Вскоре Pixar повторил успех: выпустил аналогичные фильмы «Корпорация монстров» и «В поисках Немо».
Пример компьютерного персонажа, который взаимодействует на экране с живыми актерами, — Голлум в фильме «Властелин колец». Здесь применили технологию захвата движения: сначала сняли настоящего человека, а потом сопоставили его движения с нарисованным CGI-Голлумом.
Персонаж Голлум — компьютерный, но движения принадлежат реальному актеру
Дальше — больше. В 2009 году фильм «Аватар» объединил захват движения актеров с захватом мимики. Персонажи, нарисованные на компьютере, получились сверхреалистичными.
Киноиндустрия продолжает использовать и совершенствовать CGI. Пример: пробивающий стену Халк, летающий Железный Человек, бегающие по улицам с живыми людьми трансформеры — всё это CGI. Но теперь технологию применяют и в коммерции: рекламщики, дизайнеры и архитекторы.
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT
Какие выделяют этапы разработки CGI
Моделирование. Первый этап работы CGI-дизайнера, на котором он создает форму объекта. Для этого у него есть инструмент — полигонная сетка. Дизайнер меняет сетку до тех пор, пока не получит нужный размер и форму. Результат выглядит как объект с множеством граней, по факту это черновик будущего дизайна.
Текстурирование. Специалист берет свой многогранный объект-черновик и накладывает на него текстуры. Грани сглаживаются. Дизайн начинает выглядеть реалистично.
Наложение света. Чтобы добиться еще большей натуралистичности, дизайнер размещает рядом с объектом источники света. Они создают тени и блики на объекте.
Риггинг. На этом этапе создают условный скелет, с помощью которого анимируют разные части объекта. Например, если объект — собака, то через скелет спец будет управлять ее лапами, хвостом, ушами, головой.
Композитинг. Это финальный шаг. Дизайнер объединяет все слои — с текстурой, тенями, бликами — и получает целостное CGI-изображение.
Какое ПО использовать, чтобы создавать CGI
Обычно CGI создают сразу в нескольких программах. В одной прорабатывают динамику, в другой накладывают спецэффекты. В третьей моделируют объекты, а в четвертой всё объединяют и получают анимированную сцену. Вот самые популярные программы CGI-дизайнеров:
After Effects. Программа, в которой создают 3D-персонажей, запускают анимации — дождя, дыма, огня. А еще строят модели объектов в трехмерном пространстве и создают визуальные эффекты.
ZBrush. Программное обеспечение для работы с 3D-графикой. В нём рисуют, моделируют, занимаются скальпингом. Например, разрабатывают внешний вид ювелирных изделий, автомобилей, самолетов, игрушек, элементов компьютерных игр.
Cinema 4D. Универсальное ПО для моделирования 3D-объектов, оформления эффектов, редактуры предметов, наложения теней, бликов и текстур.
Maya Autodesk. Программа, в которой создают персонажей, работают над спецэффектами, 3D-анимацией. Maya Autodesk используют для комбинаторных съемок — когда сначала снимают живых людей, а потом поверх накладывают графику.
Blender. Бесплатная программа, в которой работают аниматоры, дизайнеры интерьеров и игровые дизайнеры. Поддерживает рендеринг VR, шейдеры PBR, рендеринг GPU и CPU, освещение HDR.
Главное: что такое CGI
- CGI — это технология в дизайне. Она нужна, чтобы создавать реалистичную компьютерную графику, анимацию, спецэффекты и сцены.
- CGI используют в кино, рекламе, инжиниринге, видеоиграх, сериалах, архитектуре. По сути — везде, где дорого использовать физические модели или небезопасно воссоздавать спецэффекты.
- CGI-дизайнер работает не в одном ПО, а сразу в нескольких. Где-то создает модель, где-то накладывает текстуры, а где-то — анимирует разные части компьютерной сцены.
- В основном работа CGI-дизайнера состоит из пяти этапов: моделирования, текстурирования, наложения света, риггинга и композитинга.
Источник: sky.pro