quarta-feira, 7 de abril de 2010

Go Language no Windows

Fala pessoal,

Esta semana resolvi testar a linguagem do google no windows, de fato é uma linguagem bem interessante porem ainda não possui muitas bibliotecas em sua versão para windows espero que em breve esteja disponivel.

O que aparenta ser simples nem sempre é tão simples, por ser de fato uma linguagem relativamente nova a mesma ainda não possui muita informação disponivel na internet.

Sendo assim só para compilar seu primeiro programa, aquele famoso hello world torna-se uma tarefa um pouco chata até que você entenda como tem que funcionar.

Vamos la então, primeiro precisamos baixar o nosso compilador do site http://code.google.com/p/gomingw/

Feito isto descompacte o arquivo no diretorio “C:\” a pasta “go” sera criada.

Agora antes de começarmos a criar nossos programas podemos ainda baixar mais um arquivo que possui outras libs ja compiladas para o go. baixe do endereço http://code.google.com/p/go-windows/

descompile no mesmo local do outro. feito isto as novas libs estaram na pasta ‘C:\go\pkg\mingw_386’

Agora como não gosto de setar variaveis no path do windows e ficar toda hora digitando comandos para compilar e gerar meus executaveis criei um bat para realizar todo o processo.

Segue a baixo o codigo do bat

@echo off & setlocal enabledelayedexpansion

REM Aqui configuramos o ambiente do GO, GOROOT = diretorio do go, GOOS = tipo de
REM ambiente atualmente utilizamos o mingw porem futuramente sera modificado para
REM windows, GOARCH = tipo de arquitetura 386=32x
set GOROOT=C:\go
set GOOS=mingw
set GOARCH=386

set oldcontents=%contents%
set contents=

REM Modifique as variaveis abaixo para os dados do seu projeto
REM programName é o nome do seu programa
REM programExt é o tipo de arquivo do seu programa nosso caso exe do windows
REM projectPath é o diretorio de onde esta o seu arquivo do programa
set programName=helloworld
set programExt=exe
set projectPath=C:\go\bin

REM Não modifique essas variaveis.
set errorFile=%projectPath%\err.log
set fullProgramPath=%projectPath%\%programName%
set fullProgramOutFile=%fullProgramPath%.%programExt%

REM IF EXIST "%fullProgramOutFile%" del "%fullProgramOutFile%"

"C:\go\bin\8g.exe" -o "%fullProgramPath%.8" "%fullProgramPath%.go" > "%errorFile%"

for /f "tokens=*" %%a in (err.log) do (
   if not defined contents (
      set contents=%%a
   ) else (
      set contents=!contents!;%%a
   )
)

if not !contents! == !oldcontents! (
   echo %contents%
   goto END
)

"%GOROOT%\bin\8l.exe" -o "%fullProgramOutFile%" "%fullProgramPath%.8"
"%fullProgramOutFile%"

:END
del %errorFile%

O legal deste bat é que ele exibe ja o erro caso aconteça ao compilar e nao gera o exe, caso nao tenha erro ja gera o exe e automaticamente o executa.

lembre-se que você pode tambem definir as variaves do go diretamente nas variaveis do windows.

Agora sim feito isto crie o arquivo de texto no diretorio bin do go (no caso deste exemplo) chamado helloworld.go com o código:

package main

import "fmt" //Pacote que implementa formatacao de E/S

func main() {

   fmt.Printf("Hello World! \n");

   for i:=0; i < 10; i++ {
    fmt.Printf("Contando: %d \n",i) 
   }

}

Salve e então execute o bat.

 

Espero que gostem ;)

Grande abraço,
Diego M. Garcia.

quarta-feira, 16 de dezembro de 2009

Melhorando o entendimento do seu código (Exit)

 

Fala pessoal,

Esses dias estava dando uma consultoria e encontrei um código cheio de exits no delphi algo que se utilizado sem critério torna a manutenção do código bem mais complicada e demorada.

vamos ver um exemplo disso:

function TForm1.PerguntaNome: string;
var
  nome, sobrenome : string;
begin
  Result := 'Preguiçoso';
  repeat
    if not InputQuery('Programa de teste', 'Nome :', nome) then
       Exit;
    if not InputQuery('Programa de teste', 'Sobrenome :', sobrenome) then
       Exit;
  until (nome <> '') or (sobrenome <> '');

  Result := nome + ' ' + sobrenome;
end;

Agora vejamos uma forma de se escrever sem a utilização de exit, como fica muito mais simples e claro de se entender.

function TForm1.PerguntaNome: string;
var
  nome, sobrenome : string;
begin
 
repeat
   if (not InputQuery('Programa de teste', 'Nome :', nome)) or
      (not InputQuery('Programa de teste', 'Sobrenome :', sobrenome)) then
     Result := 'Preguiçoso' else
     Result := nome + ' ' + sobrenome;
until Trim(Result) <> '';
end;

Note que o funcionamento de ambas as rotinas são idênticas porém escritas de forma diferente, da segunda forma notamos automaticamente que se a InputQuery de qualquer um dos valores (nome ou sobrenome) for cancelada o retorno de nossa função será ‘Preguiçoso’, do contrario, se em uma delas foi pressionado o botão ‘ok‘ então o retorno da nossa função será o nome + ‘ ‘ + sobrenome. Por ultimo no nosso repeat verificamos se o result contem algo diferente de ‘’ (vazio) caso seja positivo sai do laço e não pergunta mais para o usuário as informações.

O código deste exemplo esta disponível clicando aqui para download.

Reparem que este exemplo é pequeno mas imaginem uma rotina gigante que estamos acostumados ver no dia a dia o quanto o exit pode dificultar a visualização do que esta acontecendo e do que realmente deve acontecer.

Grande abraço,
Diego Garcia.

sábado, 31 de outubro de 2009

Dica para migrar para o delphi 2010

 

Fala pessoal,

Seguinte se você esta migrando uma aplicação por exemplo do delphi 2007 para o delphi 2010 então é muito importante que você verifique após migrar seu projeto, se em seu Project Options -> Delphi Compiler -> Unit aliases contém as seguintes definições:

 "WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE"

Caso não tenha, em alguns lugares do código do seu programa pode ser que o code completition do delphi não funcione !

Um Grande Abraço a todos e um ótimo feriado ;)

Diego Garcia.

quinta-feira, 29 de outubro de 2009

Preparem-se vem ai Delphi Conference

 

Para maiores informações clique aqui.

 

Grande abraço,

Diego Garcia

sexta-feira, 16 de outubro de 2009

ISSkin com a nova versão do Inno Setup

 

Fala pessoal,

Se você acabou de atualizar seu inno setup para a versão com suporte a Unicode e seu script de instalação utiliza o ISSkin, você notara que a skin não será carregada. Isso ocorre devido ao fato do inno setup agora utilizar strings no padrão WideString como o delphi 2009 e 2010, para resolver o problema basta declarar os métodos da dll IsSkin.dll da seguinte forma:

// Importing LoadSkin API from ISSkin.DLL
procedure LoadSkin(lpszPath: AnsiString; lpszIniFileName: AnsiString);
external 'LoadSkin@files:isskin.dll stdcall';

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

Execute seu script novamente e pronto seu instalador esta funcionando com a skin como anteriormente !

Grande abraço,

Diego Garcia