sexta-feira, 31 de dezembro de 2004

Recordações de um ano bem apressadinho

Foi um ano bem apressado mesmo! Nossa como passou rápido. Mas enquanto passava deu um bom prazo pra aprender muita coisa na faculdade, mas na vida mais ainda. Vou deixar um breve resumão do que mais marcou, vem comigo?

Na faculdade
1º semestre
Eletrônica digital: Ô materiazinha interessante. Deu muita base pra Arquitetura (abaixo). O mais intrigante foi o programa pra resolver mapa de karnaugh que me rendeu um dez! Nem foi necessário fazer avaliação. Sem dúvida o que mais marcou.

Estrutura de dados I
Descrobri que muita coisa existe e pouca gente conhece: pilha, lista, fila, etc. Diria que facilitaria bastante se pelo menos as pessoas a minha volta (onde trabalho) soubessem o conceito e utilizassem. Não sobra dúvida que ajuda um programador a ser "ágil" em determinadas rotinas.

Outra coisa que me deixou alegre foi algumas aulas que ministrei como reforço para os colegas. Ninguém imagina o quanto isso aumenta em bagagem, te deixa mais solto e te ensina ainda mais. Fica a dica pra você o fazer.

Metodologia científica
Aqui apareceu um dos professor com quem mais me identifiquei até hoje: ele não ensina metodologia científica apenas: te mostra como deveria ser uma universidade! Adeus época em que eu achava que reproduzir conhecimento era o que a escola deveria fazer. Diria que este é um legítimo "professor pra abrir a cabeça". Meus agradecimentos ao ilustre professor José Reinaldo.

Filosofia:
Sinceramente concordo que muita coisa veio daqui, mas acredito que exista uma forma mais interessante de dizer isso, ficar estudando que "fulano falou isso" e "ajuda nisso", "revolucionou isso" não é uma coisa que me atrai. Porém, nota 10 pra forma da professora dar aula. Primeira vez na minha vida que não tive avaliação no final do bimestre. Tive avaliação dentro de sala, todo dia você faz alguma coisa e ganha parte da nota, legal.

2º semestre
Continua a saga de aprendizado em ED2, agora com árvores binárias e grafos. É muita coisa que pouca gente conhece. Onde trabalho por exemplo, de nada adianta falar pra alguém que uma árvore ajuda ele evitar pelo menos quinhentas linhas de código: tem muito conceito por trás e é impossível usar sem ele. O curioso é que em uma parte de um sistema que mantenho acabei utilizando árvore sem conhecer (espanto). São algumas funções recursivas que fazem o tratamento de uma árvore de opções que o usuário pode escolher, nada importante demais pra ressaltar.

Banco de dados: dei muitas opniões na aula da professora, muitas mesmo. Mas no final ela me agradeceu (e é claro, fiquei todo "pomposo" :D ). Mas comigo é assim, acho que pode melhorar não penso duas vezes: falo. No conteúdo teve muita coisa teórica, mas quase sempre algo que já utilizo na prática: banco de dados é algo que se usa muito, pode crer.

Juntando banco de dados com árvores: acabei descobrindo o conceito que está por trás de índices. Acredite: muda sua forma de trabalhar. Consigo perfeitamente entender agora porque um índice é que sustenta um banco de dados e onde/quando devo utilizá-lo ou não. Porém, isso é matéria do próximo semestre: banco de dados II. Vale também pra entender sistemas de arquivos, mas é matéria pra sistemas operacionais I ou II, então deixo os detalhes de lado.

Arquitetura foi um máximo: aprendi a construir uma máquina digital (hipotetic computer). Gostei mesmo deste negócio... minha máquina ficou toda funcionando. Estou até pensando em me dedicar mais nesta área, quem sabe não tenho futuro? Placas, computadores, emocionante! Vamos ver o que está por vir em Arquitetura II.

Probabilidade: não teve muita coisa a acrescentar na bagagem. Não que tenha deixado de frequentado as aulas, mas é uma matéria que um programador não usa muito no seu dia a dia. Da probabilidade/estatística que uso no meu dia a dia, a maioria aprendi no Ensino Médio e o retante com a necessidade. Mas espero fazer uso se surgir necessidade, de todos os males sei que o conteúdo existe.

Não poderia deixar de registrar no final que neste último semestre houve um fenômeno de diminuição de minhas médias. Tudo bem que foram todas acima de nove, mas os semestres anteriores tiveram médias de apreveitamento dez.

