SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Aplicações do
    Tcl e Starkits


CBQ Recife - Outubro de 2012
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.
Sintaxe do Tcl
●
    Todos os comandos na forma:
    comando arg1 arg2 …
    Exemplos de comandos:
    set nome “Rildo Pragana”
    set numero 1234
    puts $nome
    puts -nonewline “numero=$numero”
●
    Todos os tipos são equivalentes a
    strings (cadeia) de caracteres.
●
    Substituições:
    ●
        Variável  $variavel
    ●
        Comando [comando]
    ●
        Backslash  n t u00c7
Sintaxe 2
●
    Agrupando ítens:
    ●
        Com substituição:
        “cmd = $comandon data = [clock format $ck]”
    ●
        Sem substituição:
        {Nada disso é modificado: [teste], $}


●
    Expansão de argumentos: (evita uso de “eval”)
        set lsArgs {-l nota.txt}
        exec ls $lsArgs → não funciona
        eval exec ls $lsArgs → funciona mas expande tudo
        exec ls {*}$lsArgs → perfeito!
Listas
●
    Exemplos de listas:
    ●   set cores {azul amarelo vermelho branco}
    ●   set lst { {12.37 N} {-1.567 W} 135 }
●
    Alguns comandos:
    ●   list ?arg arg …?
    ●   lindex list ?index …?
    ●   lappend listVar ?value …?
    ●   linsert list index element ?element …?
    ●
        Outros: lreplace, llength, lsearch, lsort,
        lset, lrepeat, lrange
Arrays

●   Variável com um índice (hash)
    Exemplos:
      data(agora)
      v(1) v(2) …
      posicao(12.5,23.7)
●   Comando para manipular variáveis tipo array
    ●   array names arrayName ?mode? ?pattern?
    ●   array get arrayName ?pattern?
    ●   array set arrayName list
Dict (dicionário)
●   Lista de pares key (chave), valor
●
    Comandos mais comuns:
    ●   dict create ?key value …?
    ●   dict get dictVal ?key …?
    ●   dict set dictVariable key ?key …? value
    ●   dict size dictValue
    ●   dict keys dictValue ?globPattern?
    ●   dict for {keyVar valueVar} 
           dictValue body
Criando subcomandos (ensemble)
 namespace eval ::counter {
   variable counter 0
   namespace export get set incr
   namespace ensemble create
 }                                        Utilização:
                                          counter set 35
 proc ::counter::get {} {
   variable counter                       counter get
   return $counter                        counter incr
 }                                        counter incr -2
                                          set counter::counter
 proc ::counter::set {value} {
   variable counter
   return [::set counter $value]
 }

 proc ::counter::incr {{increment 1}} {
   variable counter
   return [::incr counter $increment]
 }
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.
Aplicação com dual vídeo
Tatu (servidor web)
Tatu plugins

namespace eval myapp {}

proc myapp::service {conn parms} {
   tatu::log "******** myapp starting..."
   $conn outHeader 200 {Content-Type text/plain}
   $conn out "Example output of a simple service"
}


tatu::addRoute "/myapp" myapp::service

error "This is an error on purpose.nComment to
remove error msg."
Tatu plugins 2
proc route1 {conn parms} {
   tatu::log "*** method=[$conn reqCmd] conn=$conn
parms=$parms"
   $conn outHeader 200 {Content-Type text/plain}
   $conn out "Plain text output from a service
Parameters: $parms"
   return
}

    tatu::addRoute "/book/:title/author/:author" route1
Tatu plugins 3

proc route3 {conn parms} {
   $conn outHeader 200 {Content-Type text/plain}
   $conn out "method=[$conn reqCmd]n"
   $conn out "queryNames: [$conn queryNames]nQuery
variables:n"
   foreach var [$conn queryNames] {
      $conn out "$var --> [$conn queryData $var]n"
   }
   return
}

tatu::addRoute "/query" route3
Métodos da API
method outHeader {{status 200} {headers {}} {delayed 0}}
method out {s {bin 0}}
method queryNames {}
method queryData {name {multiple 0} {index -1}}
method reqCmd {}

--------------------------------------------

tatu::addRoute {route cmd {log 1}
    {protocols {http https}}}
tatu::log {msg {type "warn"}}

                                               Usado com várias “keys” iguais na query.
Arquitetura de aplicaçōes Web
       conteúdo
                                         estilo



HTML                             CSS




            Javascript

                         comportamento
Jquery.fileTree (javascript)

$('.filetree').fileTree({
   root: './',
   script: '/filetree'
},function(file){alert(file);});


 (*) O elemento .filetree (CSS class) poderá ser uma <div>
      no <html> da página:
     <div class="filetree"></div>

 (**) A rota /filetree irá disparar o script filetree::filetree.
