SlideShare a Scribd company logo
1 of 33
Desenvolvimento
   Rápido de
 Aplicações com
  Tcl e XOTcl
Porque usar scripts?
●
    Interatividade: não há o ciclo “edita-compila-
    testa”.
●
    Menos linhas de código (alto-nível).
●
    Melhor representação dos dados (no Tcl, por
    exemplo, tudo é string).
●
    Portabilidade. (Linux (e outros unices),
    Windows, Mac, mobile, embedded, ...)
O que podemos fazer com Tcl?
●
    MITO: linguagens de script são muito lentas,
    não devem ser usadas em aplicações velozes
    (processamento de vídeo, por exemplo)
●
    REALIDADE: só uma pequena fração do
    código precisa ter velocidade extrema; scripts
    nos fornecem mais controle, flexibilidade e
    menos linhas de código.
Starkits
●
    Scripts e extensões encapsulados em um único
    arquivo (.kit), portável (Linux/Windows/Mac)
●
    Executável separado para cada plataforma:
    tclkit, tclkit.exe
●
    Diretório virtual. Pode conter scripts, bibliotecas
    (multiplas versões, uma para cada OS),
    documentação. Implementado no topo do
    banco de dados Metakit.
Manipulando kits
●
    Utilitário sdx
    ●   sdx qwrap programa.tcl
        –   Gera um kit a partir do script fornecido
    ●   sdx unwrap programa.kit
        –   Expande o kit como o diretório programa.vfs
    ●   sdx wrap programa.kit
        –   Reempacota o kit usando o diretório programa.vfs
        –   Opcionalmente, podemos usar -runtime tclkit para
            produzir um starpack (tudo em um só executável).
Bibliotheca
Bibliotheca (2)
●
    Cada livro é representado por uma imagem
    (capa) de tamanho reduzido.
●
    Formatos dos arquivos (livros): pdf, djvu,
    chm, ps,...(outros podem ser suportados
    facilmente)
●
    Comandos para incluir novos livros,
    reorganizar as “estantes”, criar ícones para
    um livro, ou até para transferir o conteúdo
    (ssh) a partir de um servidor.
Bibliotheca (3)
●
    Informações sobre livros armazenados numa
    lista:

    <arquivo_do_livro> <ícone> <estante>

    ●   Todos os livros localizados em um diretório
        único, configurável.
    ●   Ícones de tamanho até 96x128 pixels,
        variável.
    ●   Cada “estante virtual” agrupa livros de
        assunto similar.
Bibliotheca (4)
Bibliotheca (5)
proc showDoc {fn} {
global P
after cancel setupButMotion
switch [file extension $fn] {
   ".Chm" -
   ".chm" {
      set P(chan) [open "|xchm "$fn"" r+] }
   ".Pdf" -
   ".pdf" -
   ".PDF" {
      set P(chan) [open "|acroread "$fn"" r+] }
   ".djvu" { set P(chan) 
         [open "|djview "$fn"" r+] }
   default { set P(chan) [open "|gv "$fn"" r+] }
}
fileevent $P(chan) readable 
      [list execHndl $P(chan)]
}
Critcl
●
    Permite criar novos comandos (extensões para
    o Tcl) em C, em scripts.
    package provide fork 1.0
    critcl::ccode {
       #include <unistd.h>
    }
    critcl::cproc fork {} int {
       return fork();
    }

●
    Compilado com: critcl -pkg fork
●
    Extensão produzida pode ser incluida na
    aplicação normalmente, com:
Aplicação com dual vídeo
Libavformat/avcodec + SDL
       interfaceados com Tcl
●
    libavformat/avcodec (ffmpeg)
    ●
        Decodifica vídeo/áudio
    ●
        Redimensiona os quadros (video frames)
●
    SDL
    ●
        Preenche os buffers de vídeo na tela, usando MMX
        e outras tecnologias para obter maior desempenho
●
    Tcl
    ●
        Aplicação principal: controla todo o contexto
