• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Blog dos Moderadores

  • entries
    43
  • comments
    0
  • views
    49281

Contributors to this blog

  • jpaulino 19
  • thoga31 9
  • Rui Carlos 7
  • David Pintassilgo 3
  • brunoais 2
  • bioshock 1
  • Warrior 1
  • M6 1

About this blog

Entradas promovidas pelos Moderadores da Comunidade

Entries in this blog

thoga31

PROGRAMAR Downloader for Linux

210_abort.png

Para os leitores da Revista PROGRAMAR e que usam distribuições GNU/Linux, foi lançada uma aplicação minimalista para fazer o download automatico e selectivo das edições da Revista.

Esta aplicação junta-se a outras já existentes para a OS Windows.

Em 2/2/2014 às 21:06, thoga31 disse:

Titulo do Projecto: PROGRAMAR Downloader for Linux

Última Versão: 1.1.0-beta

Licença: GNU GPL 3.0

Líder do Projecto: thoga31

Membros Actuais do Projecto: thoga31

Descrição do Projecto:

Reparei que já temos mais do que uma aplicação relacionada com a Revista PROGRAMAR, mas nenhuma delas se destina a outra plataforma que não o Windows.

Nessa medida, decidi fazer uma aplicação simples e minimalista para distribuições GNU/Linux.

O programa permite:

  • Verificar qual é a última edição da Revista.
  • Fazer o download de todas as edições, apenas da última, ou então um download selectivo de determinadas edições.
  • Modular o output através dos modificadores -v (verbose) e -q (quiet, não recomendado).

Ver mais: PROGRAMAR Downloader for Linux

Rui Carlos

Tutoriais da Disponíveis no P@P

O índice de tutoriais disponíveis no P@P tem vindo a ser actualizado, e já conta com dezenas de tutoriais indexados :)

Vê a lista actualizada abaixo.

ActionScript

ASP

Bases de Dados

C

CSS

C#

Java

Javascript

Pascal

PHP

Python

SQL

VB.net

VBA

Outros

jpaulino

Guia de Documentação do P@P

Guia de Documentação do P@P

Este Guia tem por objectivo orientar os membros sobre a boa utilização dos recursos de documentação que o P@P disponibiliza.

A existência de bons documentos depende em muito da boa-vontade dos membros em participar com conteúdos de qualidade.

Índice:

  1. Quais são os recursos de documentação do P@P?
  2. Qual o funcionamento e o método de trabalho de cada recurso?
  3. O que posso publicar em cada um dos recursos?
  4. Tenho dúvidas sobre onde colocar um documento que quero partilhar.
  5. Não sei trabalhar na Wiki. Não posso colocar o tutorial/how-to/snippet num tópico no fórum?
  6. Quais os níveis de acesso que cada recurso tem?
  7. Notas finais

1. Quais são os recursos de documentação do P@P?

  • Wiki P@P - plataforma Wiki onde qualquer membro pode colocar os seus documentos e actualizar os já existentes. Inclui a possibilidade de tirar dúvidas e dar sugestões directamente nos documentos graças ao módulo Discussion. Para mais informações sobre como participar na Wiki, consulta o FAQ e o Guia.

  • Portal de Downloads - um repositório de documentação sobre programação e assuntos relacionados. Inclui documentos académicos, tutoriais, exercícios, bibliotecas, aplicações, entre outros.

  • Revista PROGRAMAR - revista bimensal, em formato digital, gratuita e sem fins lucrativos, feita por membros e não-membros voluntários. Conta já com mais de 100 artigos de qualidade sobre programação, e mais outros tantos sobre temas relacionados.

2. Qual o funcionamento e o método de trabalho de cada recurso?

Cada recurso tem o seu funcionamento próprio devido às diferentes plataformas e aos diferentes suportes em que existem.

  • Wiki P@P - qualquer membro pode editar ou criar documentos. Contudo, não é um documento "qualquer" que lá pode ser colocado, e as edições devem ser feitas com rigor e sem perda de informação, a não ser que esta esteja errada. Pequenos tutoriais e how-to's, snippets e informação de qualidade em geral podem ser lá colocados na devida área (namespace). A equipa que faz a sua manutenção é a Wiki Team.
    • [Regras e guia de estilo | Guia da Wiki P@P | FAQ]
    • ​ATENÇÃO! Se não se pretender que o documento possa ser alvo de edição por um outro qualquer membro, então esteve deve ser submetido no Portal de Downloads!

  • Portal de Downloads - qualquer membro pode colocar documentos (ficheiros) na secção devida. Dever-se-á incluir uma pequena descrição do documento. Antes de este ser colocado a público, o ficheiro será alvo de aprovação. A equipa que faz a sua manutenção é o Staff.

3. O que posso publicar em cada um dos recursos?

Para ser fácil de consultar, cada género de documento é listado, seguido dos recursos onde se pode inserir.

  • Tutoriais & how-to's
    • Pequena dimensão: Wiki; Downloads (em PDF)
    • Média e grande dimensão: Downloads; Revista (a debater com a respectiva equipa). Em casos excepcionais na Wiki - contactar a Wiki Team antes da publicação.
    • Documentos que possam ser bons artigos devem ser submetidos para a Revista.

  • Snippets
    • Prontos-a-usar: Wiki
    • Com documentação/informação: Wiki, Downloads (em ZIP)