Na vida
Pra início, cancelei um monte de conta em banco, dava muito trabalho manter. Sem falar que acabam te cobrando muito por ela. Pra queimar minha lingua, a empresa onde trabalho começou a pagar salário no BB e foi com esta conta que fiquei. Mas teve um lado bom: como toda minha movimentação ficou concentrada em apenas um lugar ganhei um gerente novo que tem mais tempo pra ouvir o que preciso.

Também comecei a investir em fundos de ações. Coisa ariscada de se fazer, diriam alguns. Mas o país está crescendo e estou tendo um ótimo rendimento. Fica a dica pra que você faça. Dividendos e Exportação são boas pedidas para o ano que vem, dizem os especialistas. E não vem falar que não tem dinheiro pra fazê-lo... com R$ 200 você já começa e o banco é quem administra, pois é fundo.

Também comprei um lote no residencial arcoíris. É mais na esperança de valorizar mesmo porque ô cidadezinha inflada imobiliariamente. A terra aqui parece que tem ouro.

Finalizando a parte financeira, troquei de computador no início do ano e minha moto está quase toda paga, faltam só três!

Quanto a leitura, tudo ficou concentrado em internet quase o ano todo. Mas isso é muito, e o conteúdo é bem selecionado.

Pra não dizer que não li livro, gostei bastante do "Guia de Expressões Regulares" de Aurélio Martins e é algo que me ajuda no dia a dia. Há!, vai ser útil em "Linguagens Formais" e "Compiladores"... que chutão que fiz!

Agora nas férias estou lendo um livrinho com mais de 1000 páginas :D. O nome dele é "Profissional linux programando". Ótima pedida pra quem tá fazendo universidade, aliás, pra quem pretende ser programador. E isso não se restringe a linux pois o livro ensina usar várias ferramentas como cvs, banco de dados como mysql e postgres dentre outras ferramentas. A compra dele foi um ótimo investimento. Comprei-o por apenas R$ 20 e ele custa mais de R$ 200. Foi uma promoção da Makron Books com a Pearson Education.

Pro ano que vem já pedi "Pai Rico, Pai Pobre", "Quem mexeu no meu queijo" e "Porque os homens fazem sexo e as mulheres amor". Como percebe, esta é a parte não científica de minha leitura.

Diria que foi um ano "conturbado" e nem colocaria aqui, afinal, é um blog de tecnologia. Porém, quero deixar registrado para que eu veja algum dia e para retribuir as pessoas que fizeram parte de minha vida neste período e vão ler isso aqui.

No início do ano meus pais se separaram e isso veio junto com uma mudança de casa e muita responsabilidade. Sem dúvida uma experiência que não gostei.
Na minha parte houve também um final de relacionamento, uma grande perda sem dúvida.

Como ficar sozinho te dá algum tempo livre, criei este blog e é por isso que você leu tudo isso agora. (que piada :D )

Meu muito obrigado a todos que leram e fizeram proveito do que foi postado aqui. Deixo o desejo que comentem mais já que bastante gente lê mas não me mostra sua opnião.

Este é a parte de retribuição já que muita coisa não se deve agradecer. Aos meus colegas, da faculdade ou não, presentes no meu dia a dia. É algo marcante e é um período que vou lembrar quando for contar para meus filhos e netos. Não vou citar nomes mas quem participa sabe que sempre tento retribuir a companhia e amizade mesmo que da minha forma.

Um ótimo novo ano a todos!

quinta-feira, 25 de novembro de 2004

Live bookmark's no melhor browser do mundo

Cheguei a mencionar sobre feeds rss no post Inovações no software livre.
A novidade agora fica com os live bookmark's do Mozilla Firefox.

Alguns conhecem bookmarks como "favoritos". Live bookmark's são favoritos "vivos", ou seja, se modificam de acordo com o conteúdo de algum site que publique feeds rss/atom.
Em suma, você adiciona o bookmark vivo no browser e fica sabendo os nomes dos artigos/textos quando o site tiver alguma publicação.

Frequento mais ou menos uns 20 blog's e admito que seria impraticável visitar um a um pra verificar se houve alteração. Os recursos do firefox vieram pra facilitam minha navegação, e muito. Existem muitos outros além dos bookmarks vivos pois é um browser extensível. Veja aqui todas as extensões disponíveis.

Das extensões que utilizo:
GMail Notifier: Notifica quando recebo um email na caixa de entrada do GMail e me avisa a quantidade de emails não lidos.
Bookmark sincronizer: Permite enviar meus bookmark's (inclusive os vivos) para um ftp e baixar em casa. Assim, mantenho meus favoritos atualizados em casa e no serviço.
HTML Validator: Valida páginas html de acordo com as normas da w3c.
Optimoz Tweaks: Esconde/Mostra a Side Bar automaticamente quando o mouse entra/sai nela.

