Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

BR-ovi kristalografski računarski tutorijali


Bernhard Rupp

CGI skriptovanje - ova stranica sada je dostupna i na beloruskom !

Postoji mala CGI skripta koja dekodira prostornu grupu. Samo unesite valid space goup symbol (validni simbol prostorne grupe) ili broj prostorne grupe (1-230) i eto ga! Idemo:

Unesite prostornu grupu ili broj prostorne grupe i pritisnite enter.

Kul, zar ne? Pa kako to funkcioniše?

Uvod

Veb stranice koje vi vidite zapravo su klijent strana klijent-server veze preko interneta. Ako vaš pretraživač (klijent) želi da vidi neku veb stranicu, na primer, on šalje zahtev domaćinu kojeg ste naveli u URL (Uniform Resource Locator) korišćenjem određenog protokola (HTTP u ovom slučaju, Hyper Text Transfer Protocol). Primer za URL: http://vvv.ruppveb.org/default.htm (protokol://sajt.domen/dokument). Ime sajta nije ništa drugo nego naziv dodeljen IP adresi mašine (na primer: 128.115.150.112) na kojoj radi (veb) server. (NAPOMENA: u ovom kontekstu server je program koji pokreće veb uslugu na mašini, a ne sam računar - računar je domaćin).

Kada server primi takav zahtev, on odgovara i šalje nazad stranu, ili šta god za šta je zahtev bio upućen. Jezik kojim server i klijent komuniciraju je HTML (Hyper Text Markup Language). Osim statičkih zahteva za veb stranicama, neko će možda želeti da server da obavi određeni zadatak (kao što je pretraživanje baze podataka ili dekodiranje prostorne grupe). Mora postojati mehanizam da bi server dobio informacije o tome šta treba da uradi i da se predaju aplikaciji koja obrađuje zahtev. Ovaj interfejs je CGI (Common Gateway Interface). Server u suštini postavlja određene promenljive sistemskog okruženja, koje pozvani program može da pročita i obradi. Izlaz se vraća serveru prosleđujući ga preko interneta pretraživaču koji je izvršio upit i koji sada prikazuje rezultat. Možete da pogledate CD Microsoft Internet Developement ili neke druge reference za više informacija o ovoj temi.

Primer

Na ovoj veb stranici koristio sam sledeću skriptu za kreiranje polja za unos i definisanje akcije koju treba preduzeti:
<form action="/cgi-bin/sexie32.exe" method="GET">
  <p>Enter a spacegroup or spacegroup number 
  <input type="text" size="11" name="spcgrp"> 
  and hit enter</p>
</form>
ovaj minimalni kod stvara gornje polje za unos, dodeljuje unos promenljivoj pod nazivom "spcgrp" i pokreće program sexie32 koji obavlja posao. Kako da ubacim promenljivu prostorne grupe u program? Određivanjem GET kao metode, server dodaje ime promenljive i njen sadržaj posle upitnika na imenu programa i smešta ovaj niz u promenljivu okruženja QUERY_STRING. Program samo čita ovaj niz promenljive okruženja, dekodira ga, i nakon obračuna, dopiše rezultat kao HTML fajl na standardni izlaz (konzola) koji server preusmerava podnosiocu zahteva. Većina jezika skriptovanja nude biblioteke i ne morate da se bavite detaljima čitanja sistemskog okruženja.

FORTRAN

Kao naučnici, možemo imati koristi od programa FORTAN koji dobro obavlja posao i bilo bi poželjno da bude dostupan na internetu. Očigledna prednost jeste u tome što ne morate da se bavite pitanjima platforme i implementacije - nema množenja nepotvrđene verzije, nema zbrke oko izvornog koda itd - aplikacija radi na vašem računaru domaćinu, a pretraživači brinu o implementaciji specifičnoj za platformu. Odjednom vaš stari F66 kod ima grafički windows interfejs!

Podrutina WEBSPC čita promenljive okruženja i vraća niz prostorne grupe glavnoj rutini.
      subroutine webspc (spcgrp,title,igr,ierr)                         WEBS0001
c ----------------------------------------------------------------------WEBS0002
c     returns space group passed from web server through GET method     WEBS0003
c ----------------------------------------------------------------------WEBS0004
      USE MSFLIB                                                        WEBS0005
      integer*4 lstr                                                    WEBS0006
      integer igr(36)                                                   WEBS0007
      character today*24,spcgrp*10,title*60,usradd*15,fname*60,qstr*80  WEBS0008
      character usrnam*80,browsr*80                                     WEBS0009
                                                                        WEBS0010