Dual vídeo extension
package provide embvideo 1.0
critcl::cheaders -g -I. -DLINUX 
   -I/usr/local/include/ffmpeg/ -I/usr/local/include/

critcl::clibraries -L/usr/lib -L/usr/local/lib 
   -lavformat -lavcodec -lavutil -lSDL -lSDL_image -lz

critcl::ccode {
   #include "embvideo.c"
}
::critcl::cproc vidinit { Tcl_Interp* ip
      int wid int dual } ok {
   ...
   return TCL_OK;
}
. . .
. . .
Dual vídeo extension (2)
●   Usa 3 buffers (shared memory) para enviar video
    frames, comandos e status entre os processos
    de vídeo/audio, sincronizando a comunicação
    por meio de signals.
        mmfd = open("/dev/zero",O_RDWR);
        mmpixels = mmap(0,sfrw*sfrh*3, PROT_READ|PROT_WRITE,
        MAP_SHARED, mmfd, 0);
        close(mmfd);

●
    Comandos ofertados ao script tcl:
    ●   vidsetmovie <audio/video_filename>
        vidcmd <large | small>
        vidinit <window id> <flags>
        vidcheckend, vidwait, vidquit
Protocolo do libavformat
URLProtocol decrypt_protocol = {
    "decrypt",
    decrypt_open,
    decrypt_read,
    NULL /*decrypt_write*/,
    decrypt_seek,
    decrypt_close,
};


             decrypt:arquivo_video_audio

  Registrando o novo protocolo em libavformat:
        register_protocol(&decrypt_protocol);
XOTcl (exotickle)
●
    Sistema de objetos poderoso, baseado no
    CLOS (Common Lisp Object System)
●
    Adiciona dois novos comandos apenas: Object
    e Class.
●
    Introspecção completa em todos os aspectos
    dos objetos através do comando standard já
    presente no tcl, info.
●
    Suporte a muitas abstrações como filtros,
    mixins, slots, nested classes, method
XOTcl (2)
Exemplo: configurador.xotcl
●
    Definindo (ou adicionando) uma ou mais
    opções:
    ●   config state {width 800 height 600
          background “cadet blue”}
●
    Apagando todas as opções armazenadas:
    ●   config state -clear yes
●
    Obtendo todas as opções existentes:
    ●   config state
●
    Outros comandos: config   load, config save
configurador.xotcl
Object config
config proc state {{-clear 0} {newstate ""}} {
   if {$newstate != ""} {
      foreach {v contents} $newstate {
         my set $v $contents
      }
   }
   set r {}
   foreach v [my info vars] {
      lappend r $v [my set $v]
   }
   if $clear {
      foreach v [my info vars] {
         my unset $v
      }
   }                            my
                                 my       [self]
                                           [self]
   return $r
}
configurador.xotcl (3)
config proc save {filename} {
  set f [open $filename w]
  puts $f [my state]
  close $f
}

config proc load {filename} {
  set f [open $filename r]
  my state [read $f]
  close $f
}
Peculiaridades do XOTcl
●
    XOTcl tem caraterísticas diferentes do
    tradicional (C++/Java):
    ●
        Sistema de classes dinâmico. Tudo pode ser mudado a
        qualquer instante.
    ●
        É voltado aos objetos e não às classes, ou seja, cada
        objetos tem vida independente, podendo ter suas
        próprias “procs”, variáveis específicas do objeto, etc.
    ●
        É completamente reflexiva (um programa pode
        observar seu próprio comportamento e modificá-lo, se
        desejado).
XOTclIDE


Component browser




                Object Browser
Classes e Objetos
●
    Uma classe generaliza operações e variáveis
    dos objetos (instâncias).
      Class   Curso
      Curso   instproc init args {
         my   set pre-requisitos ""
      }
      Curso   instproc sethorario hr {
         my   set horario $hr
      }

      Curso historia -sethorario 10:30
