terça-feira, 15 de julho de 2008

Usando funções para substituir o comando for da linguagem C

Alguns cientistas da computação provaram que é possível resolver problemas de linguagens decidíveis (a maior parte dos programas de computador comerciais) utilizando-se apenas de funções recursivas , e entrando nessa onde resolvi fazer o seguinte código?

[code]




//################################################
//Bibliotecas incluídas no programa
//################################################
#include
#include
//################################################
//======================================================
//Funções utilizadas no programa
//======================================================
//------------------------------------------------------
int fib10it(int fib1)
{
int atual, prox, ant, i;
atual=1; prox=1; ant=0; i=0;

if(fib1 < 0){
printf("\n |> !!! Erro !!! Fibonacci nao aceita numeros negativos \n");
return 0;}
if(fib1==0)return 1;
if(fib1==1)return 1;
for(i=0; i < fib1; i++)
{
atual = ant + prox; ant=prox;
prox = atual;
}
return atual;//retorna o valor de fibonacci de forma iterativa

}
//------------------------------------------------------
//------------------------------------------------------
int fib10(int fib1)
{
if(fib1 < 0){
printf("\n |> !!! Erro !!! Fibonacci nao aceita numeros negativos \n");
return 0;}
if(fib1==0)return 1;
if(fib1==1)return 1;
//printf("\n\n Esta passando na funcao recursiva fib10()! \n\n");
return fib10(fib1 -1 )+ fib10(fib1 - 2);
}
//------------------------------------------------------
void fc2(int va)
{

printf(" \t %i", fib10it(va));
}
//------------------------------------------------------
//------------------------------------------------------
void fc1(int va)
{

printf(" \t %i", fib10(va));
}
//------------------------------------------------------
int forrec7( int j, void (*func1)())/* equivaçemte ao for(i=0; i < = j; i++), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(i=0; i < = j; i++)
func1();

*/
{

return forrec(0, j, func1);
}
//------------------------------------------------------
int forrec6( int j, void (*func1)())/* equivaçemte ao for(i=0; i < j; i++), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(i=0; i < j; i++)
func1();

*/
{

return forrec1(0, j, func1);
}
//------------------------------------------------------
int forrec5(int i, void (*func1)())/* equivaçemte ao for(; i > 0; i--), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(; i > 0; i--)
func1();

*/
{

if(i < = 0)
return 0;
(*func1)();
/*printf("\n i=%i, j=%i", i, j);*/
i--;
return forrec5(i, func1);
}
//------------------------------------------------------
int forrec4(int i, void (*func1)())/* equivaçemte ao for(; i > = 0; i--), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(; i > = 0; i--)
func1();

*/
{

if(i < 0)
return 0;
(*func1)();
/*printf("\n i=%i, j=%i", i, j);*/
i--;
return forrec4(i, func1);
}
//------------------------------------------------------
int forrec3(int i, int j, void (*func1)())/* equivaçemte ao for(i=j; i > = 0; i--), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(i=j; i > = 0; i--)
func1();




*/
{
if(i < 0)
return 0;
return forrec4(j, func1);
}
//------------------------------------------------------
int forrec2(int i, int j, void (*func1)())/* equivaçemte ao for(i=j; i > 0; i--), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(i=j; i > 0; i--)
func1();

*/
{

if(i < = 0)
return 0;
(*func1)();
/*printf("\n i=%i, j=%i", i, j);*/
i--;
return forrec2(i, j, func1);
}
//------------------------------------------------------
int forrec1(int i, int j, void (*func1)())/* equivaçemte ao for(i=0; i < j; i++), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(i=0; i < j; i++)
func1();

*/
{

if(i > = j)
return 0;
(*func1)();
/*printf("\n i=%i, j=%i", i, j);*/
i++;
return forrec1(i, j, func1);
}
//------------------------------------------------------
//------------------------------------------------------
int forrec(int i, int j, void (*func1)())/* equivaçemte ao for(; i<=j; i++), onde func1 é o endereço da função que você deseja que esteje dentro do for

seria semelhante a:
for(; i < = j; i++)
func1();

*/
{

/* em haskell (não testei ainda) :
forrec i j = forrec (i=i+1) j
forrec i j
| i > j =0
*/

if(i>j)
return 0;
(*func1)(i);
/*printf("\n i=%i, j=%i", i, j);*/
i++;
return forrec(i, j, func1);
}