c --- Set spacegroup blank                                              WEBS0011
      spcgrp='          '                                               WEBS0012
      ierr=0                                                            WEBS0013
Evo kako da pročitate promenljive okruženja koje su postavljene od strane servera u skladu sa uputstvima u HTML fragmentu koda iznad. Naći ćete spisak ostalih promenljivih koje su uvrštene u većinu knjiga o veb programiranju (neke od njih čita i webspc). Ključ je QUERY_STRING koji sadrži promenljivi deo URL-a sastavljen gorenavedenim postupkom:

http://ruppveb.dindns.org/cgi-bin/sexie32.exe?spcgrp=I+4%2Fm+m+m

QUERY_STRING sadrži: spcgrp=I+4%2Fm+m+m (NAPOMENA: ako unesete URL adresu iznad ili kliknite na nju, CGI skripta će zapravo biti pokrenuta). Primetite takođe da CGI interfejs zamenjuje praznine sa + znakovima i posebnim karakterima čijem heksadecimalnom kodu predhodi znak % (npr. kosa crta je %2F). Stvarni niz unet u polje bio je 'I 4/m m m' u ovom slučaju..
                                                                        WEBS0014
c --- get the client name and the query_string from environment         WEBS0015
      ladd = GETENVQQ('REMOTE_ADDR', usradd)                            WEBS0016
      lnam = GETENVQQ('REMOTE_USR', usrnam)                             WEBS0017
      lbrs = GETENVQQ('HTTP_USER_AGENT', browsr)                        WEBS0018
      lstr = GETENVQQ('QUERY_STRING', qstr)                             WEBS0019
                                                                        WEBS0020
c --- read space group - if an integer decode by number                 WEBS0021
      read(qstr,'(7x,i3)',err=0001) ispa                                WEBS0022
c --- if we get here, it was read successfully as a number              WEBS0023
Imajte na umu da koristim pogrešnu oznaku prilikom čitanja simbola kao celine da bih razlikovao da li je unet simbol prostorne grupe ili broj prostorne grupe.
      call spsymc (spcgrp,ispa)                                         WEBS0024
c --- ispa returns the symbol now proceed with checks                   WEBS0025
      goto 2002                                                         WEBS0026
                                                                        WEBS0027
c --- parse the input string if not a number                            WEBS0028
0001  continue                                                          WEBS0029
      ilen=lstr-7                                                       WEBS0030
      j=0                                                               WEBS0031
c --- begin loop over query_string                                      WEBS0032
Primetite da CGI interfejs zamenjuje praznine sa + znakovima i posebnim karakterima čijem heksadecimalnom kodu predhodil znak% (npr. / je %2F), tako da moramo da analiziramo taj niz.
      i=8                                                               WEBS0033
1000  continue                                                          WEBS0034
c ---    replace + with blank                                           WEBS0035
         if (qstr(i:i).eq.'+') then                                     WEBS0036
            j=j+1                                                       WEBS0037
            spcgrp(j:j)=' '                                             WEBS0038
            i=i+1                                                       WEBS0039
c ---    replace special character hex code with character              WEBS0040
         else if (qstr(i:i).eq.'%') then                                WEBS0041
c ---       %2F is slash                                                WEBS0042
            if (qstr(i+1:i+2).eq.'2F') then                             WEBS0043
               j=j+1                                                    WEBS0044
               spcgrp(j:j)='/'                                          WEBS0045
               i=i+3                                                    WEBS0046
            end if                                                      WEBS0047
         else                                                           WEBS0048
            j=j+1                                                       WEBS0049
            spcgrp(j:j)=qstr(i:i)                                       WEBS0050
            i=i+1                                                       WEBS0051
         end if                                                         WEBS0052
c --- repeat until finished with string                                 WEBS0053
      if (i.lt.(ilen+8)) goto 1000                                      WEBS0054
                                                                        WEBS0055
c --- now check if a valid space group symbol                           WEBS0056
 2002 call upstrg(spcgrp,10)                                            WEBS0057
      read(spcgrp,'(10a1)') (igr(i), i=1,10)                            WEBS0058
      ispa=0                                                            WEBS0059
      call spsymc (spcgrp,ispa)                                         WEBS0060
                                                                        WEBS0061
c --- get a date string, format is :Wed Nov 20 15:33:29 1996            WEBS0062
      call fdate (today)                                                WEBS0063
      title='Webjob on '//today(1:10)//today(20:24)//' at'//            WEBS0064
     & today(11:19) //' from '//usradd                                  WEBS0065