Cada dia me surpreendo mais com o browser da mozilla!
Instale-o e se surpreenda também!

Um dos únicos argumentos que podem surgir é que nem todas páginas são exibidas, então vou rebater logo com a verdade pois todos deviam saber:

Primeiro: se você só utiliza Internet Explorer não conhece um browser de verdade, e te garanto que você só o conhece porque a Microsoft fez o favor de incluir ele no Windows para sua comodidade. Se tivesse que baixar da internet e instalar no seu windows, você não o faria. E mais: sua dona não tem interesse em aperfeiçoá-lo. Porquê? Veja aqui.

Segundo: O estrago na internet que ela fez com o monopólio que veio advindo desta "distribuição" disfarçada é incalculável. Muita gente sabe que a Microsoft nunca foi a que mais seguiu padrões e nem será. É bastante simples entender: padrões não possuem importância quando se é a maioria. Você faz e quase todo mundo automaticamente usa, isso importa. Comparo a dar remédio pra menino "guela abaixo": você tem muito mais força e se ele reagir você o domina.

A falta destes padrões dificultam que outros browser's exibam as mesmas páginas que o navegador dela exibe. Então, se você usa o Firefox/outro e ele não mostra a página que você deseja corretamente, a partir de agora já sabe que a culpa não é do browser: é do dono do site que não o fez seguindo padrões.

Esta não é somente a minha opnião. Bastante pessoas pensam como eu (ou eu penso como elas :D), duas:
Bruno Torres
Joel on Software

segunda-feira, 22 de novembro de 2004

Você adora ser um hardware man?

Pra quem é ou deseja ser um "hardware man" ou "suport man", que tal este cartum aparentemente feito pela IBM?

Ele descreve bastante bem o que você é/será!
É um cartum "flashiano" em chinês, mas não é difícil de enteder.
É um pouquinho grande, mas já aviso: vale cada bit do download.
A música de fundo é chique pra caramba!

Veja aqui o Cartum

quinta-feira, 18 de novembro de 2004

Um jogo de xadrez interessante

A fim de descobrir quem joga xadrez da turma:
Que tal ver o que o computador está calculando para fazer a jogada?

Achei super interessante este jogo de inteligência articial (sim, ele aprende jogando).
Não é necessário nem instalar! Basta clicar no link.

Link do jogo

Se não sabe jogar, vai querer pelo menos ver as imagens. (Cada linha correponde a uma jogada possível)

Imagens interessantes

Para os não curiosos que deixaram de olhar o código da página: é um jogo feito em java... mais precisamente um Applet. E muito bem feito!

sexta-feira, 5 de novembro de 2004

Btree for all

Não pude deixar de notar esta beleza de aula que vai do começo ao aparente final do assunto btree.

Aula btree USP

Huffman

Pra quem está boiando em código de huffman...

Leia esta apostila que explica muitíssimo bem!
É um arquivo em formato pdf.

Apostila da USP

quinta-feira, 4 de novembro de 2004

Build em somente um passo com Want

Want é uma ferramenta para automatizar a compilação de projetos delphi criada por Juancarlo Anez como podemos constatar no sourceforge. Sua criação foi inspirada na ferramenta Apache Ant e com isso acabou suportando a grande maioria de tarefas que esta tem a disposição. Não encontrei muita documentação a respeito do want mas a documentação do Apache Ant foi suficiente para minhas dúvidas e inclusive o próprio autor a indica.

De onde vem o nome? Conforme cita o autor a primeira idéia foi representar "Windows Ant" só que ele queria algo que também incluísse o Kylix/FreePascal. Porém como era fácil pensar: want compile, want install, ou seja, desejo compilar, desejo instalar, o nome acabou sendo mantido. :D

2.0 Por que utilizar?
Diria que automatizar o processo de compilação, principalmente quando se tem vários programas ou mesmo vários módulos, algumas diretivas de compilação e outras coisinhas mais, te leva a deixar de se preocupar com vários detalhes que geralmente são esquecidos no momento da distribuição dos binários para o Cliente e como diz a experiência, uma falha neste processo sempre causa alguns problemas e alguma insatisfação.
Além disso, uma das etapas que o Joel defende em seu blog no artigo 12 passos para um código melhor é exatamente o build em somente um passo. Admirando suas idéias e pensamentos (o cara é realmente bom no que escreve e pensa) não poderia deixar de perceber que realmente é um passo de grande importancia! E acredito que temos um bom motivo pra fazê-lo ao somar todo o processo que vai do Ctrl+F9 até a disponibilização em um ftp ou website.