Para saber o core de cada recurso, segue a descrição:

  • Wiki P@P - Documentos informativos (tipo Wikipédia), tutoriais de pequena e média dimensão, how-to's, snippets em geral, de preferência prontos-a-usar e/ou com informação sobre o seu código e o seu uso.

  • Portal de Downloads - Documentos académicos, exercícios, tutoriais de grande dimensão em PDF, aplicações e bibliotecas (com documentação, de preferência, e em ZIP).

  • Revista PROGRAMAR - Artigos sobre programação e/ou assuntos relacionados, apreciações de livros da área, entre outros.

4. Tenho dúvidas sobre onde colocar um documento que quero partilhar.

Primeiro contacta um membro da equipa da área onde achas que se poderá encaixar melhor o teu documento.

Para o caso da Revista, as propostas devem ser colocadas directamente no quadro para o efeito - Propostas de artigos -, onde os tópicos só são visíveis ao autor deste e ao Staff da Revista, pelo que o diálogo se dará em privado.

5. Não sei trabalhar na Wiki. Não posso colocar o tutorial/how-to/snippet num tópico no fórum?

Sim. Contudo, não se deve "inundar" um quadro do fórum só com documentos.

Após a colocação do documento no fórum, deve-se contactar um membro da Wiki Team para a equipa saber que

  1. o autor autoriza a sua colocação na Wiki, e
  2. existe um novo documento para ser colocado na Wiki,

isto porque a Wiki Team não pode estar sempre a seguir todos os tópicos novos para verificar a existência de conteúdos de qualidade: cabe aos membros dar esta indicação, ajudando a Wiki a tornar-se um centro de informação de qualidade.

Em alternativa, aconselha-se contactar directamente um membro da Wiki Team com o documento em questão sem ter de o publicar no fórum.

6. Quais os níveis de acesso que cada recurso tem?

A Revista não encaixa nestes parâmetros, pelo que:

  • Wiki P@P
    • Criação & edição: membros do P@P, vedado a visitantes.
    • Consulta: qualquer pessoa.

  • Portal de Downloads
    • Criação: membros do P@P, vedado a visitantes.
    • Manutenção/edição/actualização: só o membro que criou o documento a ser actualizado.
    • Consulta/download: apesar de os visitantes poderem ver quais os conteúdos que existem, só os membros do P@P podem fazer download destes.

Notas finais

Se tiverem mais alguma questão sobre os recursos de documentação do P@P, não hesitem em perguntar!

E não se esqueçam de contribuir!

Mais informação e actualização em: Guia de Documentação do P@P

thoga31

Python - Links úteis

O quadro de Python tem, a aprtir de hoje, um tópico com links úteis:

  • Links do P@P
    • Tutoriais
    • Snippets
    • Artigos Revista PROGRAMAR

    [*]Links externos ao P@P

Sintam-se à vontade para propor mais links úteis, este tópico estará em constante actualização ;)

Aqui fica uma listagem de links úteis sobre Python. :thumbsup:


Links do P@P

Tutoriais

[table]

[td]Introdução ao Python[/td]

[td][/td]

[td]Wiki[/td]

[td]Tutorial simples do Pygame[/td]

[td][/td]

[td]Wiki[/td]

[td]Compilar codigo fonte (.py) para byte-code (.pyc)[/td]

[td][/td]

[td]Wiki[/td]

[td]Expressões Regulares em Python[/td]

[td][/td]

[td]Wiki[/td]

[td]Função Filter[/td]

[td][/td]

[td]Wiki[/td]

[td]Função Map[/td]

[td][/td]

[td]Wiki[/td]

[td]Função Reduce[/td]

[td][/td]

[td]Wiki[/td]

[td]Funções Lambda[/td]

[td][/td]

[td]Wiki[/td]

[td]Interfaces Gráficas com Tkinter[/td]

[td][/td]

[td]Wiki[/td]

[/table]

Snippets

[table]

[td]Snippets vários[/td]

[td][/td]

[td]Wiki[/td]

[td]Leitor de feeds em modo de texto[/td]

[td][/td]

[td]Wiki[/td]

[td]Option parser[/td]

[td][/td]

[td]Wiki[/td]

[td]Sudoku[/td]

[td][/td]

[td]Wiki[/td]

[/table]

Artigos Revista PROGRAMAR

[table]

[td]Python: Sockets e NetWorking - 1ª Edição[/td]

[td]Revista[/td]

[td]Python - Introdução - 6ª Edição[/td]

[td]Revista[/td]

[td]Interacção Python/MySQL - 14ª Edição[/td]

[td]Revista[/td]

[td]Programação Funcional em Python - 23ª Edição[/td]

[td]Revista[/td]

[td]Aquisição e Inspecção de Dados em Python - 34ª Edição[/td]

[td]Revista[/td]

[/table]


Links externos ao P@P

[table]

[td]Documentação oficial - Python Documentation[/td]

[td]Inglês[/td]

[td]Link[/td]

[td]Learn Python The Hard Way[/td]

[td]Inglês[/td]

[td]Link[/td]

[/table]


Esta lista será actualizada com os documentos mais relevantes sempre que houver novidades.

Se quiserem propor mais documentos, sites e blogs de relevância, apitem. :D

Este tópico não serve para discutir os links.

Não se esqueçam: contribuam com novos documentos e snippets na Wiki! :thumbsup:

Origem: Links úteis (documentação, livros, tutoriais, snippets)

jpaulino

A empresa syncfusion disponibiliza alguns recursos, ebook e white papers, muito interessantes e ainda por cima gratuitos. Os recursos estão disponíveis em formato PDF ou em versão Kindle.

Os ebooks são de uma série, designada por Succinctly, e não são mais dos que guias de determinadas tecnologias com aproximadamente 100 páginas.Estes são os títulos à data disponíveis:

