Python + DelphiUm relacionamento que está dando certo (Python Cases)1Fernando Macedo
Quem?Fernando MacedoDesenvolvedor Delphi/PythonBacharel em Sistemas de Informação (Faculdade Impacta de Tecnologia)Mestrando em Gestão do Conhecimento e Sistemas Inteligentes (IPEN-USP)Membro da APyB2
Onde?Esys Colibri23 anos de experiência15.000 clientes35.000 PDVs instalados100 revendedores em todo o PaísSuporte 24/7 em todo o BrasilAtualização constante às novas leis3
O que?Caso da Esys na utilização de Python no Colibri 8Integração entre Python e Delphi4
CenárioSoftware PDVMesaBalcãoFichaEntregaContextoEmpresa tradicional - 23 anosAplicação comercialAmbiente Windows(MS, C# e Delphi)Nova versão5
Os problemasMódulo de relatóriosFormatação embutida no aplicativoManutenção difícilIntegração com terceirosImplementações específicas6
7Relatórios texto: Antes  { Layout da linha levando em conta qtd fracionada }    TmpStr := '%s%-2.0f ' + Trim(strFormatDesc);    if QtdeFracionada then      TmpStr := '%s%3.3f ' + Trim(strFormatDesc);     TmpStr := Format(TmpStr, [strTagIni, fQuantidade, strDescr]);     lstMarchador.Add(TrimAcentos(Tmpstr) + strTagFim);    sLineMarchadorAgrup:= sLineMarchadorAgrup+';'+TrimAcentos(Tmpstr) + strTagFim;     if dmVenda.qryColibriBN_LUGARMESA.AsBoolean then      TmpStr := TmpStr + FormatFloat(' #0', MyMaterial[i].LugarMesa);     TmpStr := TmpStr + strTagFim;    lstRemota.Add(TrimAcentos(TmpStr)); 
O desafio dos relatóriosPremissasGerar a mesma configuração de arquivos;Simples;Suportar troca em run-time;Suportar loops aninhados, do tipo mestre-detalhe;Mesma origem dos dados para os relatórios visuais;Ter toda a infra construída em dias, e não em meses.8
Por que Python?ExpressividadeLegibilidade de códigoCodificação rápidaVasta coleção de bibliotecasRecurso X, Y, Z9
A linguagem certaE não sabendo que era impossível,     Python foi lá e fez!Solução da infra em 2 dias!Ganhou moral.10
ResultadosPremissas atendidasPlus: Extensão e customização por clientes11
Depois12{%extends"relatorio-base.template"%}{%setpag = impressaoNumero%}{%settot = impressaoTotal%} {%- block relatorio %}{%blockcabecalhoscoped -%}{%filtercompexp%}Conta{{venda.codigoDoTicket}}{{'=' * 5}}{{pag}}/{{tot}}{%endfilter%}Mov.: {{dataContabil}} - Imp.: {{data}} - {{hora}}hPDV: {{maquina|semAcentos}}Caixa: {{caixa|semAcentos}}Garcom: {{garcom|semAcentos}}SEQ: {{venda.sequencia}}{%- endblockcabecalho %} %- block corpo -%}{{render_cancelado() }}{%foriteminitens -%}{{render_item(item) }}{%endfor -%}{{render_cancelado() }}{%- endblock corpo %}
IntegraçãoDesktop GUIhttp://www.python.org/about/apps/ScriptingExtendingUpgrade tecnológico13
DriverPython14
Uso do P4D15type  EngineDoPython = class  private class var    _Eng: TPythonEngine;    _IO: TPythonInputOutput;    _Dir: string;  private const    NOME_DLL = 'python27.dll';    NOME_BIBLIOTECA = 'python27.zip';  public [...]    class procedure AdicionarDiretorioAoPath(umDiretorio: string);    class property Engine: TPythonEngine read ObterEngine;    class property DirDoPython: string read _DirDoPython write _DirDoPython;    class property Iniciado: Boolean read ObterIniciado;    class property IO: TPythonInputOutput read _IO;  end;
Uso do P4D16class constructor EngineDoPython.Create;begin  _Eng := TPythonEngine.Create(nil);  _IO := TPythonInputOutput.Create(nil);  _Eng.DllName := NOME_DLL;  _Eng.PyFlags := _Eng.PyFlags + [pfIgnoreEnvironmentFlag];  _Eng.IO := _IO;end;class procedure EngineDoPython.Iniciar;begin  _Eng.DllPath := arquivos.NormalizarPasta(DiretorioDoPython);  arquivos.ExecutarNaPasta(DiretorioDoPython,    procedure begin      _Eng.LoadDll();      SysModule.path.append(_Eng.DllPath);      SysModule.path.append(_Eng.DllPath + NOME_BIBLIOTECA);    end);end;
O que pode ser feito?Módulos *.pydExecutar códigos Python;Expor classes Delphi ao Python;17
Problemas e riscosCTypesManifestoPessoalDisseminar conhecimento à equipeContinuidade do projeto Python4DelphiSuporte a futuras versões18
Minhas impressõesA ilusão de que verificação de tipos em tempo de compilação resolve todos os problemasPythonOferece alto nível de abstraçãoEscreve-se menos códigoMaior produtividadePython não se põe entre o desenvolvedor e o problema19
Linkshttp://code.google.com/p/python4delphi/http://code.google.com/p/pyscripter/20
Obrigado!Dúvidas?Contatosfgmacedo@gmail.com@fgmacedowww.esys.com.br21
22