//------------------------------------------------------
void for_iterativo(int i, int j, void (*func1)())
{
for( ; i < = j ; i++)
(*func1)(i);

}
//------------------------------------------------------
void for_iterativo1( int j, void (*func1)())/* for( i=0 ; i <= j ; i++)*/
{
int i;
i=0;
for( ; i < = j ; i++)
(*func1)(i);

}
//------------------------------------------------------
//------------------------------------------------------
void fib20()
{
int op, seq;
op=0, seq=0;
printf("\n | > \t Deseja que o for usado seja o recursivo ou o iterativo ? \n | > \t Para recursivo tecle 1 \n | > \t Para iterativo tecle 2: \n | > ");
scanf("%i", &op);
printf("\n | > \t Entre com o termo que deseja gerar a sequencia: \n | >");
scanf("%i", &seq);
printf("\n | > \t A sequencia de fibonacci e: \n | > \t ");
(op==1)?forrec7( seq , &fc1):for_iterativo1( seq, &fc2);

}
//------------------------------------------------------
//------------------------------------------------------
int fib2(int fib1)
{
int op;
op=0;
printf("\n | > \t Deseja que o for usado seja o recursivo ou o iterativo ? \n | > \t Para recursivo tecle 1 \n | > \t Para iterativo tecle 2: \n | > ");
scanf("%i", &op);
(op==1)?forrec7( fib1 , &fc1):for_iterativo1( fib1, &fc2);
printf("\n | > \t A sequencia de fibonacci e: \n | >");

return 0;

}
//------------------------------------------------------
void cle()
{
//?????????????????
// Declarações de variáveis principais
int seq;

//?????????????????
/* !!!!!!!!!!!!!!! */
//inicalização das variáveis
seq=0;
/* !!!!!!!!!!!!!!! */
printf("\n\n\n | > Programa que retorna a sequencia do numero de fibonacci \n ");
fib20();
printf("\n\n\n");

}
//------------------------------------------------------
//======================================================
int main(int argc, char **argv)
{
cle();
return 0;
}





[/code]

Esse código foi testado apenas na linguagem C!
Esse código da função que realiza a tarefa do comando for é interessante, pois utilizando-se de funções recursivas evita-se entrar em loops infinitos, já que um loop na pilha da recursão no máximo estouraria a pilha..! O uso de funções recursivas exige mais tempo de processamento e memória, mas é menos sujeito a erros, vale a pena o programador se perguntar: "O que desejo ? Eficiência ou garantia que meu código está coeso e não dará pau ?"

domingo, 6 de julho de 2008

__| O cara da informatica |__

Hoje recebi um e-mail do DEFUG e entre algumas coisinhas do DEFUG, achei interessante postar isso aqui, para aqueles que pensam que o cara da informática é um ser que não necessita de descanso, repare nas coias ai abaixo ...!


"Nem tudo que publicamos aqui e' serio, na verdade adoramos rir de nos mesmos e, sempre publicamos textos engracados que falam desta nossa vida tecnologica. O Fernando Anselmo, fernando.anselmo@dfjug.org, coordenador e moderador da lista de discussao do DFJUG, distribuiu o texto abaixo entre os amigos (e a carapuca serviu para todos :-))

Para os verdadeiros CARAS DA INFORMaTICA
1) O CARA DA INFORMaTICA dorme. Pode parecer mentira, mas o CARA DA INFORMaTICA precisa dormir como qualquer outra pessoa. Esqueca que ele tem celular e telefone em casa, ligue so para o escritorio;

2) O CARA DA INFORMaTICA come. Parece inacreditavel, mas e verdade. O CARA DA INFORMaTICA tambem precisa se alimentar e tem hora para isso;

3) O CARA DA INFORMaTICA pode ter familia. Essa e a mais incrivel de todas: Mesmo sendo um CARA DA INFORMaTICA, a pessoa precisa descansar no final de semana para poder dar atencao a familia, aos amigos e a si proprio, sem pensar ou falar em informatica, impostos, formularios, consertos e demonstracoes, manutencao, virus e etc.;

4) O CARA DA INFORMaTICA, como qualquer cidadao, precisa de dinheiro. Por essa voce nao esperava, ne? e surpreendente, mas o CARA DA INFORMaTICA tambem
paga impostos, compra comida, precisa de combustivel, roupas e sapatos e ainda consome Lexotan para conseguir relaxar. Nao peca aquilo pelo que nao pode pagar ao CARA DA INFORMaTICA;