Ebooks

javascript_succinctly.PNG git_img.PNG jquery_img.PNG

e ainda:

White papers

mobileapps_im.PNG windows8_im.PNG html5_im.PNG

E ainda:

A não perder e para mais informações consultar o Technology Resource Portal da Syncfusion

thoga31

Enquanto os computadores evoluíam, o Delphi não ficou atrás, e surgiu nesta linguagem uma forma muito inteligente de trabalhar com ficheiros de texto, mesmo com os de tamanho considerável.

Descobre a classe TStrings e os seus métodos simples e eficientes que permitem trabalhar com ficheiros de texto neste excelente mini-tutorial.

O Pascal sempre foi uma linguagem de trato fácil, e trabalhar com ficheiros não é excepção.

Portanto, foi com naturalidade que essa simplicidade foi transmitida ao Delphi, que manteve a mesma forma de abrir ficheiros de texto, atribuindo o ficheiro a uma variável, que depois seria lida sequencialmente para uma qualquer string, e com isso, teríamos o conteúdo do ficheiro.

(...)

Origem: Trabalhar com ficheiros de texto em Delphi

thoga31

Um editor de texto simples e eficiente em Pascal. Descobre como se aplica na prática o tipo de dados Text.

Este editor de texto permite criar, consultar e editar ficheiros. A edição não permite criar linhas, só alterar linhas específicas.

O programa está devidamente comentado.

program editor_texto;
uses crt,dos;
var fich:text; // Ficheiro a criar, consultar ou editar
   aux:text; // ficheiro auxiliar para edição
   nome:string; // nome do ficheiro a criar
   nome_aux:string;  // nome do ficheiro auxiliar para edição
   line:string; // string que vai guardando cada linha do documento
   opt:char; // para menus
   opt2:char; // para edições
   i,j:integer; // contadores de linhas e outros


function existeficheiro: boolean;  // verifica se existe um ficheiro
begin
assign (fich, nome);
{$I-};
Reset (fich);
Close (fich);
{$I+};
existeficheiro:=(IoResult=0);
end;

procedure criar;  // criação de ficheiros
begin
    clrscr;
    writeln('A CRIAR UM FICHEIRO DE EXTENSAO TXT');
    writeln;
    writeln('INTRODUZA:');
    write('Nome do ficheiro: '); readln(nome);
    nome:=nome+'.txt';  // nome.*txt
    if NOT existeficheiro then begin  // se NÃO existir o ficheiro, então este é criado
    rewrite(fich);
    writeln;
    writeln('Conteudos:  (nota: ao escrever "<EXIT>" termina a escrita do ficheiro. Para paragrafo, basta fazer ENTER.)');
    i:=0;
    repeat
          i:=i+1;
          write('Linha ',i,': '); readln(line);
          if line='' then writeln('   [Foi feito paragrafo]');  // detector de parágrafos
          if upcase(line)<>'<EXIT>' then writeln(fich,line);
    until upcase(line)='<EXIT>'; // ir escrevendo as linhas do ficheiro, até dar ordem de saída
    if i=1 then writeln('NOTA: O ficheiro ficou vazio. Sera considerao que nao existe!');  // Se i=1, só foi feito <EXIT>, logo o ficheiro está vazio
    close(fich);
    end
    else writeln('[O ficheiro "',nome,'" ja existe!]');  // no caso de haver o ficheiro nomeado, é dado o alerta
    write('Prima qualquer tecla...'); readkey;
end;

procedure consultar;  // ver o conteudo de um ficheiro já existente
begin
    clrscr;
    writeln('A CONSULTAR UM FICHEIRO DE EXTENSAO TXT');
    writeln;
    write('Nome do ficheiro a consultar: ');
    readln(nome);
    nome:=nome+'.txt';

    if existeficheiro then begin  // Se o ficheiro EXISTE, então é lido
       reset(fich);
       i:=0;
       while NOT eof(fich) do begin  // até ao fim do ficheiro, ir mostrando conteúdo linha a linha
             i:=i+1;
             readln(fich,line);
             writeln('Linha ',i,': ',line);
       end;
       writeln('[Fim de ficheiro]');
       close(fich);
    end
    else writeln('[Nao existe o ficheiro "',nome,'"]');  // Se o ficheiro NÃO existe, é dado o alerta e a operação é cancelada
    write('Prima qualquer tecla...'); readkey;
end;

