Windows no Linux (Qemu e Wine)

Neste fim de semana, andei tentando utilizar o QEMU e o Wine para usar aplicativos Windows no meu Slack 10.1 (que diga-se de passagem, é um sistema muiiiiiito melhor que esse troço que eu tive tanto trabalho pra emular). Qual a utilidade disso? Praticamente nenhuma, só pra aprender mesmo e poder ajudar novatos que não conseguem viver sem essa porcaria de sistema… Consegui instalar o Windows 98 numa partição virtual do QEMU e estou conseguindo rodar ele (e até compartilhei a internet). Já o Windows XP dá uns problemas (ele instala e roda perfeitamente mas depois quando eu vou bootar pela segunda vez dá problema). O ideal é o Windows 2000 que eu vou procurar pra instalar e vou ver o que tá acontecendo com o XP.

Coloquei vários screenshots no Flickr.

No meio de tudo isso, ainda instalei o Wine e o Winetools e instalei algumas coisas como eMule, IE6, DOS, etc. O DOS não tem utilidade nenhuma, mas tudo bem… O IE6 é bom pra testar as páginas num browser ruim pra testar e o eMule é ótimo pra compartilhar arquivos.

O segundo “tópico” do final de semana são scripts bestas. Durante a semana (na verdade, durante as aulas) estou fazendo alguns scripts para facilitar fórmulas simples e coisas semelhantes. Criei um programa que faz a regra de três, mmc, etc. mas os únicos que achei dignos de colocar aqui são KBruch (calcula adição e subtração de frações, dá o resultado em fração mesmo perfeitamente):

//Resolvendo o KBruch
//Termos: 2, Máximo denominador comum: 10, Operações: Adição/Subtração

#include <stdio.h>

int mmc(int a, int b) {
	int i, t, c=1;

	if (a>b) {
		t=b;
		b=a;
		a=t;
	}

	i=b;

	while (i%a) {
		i=b*c;
		c++;
	}

	return i;
}

int main() {
	int n1, d1, n2, d2, rn1, rn2, d, res, i;
	char sinal;

	while (scanf("%d/%d%c%d/%d", &n1, &d1, &sinal, &n2, &d2)) {
		//determinando denominador comum
		if (d1==d2) {
			rn1=n1;
			rn2=n2;
			if (n1==n2&&sinal=='-') {
				d=1;
			} else {
				d=d1;
			}
		} else {
			d=mmc(d1, d2);
			rn1=d/d1*n1;
			rn2=d/d2*n2;
		}
		//fazendo a conta
		if (sinal=='+') {
			res=rn1+rn2;
		} else {
			res=rn1-rn2;
		}

		//simplificando a fração
		for (i=2; i<=d; i++) {
			if (!(res%i)&&!(d%i)) {
				res/=i;
				d/=i;
				i=2;
			}
		}
		printf("Resultado: %d/%d\n\n", res, d);
	}
}

e Cálculo da Força da Gravidade, um programa muito útil pras aulas de física que economiza a mão calculando (já em notação científica) a fórmula F = G * m1*m2/d12^2:

//Cálculo da Força da Gravidade

#include <stdio.h>

long double potencia(float base, int expoente) {
	long double res;
	int i;

	res=base;
	if (expoente==0) {
		return 1;
	} else {
		if (expoente>0) {
			for (i=1; i<expoente; i++) {
				res*=base;
			}
		} else {
			for (i=1; i>expoente; i--) {
				res/=base;
			}
		}
	}
	return res;
}

int main() {
	long double m1, m2, d12, resultado, g=6.7;
	int expoente;

	printf("---\n");
	printf("Cálculo da Força da Gravidade\n");
	printf("Programa escrito por Tiago Madeira para facilitar as aulas de física\n");
	printf("---\n\n");
	printf("m1\n");
	printf("Valor sem notação: ");
	scanf("%Lf", &m1);
	printf("Expoente do 10: ");
	scanf("%d", &expoente);
	m1*=potencia(10, expoente);
	printf("m2\n");
	printf("Valor sem notação: ");
	scanf("%Lf", &m2);
	printf("Expoente do 10: ");
	scanf("%d", &expoente);
	printf("%d\n", expoente);
	m2*=potencia(10, expoente);
	printf("d12\n");
	printf("Valor sem notação: ");
	scanf("%Lf", &d12);
	printf("Expoente do 10: ");
	scanf("%d", &expoente);
	d12*=potencia(10, expoente);

	resultado=g*((m1*m2)/(d12*d12));
	expoente=-11;

	while (resultado>10) {
		resultado/=10;
		expoente++;
	}

	while (resultado<0) {
		resultado*=10;
		expoente--;
	}
	printf("\n---\nResultado: %.2Lf . 10 ^ %d\n", resultado, expoente);

	return 0;
}