Exemplo de web service
namespace eval filetree { }

proc filetree::filetree {conn params} {
    set dir [$conn queryData dir]
    tatu::log "filetree dir=$dir"
    set s {<ul class="jqueryFileTree">}
     foreach f [glob -directory $dir *] {
        if {![file isdirectory $f]} continue
           append s {<ul><li class="directory collapsed">}
           append s "<a href="#" rel="$f/">"
           append s "[file tail $f]</a></li></ul>" }
     foreach f [glob -directory $dir *] {
        if {[file isdirectory $f]} continue
           set ext [string range [file extension $f] 1 end]
           append s "<ul><li class="file">"
           append s "<a href=""#"" rel=""$f">[file tail $f]</a></li> }
           append s "</ul>"
    $conn outHeader 200 {Content-Type text/html}
    $conn out $s
}

tatu::addRoute "/filetree" filetree::filetree 0 {http}
Links interessantes
●
    http://pragana.net - Adventures in Linux
       Programming
●
    http://wiki.tcl.tk - Tcler's wiki
       (farta documentação!)
●
    http://www.tcl.tk/man/tcl/tutorial/tcltutorial.html
●
    http://www.tcl.tk - Tcl developer exchange
●
    http://wfr.tcl.tk - Tcler's wiki versão francesa
       (independente do original)
Perguntas




                ?
?
         ?
Palestra cbq

Weitere ähnliche Inhalte

Was ist angesagt?

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
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesDevCamp Campinas
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateVitor Silva
 
Mongo DB
Mongo DBMongo DB
Mongo DBdist_bp
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxoFrederico Madeira
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoAndré Déo
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em JavaDevmedia
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Carlos Santos
 
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesLuis Gustavo Almeida
 

Was ist angesagt? (20)

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
 
Python e bancos NoSQL
Python e bancos NoSQLPython e bancos NoSQL
Python e bancos NoSQL
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernate
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Bd sql (1)
Bd sql (1)Bd sql (1)
Bd sql (1)
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Linux shell
Linux shellLinux shell
Linux shell
 
PHP e Mysql - DELETE
PHP e Mysql - DELETEPHP e Mysql - DELETE
PHP e Mysql - DELETE
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxo
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André DéoZabbix e SNMP - Zabbix Conference LatAm - André Déo
Zabbix e SNMP - Zabbix Conference LatAm - André Déo
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Shell Scipt - Comandos
Shell Scipt - ComandosShell Scipt - Comandos
Shell Scipt - Comandos
 
A Classe StringBuilder em Java
A Classe StringBuilder em JavaA Classe StringBuilder em Java
A Classe StringBuilder em Java
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and ZabbixZabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
Zabbix Conference LatAm 2016 - Andre Deo - SNMP and Zabbix
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e Routes
 

Ähnlich wie Palestra cbq

O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
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
 
O Que é shell - bash
O Que é shell - bashO Que é shell - bash
O Que é shell - bashSérgio Silva
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno 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 matlab 6 especiais
Curso matlab 6 especiaisCurso matlab 6 especiais
Curso matlab 6 especiaisJosh Santos
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2Daniel
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - IntroduçãoMarco Pinheiro
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 

Ähnlich wie Palestra cbq (20)

O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
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
 
O Que é shell - bash
O Que é shell - bashO Que é shell - bash
O Que é shell - bash
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
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)
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Minicurso Ruby on Rails
Minicurso Ruby on RailsMinicurso Ruby on Rails
Minicurso Ruby on Rails
 
Curso matlab 6 especiais
Curso matlab 6 especiaisCurso matlab 6 especiais
Curso matlab 6 especiais
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 