3.0 Copiando e instalando
Do sourceforge você irá baixar este arquivo compactado que contém o binário, o código fonte do want e do dunit (do mesmo autor) além de alguns exemplos de script em xml.
Pra facilitar, coloque o arquivo want.exe em um diretório que esteja no path de seu sistema operacional (ou direcione o path até ele).
Copie também este programa ftp, feito em Delphi com os componentes Indy que será utilizado como exemplo de compilação.

A versão do Indy necessária é a 9.00.10 que vem por padrão no Delphi 7 mas não no 6. Pensando na frustação de quem usa o Delphi 6 e quer seguir o artigo deixo a dica: Remova o Indy que vem em seu Delphi através de "Adicionar/Remover programas - Borland Delphi 6/Alterar" desmarcando apenas o Indy. Depois baixe este arquivo, extraia e compile a package. Se ainda restar dúvida, veja as notas específicas para a sua versão de delphi direto do site do Indy.

4.0 Criando um script de compilação (want.xml)
Acompanhe a criação das tags observando o arquivo want.xml da pasta do programa ftp.

4.1 O cabeçalho do arquivo
O script possui seção geral (como todo xml) onde se é definido o nome do projeto, o diretório base que será utilizado na definição dos caminhos e o alvo padrão que será chamado quando não for fornecido parâmetro algum ao want.exe. Facilita bastante utilizar . ou .. para indicar o diretório atual e o anterior, principalmente quando resolver mudar o caminho dos fontes.



<project name="ftpth" basedir="." default="all">
</project>



4.2 Definindo propriedades

Considere propriedade como sendo uma varíavel do tipo string. Ela tem um nome e um conteúdo. Para definí-la você utiliza a sintaxe:

<property name="nomevar" value="valor"/>


Para definir o valor, além do texto, pode-se utilizar alguma outra propriedade já definida, variáveis vindas da linha de comando e chaves de arquivos ini.


<property name="nomevar" value="${propertyJaDefinida}textoadicional"/>



4.3 Lendo chaves de um arquivo ini
Antes um detalhe: Os caminhos de arquivos/diretórios no want, mesmo em ambiente windows são definidos utilizando barra normal.

Se sua empresa/projeto possui vários programadores, suspeito que cada um deles prefira instalar aquela suite de componentes ou até mesmo o próprio Delphi em um caminho diferente. Diria que cada um bagunça como pode, então iremos isolar os caminhos destes componentes em um arquivo ini com seções e chaves pré-definidas pra facilitar uma posterior manutenção no script. Nesta mesma "bagunça" cada programador há de querer que os binários resultantes da compilação fiquem em um diretório específico, então, mais uma chave no arquivo ini. Outro para os arquivos zipados, outro para isto, aquilo, aquilo...

Teoria: Para ler uma chave de um arquivo ini utilizamos o operador ?{}. A linha a seguir lê a chave "key1" da seção "seção1" do arquivo "th.ini" atribuindo seu valor a propriedade "nomeprop":


<property name="nomeprop" value="?{th.ini:seção1:key1}"/>


Embora o programa a ser compilado (ftpth) não necessite de componentes que não tenham dcu's fora da pasta lib, e o want também disponibilize uma chave para incluir o LibraryPath do delphi, vou ilustrar a inclusão. Ela está comentada utilizando <!-- --> e dentro da seção project:


<!--
<property name="delphibase" value="?{want.ini:paths:delphibase}"/>
<property name="tponguard" value="${delphibase}/?{want.ini:path:tponguard}"/>
<property name="jvcl" value="${delphibase}/?{want.ini:path:jvcl}"/>
<property name="jcl" value="${delphibase}/?{want.ini:path:jcl}"/>
-->
<property name="bin" value="?{want.ini:paths:bin}"/>
<property name="src" value="?{want.ini:paths:src}"/>
<property name="doc" value="?{want.ini:paths:doc}"/>



4.4 Variáveis vindas da linha de comando

Para as vezes em que for necessário definir algo somente no momento da chamada, existe a possibilidade de passar variáveis para o want através da flag -D.
Exemplo: Definindo que a propriedade nomeprop receberá o valor da variável nomevar
Na chamada do want: want acao -Dnomevar=conteudo
A variável no script:

<property name="nomeprop" value="%{var_linha_cmd}"/>



4.5 Conjunto de propriedades
Para facilitar a posterior inclusão dos caminhos todos de uma só vez na chamada do compilador, um agrupamento dos caminhos acima é o ideal. Até porque existem sistemas que utilizam vários componentes de terceiros e ninguém costuma colocar tudo numa mesma pasta :D. Para isso, utiliza-se a tag patternset:



<patternset id="sources">
<!--
<include name="${tponguard}"/>
<include name="${jvcl}"/>
<include name="${jcl}"/>
-->
</patternset>