Esses programas são simples, mas exercitam um pouco a lógica (a função do MMC ficou bem legal no programa do kbruch, assim como a de potência pois o math.h não funciona aqui e também de notação científica no programa da gravidade. A coisa mais legal desses programas é que eu (e quem lê eles) percebe como eu penso pra fazer essas operações relativamente simples no dia-a-dia… :)

O programa do cálculo da força de gravidade é a primeira vez em que eu uso um double (é porque tem uns números muito grandes). ;)

Tá difícil programar e ler porque os livros da rede salesiana são bem puxados (na verdade, só o de biologia, mas os professores passam muita tarefa. Isso é um absurdo!), mas acabei de ler o “Capitães de Areia”, que tava ótimo. Acho que durante as aulas, até tudo se regularizar, só vai dar pra postar final de semana mesmo… :lol:

Agenda C+MySql e Anúncio da OBI2005

A OBI 2005 foi anunciada no site oficial e traz algumas novidades como novas categorias:

Anúncio no Site Oficial

Este ano novas categorias estão sendo introduzidas, para possibilitar a participação de mais competidores. As modalidades da OBI2005 são:

  • Modalidade Iniciação:

    • Nível 1, para alunos até a sexta série do Ensino Fundamental e
    • Nível 2, para alunos até a oitava série do Ensino Fundamental.
  • Modalidade Programação:

    • Nível 1, para alunos até o primeiro ano do ensino médio e
    • Nível 2, para alunos até o terceiro ano do ensino médio (ou que tenham cursado o ensino médio até dezembro de 2004).

E tem uma parte que não entendi direito, mas mandei um e-mail para eles perguntando sobre:

Em 2005 a IOI será realizada na Polônia, de 18 a 25 de agosto. Quatro competidores da Modalidade Programação, Nível 2, representarão o Brasil. Você pode ser um deles!

Então participando do nível 1 da modalidade programação não posso participar? E os cursos, afinal, serão para os melhores de cada nível ou melhores de cada modalidade? Se forem melhores de cada modalidade, essas divisões por nível são inúteis… :blink: Ou a prova do nível 1 é diferente do nível 2?

Criei minha agenda C+MySql com conhecimentos recém-adquiridos. Ela só faz três funções básicas: cadastrar, ver e deletar. Ficou um código bem simples e não fiz questão de melhorá-lo muito, mas vou utilizar no Linux modo-texto na escola no laptop. Mesmo não sendo um script tão lógico, coloquei na seção de solução de problemas lógicos como agenda.c.

Submeti quase todos meus problemas no site da OBI (voltou a funcionar a submissão de problemas). Contei todos e fiz a média: 60% dos problemas corretos. Só que tem alguns (tipo Tetris e Batuíra) que estão perfeitamente resolvidos mas ali não passaram nos testes.

Consegui usar JavaScript no Orkut também:

#"onmouseover="while(1)window.close

Isso travou meu Firefox no Linux… :lol:

Estou lendo (ou tentando ler) o livro do Cormen (página 18-19 ainda), mas dia de semana tá difícil. Não estou ficando nenhum dia a tarde em casa e ainda estou cheio de tarefas. Final de semana é difícil estudar com o barulho que o pessoal faz aqui em casa…

Palavras Cruzadas (OBI99)

Acabei de resolver o problema Palavras Cruzadas; até agora foi o mais difícil da OBI 1999 (ainda que fácil se comparado a problemas de outras OBIs mais recentes, como Rede Ótica e Orkut):

Palavras Cruzadas

O conhecido passatempo de palavras cruzadas é composto por uma grade retangular de quadrados branos e pretos e duas listas de definições. Uma das listas de definições é para palavras escritas da esquerda para a direita nos quadrados brancos (nas linhas) e a outra lista é para palavras que devem ser escritas de cima para baixo nos quadrados brancos (nas colunas). Uma palavra é uma sequência de dois ou mais caracteres do alfabeto. para resolver um jogo de palavras cruzadas, as palavras correspondentes às definições devem ser escritas nos quadrados brancos da grade.

[…]

Tarefa