Palestra cbq

  • 1. Aplicações do Tcl e Starkits CBQ Recife - Outubro de 2012
  • 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. Sintaxe do Tcl ● Todos os comandos na forma: comando arg1 arg2 … Exemplos de comandos: set nome “Rildo Pragana” set numero 1234 puts $nome puts -nonewline “numero=$numero” ● Todos os tipos são equivalentes a strings (cadeia) de caracteres. ● Substituições: ● Variável  $variavel ● Comando [comando] ● Backslash  n t u00c7
  • 5. Sintaxe 2 ● Agrupando ítens: ● Com substituição: “cmd = $comandon data = [clock format $ck]” ● Sem substituição: {Nada disso é modificado: [teste], $} ● Expansão de argumentos: (evita uso de “eval”) set lsArgs {-l nota.txt} exec ls $lsArgs → não funciona eval exec ls $lsArgs → funciona mas expande tudo exec ls {*}$lsArgs → perfeito!
  • 6. Listas ● Exemplos de listas: ● set cores {azul amarelo vermelho branco} ● set lst { {12.37 N} {-1.567 W} 135 } ● Alguns comandos: ● list ?arg arg …? ● lindex list ?index …? ● lappend listVar ?value …? ● linsert list index element ?element …? ● Outros: lreplace, llength, lsearch, lsort, lset, lrepeat, lrange
  • 7. Arrays ● Variável com um índice (hash) Exemplos: data(agora) v(1) v(2) … posicao(12.5,23.7) ● Comando para manipular variáveis tipo array ● array names arrayName ?mode? ?pattern? ● array get arrayName ?pattern? ● array set arrayName list
  • 8. Dict (dicionário) ● Lista de pares key (chave), valor ● Comandos mais comuns: ● dict create ?key value …? ● dict get dictVal ?key …? ● dict set dictVariable key ?key …? value ● dict size dictValue ● dict keys dictValue ?globPattern? ● dict for {keyVar valueVar} dictValue body
  • 9. Criando subcomandos (ensemble) namespace eval ::counter { variable counter 0 namespace export get set incr namespace ensemble create } Utilização: counter set 35 proc ::counter::get {} { variable counter counter get return $counter counter incr } counter incr -2 set counter::counter proc ::counter::set {value} { variable counter return [::set counter $value] } proc ::counter::incr {{increment 1}} { variable counter return [::incr counter $increment] }
  • 10. 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.
  • 11. 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).
  • 13. 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.
  • 14. 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.
  • 17. Tatu plugins namespace eval myapp {} proc myapp::service {conn parms} { tatu::log "******** myapp starting..." $conn outHeader 200 {Content-Type text/plain} $conn out "Example output of a simple service" } tatu::addRoute "/myapp" myapp::service error "This is an error on purpose.nComment to remove error msg."
  • 18. Tatu plugins 2 proc route1 {conn parms} { tatu::log "*** method=[$conn reqCmd] conn=$conn parms=$parms" $conn outHeader 200 {Content-Type text/plain} $conn out "Plain text output from a service Parameters: $parms" return } tatu::addRoute "/book/:title/author/:author" route1
  • 19. Tatu plugins 3 proc route3 {conn parms} { $conn outHeader 200 {Content-Type text/plain} $conn out "method=[$conn reqCmd]n" $conn out "queryNames: [$conn queryNames]nQuery variables:n" foreach var [$conn queryNames] { $conn out "$var --> [$conn queryData $var]n" } return } tatu::addRoute "/query" route3
  • 20. Métodos da API method outHeader {{status 200} {headers {}} {delayed 0}} method out {s {bin 0}} method queryNames {} method queryData {name {multiple 0} {index -1}} method reqCmd {} -------------------------------------------- tatu::addRoute {route cmd {log 1} {protocols {http https}}} tatu::log {msg {type "warn"}} Usado com várias “keys” iguais na query.
  • 21. Arquitetura de aplicaçōes Web conteúdo estilo HTML CSS Javascript comportamento
  • 22. Jquery.fileTree (javascript) $('.filetree').fileTree({ root: './', script: '/filetree' },function(file){alert(file);}); (*) O elemento .filetree (CSS class) poderá ser uma <div> no <html> da página: <div class="filetree"></div> (**) A rota /filetree irá disparar o script filetree::filetree.
  • 23. Exemplo de web service namespace eval filetree { } proc filetree::filetree {conn params} { set dir [$conn queryData dir] tatu::log "filetree dir=$dir" set s {<ul class="jqueryFileTree">} foreach f [glob -directory $dir *] { if {![file isdirectory $f]} continue append s {<ul><li class="directory collapsed">} append s "<a href="#" rel="$f/">" append s "[file tail $f]</a></li></ul>" } foreach f [glob -directory $dir *] { if {[file isdirectory $f]} continue set ext [string range [file extension $f] 1 end] append s "<ul><li class="file">" append s "<a href=""#"" rel=""$f">[file tail $f]</a></li> } append s "</ul>" $conn outHeader 200 {Content-Type text/html} $conn out $s } tatu::addRoute "/filetree" filetree::filetree 0 {http}
  • 24. Links interessantes ● http://pragana.net - Adventures in Linux Programming ● http://wiki.tcl.tk - Tcler's wiki (farta documentação!) ● http://www.tcl.tk/man/tcl/tutorial/tcltutorial.html ● http://www.tcl.tk - Tcl developer exchange ● http://wfr.tcl.tk - Tcler's wiki versão francesa (independente do original)
  • 25. Perguntas ? ? ?