5) Ler, estudar tambem e trabalho. E trabalho serio. Pode parar de rir. Nao e piada. Quando um CARA DA INFORMaTICA esta concentrado num livro ou publicacao especializada ele esta se aprimorando como profissional, logo trabalhando;

6) De uma vez por todas, vale reforcar: O CARA DA INFORMaTICA nao e vidente, nao joga taro e nem tem bola de cristal, pois se achou isto demita-o e contrate um PARANORMAL OU DETETIVE. Ele precisa planejar, se organizar e assim ter condicoes de fazer um bom trabalho, seja de que tamanho for. Prazos sao essenciais e nao um luxo. Se voce quer um milagre, ore bastante, faca jejum, e deixe o pobre do CARA DA INFORMaTICA em paz;

7) Em reunioes de amigos ou festas de familia, o CARA DA INFORMaTICA deixa de ser o CARA DA INFORMaTICA e reassume seu posto de amigo ou parente, exatamente como era antes dele ingressar nesta profissao. Nao peca conselhos, dicas. ele tem direito de se divertir;

8) Nao existe apenas um 'levantamentozinho' , uma 'pesquisazinha' , nem um 'resuminho', um 'programinha pra controlar minha loja', um 'probleminha que a maquina nao liga', um 'sisteminha' , uma 'passadinha rapida (ALIAS CONTA-SE DE ONDE SAIMOS E ATe CHEGARMOS)', pois esqueca os 'inha e os inho (programinha, sisteminha, olhadinha, )' pois, CARAS DA INFORMATICA nao resolvem este tipo de problema. Levantamentos, pesquisas e resumos sao frutos de analises cuidadosas e requerem atencao, dedicacao. Esses topicos podem parecer inconcebiveis a uma boa parte da populacao, mas servem para tornar a vida do CARA DA INFORMATICA mais suportavel;

9) Quanto ao uso do celular: celular e ferramenta de trabalho. Por favor, ligue, apenas, quando necessario. Fora do horario de expediente, mesmo que ainda duvide, o CARA DA INFORMATICA pode estar fazendo algumas coisas que voce nem pensou que ele fazia, como dormir ou namorar, por exemplo;

10) Pedir a mesma coisa ao mesmo tempo nao faz o CARA DA INFORMATICA trabalhar mais rapido. Solicite, depois aguarde o prazo dado pelo CARA DA INFORMATICA;

11) Quando o horario de trabalho do periodo da manha vai ate 12h, nao significa que voce pode ligar as 11:58 horas. Se voce pretendia cometer essa gafe, ligue apos o horario do almoco (relembre o item 2). O mesmo vale para a parte da tarde: ligue no dia seguinte;

12) Quando o CARA DA INFORMATICA estiver apresentando um projeto, por favor, evite as perguntas que nao tenham relacao com o projeto. Isso tira a concentracao, alem de torrar a paciencia.

13) O CARA DA INFORMATICA nao inventa problemas, nao muda versao de WINDOWS, nao tem relacao com virus, NaO e CULPADO PELO MAL USO DE EQUIPAMENTOS, INTERNET E AFINS. Nao reclame! O CARA DA INFORMATICA com certeza fez o possivel para voce pagar menos. Se quer EMENDAR, EMENDE, mas antes demita o CARA DA INFORMATICA e contrate um CARA DE POG;

14) Os CARAS DA INFORMATICA nao sao os criadores dos ditados 'o barato sai caro' e 'quem paga mal paga em dobro'. Mas estao todos de acordo com eles;

15) Nao pergunte para O CARA DA INFORMATICA uma sugestao de computador BOM e BARATO para voce comprar. Nao existe computador BOM e BARATO. Ou e uma coisa, ou e outra;

16) E, finalmente, o CARA DA INFORMATICA tambem e filho de DEUS e nao filho disso que voce pensou.

Agora, depois de aprender sobre O CARA DA INFORMATICA, repasse aos seus amigos, afinal, essas verdades precisam chegar a todos. O CARA DA INFORMATICA agradece.
/** Certificacao JEDI http://www.dfjug.org/DFJUG/tvdfjug/videos/v_wildt.html **/"

terça-feira, 1 de julho de 2008

Matando processos com o auxílio da shell do linux, do kill e do ps

Para matar aquele processo chato que acabou entrando em loop infinito, ou você não aguenta mais esperar a resposta dele...!!

Para matar um processo é necessário primeiro saber qual é o número do PID dele, para isso você digita na shell:

$ ps -A



Sabendo o PID basta dar o comando:

$ kill PID_do_Processo