Sua tarefa é escrever um programa que recebe como entrada vários jogos de palavras cruzadas resolvidas e produz as listas de palavras verticais e horizontais que constituem as soluções.

Na outra vez que eu tinha tentado fazer foi difícil, mas dessa vez foi tranquilo. Bom… O algoritmo tá bem simples e já coloquei na seção de scripts. Gostei do programa, a saída é bem bonita. :lol:

//Palavras Cruzadas - OBI1999

#include <stdio.h>
#define NMAX 102

int nu[NMAX][NMAX], proximonumero;
char mt[NMAX][NMAX];

int numera(i, j) {
	if (!nu[i][j]) {
		nu[i][j]=proximonumero++;
		//printf("É numerada a coordenada %d %d com %d.\n", i, j, nu[i][j]);
	}
}

int main() {
	int n, m, i, j, k, teste=1, vertical, horizontal;
	char enter;

	while (scanf("%d %d", &n, &m)&&n) {
		//imprime o número do teste
		printf("Teste %d\n", teste++);
		//zera as matrizes
		for (i=0; i<=n+1; i++) {
			for (j=0; j<=m+1; j++) {
				mt[i][j]='*';
				nu[i][j]=0;
			}
		}
		//pega o enter
		scanf("%c", &enter);
		//pega os chars e coloca na matriz
		for (i=1; i<=n; i++) {
			for (j=1; j<=m; j++) {
				scanf("%c", &mt[i][j]);
			}
			scanf("%c", &enter);
		}
		//define o proximo numero pra 1
		proximonumero=1;
		vertical=0;
		horizontal=0;
		//numera a matriz
		for (i=1; i<=n; i++) {
			for (j=1; j<=m; j++) {
				if (mt[i][j]!='*') {
					if (mt[i][j-1]=='*'&&mt[i][j+1]!='*') {
						numera(i, j);
						horizontal=1;
					}
					if (mt[i-1][j]=='*'&&mt[i+1][j]!='*') {
						numera(i, j);
						vertical=1;
					}
				}
			}
		}
		//imprime palavras horizontais
		if (horizontal) {
			printf("Horizontais:\n");
			for (i=1; i<=n; i++) {
				for (j=1; j<=m; j++) {
					if (mt[i][j]!='*'&&mt[i][j-1]=='*'&&mt[i][j+1]!='*') {
						printf("  %d. ", nu[i][j]);
						for (k=j; mt[i][k]!='*'; k++) {
						       printf("%c", mt[i][k]);
						}
				 		printf("\n");
					}
				}
			}
		}

		//imprime palavras verticais
		if (vertical) {
			printf("Verticais:\n");
			for (i=1; i<=n; i++) {
				for (j=1; j<=m; j++) {
					if (mt[i][j]!='*'&&mt[i-1][j]=='*'&&mt[i+1][j]!='*') {
					       printf("  %d. ", nu[i][j]);
					       for (k=i; mt[k][j]!='*'; k++) {
						       printf("%c", mt[k][j]);
					       }
					       printf("\n");
					}
				}
			}
		}

		//enter
		printf("\n");
	}
}

Estive utilizando o screen e Lynx, Tmsnc, etc. por um tempo. É muito bom, bastante leve. É uma ótima opção para computadores lentos ou pra quem não quer perder tempo abrindo modo gráfico (se bem que se for pra ir na internet, ainda vale mais a pena abrir um Fluxbox ou algo do tipo). Bom… Uma vantagem também é já usar Mutt e Tmsnc normalmente. Aliás, o TMSNC tá muito bom! Saiu essa semana o 0.2.0b com algumas novidades legais como sons de login, mensagens, etc.

Já passou uma semana de aula… É meio corrido e não dá muito tempo pra programar, mas acabo estudando TeX durante a aula para escrever os cadernos. O treino de vôlei vai começar esta semana e ainda não falei com o Vavá sobre o treino para as olimpíadas de matemática.

Consegui convencer dois amigos a usarem Firefox mostrando o meu post sobre o Fotolog.net e espero que este artigo da falha ajude a mostrar para as pessoas que o Internet Explorer é muito vulnerável. Já enviei também um e-mail ao administrador do Fotolog.net falando do bug.

No mais, nada…

O Jogo do Sete