procedure editar;  // lê e edita um ficheiro
begin
    clrscr;
    writeln('A EDITAR UM FICHEIRO DE EXTENSAO TXT');
    writeln;
    write('Nome do ficheiro a editar: '); readln(nome);
    nome:=nome+'.txt';

    repeat
    opt2:='N';
    if existeficheiro then begin  // se o ficheiro nomeado EXISTE, então este é lido e, se assim ordenado, é editado linha a linha
       reset(fich);
       nome_aux:=nome+'_aux.txt';  // nome.txt_aux.*txt
       assign(aux,nome_aux);
       rewrite(aux);

       i:=0;
       while NOT eof(fich) do begin  // mostrar o conteúdo do ficheiro original e copiá-lo para o auxiliar
             i:=i+1;
             readln(fich,line);
             writeln('Linha ',i,': ',line);
             writeln(aux,line);
       end;
       writeln('[Fim de ficheiro]');
       close(fich);
       close(aux);
       opt2:=#13;

       {}
             write('Pretende editar uma linha? (S/N) '); readln(opt2);  // Verifica se há alterações a fazer ao ficheiro
             if upcase(char(opt2))='S' then begin   // Se Sim (S), então editar
                write('Linha a reescrever: '); readln(j);  // Qual a linha a reescrever?
                j:=ABS(j);  // mini-sistema de segurança (não admite nºs reais, só inteiros relativos)
                assign(aux,nome_aux);
                assign(fich,nome);
                reset(aux);  // o auxiliar está pronto a ser lido
                rewrite(fich);  // o ficheiro original é apagado
                i:=0;
                while NOT eof(aux) do begin
                      i:=i+1;
                      readln(aux,line);  // ler linha a linha o auxiliar
                      if (i=j) then begin   // quando i=j (linha actual em análise = linha a editar) é pedido o novo conteúdo da linha
                         writeln('A editar a linha ',j,'...');
                         writeln('Antigo conteudo: ',line);  // antigo conteúdo
                         write('Escreva novo conteudo: '); readln(line);  // novo conteúdo
                      end;
                      writeln(fich,line);  // copiar a linha do auxiliar para o original: se i=j, copiar novo conteúdo
                end;
                writeln('LINHA EDITADA');  // fim de edição do ficheiro
                close(aux); close(fich);
             end;
       {}

    end
    else writeln('[Nao existe o ficheiro "',nome,'"]');  // se NÃO existe o ficheiro nomeado, é dado o alerta e a operação é calcelada

    until upcase(char(opt2))='N';  // no caso de não haver mais edições, ou não existir ficheiro, finalizar edição

    write('Prima qualquer tecla...'); readkey;
end;


begin

    repeat  // MENU PRINCIPAL

    clrscr;
    writeln('EDITOR DE TEXTO [by: Igor Nunes] [version 0.00 beta PT]');
    writeln('MENU PRINCIPAL:');
    writeln;
    writeln('1 > Criar ficheiro');
    writeln('2 > Consultar ficheiro');
    writeln('3 > Editar ficheiro');
    writeln('0 > SAIR');
    writeln;
    writeln('Caso um ficheiro nao tenha conteudos, considera-se hipoteticamente que nao existe.');
    repeat
          write('Opcao: '); readln(opt);
          case char(opt) of
               '1':criar;
               '2':consultar;
               '3':editar;
               '0':exit;
          end;
    until char(opt) in ['0'..'3'];

    until char(opt)='0';
end.

Optimizado para Free Pascal.

Disponível na Wiki

Cumprimentos. :cheesygrin:

Origem: Editor de Texto simples - utilização do tipo de dados Text

thoga31

Class Helpers

Descobre, em Delphi, uma boa forma de acrescentar métodos e propriedades a uma classe pré-existente sem ter de recorrer à derivação clássica, evitando assim a existência de um conjunto enorme de classes extremamente semelhantes mas sim só das estritamente necessárias.

Muitas vezes quando programamos em Delphi, toda a parafernália de componentes que temos à disposição chega e sobra para o que estamos a fazer.

São muitas vezes componentes nativos, testados até à exaustão, e que resolvem bem os problemas.

Também quando não temos nenhum componente para fazermos o que pretendemos, podemos sempre instalar outros, de terceiros, que muitas vezes têm outras funcionalidades, e se bem escolhidos, podem ser a "salvação da lavoura".

Podemos até criar os nossos próprios componentes, à medida para o que precisamos.

Mas muitas vezes não precisamos mesmo de um novo componente... Dáva-nos jeito que um determinado componente (na verdade, a uma determinada classe) fizesse mais qualquer coisa, mas um novo? Não vale o trabalho...

É aqui que entram os CLASS HELPERS

Um Class Helper é uma forma de adicionar propriedades ou métodos a um determinado componente, de forma a que, em qualquer unit onde esse helper esteja referenciado, o componente original irá comportar-se como se tivesse lhe tivesse sido acrescentados os métodos e propriedades do helper.

Para exemplo, e porque um caso prático mostra melhor isto do que 50 páginas de teoria, vamos imaginar o seguinte:

O TEdit, um dos componente mais usados nas aplicações em Delphi.

O utizador escreve qualquer coisa na caixa de texto, e esse valor fica disponível na propriedade TEXT, do tipo TCaption (String).

Se o que queremos que o utilizador insira for um valor numérico, iremos precisar de converter o valor de TEXT antes de o usar, e assim de cada vez que ele for preciso.

unit HEdit;

interface

uses
   StdCtrls; // A unit de origem do componente original tem de existir na unit do helper

type
 THEdit = class helper for TEdit           // Cria-se o helper
   public
     function AsInteger:integer;           // Declaração dos novos métodos
     function AsDouble:double;
 end;

implementation

function THEdit.AsInteger:integer;    // Implementação dos novos métodos
var
  err:integer;
begin
    val(Text,Result,Err);
end;

function THEdit.AsDouble:double;
var
  err:integer;
begin
    val(Text,Result,Err);
end;

end.

Criamos assim um Class Helper (THEdit) com dois métodos: AsInteger e AsDouble.

Os métodos basicamente convertem o valor da propriedade TEXT do próprio TEdit e retorna o resultado (que será 0 caso TEXT não contenha um valor numérico).

Este helper foi criado numa unit só para ele, e embora eu prefira desta forma, nada impede de o colocar na mesma unit de uma form, por exemplo.

A partir daqui, em todas as forms que na sua unit respectiva tenham na secção USES a unit HEdit, se usarmos um TEdit normal, iremos ter dois métodos novos para recolher o seu valor, como no exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  d:double;
begin
  i := edit1.AsInteger * 5 + 3;
  d := edit1.AsDouble / 2 - 2.3;

  showmessage( inttostr (i));
  showmessage( floattostr (d));