4.6 Versionamento
Utilizando um arquivo ini e o auxílio de expressões regulares vamos definir algumas propriedades com as versões que serão utilizadas nos alvos daqui alguns minutos ;D. Ficarão posicionadas na seção project visando a visibilidade para todos alvos.



<!-- buscando a versão do último build em um arquivo ini -->
<property name="old.version" value="?{want.ini:ftpth:versao}" />
<!-- build anterior - note a utilização de expressões regulares -->
<regexp property="old.build" text="${old.version}"
pattern="^.*.([0-9]+)$" subst="1" />
<!-- incrementa o build number e prepara string com as versões -->
<property name="build" value="={1 + ${old.build}}" />
<regexp property="version" text="${old.version}"
pattern=".[0-9]*$" subst=".${build}" />
<regexp property="comma.version" pattern="." subst=","
text="${version}"/>
<property name="zipfile" value="${bin}/ftpth-${version}.zip"/>



4.7 Definindo alvos pré compilação

Como em makefile's, muito utilizados em c, c++, e outras, é possível definir alvos que realizam alguma tarefa especifica e também alvos que possuem alguma dependência. Um alvo (target) sempre será especificado na linha de comando indicando para o executável o que fazer. O alvo pode estar definido em "default" na tag "project" e ser omitido na chamada.

Fazendo do alvo "clean" o responsável em limpar o diretório definido no arquivo ini por sua vez mapeado na propriedade bin:


<target name="clean">
<delete dir="${bin}" basedir=".">
<include name="*.exe"/>
<include name="*.map"/>
</delete>
<delete dir="${src}" basedir=".">
<include name="*.dcu"/>
<include name="*.drc"/>
</delete>
<delete dir="${doc}" basedir=".">
<include name="*.*"/>
</delete>
</target>



Este alvo prepare cria o diretório onde ficarão os binários, pre-processa o arquivo de resources (com o ícone e informações da versão do arquivo) e gera o arquivo .res. Ele utiliza as propriedades de incremento de versão, este alvo será dependencia de outro, que chamaremos de "build".



<target name="prepare">
<mkdir dir="${bin}"/>
<!-- exibindo mensagem com a versão -->
<echo message="version=${version}" />
<echo message="build=${build}" />
<!-- note que as marcações do arquivo ftpth.template.rc são substituídas automaticamente -->
<echo input="${src}/ftpth.template.rc" file="${src}/ftpth.rc" />
<!-- gerando o arquivo de resources -->
<brcc file="${src}/ftpth.rc" output="${src}/ftpth.res" />
</target>



4.8 Defindo os alvos de compilação
Nos alvos abaixo não é utilizado nem a metade das opções possíveis para a tag dcc. Porém acredito que a grande maioria (senão todos) os parâmetros do dcc32.exe estão disponíveis. Fica a dica de uma exploração no código fonte do want, mais precisamente no arquivo DelphiTasks.pas da linha 254 em diante.


<target name="compile">
<!-- Invoca o compilador dcc para o arquivo ftpth.dpr no diretório src -->
<dcc basedir="${src}" source="ftpth.dpr">
<!-- Os executáveis vão para o diretório bin -->
<exeoutput path="../${bin}"/>
<console value="true"/>
<!-- Definindo uma diretiva de compilação -->
<define name="DEBUG"/>
<uselibrarypath value="true"/>
<!-- Onde encontrar os sources (comentado pela utilização do library path)
<unitpath refid="sources"/>
<includepath refid="sources"/>
-->
<resourcepath>
<include name="${src}"/>
</resourcepath>
</dcc>
</target>



Sendo o alvo anterior a compilação com informações de debug, vamos criar um novo a partir dele só que retirando as informações de debug e inserindo otimização no compilador. Se chamará "build" e depende dos alvos clean e prepare, ou seja, a sequencia de execução ao chamar "want build" será: clean, prepare, build.


<target name="build" depends="clean,prepare">
<dcc basedir="${src}" source="ftpth.dpr">
<exeoutput path="../${bin}"/>
<build value="true"/>
<optimize value="true"/>
<console value="true"/>
<uselibrarypath value="true"/>
<resourcepath>
<include name="${src}"/>
</resourcepath>
</dcc>
</target>



4.9 Gerando a documentação do fonte
Um exemplo de alvo que gera a documentação utilizando a ferramenta PasDoc. Pode notar que é invocado o executável propriamente dito com alguns parâmetros e em seu lugar poderia estar qualquer outra ferramenta que você conhece/utiliza que aceite parâmetros na chamada.
Uma coisinha nova que aparece é o operador @{} que faz com que o caminho relativo passado seja expandido e adaptado ao formato do sistema operacional.