Program takođe vodi evidenciju o korisnicima.
c --- log the job                                                       WEBS0066
      fname='C:\inetsrv\wwwroot\webjobs.html'                           WEBS0067
      open (66,file=fname,access='append',position='append')            WEBS0068
c --- overwrite old </body> tag                                         WEBS0069
      backspace (66)                                                    WEBS0070
      write(66,'(a,a,a)')' <p>Date   : '//today//'<br>'                 WEBS0071
      write(66,'(a,a,a)')' Client : '//usradd(1:ladd)//'<br>'           WEBS0072
      write(66,'(a,a,a)')' Browser : '//browsr(1:lbrs)//'<br>'          WEBS0073
      write(66,'(a,a,a)')' Spacegr: '//spcgrp//'<br>'                   WEBS0074
      if (ispa.lt.0) then                                               WEBS0075
         write(66,'(a)')' Status : failed!</p>'                         WEBS0076
      else                                                              WEBS0077
         write(66,'(a)')' Status : ok</p>'                              WEBS0078
      end if                                                            WEBS0079
      write(66,'(a)')    ' <hr>'                                        WEBS0080
      write(66,'(a)')    ' </BODY>'                                     WEBS0081
      close(66)                                                         WEBS0082
c --- if something went wrong, return message and termination signal    WEBS0083
      if (ispa.lt.0) then                                               WEBS0084
         call webtxt (1,spcgrp)                                         WEBS0085
         ierr=1                                                         WEBS0086
         close(5)                                                       WEBS0087
         return                                                         WEBS0088
      else                                                              WEBS0089
         close(5)                                                       WEBS0090
         return                                                         WEBS0091
      end if                                                            WEBS0092
      return                                                            WEBS0093
      end                                                               WEBS0094
Promenljiva spcgrp vraća se glavnoj rutini koja dekodira prostornu grupu. Izlaz se zapisuje u fajl, i sve što je potrebno jeste malecka rutina da se ovaj izlaz zapiše kao HTML fajl na standardnom izlazu (konzola).
      subroutine htmake                                                 HTMA0001
                                                                        HTMA0002
      character*80 line                                                 HTMA0003
                                                                        HTMA0004
      open(6,file='sexie.out')                                          HTMA0005
      write(*,*)'Content-type: text/html'                               HTMA0006
      write(*,*)                                                        HTMA0007
      write(*,*)'<BODY bgcolor="#FFFDE6" TEXT="#0000FF">'               HTMA0008
      write(*,*)'<TITLE>Space group decoding</TITLE>'                   HTMA0009
      write(*,*)'<pre>'                                                 HTMA0010
      do i=1,100000                                                     HTMA0011
         read(6,'(1x,a)',end=9999) line                                 HTMA0012
         write(*,'(1x,a)') line                                         HTMA0013
      end do                                                            HTMA0014
9999  close(6)                                                          HTMA0015
      open(6,file='xyz.txt')                                            HTMA0016
      write(*,'(//a//)')                                                HTMA0017
     &  ' Alternate listing of symmetry operators follows'              HTMA0018
      do i=1,100000                                                     HTMA0019
         read(6,'(1x,a)',end=9990) line                                 HTMA0020
         write(*,'(1x,a)') line                                         HTMA0021
      end do                                                            HTMA0022
9990  close(6)                                                          HTMA0023
      write(*,*) '</pre>'						HTMA0024
      write(*,*) '</BODY>'                                              HTMA0025
      return                                                            HTMA0026
      end                                                               HTMA0027
Dakle, to je sve što treba da znate o osnovnom CGI skriptovanju. Samo napred, napišite sami fragment koda i igrajte se malo. Koristio sam Microsoft FrontPage [2] da napravim svoj sajt i forme, kao i Microsoft FORTRAN Professional Edition za F90 programiranje. Vaš FORTRAN kompajler može koristiti neki drugačiji način da dođe do promenljive okruženja, ali to bi trebalo da možete da pronađete u svojoj dokumentaciji. Naravno, ovo NIJE podstrek da pišete CGI skripte u FORTRAN-u. Izvršni fajlovi su glomazni i puni dodataka, i za mnoge zadatke brži su C, Pearl, J++ itd. Međutim, ako imate solidno parče koda, hej, zašto ga ne biste učinili upotrebljivim na internetu!



Published (Last edited): 05-09-2012 , source: http://www.ruppweb.org/xray/comp/cgi_prog.htm