end;

Origem: Class Helpers

thoga31

Pause (procedimento útil)

Uma boa amostra da sobrecarga de métodos em Pascal (overloading) e de como fazer pausa no programa de forma correcta sem recorrer massivamente ao readln.

Vê-se constantemente o readln ou o readkey serem utilizados como pausas. Contudo, eu não gosto nada de utilizar estes, e já hé muito tempo que criei um procedimento com três overloads que permite criar uma pausa totalmente personalizável e de forma muitíssimo simples.

Este procedimento é inspirado no comando Pause [Text] do TI-Basic Z80.

Código:

TYPE TKeys = set of char;

procedure Pause(const PauseText : string; const KeysToProceed : TKeys; var KeyReceiver : char);
(* PROCEDIMENTO COMPLETO - recebe texto a mostrar, teclas que desbloqueiam a pausa e a variável receptora da chave *)
begin
    write(PauseText);
    repeat
          KeyReceiver := ReadKey;
    until KeyReceiver in KeysToProceed;
end;


procedure Pause(const PauseText : string; const KeysToProceed : TKeys); overload;
(* PROCEDIMENTO COMPACTO - não há output *)
var Key : char;
begin
    Pause(PauseText, KeysToProceed, Key);
end;


procedure Pause(const PauseText : string); overload;
(* PROCEDIMENTO SIMPLIFICADO - assume Enter como tecla a processar *)
begin
    Pause(PauseText, [#13]);
end;


procedure Pause; overload;
const StrEmpty : string = '';
begin
    Pause(StrEmpty);
end;

Utilização de cada um, por ordem:

// ...
var chave : char;
// ...
pause('Esta é uma pausa completa...', [#13, #27], chave);
(* Escreve o texto, e as teclas que desbloqueiam a pausa é o Enter e o Esc,
e a tecla que for carregada fica guardada na variável chave. *)

pause('Esta é uma pausa compacta...', [#13, #27]);
(* O mesmo que o anterior, mas a tecla não é guardada em nenhuma variável - é perdida. *)

pause('Esta é uma pausa simplificada...');
(* Só mostra texto, sendo o Enter a tecla que desbloqueia a pausa *)
// Nota: como é a única tecla que pode desbloquear, não faz sentido ter um
// parêmetro por referência que guarde a tecla.

pause;
(* Faz pausa, sem texto e com o Enter como tecla desbloqueadora. *)
// Nota: este overload evita que se tenha de escrever "Pause('');"

// ...

Este código foi optimizado para Free Pascal. Se for necessária alteração para ser compatível com outros compiladores, digam que eu altero. :)

Espero que seja útil.

Cumprimentos. ;)

Origem: Pause (procedimento útil)

thoga31

[Snippet] Triângulo de Sierpinski

Mais uma "brincadeira" com gráficos avançados em Pascal - desenha o famoso Triângulo de Sierpinski através de um método semi-áleatório muito simples e com um resultado belíssimo.

Vamos festejar a mudança de plataforma com mais um snippet que eu acho ser engraçado e muito educativo :P

Mais uma brincadeira com a unit Graph... Já alguém ouviu falar do Triângulo de Sierpinski? Muito famoso entre os entusiastas da Geometria Fractal.

Querem saber como é este triângulo? Este programa calcula os pontos do triângulo segundo um método de aleatoriedade e que só falha 1~3% dos pontos - isto explicará um ou outro pixel fora do triângulo.

Enjoy! ;)

PROGRAM Sierpinski;

USES sysutils, graph;

VAR Driver, Modus : smallint;
x, y, n : real;
k : integer;

BEGIN
 try
	writeln('A desenhar o Triangulo de Sierpinski...');

	try
	   DetectGraph(Driver, Modus);
	   InitGraph(Driver, Modus, '');

	   randomize;
	   x := random;
	   y := random;

	   for k:=1 to 30000 do begin
		   n := random;

		   if (n<=1/3) then begin
			  x := x/2;
			  y := y/2;
		   end
		   else if (n>1/3) and (n<=2/3) then begin
			  x := (x+0.5)/2;
			  y := (1+y)/2;
		   end
		   else if (n>2/3) then begin
			  x := (x+1)/2;
			  y := y/2;
		   end;

		   PutPixel(round(500*x), round(500-500*y), White);
	   end

	except
		  ON ex:exception do begin
			 writeln('ERRO: ',ex.message);
			 CloseGraph;
		  end;
	end

 finally
		write('ENTER para terminar...');
		readln; // pausa
		CloseGraph;
 end;
END.

Origem: [snippet] Triângulo de Sierpinski

thoga31

Uma experiência muito útil sobre a utilização de gráficos avançados em Pascal. Desfruta, ao mesmo tempo, de um pequeno snippet de representação de ângulos e funções sinusoidais em meia dúzia de linhas de código ;)

Ando agora a estudar a unit Graph do Free Pascal, e deixo-vos a minha primeira experiência, bem sucedida.

(não está comentado nem muito "arranjadinho", é só mesmo uma experiência)

Ora digam lá se o Pascal é ou não fraquinho? :D

Eu demoraria muito mais a obter o mesmo resultado em VB.NET, a outra LP do meu conhecimento...

Venham daí as vossas opiniões sobre esta maravilha! I just love it, man! :D

trigonometria_pascal.png

program Trigonometria;
uses graph, sysutils, windows;
var Driver, Modus : smallint;
    Angle : integer;

function Real2String(const value : real) : string;
begin
     Str(value, Real2String);
end;

function Int2String(const value : integer) : string;
begin
     Str(value, Int2String);
end;

begin
     try
        repeat
              write('Angulo (inteiro) (-360..360)? ');
              readln(Angle);
        until (Angle in [-360..360]);

        DetectGraph(Driver, Modus);
        InitGraph(Driver, Modus, '');

        Circle(200, 200, 100);
        Line(200, 50, 200, 350);
        Line(50, 200, 350, 200);

        SetLineStyle(SolidLn,0,ThickWidth);
        SetColor(red);
        Line(200, 200, round(100*cos((angle*pi)/180)+200), round(-100*sin((angle*pi)/180)+200));

        SetColor(white);
        OutTextXY(300, 300, 'sin(' + Int2String(angle) + ') = ' + Real2String(sin((angle*pi)/180)));
        OutTextXY(300, 310, 'cos(' + Int2String(angle) + ') = ' + Real2String(cos((angle*pi)/180)));

        readln; // pausa

        CloseGraph;
     except
           ON e:exception do begin
              MessageBox (0, @(e.message)[1] , 'ERRO!', 0 + MB_ICONHAND);
           end;
     end;
     writeln; write('end'); readln; // pausa
end.

Origem: [snippet] Breve experiência com a unit 'Graph'

Warrior

Parabéns a todos os participantes, mas de um modo muito especial ao Pedro Paredes, ao Afonso Santos, ao Francisco Machado e ao João Ramos, os 4 primeiros vão às IOI'2012 na Itália, para representarem Portugal.

Espero que tenham gostado dos problemas :) Para mim foram muito divertidos de fazer, e tinha pelo menos 5 soluções de complexidadades diferentes para cada um.

Já actualizei o sítio das ONI com alguma informação da final (daqui a pouco adiciono as fotos):

Sítio das oni: http://www.dcc.fc.up.pt/oni/2012/

Classificação da final: http://www.dcc.fc.up...nal-oficial.htm

Os 4 que vão às IOI: http://www.dcc.fc.up...ugueses-big.jpg

Problema A - Triângulos de Pascal: http://www.dcc.fc.up...inal/probA.html

Problema B - Arranha-Céus: http://www.dcc.fc.up...inal/probB.html

Problema C - Saltitando: http://www.dcc.fc.up...inal/probC.html

Limites dos problemas: http://www.dcc.fc.up...al/limites.html

Sessão de Discussão dos Problemas: http://www.dcc.fc.up...ssao/index.html

Muito vou querer ainda falar com todos os concorrentes, mas agora vou ter de terminar de preparar umas coisas pois amanhã tenho vôo logo às 7 da manhã e só de noite chego ao Arizona ;) (para os mais curiosos: https://sites.google...ocial12/program) Não se admirem portanto se durante o dia de amanhã não conseguir responder a possíveis perguntas.

Abraço a todos e para os que participaram pela primeira vez, espero que tenham ficado com o "bichinho" dos concursos! Para os que não estão no 12º ano, ainda iremos falar antes, mas espero ver-vos a todos a participar novamente em 2013 (as IOI vão ser... na Austrália! :))