<target name="doc">
<mkdir dir="${doc}"/>
<exec executable="pasdoc">
<arg value="--write-uses-list"/>
<arg value="-T FtpTh"/>
<arg value="-L br"/>
<arg value="-v 2"/>
<arg value="-M private,protected,published,public"/>
<arg value="-E"/>
<arg value="@{${doc}}"/>
<arg value="@{${src}/*.pas}"/>
</exec>
</target>



4.10 ZIP
Não será necessário compactador externo já que a want tem uma tag nativa para tal. Não a conhecia, mas é a PasZLib.
No arquivo zip será incluído o binário da compilação, os fontes e sua documentação.



<target name="zip">
<zip zipfile="${zipfile}">
<include name="${bin}/*.exe"/>
<include name="${src}/*.*"/>
<exclude name="${src}/*.dcu"/>
<exclude name="${src}/*.exe"/>
<include name="${doc}/*.*"/>
<include name="want.xml"/>
<include name="want.ini"/>
<include name="want.css"/>
<include name="want.html"/>
<include name="ftpsend.template"/>
</zip>
</target>



4.11 FTP
Está se perguntando pra que este programa de ftp já que o windows tem um desde o início da leitura, certo?
Bom, o ftp padrão do windows funciona extremamente bem até você estar atrás de um proxy. Fizeram o favor de não implementar o modo passivo (command pasv) e isso me impossibilita de utilizá-lo.

Assim como no arquivo dos resources, teremos um arquivo de template com os comandos para envio pelo ftp com algumas variáveis. A idéia é pre-processar este arquivo e enviar o resultado como parâmetro para o programa que vai despachar o build.

Arquivo template: ftpsend.template

Arquivo resultante: ftpsend.ftp



<target name="ftpsend" depends="zip">
<property name="ftphost" value="?{want.ini:ftp:host}"/>
<property name="ftpuser" value="?{want.ini:ftp:user}"/>
<property name="ftpkey" value="?{want.ini:ftp:key}"/>
<property name="binfile" value="@{${zipfile}}"/>
<property name="dirdoc" value="@{${doc}/*.*}"/>
<echo input="ftpsend.template" file="ftpsend.ftp" />
<exec executable="binary/ftpth">
<arg value="ftpsend.ftp"/>
</exec>
<delete dir="." file="ftpsend.ftp"/>
</target>



4.12 CVS
Só fazendo uma "xerox" do alvo tag do script de build do próprio want:


<target name="tag">
<regexp property="cvs.tag" text="build_${version}" pattern="." subst="_" />
<cvs command="rtag -R -F ${cvs.tag} ." />
</target>



4.13 Alvo default - O faz tudo!

Lembra-se que na seção project ficou definido que o alvo "all" deve ser o default?
Ele também fica responsável em gravar a versão no arquivo ini já que enquanto não chegar tudo no ftp podem acontecer erros e a versão não deveria ser incrementada por isso.



<target name="all" depends="build,doc,tag,ftpsend">
<!-- Gravando a versao no arquivo ini (só é executado se todo o processo tiver sucesso)-->
<ini file="want.ini">
<write section="ftpth" key="versao" value="${version}" />
</ini>
</target>



Conclusão
Foi ótimo digitar want e puf! está lá no site tudo correto, o número de versão, ícone, cvs etc :D
Se chegou até aqui acredito que vai achar ruim que não foi colocado pelo menos três ótimos alvos:
1) compilação de sistemas modularizados em packages

2) DUnit (já existe a tag)
3) InnoSetup (também já tem tag)

segunda-feira, 25 de outubro de 2004

Como você nomeia suas funções?

Se você é um daqueles que não fazem do nome de funções uma coisa útil e identificável que sirva para entendimento e fácil localização, bem vindo ao clube do qual já vou saindo...

Imagine a situação: Estás a fazer aquele monstro de rotina para manipulação de btree’s e de repente percebe que usar aquele seu arquivo de pilha será muito útil. Tudo perfeito pois a idéia é mesmo aproveitar o que está pronto. É neste momento que a coisa pega: Você acabou pensando cada arquivo como uma coisa isolada, não reutilizável, e nomeou as funções sem usar prefixos ou sufixos. Existe uma função em um arquivo chamada destrói (a pilha) e no outro existe uma função que destrói a árvore. Como você faz pra identificar uma e outra?

Em linguagens orientadas a objetos é simples... "objeto.procedimento" e a situação está resolvida! Em linguagens com conceito de namespaces (c++ por exemplo) também fica fácil já que se pode envolver tudo num "space" e "space.procedimento" te retorna a função...