Precedência do next
Class Terrestre
Class Maritimo
Terrestre instproc desc args {return "-terrestre-
[next]"}
Maritimo instproc desc args {return "-maritimo-[next]"}

Class Anfibio -superclass {Terrestre Maritimo}
Anfibio   instproc desc args {return "-anfibio-[next]"}

Terrestre automovel
Maritimo lancha
lancha proc desc args {return "-lancha-[next]"}

Anfibio hovercraft
   -terrestre-
hovercraft proc desc args {return "-hovercraft-[next]"}
   -lancha—maritimo-
   -hovercraft--anfibio--terrestre--maritimo-
Nested objects
●   historia contains {Object idade_media}
●   Class Point -parameter {{x 100} {y 300}}
    Class Rectangle -parameter {color}
    Rectangle r0 -color pink -contains {
       Rectangle r1 -color red -contains {
          Point x1 -x 1 -y 2
          Point x2 -x 1 -y 2
       }
       Rectangle r2 -color green -contains {
          Point x1
          Point x2
       }
    }

                      ::historia::idade_media

                      historia idade_media
Filtros
Object instproc exempFiltro {args} {
   puts "self        = [self]"
   puts "calledproc = [self calledproc]"
   puts "args = $args"
   puts ---------------------------
   next
}

Class TesteClass
TesteClass filter exempFiltro
TesteClass umObjeto

                        className instproc FilterName args {
                           pre-part
                           next
                           post-part
                         }
Filtros (2)
●
    Filtros “por objeto” e “por classe”
      Class Painel
      Painel p1
      Painel p2

      Painel instproc observaFiltro args {
         puts "observaFiltro para objeto: [self]"
         set r [next]
         puts "observaFiltro (obj=[self]) retornou: $r"
      }

      Painel instfilter observaFiltro
Mixins
Class   Agent
Agent   instproc move {x y} {
    #   do the movement
}
Class   InteractiveAgent -superclass Agent

Class MovementLog
MovementLog instproc move {x y} {
    # movement logging
    next
}
Class MovementTest
MovementTest instproc move {x y} {
    # movement testing
    next
}

InteractiveAgent i1; InteractiveAgent i2
i1 mixin MovementLog
i2 mixin MovementTest MovementLog
Slots
●
    System slots: superclass,      class, mixin, instmixin,
    filter, instfilter.

●
    Attribute slots.
      Class Person -slots {
         Attribute name
         Attribute salary -default 0
         Attribute projects -default {}
            -multivalued true
      }                                 Acessa o slot meta-objeto
      Person slot name

      Person rildo
      rildo name “Rildo Pragana”
      rildo name
A função primitiva self
self – retorna o nome do objeto em execução
self class – retorna a classe que define a instproc corrente
self proc – retorna a proc ou instproc em execução
self callingclass – retorna a classe que chamou
     este método
self callingobject – objeto que chamou este método
self callingproc – a proc (ou método) que chamou
     o método corrente
self calledclass – a classe que contem essa
     proc (mixins, filters)
self calledproc – nome do método da proc alvo
     (só em filtros).
self isnextcall – retorna 1 se chamado por “next”
self next – retorna o path do próximo “next”
self filterreg – em um filtro: retorna o nome da classe/objeto
     onde foi registrado na forma 'obj filter nomeDoFiltro'
     ou 'classe instfilter nomeDoFiltro'
self callinglevel – nível da chamada
self activelevel – nível da pilha onde a proc foi chamada
Links interessantes
●
    http://www.pragana.net - Adventures in Linux
       Programming
●
    http://wiki.tcl.tk - Tcler's wiki (farta
       documentação!)
●
    http://www.tcl.tk - Tcl developer exchange
●
    http://media.wu-wien.ac.at - XOTcl homepage
●
    http://www.xdobry.de/xotclIDE/ - XOTclIDE
       homepage
●
    http://openacs.org - OpenACS (toolkit para
       aplicações web)
●
Perguntas




                ?
?
         ?