Origem: ONI 2012 - Olimpíadas Nacionais da Informática

jpaulino

Aplicações que permitem usar VBA

Este é um tópico fixo para que deixem aqui o vosso contributo sobre aplicações que permitem usar VBA, pois existem inúmeras, muito para além do Microsoft Office. Podem também deixar experiências de como o VBA melhorou a produtividade ou ajudar a personalizar a aplicação.

Tenho conhecimento de inúmeras aplicações em que se pode usar VBA, como Corel, AutoCad, Primavera, etc, mas como não tenho experiência de utilização, deixo para quem já utilizou.

Venham de lá esses contributos!

EDIT: Este tópico é exclusivo a contributos e não a discussão ;)

Origem: Aplicações que permitem usar VBA

brunoais

Como remover nós de uma lista ligada

Aqui está explicado pelo nosso membro Flinger, em pseudo-código, dois processos para remover um nó de uma lista ligada.

Tens 2 modelos:

O recursivo, que pode custar mais a entender para quem está habituado a programação imperativa, mas que pode ser mais fácil e simples de programar e de ler, se entenderes bem o que estás a fazer.

Ou o imperativo, um bocado mais complexo, mas mais fácil de entender para quem não entende bem a recursividade.

Recursivo:

lista remove_lista(lista)
se lista = null
retorna null
senão se (lista é o nodo a remover)
retorna o lista->proximo
senao
lista->proximo = remove_lista(lista->proximo)
retorna lista;

A função devolve-te a nova lista já sem o elemento (faltam aí os frees, lógico).

No caso imperativo, tens sempre de ter em atenção as extremidades.

Se o primeiro nodo é o nodo a remover, a tua lista passa a ser o nodo seguinte.
Senão olhas sempre para o seguinte, enquanto houver.
listatemp=lista;
enquanto (listatemp->proximo != null && listatemp->proximo não for o nodo a remover)
 listatemp=listatemp->proximo
Se listatemp->proximo = null
 não encontrou o nodo
senao listatemp->proximo = listatemp->proximo->proximo (usar variavel temporaria para fazer o free ao nodo removido)

Podem existir solução mais elegantes, mas isto é o que eu costumo fazer. Testa sempre as remoções nas extremidades que costumam ser os casos mais complicados.

Source: Problemas em remover nomes em lista ligada

brunoais

Cursos Gratuitos

Este post é informação útil para quem quiser ter um "crash course" em programação. De acordo com a informação disponível este site é de boa qualidade.

Olá a todos.