Em linguagens estruturais a melhor idéia é mesmo identificar. Não só funções, as estruturas e outros. Vai me dizer que todas as estruturas que definem os nós da sua btree, pilha e fila chamam-se "noh"?!

Uma boa idéia (não a única) é nomear utilizando um prefixo:
btree_insert, btree_destroi, btree_...
ebtree_noh ou sbtree_noh (a primeira letra de estrutura, struct)

Utilizar nomes de funções no imperativo ou no infinitivo pessoal também é uma boa pedida.
btree_insere ou btree_inserir, btree_destroi ou btree_destruir e por aí vai.

Embora cada um se sinta mais a vontade fazendo do "seu jeito", acho que é uma boa dica. Quer mostrar a notação que utiliza? Coloque como comentário, ok?

sábado, 23 de outubro de 2004

Utilize o que já fizeram pra te ajudar

Minha pouca experiência de programador já é capaz de refletir em algumas de minhas opniões. Uma delas diz: "utilize o que já fizeram pra te ajudar". Nada de muito especial ou imprevisível, mas às vezes realmente deixamos de fazê-lo. (Observe que não estou me referindo a pegar o exercício da lista pronto no google)

Geralmente neste ramo a idéia é sempre fazer algo generalizado. Html por exemplo: alguém inventou e hoje você vê este blog. Em suma, é um padrão. Todo mundo que disponibiliza uma página na web utiliza assim.

Só que para usar o que já fizeram por você é necessário que saiba como. Particularmente tenho facilidade em pegar exemplos prontos de alguma coisa e adaptá-la as minhas necessidades ou até mesmo aprender só de olhar o exemplo.

Então, aí vai um exemplo de geração de uma árvore binária (b-tree) em html. É claro que conhecimentos básicos de html são necessários pra entender completamente a função que está em c, mas não deixe de olhar apenas por isso.

Arquivo

Não entendeu? Bom, pode me pedir uma explicação!

sexta-feira, 15 de outubro de 2004

Inovações no software livre

Cada dia mais percebo que quem fala mal de software livre é porque nunca teve chance de pelo menos uma vez experimentar. Não estou falando de linux. Estou falando de software livre mesmo. Mas o que quero destacar agora é a velocidade que inovações são incluídas e disponibilizadas nos programas livres!

Hoje descobri a última maravilha de leitores de email/notícias. Já utilizava o Mozilla Thunderbird a algum tempo, mas esta última versão inclui uma novidade espetacular. É a conta para os "feeds rss".
Já pensou poder ver meu blog do seu programa de e-mail/notícias?
Tá bom, não é grande coisa assim... mas você pode incluir "feeds" no formato rss que quase todos sites de notícias e blog's possuem. Basta procurar por um ícone escrito "rss" em cor alaranjada.

Mas como faço?
Basta incluir uma conta (Menu ferramentas/Configurar Contas/Nova Conta) do tipo "RSS News & Blogs" e informar uma descrição. Logo após você seleciona a conta que acabou de criar no painel da esquerda e clica no botão "configurar inscrições". Clique em "Nova" e informe o arquivo fonte rss.

O arquivo rss do meu blog é http://www.tbosystems.bluehosting.com.br/blog/xml-rss2.php

Veja aqui uma imagem de como ficou!

Já que o assunto é software livre mesmo, então que tal este feed?
http://br-linux.org/noticias/index.rdf

Aqui tem uma breve explicação sobre rss:
Mantendo-se em dia na Web com RSS

Você não disse onde encontrar o mozilla thunderbird!
Há sim... siga este link

sábado, 9 de outubro de 2004

Apresentando: O blog do Joel

Por acaso conheci um blog, no news de delphi que frequento, que tem um material interessante. Pra começar, o autor dele foi chefe cordenador da equipe que desenvolveu o Microsoft Excel. Sentiu a força?

Pra falar a verdade, desde o dia que conheci vivo cultuando este blog. Que idéias interessantes pra quem é desenvolvedor de software! Acredito que todos os que estão neste meio (tanto acadêmico como profissional) deveriam lê-lo.

Mas desenvolvimento do Excel, Delphi, não sou muito entendido destas tecnologias, vou fechar o browser...
Peraí... se enganou se acha que não vai ser interessante. Primeiro que não tem nada a ver com Delphi a não ser o sistema operacional que rodam.

Este link que vou postar é sobre strings em C. Quero até ver o que vai me dizer depois da abordagem acadêmica que ele dá ao assunto. Você vai ver, parece que ele é seu professor e sabe de tudo o que você pensa. Não dê atenção ao pormenores que você não entender. O que vale é o todo.

Está exagerando demais...