Por exemplo eu vou matar o processo do java, para isso dei um ps -A que me gerou o resultado abaixo:

danilomatias@danilomatias-laptop:~$ ps -A
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 migration/1
7 ? 00:00:00 ksoftirqd/1
8 ? 00:00:00 watchdog/1
9 ? 00:00:00 events/0
10 ? 00:00:00 events/1
11 ? 00:00:00 khelper
46 ? 00:00:00 kblockd/0
47 ? 00:00:00 kblockd/1
50 ? 00:00:00 kacpid
51 ? 00:00:00 kacpi_notify
134 ? 00:00:00 kseriod
176 ? 00:00:00 pdflush
177 ? 00:00:00 pdflush
178 ? 00:00:00 kswapd0
219 ? 00:00:00 aio/0
220 ? 00:00:00 aio/1
1417 ? 00:00:00 ksuspend_usbd
1420 ? 00:00:00 khubd
1558 ? 00:00:00 ata/0
1565 ? 00:00:00 ata/1
1566 ? 00:00:00 ata_aux
2319 ? 00:00:00 scsi_eh_0
2320 ? 00:00:00 scsi_eh_1
2321 ? 00:00:00 scsi_eh_2
2361 ? 00:00:00 scsi_eh_3
2362 ? 00:00:00 usb-storage
2398 ? 00:00:00 scsi_eh_4
2399 ? 00:00:00 scsi_eh_5
2536 ? 00:00:00 kjournald
2741 ? 00:00:00 udevd
3049 ? 00:00:00 kpsmoused
4263 ? 00:00:00 kjournald
4534 tty4 00:00:00 getty
4535 tty5 00:00:00 getty
4537 tty2 00:00:00 getty
4540 tty3 00:00:00 getty
4541 tty6 00:00:00 getty
4727 ? 00:00:00 acpid
4761 ? 00:00:00 kondemand/0
4762 ? 00:00:00 kondemand/1
4847 ? 00:00:00 syslogd
4900 ? 00:00:00 dd
4902 ? 00:00:00 klogd
4924 ? 00:00:00 dbus-daemon
4940 ? 00:00:00 NetworkManager
4954 ? 00:00:00 NetworkManagerD
4967 ? 00:00:00 system-tools-ba
4987 ? 00:00:00 avahi-daemon
4988 ? 00:00:00 avahi-daemon
5030 ? 00:00:00 cupsd
5098 ? 00:00:00 dhcdbd
5117 ? 00:00:01 hald
5120 ? 00:00:00 console-kit-dae
5121 ? 00:00:00 hald-runner
5194 ? 00:00:00 hald-addon-inpu
5200 ? 00:00:00 hald-addon-cpuf
5201 ? 00:00:00 hald-addon-acpi
5225 ? 00:00:00 hald-addon-stor
5228 ? 00:00:00 hald-addon-stor
5254 ? 00:00:00 hcid
5274 ? 00:00:00 btaddconn
5275 ? 00:00:00 btdelconn
5285 ? 00:00:00 bluetoothd-serv
5286 ? 00:00:00 bluetoothd-serv
5291 ? 00:00:00 krfcommd
5330 ? 00:00:00 gdm
5333 ? 00:00:00 gdm
5337 tty7 00:05:46 Xorg
5375 ? 00:00:00 atd
5389 ? 00:00:00 cron
5486 ? 00:00:00 vmnet-bridge
5497 ? 00:00:00 dhclient
5504 ? 00:00:00 vmnet-netifup
5517 ? 00:00:00 vmnet-dhcpd
5532 ? 00:00:00 vmnet-netifup
5541 ? 00:00:00 vmnet-dhcpd
5546 ? 00:00:00 vmnet-natd
5624 tty1 00:00:00 getty
5719 ? 00:00:01 gconfd-2
5721 ? 00:00:00 gnome-keyring-d
5722 ? 00:00:00 x-session-manag
5809 ? 00:00:00 seahorse-agent
5813 ? 00:00:00 dbus-daemon
5814 ? 00:00:01 gnome-settings-
5822 ? 00:00:00 pulseaudio
5825 ? 00:00:00 gconf-helper
5834 ? 00:00:00 compiz
5840 ? 00:00:06 gnome-panel
5841 ? 00:00:02 gnome-screensav
5842 ? 00:00:01 nautilus
5849 ? 00:00:00 bonobo-activati
5876 ? 00:00:00 gvfsd
5893 ? 00:00:00 gvfs-fuse-daemo
5914 ? 00:00:15 compiz.real
5915 ? 00:00:00 bluetooth-apple
5918 ? 00:00:00 update-notifier
5922 ? 00:00:00 tracker-applet
5925 ? 00:00:00 evolution-alarm
5928 ? 00:00:00 trackerd
5931 ? 00:00:01 nm-applet
5932 ? 00:00:00 python
5933 ? 00:00:00 gnome-volume-ma
5935 ? 00:00:00 gnome-power-man
5986 ? 00:00:00 evolution-excha
5994 ? 00:00:00 trashapplet
5996 ? 00:00:00 evolution-data-
5999 ? 00:00:00 gvfsd-trash
6007 ? 00:00:00 gvfsd-burn
6024 ? 00:00:00 sh
6025 ? 00:00:00 compiz-decorato
6027 ? 00:00:04 gtk-window-deco
6036 ? 00:00:00 mixer_applet2
6039 ? 00:00:00 fast-user-switc
6052 ? 00:20:36 firefox
6428 ? 00:00:14 java
6489 ? 00:00:02 gnome-terminal
6491 ? 00:00:00 gnome-pty-helpe
6492 pts/0 00:00:00 bash
6509 pts/1 00:00:00 bash
6577 ? 00:00:00 sh
6578 ? 00:00:00 dcop
6580 pts/1 00:00:00 ps