Venho aqui tentar comunicar-vos que este fim de semana os cursos da CodeSchool vão ser gratuitos, coisa que acho que toda a gente aqui deve se interessar.

http://www.codeschool.com/free-weekend

Para quem não conhece, podem experimentar os cursos gratuitos

Aproveitem! :)

Source: Cursos de qualidade GRATUITOS

jpaulino

Gestão de Projectos: Orçamentos

Tenho notado que há no fórum alguma procura de informação sobre como fazer um orçamento, quanto cobrar por um determinado desenvolvimento, etc..

Este tópico vem dar algumas respostas, embora não seja, nem pretenda ser, uma regra, disponibiliza alguma informação sobre como estas coisas costumam ser feitas nas TIse em regime freelance.


Ideia Geral

A ideia geral para efectuar um orçamento é bastante simples, bastando atribuir um valor por hora e multiplicar esse valor pelo número de horas que o projecto fechado, ou seja, chave-na-mão demora a fazer. O mesmo principio é aplicável a um projecto que não é fechado.

Para encontrar o número de horas que se vão usar há que fazer um planeamento ou, no mínimo, uma estimativa.

Orçamento

De forma simples, um orçamento costuma fazer-se da seguinte forma:

1. Planeamento ou estimativa de tempo (normalmente esta inclui uma margem de segurança, por exemplo, mais 10% do que o tempo estimado originalmente) dos tipos e números de recursos, tarefas e tempo de participação de cada recuros nas tarefas.

2. Cada tipo de recurso possui um valor por hora.

3. Para cada tipo de recurso multiplica-se as horas de participação no projecto pelo seu valor por hora.

TI

A forma de encontrar o valor por hora numa TI costuma ser bastante simples. Cada tipo de recurso possui um ordenado base, que dividido por 22 e depois por 8 permite encontrar o valor por hora. Esse valor por hora é quanto a empresa paga, por hora, a esse recurso. De forma a ganhar lucro com o projecto, a empresa tem de vender a hora esse recurso por um valor superior.Essas contas permitem construir uma tabela de preços da empresa que passa a ser a referência para os orçamentos.

Por exemplo, em outsourcing é normal um recurso ser vendido a uma empresa por três vezes mais do que custa à empresa. Isto quer dizer que: se na empresa em que trabalham vocês estiverem num projecto com alguém que não pertence à vossa empresa mas que ganha o mesmo ordenado como vocês, a vossa empresa está a pagar à outra empresa três vezes o vosso ordenado.

Dado que durante o processo de negociação é normal o cliente negociar o preço, é necessário possui alguma flexibilidade de forma a conseguir baixar o preço final do projecto sem nunca comprometer o planeamento nem o lucro da empresa. Este tipo de "ginástica" é facilmente conseguido usando truques simples como cobrar o valor de um junior por um sénior ou reduzir o factor de multiplicação do valor por hora. Seja qual for a estratégia, o valor a cobrar por recurso nunca pode ser inferior ao valor que o mesmo custa à empresa, pois caso contrário a empresa perderá dinheiro. Normalmente não se cobra menos e uma vez e meia o valor do recuro, caso contrário corre-se o risco do projecto não ser lucrativo para a empresa. É que existem outros factores como o facto de, por exemplo, as pessoas que efectuam trabalho como o caso dos recursos humanos, não poderem ser vendidas a projectos, mas a empresa continua a ter de lhes pagar o ordenado e a única forma de isso acontecer é usando o dinheiro ganho nos projectos. Assim, o valor cobrado por cada recurso tem de pagar, não só o valor desse recurso, mas também uma pequena parte dos recursos da empresa que não podem ser vendidos. Só assim é possível pagar o ordenado a todas as pessoas e a empresa gerar lucro.

Ainda no capitulo negocial, por vezes a administração da empresa assume o prejuizo de um projecto, onde assumida e conscientemente o preço de venda do projecto é mais baixo do que o custo do mesmo. Este tipo de negócio prende-se com estratégias empresariais, por exemplo a empresa quer mesmo entrar numa determinada área de negócio ou quer pôr um pé num determinado cliente e então esta opção é vista como uma estratégia e um investimento, recuperando o dinheiro investido ao longo do tempo, através de outros futuros projectos ou através da manutenção e suporte do projecto em causa.

Freelance

Tudo o que foi dito para as TI é verdade para os freelancers. Só que neste caso é esperado que o preço seja mais baixo do que se o projecto fosse efectuado por uma TI. Isto deve-se a um conjunto de razões, umas mais válidas que outras, mas de onde se destaca um dos maiores receios: o de um freelancer "desaparecer" de um momento para o outro ou não ter interesse, ou disponibilidade, de fazer manutenção e suporte. Como tal, o cliente não está disposto a pagar a um freelancer o mesmo valor que leva uma empresa.

Por outro lado, um freelancer não tem a seu cargo coisas como um departamento de recursos humanos, o que lhe permite apresentar um orçamento mais baixo mas mesmo assim muito interessante para o seu lado.

É muito provavel que o trabalho não possa ser totalmente executado pelo freelancer e que este tenha de recorrer a serviços de terceiros, por exemplo fazer tuning a uma BD ou encomendar o design de um site.