Não quer deixar que eu poste o link?

Tudo bem, tudo bem.
Então aí vai, uma ótima leitura... (e não deixe de olhar os outros artigos)

Voltando ao básico

sexta-feira, 8 de outubro de 2004

Definições do google

Mas o que esta sigla significa? E esta palavra de tecnologia?
Vive se perguntando sobre significado de siglas e palavras?
Seus problemas acabaram! Chegou o ultra revolucionário google definator tabajara!

Hehe... pesquise no google com a seguinte sintaxe: define:nat
Ele te mostrará todas as possíveis definições na web da sigla "nat".

Arquivos da lista de recursão

O Rogério (colega) me pediu a lista de recursão que fiz pra entregar em ed2.
Acho que pode ser do interesse de mais alguém (tenho dúvidas) por isso resolvi postar num local público.

De quebra vai indo a lista encadeada simples e dupla, sem as quais a recursão não compila já que utilizei o que estava pronto.

Nem pense que é a melhor implementação possível. Eu tenho muita preguiça de fazer estas listas, como demoram.

O arquivo que você deve compilar é só o recursão_xxx.c pois é o único que tem a função main. Nem preciso dizer que devem estar no mesmo diretório, certo? (Ops, acabei dizendo :P)

Lista simples
Lista dupla
Recursão

quinta-feira, 7 de outubro de 2004

Como é fácil aprender a ler inglês

Saiu no dicas-l da unicamp uma pérola de dica! Principalmente pra quem trabalha com computação e acaba se vendo limitado por conta, pelo menos, da leitura do inglês. Já estou estudando e realmente está funcionado, interessante o método publicado.

Como já enviei por email pra muitos de meus colegas, vou deixar apenas os links pra seguir a matéria:

http://www.dicas-l.com.br/dicas-l/20041005.php
Veja esta apostila que recebi ao me inscrever

quarta-feira, 6 de outubro de 2004

Como utilizar um debugger?

Antes de mais nada, debugger é um utilitário que utilizamos para percorrer o código fonte do programa observando onde a linha de execução do programa percorre além de monitorar o comportamento de variáveis (seus valores).

Particularmente, acho muito fácil programar utilizando um. Os erros de lógica são percebidos bem facilmente, ainda mais quando se tem domínio da ferramenta.

É mais fácil utilizar em um ambiente de desenvolvimento que te permite fazer as marcações mais facilmente (utilizando o mouse por exemplo).
No Linux temos alguns disponíveis. Os que prefiro:
- KDevelop (ambiente KDE)
- Anjuta (ambiente GNome)

No Windows o DevC++ (livre) e o VisualC++ (Microsoft) possuem debugador integrado também.

Bom, mas quero chegar nestes dois artigos do site Viva o Linux que explicam, através do gnu debugger, os princípios de um debugador (breakpoint's por exemplo), dando base pra utilizar qualquer ambiente de desenvolvimento que implemente esta funcionalidade. Somando ao fato de as vezes não termos a disposição os ambientes acima citados, temos uma boa deixa pra ler os artigos e aprender a coisa pela raiz.

De qualquer forma não deixe de olhar os ambientes de desenvolvimento que citei. Eles facilitam a vida :P

Boa leitura!
1ª Parte
2ª Parte

terça-feira, 5 de outubro de 2004

Bem vindo | Welcome | Bienvenue | Willkommen

Venho observando que as maiores informações que obtenho sobre novidade a respeito de tecnologias que utilizo em meu trabalho estão em blog's.

É grande o número de funcionários de empresa como a Borland e Microsoft (só pra citar duas) que possuem blog. É por eles que me informo de coisas novíssimas ou pelo menos fico ciente da opnião de pessoas com grande influência neste meio.

Por isso, acabei resolvendo deixar anotado aqui tudo o que vai me interessando pra poder consultar futuramente, ou pra você saber sobre o que pesquiso e até poder discutir comigo sobre os assuntos. Não será blog de minha vida pessoal. É um blog de informação, tutorias, como facilitar a vida, etc. (To "cuecas": will not find naked woman's here :D).

Quem sabe você não encontra por aqui uma boa solução para o problema de estrutura/banco de dados? Bom, pretendo publicar algo aqui. Não pense que publicarei antes do dia da entrega :). Mas talvez saia uma canja antes :D

Se tiver sugestão de matéria/artigo/link interessante pode me informar que eu posto aqui.

Pretendo publicar o que de mais precioso recebo em meu e-mail ou leio em outros sites diariamente. Assim dá pra ter um conteúdo seleto do que aprecio e de quebra você pode utilizar também.

A propósito, sabe de qual lingua se trata cada palavra do título?