Python + Delphi: Um relacionamento que está dando certo

  • 1.
    Python + DelphiUmrelacionamento que está dando certo (Python Cases)1Fernando Macedo
  • 2.
    Quem?Fernando MacedoDesenvolvedor Delphi/PythonBacharelem Sistemas de Informação (Faculdade Impacta de Tecnologia)Mestrando em Gestão do Conhecimento e Sistemas Inteligentes (IPEN-USP)Membro da APyB2
  • 3.
    Onde?Esys Colibri23 anosde experiência15.000 clientes35.000 PDVs instalados100 revendedores em todo o PaísSuporte 24/7 em todo o BrasilAtualização constante às novas leis3
  • 4.
    O que?Caso daEsys na utilização de Python no Colibri 8Integração entre Python e Delphi4
  • 5.
    CenárioSoftware PDVMesaBalcãoFichaEntregaContextoEmpresa tradicional- 23 anosAplicação comercialAmbiente Windows(MS, C# e Delphi)Nova versão5
  • 6.
    Os problemasMódulo derelatóriosFormatação embutida no aplicativoManutenção difícilIntegração com terceirosImplementações específicas6
  • 7.
    7Relatórios texto: Antes  {Layout da linha levando em conta qtd fracionada }    TmpStr := '%s%-2.0f ' + Trim(strFormatDesc);    if QtdeFracionada then      TmpStr := '%s%3.3f ' + Trim(strFormatDesc);     TmpStr := Format(TmpStr, [strTagIni, fQuantidade, strDescr]);     lstMarchador.Add(TrimAcentos(Tmpstr) + strTagFim);    sLineMarchadorAgrup:= sLineMarchadorAgrup+';'+TrimAcentos(Tmpstr) + strTagFim;     if dmVenda.qryColibriBN_LUGARMESA.AsBoolean then      TmpStr := TmpStr + FormatFloat(' #0', MyMaterial[i].LugarMesa);     TmpStr := TmpStr + strTagFim;    lstRemota.Add(TrimAcentos(TmpStr)); 
  • 8.
    O desafio dosrelatóriosPremissasGerar a mesma configuração de arquivos;Simples;Suportar troca em run-time;Suportar loops aninhados, do tipo mestre-detalhe;Mesma origem dos dados para os relatórios visuais;Ter toda a infra construída em dias, e não em meses.8
  • 9.
    Por que Python?ExpressividadeLegibilidadede códigoCodificação rápidaVasta coleção de bibliotecasRecurso X, Y, Z9
  • 10.
    A linguagem certaEnão sabendo que era impossível, Python foi lá e fez!Solução da infra em 2 dias!Ganhou moral.10
  • 11.
    ResultadosPremissas atendidasPlus: Extensãoe customização por clientes11
  • 12.
    Depois12{%extends"relatorio-base.template"%}{%setpag = impressaoNumero%}{%settot= impressaoTotal%} {%- block relatorio %}{%blockcabecalhoscoped -%}{%filtercompexp%}Conta{{venda.codigoDoTicket}}{{'=' * 5}}{{pag}}/{{tot}}{%endfilter%}Mov.: {{dataContabil}} - Imp.: {{data}} - {{hora}}hPDV: {{maquina|semAcentos}}Caixa: {{caixa|semAcentos}}Garcom: {{garcom|semAcentos}}SEQ: {{venda.sequencia}}{%- endblockcabecalho %} %- block corpo -%}{{render_cancelado() }}{%foriteminitens -%}{{render_item(item) }}{%endfor -%}{{render_cancelado() }}{%- endblock corpo %}
  • 13.
  • 14.
  • 15.
    Uso do P4D15type EngineDoPython = class  private class var    _Eng: TPythonEngine;    _IO: TPythonInputOutput;    _Dir: string;  private const    NOME_DLL = 'python27.dll';    NOME_BIBLIOTECA = 'python27.zip';  public [...]    class procedure AdicionarDiretorioAoPath(umDiretorio: string);    class property Engine: TPythonEngine read ObterEngine;    class property DirDoPython: string read _DirDoPython write _DirDoPython;    class property Iniciado: Boolean read ObterIniciado;    class property IO: TPythonInputOutput read _IO;  end;
  • 16.
    Uso do P4D16class constructor EngineDoPython.Create;begin _Eng := TPythonEngine.Create(nil);  _IO := TPythonInputOutput.Create(nil);  _Eng.DllName := NOME_DLL;  _Eng.PyFlags := _Eng.PyFlags + [pfIgnoreEnvironmentFlag];  _Eng.IO := _IO;end;class procedure EngineDoPython.Iniciar;begin  _Eng.DllPath := arquivos.NormalizarPasta(DiretorioDoPython);  arquivos.ExecutarNaPasta(DiretorioDoPython,    procedure begin      _Eng.LoadDll();      SysModule.path.append(_Eng.DllPath);      SysModule.path.append(_Eng.DllPath + NOME_BIBLIOTECA);    end);end;
  • 17.
    O que podeser feito?Módulos *.pydExecutar códigos Python;Expor classes Delphi ao Python;17
  • 18.
    Problemas e riscosCTypesManifestoPessoalDisseminarconhecimento à equipeContinuidade do projeto Python4DelphiSuporte a futuras versões18
  • 19.
    Minhas impressõesA ilusãode que verificação de tipos em tempo de compilação resolve todos os problemasPythonOferece alto nível de abstraçãoEscreve-se menos códigoMaior produtividadePython não se põe entre o desenvolvedor e o problema19
  • 20.
  • 21.
  • 22.