Verifiquei que o PID do java é: 6428

Agora vou dar o comando para matar o processo 6428:

danilomatias@danilomatias-laptop:~$ kill 6428


Prontinho processo morto com êxito!

Assindo Vídeos no linux com o ffplay

O ffplay é um programa de visualização de vídeos que acompanha o ffmpeg, ao instalar o ffmpeg, para poder converter vídeos (você instala nas distribuições baseadas em debian com o comando $ sudo apt-get install ffmpeg)

Quando você instalou o ffmpeg instalou sem querer também o ffplay e o ffserver

O comando para ver um vídeo (qualquer formato de vídeo que o ffmpeg suporta, a lista se encontra na próxima postagem, um deles é o .flv) no ffplay é:

$ ffplay nome_do_video.extensao_do_video

Por exemplo se eu quero ver o vídeo 1.flv eu dou o comando:

$ ffplay 1.flv



As opções do ffplay se encontram abaixo:




danilomatias@danilomatias-laptop:~/Vídeos/ffmpeg$ ffplay
ffplay version SVN-rUNKNOWN, Copyright (c) 2003-2006 Fabrice Bellard, et al.
usage: ffplay [options] input_file
Simple media player

Main options:
-h show help
-x width force displayed width
-y height force displayed height
-s size set frame size (WxH or abbreviation)
-fs force full screen
-an disable audio
-vn disable video
-ss pos seek to a given position in seconds
-bytes seek by bytes
-nodisp disable graphical display
-f fmt force format

Advanced options:
-ast
-pix_fmt format set pixel format
-stats show status
-debug print specific debug info
-bug workaround bugs
-vismv visualize motion vectors
-fast non spec compliant optimizations
-genpts generate pts
-lowres
-skiploop
-skipframe
-skipidct
-idct algo set idct algo
-er threshold set error detection threshold (0-4)
-ec bit_mask set error concealment options
-rtp_tcp force RTP/TCP protocol usage
-sync type set audio-video sync. type (type=audio/video/ext)
-threads count thread count

While playing:
q, ESC quit
f toggle full screen
p, SPC pause
a cycle audio channel
v cycle video channel
t cycle subtitle channel
w show audio waves
left/right seek backward/forward 10 seconds
down/up seek backward/forward 1 minute
mouse click seek to percentage in file corresponding to fraction of width




Para exibir isso que está acima de o comando:



$ ffplay


Olhando essa ajuda ai acima observa-se que a forma geral do comando é:
ffplay [options] input_file

Ou seja: ffplay opções arquivoDeVideo



Um exemplo, para conseguir ver o vídeo pti.flv com algumas opções digitei:


$ ffplay pti.flv -skiploop -skipframe -stats -ss pos -fs -ast -debug -vismv -genpts
-lowres -threads count

Onde o Vídeo pti, rodará na tela inteira do monitor (-fs) e as demais opções estão ali a volta.




Espero ter ajudado!

Lembre-se o ffplay é o player que toca o maior número de formatos existentes (pelo menos dos que eu conheço)

Apenas por isso acho que essa dica é válida

Abração e se cuida!