Wednesday, March 30, 2011

Acabo de instalar o Firefox 4 no UBUNTU 10.04


Muito bom! Muito mais rápido, e com visual mais clean. Para instalar você precisa seguir esses passos:
  1. Vá no menu Applications e clique em Ubuntu Software Center.
  2. Clique em Edit e em Software Sources.
  3. Clique na guia Other Software, e em Add.
  4. Em APT Line adicione a linha: ppa:mozillateam/firefox-stable
  5. Aguarde um pouco o update acontecer e pode fechar a janela.
  6. Vá em System, em Administration e chame o Update Manager.
  7. Feche o seu navegador firefox. Antes, leia o passo 8. :)
  8. Clique em Check e depois do gerenciador achar as atualizações, clique em Install Updates.


Prontinho! Pode reiniciar o firefox novo! O bom é que a partir de agora você terá cadastrado o site do firefox no seu source lists e terá sempre a última versão nos updates.

Na foto, além de conferir o visual do Firefox 4, a janela about com a versão, e o draft deste post, note um círculo verde no botão HTML ENCODE SELECTION. Este é o botão que é instalado pelo passo 3.2 do post Como postar código fonte no blog (26/mar/2011).

Referência
[1] Firefox 4 PPA

Contar palavras em uma frase

Um amigo meu na USP esta iniciando o curso de TI, e aprendendo a programar em C. Fez como desafio uma função Conta_Ocorrs() para contar o número de ocorrência de uma palavra em uma dada frase. Aproveitei seu algoritmo para ensinar algumas práticas melhores, comentei seus erros, corrigi, e também sugeri uma nova função contaoc().

Na nova função, discuti se vale a pena incluir um break para sair da função, ou se é melhor deixar o laço acabar por exaustão.

Abaixo a solução:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 80

//funcao Conta_Ocorrs antes do main
//evita ter que escrever o prototipo
//int Conta_Ocorrs(char *pal, char *fra); //<= repare o ponto-e-virgula no prototipo

int Conta_Ocorrs(char *pal, char *fra)
{
int k; //conta as buscas da palavra na frase
int r; //conta as ocorrencias de caracteres de palavra em frase
int o=0; //conta as ocorrencias aqui!
int n, m;

//n=sizeof(fra); Este operador da o tamanho do "tipo" de variavel (int eh 2 bytes, char eh 1 byte, etc).
//m=sizeof(pal); Nao da o tamanho da string. Para isso, use:
n=strlen(fra);
m=strlen(pal);
printf("Tamanhos: frase: %d, palavra: %d\n", n, m);

for (k=m;k<=n;k++)
{
r=1; //r eh zerado em cada pesquisa -- os indices comecam em zero
while (r<=m && pal[m-r]==fra[k-r]) //r<=m para dar zero
r++;
if (r>=m)
o++;
}
return o;
}

//a funcao acima conta comparando indices de tras para frente, o que afeta o desempenho
//o melhor eh comparar os indices na direcao da memoria, para deixar o compilador otimizar melhor o codigo
//descomente os printfs abaixo para ver os indices.
//testei com as frases
//teste 1: frase: "a casa bonita casa". palavra: "casa"
//teste 2: frase: "mamama". palavra: "mama"
//teste 3: frase: "a casa bonita cas". palavra: "casa"
int contaoc(char *pal, char *fra)
{

int p=0; //indice da palavra
int f=0; //indice da frase
int o=0; //ocorrencias
// int tfra, tpal; //use nomes melhores para lembrar do que se trata

// tfra=strlen(fra); //sera que vale a pena conferir?
// tpal=strlen(pal); //veja resposta abaixo

//aproveito que se sabe que ao final de uma string sempre tem o caracter nulo '/0'
while(fra[f+p]!='\0')
{
// printf("outside p:%d, f:%d, o:%d\n", p, f, o);
while(pal[p]!='\0' && fra[f+p]!='\0' && pal[p]==fra[f+p])
// {
// printf("inside p:%d, f:%d, o:%d\n", p, f, o);
p++;
// }
if(pal[p]=='\0') //o pal[p] foi ate o fim, entao encontrou ocorrencia, caso contrario, acabou a frase ou sao diferentes
o++;

//evita calcular o restinho da frase menor que a palavra
// if(f+tpal > tfra)
// {
// printf("strlen p:%d, f:%d, o:%d\n", p, f, o);
// break;
// }
//talvez nao valha a pena. Vejamos:
//A frase "a casa bonita casa" tem 18 letras. A palavra "casa" tem 4. Somente quando f=15, as ultimas 3 letras da frase
//teremos o break. Isso vai evitar 3 giradas do laco externo (e talvez do interno se a frase fosse "a casa bonita cas")
//estamos falando de evitar entao:
// 3 whiles externos e no pior caso, 3+2+1 whiles internos com seus respectivos p++, mais 3 if(pal[p]=='\0')
// mais 3 p=0 e f++
// TOTAL de 24 operacoes
// Incluindo o if(t+tpal>tfra) e seu break, eliminamos 24 operacoes, mas inserimos:
// 2 strlen() no inicio
// para casa laco externo antes dos 3 ultimos (ou seja, 15 lacos): um if(t+tpal..., e a adicao em si do t+tpal
// TOTAL de 30 operacoes!!!
// Caso geral: supoe-se que frases podem ser maiores, mas as palavras acabam por ter um tamanho limitado
// Portanto, em um caso geral, a frase maior e uma palavra de tamanho limitado
// no algoritmo com break: aumenta o total de operacoes do if do break, e nao diminui consideravelmente os lacos
// no algoritmo sem break: o restinho do laco continua sendo executado sem necessidade, mas o numero de operacoes permanece pequeno
// Conclusao: melhor deixar o laco sem teste de break

p=0;
f++;
}
// printf("return p:%d, f:%d, o:%d\n", p, f, o);
return o;
}