Pode também acontecer que existam algumas coisas no projecto para as quais o freelancer não possui conhecimento ou competência necessária e vai ter de optar por comprar esse conhecimento a terceiros ou então adquirir esse conhecimento. Se optar por comprar o conhecimento, então está a recorrer a um serviço de terceiros e estamos perante o caso acima, já se optar por adquirir esse conhecimento, então é justo que a aquisição do conhecimento seja paga pelo freelancer, dado que é um investimento, e que haja um ajuste no preço por hora para as tarefas que envolvam aquisição de conhecimento. É também justo que o cliente não tenha de pagar esse investimento com tempo, ou seja, o investimento é do freelancer e não deve penalizar o projecto com mais carga relativa ao tempo que ele vai necessitar para aprender essa nova competência.

Outro factor que tem influencia no orçamento é a possibilidade do preço por hora variar consoante a especialização, ou o grau de conhecimento.

Tudo isto são custos que o freelancer deve ter em conta quando efectua um orçamento.

Exemplo

Vou apresentar um exemplo de forma a clarificar e a consolidar o que expliquei acima. É de referir que os valores são totalmente aleatórios e servem o único propósito de ilustração.

Imaginemos que o projecto em causa é uma loja virtual simples. Para construir a loja virtual vai ser necessário, de forma simples:

- levantamento de requisitos

- modelação e arquitectura

- design da base de dados

- design do site

- programação

- testes

Após o planeamento, ou estimativa, conclui-se que:

  • Levantamento de requisitos: 56 horas
  • Modelação e arquitectura: 120 horas
  • Design gráfico: 40 horas
  • Programação: 160 horas
  • Design da Base de Dados: 32 horas
  • Testes: 40 horas
  • Gestão, Controlo e Reporting: 40 horas

Se for uma TI a fazer o projecto,a mesma identificaria os papeis necessários para cada tarefa e, consultando a sua tabela de preços, faz as seguintes contas:

  • Consultor de negócio (56 horas de levantamento de requisitos): 56 horas x 14€ = 784€
  • Analista Programador Junior (70 horas de modelação e arquitectura e 100 horas de programação): 17 horas x 12€ = 204€
  • Lider Técnico Sénior (50 horas de modelação e arquitectura, 60 horas de programação, 12 horas de design de base de dados, 15 horas de gestão, controlo e reporting): 137 horas x 15€ = 2055€
  • Web designer (40 horas de design gráfico): 40 horas x 11€ = 440€
  • DBA (20 horas de base de dados): 20 horas x 15€ = 300€
  • QA (40 horas de testes): 40 horas x 12.5€ = 500€
  • Gestor de projecto: (25 horas de gestão, controlo e reporting) 25 horas x 15€ = 375€

Somando tudo dá: 4658€

Se for um freelancer, dado que ele faz todos os papeis, excepto os que compra a terceiros, e partindo do principio de tem um preço fixo por hora de 6€, poderá fazer as seguintes contas:

  • Design Gráfico (comprado a uma empresa de web design por preço fixo): 300€
  • DBA (dado que tem de aprender a mexer em MySQL, vai efectuar um desconto de 50% no preço por hora): 32 horas x 3€ = 96€
  • Gestão, Controlo e Reporting (concluiu que necessita apenas de 25 horas uma vez que só faz gestão, controlo e reporting para o cliente e não necessita de controlar as equipas envolvidas por estas não existirem): 25 horas x 6€ = 150€
  • Tudo o resto (dado que já tem competências nas áreas envolvidas): 433 horas * 6€ = 2598€

Ora somando tudo dá: 3144€

Conclusão

A nível de orçamento, a opção freelancer sai 1514€ mais barato.

Mas há que ter em conta que certas tarefas podem ocorrer em paralelo quando feitas por uma TI, por exemplo, a parte da arquitectura do sistema pode ocorrer em paralelo com a parte de design da base de dados, o que faz com que a TI possua um tempo de resposta mais rápido. No entanto, o freelancer pode também fazer este jogo: recorrendo ao outsourcing, pode efectuar apenas a gestão do projecto, ficando liberto para fazer a gestão de vários projectos ao mesmo tempo. Por outro lado, a TI também pode recorrer a outsourcing.

Em conclusão, a diferença entre TI e freelancer é que o freelancer é uma empresa de uma pessoa só que consegue fazer preços mais competitivos embora possa ter um tempo de resposta mais lento.

Informação Relacionada:

- The Mythical Man-Month, um livro de referência para a gestão que infelizmente muito pouca gente leu.

- Wikipedia: The Mythical Man-Month, pequeno resumo do livro.

- Eric Sink on the Business of Softwar, um bom livro para iniciados nestas andanças com exemplos práticos de ISVs, micro ISVs e shareware.

- Joel on Software, site com ensaios e artigos de opinião de um dos fundadores de uma ISV e que aborda várias temáticas desde problemas e escolhas técnicas até gestão e recrutamento.

- Joel on Software, livro com a compilação de alguns dos melhores artigos do site e que aborda temas como a gestão e o preço dos produtos.

Origem: Gestão de Projectos: Orçamentos

bioshock

Projecto Português [suecada.com]

Foi recentemente lançado um projecto português onde será possível jogar o tão famoso jogo Sueca, online e totalmente em português!

Este jogo foi criado por Irvin, utilizador da requinte comunidade Portugal-a-Programar. Foi através de lá que ele divulgou este grande projecto que surgiu..de uma brincadeira!

Como o nome indica este projecto é um jogo de sueca online e como todos os meus projectos começou por ser apenas uma brincadeira.

Comecei com a ideia de criar um jogo de sueca multi-plataforma para ser jogado em Lan, mas depois de algumas horas investidas no projecto, ocorreu-me a ideia de fazer algo onde as pessoas se pudessem ligar e obter uma lista de servidores.

Resta-nos desejar sorte e felicitar o autor do projecto..e não se esqueçam de inscrever! :D