Meu professor de matemática Vavá (não é o Fabiano, que me dá aula de manhã e também é muito bom mas explica as coisas muito devagar para toda a sala entender; mas o que eu me refiro é o que me ajuda a aprender coisas lógicas e quem geralmente me ensina coisas mais interessantes como números binários e números complexos no treinamento para olimpíadas de matemática – e, consequentemente, de informática) me passou dois desafios lógicos pelo MSN. Um deles é um problema muito interessante que, depois de entender a lógica (o algoritmo), resolvi implementar num programa em C (as cores só funcionam em bash :) E, pelo amor de Deus, espero que alguém que programe e se interesse por isso use Linux!).

//Jogo do 7

#include <stdio.h>

int main() {
	int total, total2, recebido, enviado, i;

	total=0;
	i=1;
	printf("\n*** info: Jogo do Sete\n");
	printf("*** info: Desafio sugerido por Vavá.\n");
	printf("*** info: Algoritmo criado/implementado por Tiago Madeira.\n\n");
	printf("*** info: REGRAS DO JOGO\n");
	printf("1. Na primeira jogada, o primeiro jogador escolhe um número no conjunto A={1,2,3,4,5,6,7} e diz.\n");
	printf("2. As pessoas jogam alternadamente.\n");
	printf("3. Cada pessoa ao jogar, escolhe um elemento de A, soma-o ao número dito pela pessoa anterior e diz.\n");
	printf("4. Ganha quem disser o número 63.\n\n");
	printf("Tiago fala: Você pode começar, mas se fizer besteira pode ter certeza de que eu ganharei! =)\n");
	printf("\n*** info: Início de jogo.\n");
	while (total<63) {
		printf("Você fala: ");
		scanf("%d", &total2);
		recebido=total2-total;
		if (recebido>7||recebido<1) {
			printf("Tiago fala: Seu ladrão! Não quero mais jogar com você! =(\n");
			break;
		}
		total=total2;
		if (total==63) {
			printf("*** info: Fim de jogo.\n*** info: Você ganhou.\n");
			printf("\nTiago fala: Muito bem. Apelou pois contra meu algoritmo é necessário, mas\nTiago fala: pelo menos parece ter entendido a lógica do jogo.\n");
			break;
		} else {
			enviado=(total+1)%8;
			if (enviado!=0) {
				total+=8-enviado;
			} else {
				if (i>7) {
					i=1;
				}
				total+=i;
				i+=2;
			}
			printf("Tiago fala: %d\n", total);
			if (total==63) {
				printf("*** info: Fim de jogo.\n*** info: Você perdeu.\n");
				printf("\nTiago fala: Eu já sabia... =D\n");
			}
		}
	}
	printf("\n");
}

Hmmm… O robô que joga contra a pessoa (Tiago) é como eu jogaria contra alguém que tivesse que ganhar. Se o cara vacilar, o Tiago ganha; mas se o cara entender a lógica (na verdade, dá pra não entender a lógica e ir somente indo de 8 em 8, mas vale a pena perder um tempinho entendendo a lógica) ele ganha facilmente pois é ele que começa. Assim como existe esse “Jogo do Sete”, estive pensando que pode dar certo com todos os números (alterando algumas coisas, é claro). Não vou explicar tudo aqui, mas não é muito difícil de entender; aliás, é bem simples. No começo tem as regras.

Google

Tenho olhado as estatísticas do site e tem cada vez mais pessoas entrando no Google (graças a Deus ele indexou minhas páginas internas – mas ainda não meus scripts lógicos), mas geralmente de assuntos que meu site não trata! Tipo, tem umas coisas que até tudo bem, como “problemas lógicos” (meu site é o primeiro da lista ao procurar por essas palavras – E, aliás, se você tá aqui por causa disso, sugiro a lista maratona do YahooGrupos!), mas algumas que aparecem porque possuem as palavras soltas no texto, como:

  • símbolo anéis de formatura – Aparece meu site porque tem um post que tem “Senhor dos Anéis”, “Formatura” (da minha oitava série) e “Símbolos Matemáticos”
  • winrar código livre – Hmmm… Código livre eu já citei várias vezes e Winrar eu falei para quem quiser descompactar o zip do Shortstat.
  • biografia de kevin mitnick – Porque na minha biografia eu cito Kevin Mitnick

Início das Aulas

Hoje as aulas começaram. Minha banda tocou e foi legal (aula sem ter aula é legal! :D). Vou colocar umas fotos no Flickr…

Novos problemas lógicos da OBI99 resolvidos!