More Related Content

What's hot

Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasHelder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentesHelder da Rocha
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
Threads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaHelder da Rocha
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordidaLuciano Ramalho
 
Threads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threadsThreads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threadsHelder da Rocha
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 

What's hot (20)

Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Threads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão Mútua
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Threads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threadsThreads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threads
 
Objective-C
Objective-CObjective-C
Objective-C
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 

Viewers also liked

la pena de muerte
la pena de muertela pena de muerte
la pena de muerteyrltnprncss
 
Gabriel Dj
Gabriel DjGabriel Dj
Gabriel Djjggc
 
Os três reis dragões
Os três reis dragõesOs três reis dragões
Os três reis dragõesBetina Astride
 
2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo
2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo
2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santoRoberto C. Mayer
 
Company Profile - BusinessIntelligenze
Company Profile - BusinessIntelligenzeCompany Profile - BusinessIntelligenze
Company Profile - BusinessIntelligenzeBusinessIntelligenze
 
Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...
Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...
Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...kirtikar
 
Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.
Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.
Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.Fernando Tomás Casado
 
èPoca descobrimens
èPoca descobrimensèPoca descobrimens
èPoca descobrimenslcarmona59
 

Viewers also liked (18)

Ae04605217226
Ae04605217226Ae04605217226
Ae04605217226
 
la pena de muerte
la pena de muertela pena de muerte
la pena de muerte
 
Conector17 Term
Conector17 TermConector17 Term
Conector17 Term
 
Gabriel Dj
Gabriel DjGabriel Dj
Gabriel Dj
 
Buaala.tv 3i
Buaala.tv 3iBuaala.tv 3i
Buaala.tv 3i
 
Soldadito
SoldaditoSoldadito
Soldadito
 
CáLculo D[1]..
CáLculo D[1]..CáLculo D[1]..
CáLculo D[1]..
 
Fotos
FotosFotos
Fotos
 
Os três reis dragões
Os três reis dragõesOs três reis dragões
Os três reis dragões
 
waskar resume
waskar resumewaskar resume
waskar resume
 
2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo
2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo
2014 06-11-marcello-siqueira-certics-overview-assespro-espirito-santo
 
Company Profile - BusinessIntelligenze
Company Profile - BusinessIntelligenzeCompany Profile - BusinessIntelligenze
Company Profile - BusinessIntelligenze
 
Ah04605234238
Ah04605234238Ah04605234238
Ah04605234238
 
Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...
Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...
Sampurna Tanavmukti Aani Samasyapurti (Total Stress Management In Marathi) Dr...
 
S18 m4 guia ciudadania secundaria
S18 m4 guia ciudadania secundariaS18 m4 guia ciudadania secundaria
S18 m4 guia ciudadania secundaria
 
Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.
Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.
Smart Cities: Sostenibilidad de una comunidad Impulsada por la tecnología.
 
Alfabeto dora aventureira
Alfabeto dora aventureiraAlfabeto dora aventureira
Alfabeto dora aventureira
 
èPoca descobrimens
èPoca descobrimensèPoca descobrimens
èPoca descobrimens
 

Similar to Desenvolvimento rápido com Tcl e XOTcl

Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2Daniel
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLelliando dias
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Lp script pug-pe
Lp script pug-peLp script pug-pe
Lp script pug-pehugoesb
 
Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018
Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018
Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018Tchelinux
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Python e Linux para a criação de ferramentas para pentest
Python e Linux para a criação de ferramentas para pentestPython e Linux para a criação de ferramentas para pentest
Python e Linux para a criação de ferramentas para pentestEdson Celio
 
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECLPHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECLErick Belluci Tedeschi
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
O Que é shell - bash
O Que é shell - bashO Que é shell - bash
O Que é shell - bashSérgio Silva
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com pythonUFPA
 
Orientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSLOrientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSLGeorge Mendonça
 

Similar to Desenvolvimento rápido com Tcl e XOTcl (20)

Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Aula python
Aula pythonAula python
Aula python
 
pgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQLpgBouncer: um aglomerador de conexões para PostgreSQL
pgBouncer: um aglomerador de conexões para PostgreSQL
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Lp script pug-pe
Lp script pug-peLp script pug-pe
Lp script pug-pe
 
Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018
Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018
Introdução ao SystemTap - João Avelino Bellomo Filho - Tchelinux Caxias 2018
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Python e Linux para a criação de ferramentas para pentest
Python e Linux para a criação de ferramentas para pentestPython e Linux para a criação de ferramentas para pentest
Python e Linux para a criação de ferramentas para pentest
 
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECLPHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
 
Desenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECLDesenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECL
 
String e IO
String e IOString e IO
String e IO
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Programação Orientada por Objectos - Aula 6
Programação Orientada por Objectos - Aula 6Programação Orientada por Objectos - Aula 6
Programação Orientada por Objectos - Aula 6
 
O Que é shell - bash
O Que é shell - bashO Que é shell - bash
O Que é shell - bash
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com python
 
Curso de java 02
Curso de java 02Curso de java 02
Curso de java 02
 
Orientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSLOrientação a Objetos com Python e UML - XIII FGSL
Orientação a Objetos com Python e UML - XIII FGSL
 

Desenvolvimento rápido com Tcl e XOTcl

  • 1. Desenvolvimento Rápido de Aplicações com Tcl e XOTcl
  • 2. Porque usar scripts? ● Interatividade: não há o ciclo “edita-compila- testa”. ● Menos linhas de código (alto-nível). ● Melhor representação dos dados (no Tcl, por exemplo, tudo é string). ● Portabilidade. (Linux (e outros unices), Windows, Mac, mobile, embedded, ...)
  • 3. O que podemos fazer com Tcl? ● MITO: linguagens de script são muito lentas, não devem ser usadas em aplicações velozes (processamento de vídeo, por exemplo) ● REALIDADE: só uma pequena fração do código precisa ter velocidade extrema; scripts nos fornecem mais controle, flexibilidade e menos linhas de código.
  • 4. Starkits ● Scripts e extensões encapsulados em um único arquivo (.kit), portável (Linux/Windows/Mac) ● Executável separado para cada plataforma: tclkit, tclkit.exe ● Diretório virtual. Pode conter scripts, bibliotecas (multiplas versões, uma para cada OS), documentação. Implementado no topo do banco de dados Metakit.
  • 5. Manipulando kits ● Utilitário sdx ● sdx qwrap programa.tcl – Gera um kit a partir do script fornecido ● sdx unwrap programa.kit – Expande o kit como o diretório programa.vfs ● sdx wrap programa.kit – Reempacota o kit usando o diretório programa.vfs – Opcionalmente, podemos usar -runtime tclkit para produzir um starpack (tudo em um só executável).
  • 7. Bibliotheca (2) ● Cada livro é representado por uma imagem (capa) de tamanho reduzido. ● Formatos dos arquivos (livros): pdf, djvu, chm, ps,...(outros podem ser suportados facilmente) ● Comandos para incluir novos livros, reorganizar as “estantes”, criar ícones para um livro, ou até para transferir o conteúdo (ssh) a partir de um servidor.
  • 8. Bibliotheca (3) ● Informações sobre livros armazenados numa lista: <arquivo_do_livro> <ícone> <estante> ● Todos os livros localizados em um diretório único, configurável. ● Ícones de tamanho até 96x128 pixels, variável. ● Cada “estante virtual” agrupa livros de assunto similar.
  • 10. Bibliotheca (5) proc showDoc {fn} { global P after cancel setupButMotion switch [file extension $fn] { ".Chm" - ".chm" { set P(chan) [open "|xchm "$fn"" r+] } ".Pdf" - ".pdf" - ".PDF" { set P(chan) [open "|acroread "$fn"" r+] } ".djvu" { set P(chan) [open "|djview "$fn"" r+] } default { set P(chan) [open "|gv "$fn"" r+] } } fileevent $P(chan) readable [list execHndl $P(chan)] }
  • 11. Critcl ● Permite criar novos comandos (extensões para o Tcl) em C, em scripts. package provide fork 1.0 critcl::ccode { #include <unistd.h> } critcl::cproc fork {} int { return fork(); } ● Compilado com: critcl -pkg fork ● Extensão produzida pode ser incluida na aplicação normalmente, com:
  • 13. Libavformat/avcodec + SDL interfaceados com Tcl ● libavformat/avcodec (ffmpeg) ● Decodifica vídeo/áudio ● Redimensiona os quadros (video frames) ● SDL ● Preenche os buffers de vídeo na tela, usando MMX e outras tecnologias para obter maior desempenho ● Tcl ● Aplicação principal: controla todo o contexto
  • 14. Dual vídeo extension package provide embvideo 1.0 critcl::cheaders -g -I. -DLINUX -I/usr/local/include/ffmpeg/ -I/usr/local/include/ critcl::clibraries -L/usr/lib -L/usr/local/lib -lavformat -lavcodec -lavutil -lSDL -lSDL_image -lz critcl::ccode { #include "embvideo.c" } ::critcl::cproc vidinit { Tcl_Interp* ip int wid int dual } ok { ... return TCL_OK; } . . . . . .
  • 15. Dual vídeo extension (2) ● Usa 3 buffers (shared memory) para enviar video frames, comandos e status entre os processos de vídeo/audio, sincronizando a comunicação por meio de signals. mmfd = open("/dev/zero",O_RDWR); mmpixels = mmap(0,sfrw*sfrh*3, PROT_READ|PROT_WRITE, MAP_SHARED, mmfd, 0); close(mmfd); ● Comandos ofertados ao script tcl: ● vidsetmovie <audio/video_filename> vidcmd <large | small> vidinit <window id> <flags> vidcheckend, vidwait, vidquit
  • 16. Protocolo do libavformat URLProtocol decrypt_protocol = { "decrypt", decrypt_open, decrypt_read, NULL /*decrypt_write*/, decrypt_seek, decrypt_close, }; decrypt:arquivo_video_audio Registrando o novo protocolo em libavformat: register_protocol(&decrypt_protocol);
  • 17. XOTcl (exotickle) ● Sistema de objetos poderoso, baseado no CLOS (Common Lisp Object System) ● Adiciona dois novos comandos apenas: Object e Class. ● Introspecção completa em todos os aspectos dos objetos através do comando standard já presente no tcl, info. ● Suporte a muitas abstrações como filtros, mixins, slots, nested classes, method
  • 19. Exemplo: configurador.xotcl ● Definindo (ou adicionando) uma ou mais opções: ● config state {width 800 height 600 background “cadet blue”} ● Apagando todas as opções armazenadas: ● config state -clear yes ● Obtendo todas as opções existentes: ● config state ● Outros comandos: config load, config save
  • 20. configurador.xotcl Object config config proc state {{-clear 0} {newstate ""}} { if {$newstate != ""} { foreach {v contents} $newstate { my set $v $contents } } set r {} foreach v [my info vars] { lappend r $v [my set $v] } if $clear { foreach v [my info vars] { my unset $v } } my my [self] [self] return $r }
  • 21. configurador.xotcl (3) config proc save {filename} { set f [open $filename w] puts $f [my state] close $f } config proc load {filename} { set f [open $filename r] my state [read $f] close $f }
  • 22. Peculiaridades do XOTcl ● XOTcl tem caraterísticas diferentes do tradicional (C++/Java): ● Sistema de classes dinâmico. Tudo pode ser mudado a qualquer instante. ● É voltado aos objetos e não às classes, ou seja, cada objetos tem vida independente, podendo ter suas próprias “procs”, variáveis específicas do objeto, etc. ● É completamente reflexiva (um programa pode observar seu próprio comportamento e modificá-lo, se desejado).
  • 23. XOTclIDE Component browser Object Browser
  • 24. Classes e Objetos ● Uma classe generaliza operações e variáveis dos objetos (instâncias). Class Curso Curso instproc init args { my set pre-requisitos "" } Curso instproc sethorario hr { my set horario $hr } Curso historia -sethorario 10:30
  • 25. Precedência do next Class Terrestre Class Maritimo Terrestre instproc desc args {return "-terrestre- [next]"} Maritimo instproc desc args {return "-maritimo-[next]"} Class Anfibio -superclass {Terrestre Maritimo} Anfibio instproc desc args {return "-anfibio-[next]"} Terrestre automovel Maritimo lancha lancha proc desc args {return "-lancha-[next]"} Anfibio hovercraft -terrestre- hovercraft proc desc args {return "-hovercraft-[next]"} -lancha—maritimo- -hovercraft--anfibio--terrestre--maritimo-
  • 26. Nested objects ● historia contains {Object idade_media} ● Class Point -parameter {{x 100} {y 300}} Class Rectangle -parameter {color} Rectangle r0 -color pink -contains { Rectangle r1 -color red -contains { Point x1 -x 1 -y 2 Point x2 -x 1 -y 2 } Rectangle r2 -color green -contains { Point x1 Point x2 } } ::historia::idade_media historia idade_media
  • 27. Filtros Object instproc exempFiltro {args} { puts "self = [self]" puts "calledproc = [self calledproc]" puts "args = $args" puts --------------------------- next } Class TesteClass TesteClass filter exempFiltro TesteClass umObjeto className instproc FilterName args { pre-part next post-part }
  • 28. Filtros (2) ● Filtros “por objeto” e “por classe” Class Painel Painel p1 Painel p2 Painel instproc observaFiltro args { puts "observaFiltro para objeto: [self]" set r [next] puts "observaFiltro (obj=[self]) retornou: $r" } Painel instfilter observaFiltro
  • 29. Mixins Class Agent Agent instproc move {x y} { # do the movement } Class InteractiveAgent -superclass Agent Class MovementLog MovementLog instproc move {x y} { # movement logging next } Class MovementTest MovementTest instproc move {x y} { # movement testing next } InteractiveAgent i1; InteractiveAgent i2 i1 mixin MovementLog i2 mixin MovementTest MovementLog
  • 30. Slots ● System slots: superclass, class, mixin, instmixin, filter, instfilter. ● Attribute slots. Class Person -slots { Attribute name Attribute salary -default 0 Attribute projects -default {} -multivalued true } Acessa o slot meta-objeto Person slot name Person rildo rildo name “Rildo Pragana” rildo name
  • 31. A função primitiva self self – retorna o nome do objeto em execução self class – retorna a classe que define a instproc corrente self proc – retorna a proc ou instproc em execução self callingclass – retorna a classe que chamou este método self callingobject – objeto que chamou este método self callingproc – a proc (ou método) que chamou o método corrente self calledclass – a classe que contem essa proc (mixins, filters) self calledproc – nome do método da proc alvo (só em filtros). self isnextcall – retorna 1 se chamado por “next” self next – retorna o path do próximo “next” self filterreg – em um filtro: retorna o nome da classe/objeto onde foi registrado na forma 'obj filter nomeDoFiltro' ou 'classe instfilter nomeDoFiltro' self callinglevel – nível da chamada self activelevel – nível da pilha onde a proc foi chamada
  • 32. Links interessantes ● http://www.pragana.net - Adventures in Linux Programming ● http://wiki.tcl.tk - Tcler's wiki (farta documentação!) ● http://www.tcl.tk - Tcl developer exchange ● http://media.wu-wien.ac.at - XOTcl homepage ● http://www.xdobry.de/xotclIDE/ - XOTclIDE homepage ● http://openacs.org - OpenACS (toolkit para aplicações web) ●
  • 33. Perguntas ? ? ?