// Função principal

int main(void)
{
char palavra[MAX], frase[MAX]; //ponteiros nao sao vetores! Eh preciso alocar o espaco para guardar dados, e isso eh feito com vetor
// contadores mudaram para dentro da funcao int m,n; //Definicao dos contadores
// nao estava sendo utilizada int o; //Definicao do valor de retorno da funcao

//Entrada de dados (inverti a ordem para melhor clareza)
printf("Entre com a frase (max %d letras pois 1 fica reservado para o caracter nulo): ", MAX-1);
//scanf("%s",frase); //nao se usa operador endereco & em ponteiros ou vetores
fgets(frase, MAX-1, stdin); //scanf para de ler ao ver espaco. use fgets(). fgets inclui o ENTER ao final. Elimine-o se nao quiser
frase[strlen(frase)-1]='\0'; //eliminando o ENTER final. Veja explicacao do strlen na funcao acima
printf("Entre com a palavra (max %d letras pois 1 fica reservado para o caracter nulo): ", MAX-1);
scanf("%s",palavra); //nao se usa operador endereco & em ponteiros ou vetores

//Inicializacao dos contadores pode ser feita na funcao, para diminuir numero de parametros
//m=sizeof(palavra);
//n=sizeof(frase);

//Saida de dados
printf("A palavra %s ocorre %d vez(es) na frase\n",palavra, Conta_Ocorrs(palavra, frase));
printf("Funcao contaoc(pal,fra): ocorrencias %d\n", contaoc(palavra, frase));

//Fim
//Nunca use isto. Seu algoritmo nao depende de sistema operacional. system("pause");
//Se precisa dar um tempo antes de retornar, use:
//getchar();
//mas o melhor eh aprender a executar o programa na linha de comando do prompt (shell)
}

Saturday, March 26, 2011

Como postar código fonte no blog

Não sem dificuldade, pesquisei e instalei o necessário para poder colocar no blog código fonte. Para que isso seja possível, com os simples 4 passos:

1- Colar o código no post, na janela de edit HTML
2- Selecioná-lo
3- Transformá-lo em HTML clicando no botão HTML ENCODE SELECTION
4- Colocar o código entre as tags <pre class="prettyprint"> e </pre>

É preciso antes configurar algumas coisas:

O item 3- O botão do item 3 não vem instalado por default. Para conseguí-lo é preciso:
3.1- instalar o add-on do firefox chamado greasemonkey, disponível na página GreaseMonkey Add-on
3.2- instalar o script que o greasemonkey usa para incluir o botão HTML ENCODE SELECTION. Para isso, após instalado, clique em: Script HTML ENCODE SELECTION
O greasemonkey deve aparecer na tela confirmando se quer instalar o script.

O item 4- As tags <pre class="prettyprint"> e </pre> não estão prontas para serem usadas. Para instalá-las é preciso:
4.1- Vá para as configurações do seu blog e edite o HTML Template
4.2- Faça um backup do código HTML antes de alterá-lo
4.3- Adicione na tag "head" o código (este é para o google-prettify, mas podem ser usados outros como o SyntaxHighlighter).

<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"/>
<script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"/>


4.4- Crie a tag "pre" adicionando o código:

pre {
margin: 5px 20px;
border: 1px dashed #666;
padding: 5px;
background: #f8f8f8;
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}


4.5- Adicione dentro da tag "body" o código:

- <body>
+ <body onload='prettyPrint()'>


4.6- Salve o novo template. Agora sim você pode inserir código fonte de modo fácil, como descrito acima.

Referências

References:
1. Vivian's Tech Blog
2. How to publish source code in Blogger.com
3. Posting source code on Blogger
4. HTML TO ENCODE SELECTION

Finalmente em casa

Muito bom! O blog foi transportado para o domínio beco.cc
(Marco: 2011-03-26)