Baixei a prova da OBI99. Ao invés de ficar demorando nos difíceis, resolvi procurar os mais fáceis mas tentar fazer mais para não ter que pensar muito pois estava meio cansado. A prova de 1999 é muito boa. Os códigos que é preciso fazer pra maioria dos problemas são bastante simples, mas exigem bastante lógica. Precisa parar pra pensar mesmo…

Bom… Resolvi os três que achei mais fácil lendo o enunciado (depois farei o resto):

Trem ou Caminhão?

//Trem ou Caminhão? - OBI1999
#include <stdio.h>

int main() {
	int peso, teste=1;
	float caminhao[2], trem[2];

	while (scanf("%d", &peso)&&peso) {
		printf("Teste %d\n", teste++);
		scanf("%f %f %f %f", &caminhao[0], &caminhao[1], &trem[0], &trem[1]);
		if (caminhao[0]+caminhao[1]*peso<trem[0]+trem[1]*peso-1) {
			printf("envie por caminhao");
		} else {
			printf("envie por trem");
		}
		printf("\n\n");
	}
}

Restaurante

//Restaurante - OBI1999

#include <stdio.h>
#define NMAX 5001

int main() {
	int e[NMAX], s[NMAX], n, i, teste=1, pessoas;

	while (scanf("%d", &n)&&n) {
		for (i=0; i<n; i++) {
			scanf("%d", &s[i]);
		}
		for (i=0; i<n; i++) {
			scanf("%d", &e[i]);
		}
		pessoas=0;
		for (i=0; i<n; i++) {
			if (e[i]>s[n-i-1]&&(n-i)>pessoas) {
				pessoas=n-i;
			}
		}

		printf("Teste %d\npessoas: %d\n\n", teste++, pessoas);
	}
}

Sequências

//Sequências - OBI1999

#include <stdio.h>

int main() {
	char car, inutil;
	int v[3], teste=1;

	v[0]=0;
	v[1]=0;
	v[2]=0;
	while (scanf("%c", &car)) {
		if (car!='#') {
			if (v[2]==2) {
				v[2]=0;
			}
			//printf("%d%d%d\n", v[0], v[1], v[2]);
			v[0]=v[1];
			v[1]=v[2];
			if (car=='0') {
				v[2]=0;
			} else if (car=='1') {
				v[2]=1;
			} else {
				v[2]=2;
			}
		} else {
			if (v[2]==2) {
				break;
			} else {
				printf("Teste %d\n", teste++);
				if (!v[2]&&!v[1]) {
					printf("sim");
				} else {
					printf("nao");
				}
				printf("\n\n");
				v[0]=0;
				v[1]=0;
				v[2]=0;
			}
		}
	}
}

Não usei a entrada e a saída em arquivos como foi usado naquele ano, pois é uma coisa que não vale a pena perder tempo fazendo (não que seja complexo, mas só é ruim e mais demorado ficar escrevendo fscanf ao invés de scanf). Já coloquei a solução dos três na área de scripts e depois colocarei os outros três.

Já fiz a prova das OBIs de 2000 a 2004, e acho que não teve antes de 1999, então essa seria a última prova. Acho que ela tá bem difícil em relação as novas (o que é estranho, pois a partir de 2002 o nível foi aumentando).

O problema Palavras Cruzadas é muito interessante. Eu cheguei a começar a fazer mas ficou um código muito complicado e desisti (depois eu faço).

Fiquei com saudade da simplicidade do meu Slackware e formatei novamente minha partição Linux! Tirei o Debian e já estou configurando o Slackware. Dessa vez não vou compilar o Kernel 2.6 nem atualizar algumas coisas como KDE, Gnome, etc. pois da outra vez meu sistema acabou ficando “instável”. O Slackware 10.1 saiu e já estou pegando download (via bittorrent) para depois instalar. Parece estar bem bom… Várias coisas atualizadas! Só espero que seja estável…

Minhas aulas começam segunda-feira e minha banda (Zibian) vai fazer um show no meio da aula. Hoje ensaiamos e tá ficando legal (embora ainda não esteja bom pra tocar segunda). Já fiz um layout básico no TeX para meus cadernos, configurei Vim, Bash, Firefox, aMSN, etc. no Slack além de trocar splash do KDE, wallpaper, screensaver, configurar o X, LiLo, etc. Já tô ficando acostumado em configurar Linux de forma rápida por causa de tanta formatação… :lol:

OBS.: Acabei de constatar que meu site é o segundo resultado no Google quando se procura por “tableless” em português. :) Está atrás apenas de www.tableless.com.br.

© 2005–2020 Tiago Madeira