Análise de Algoritmos

Analisar um algoritmo é prever o que o algoritmo irá precisar. Às vezes o hardware é importante, mas acho que o que acontece com mais freqüência, ao menos em olimpíadas, maratonas e problemas em casa, é precisarmos medir o tempo que ele irá demorar.

Eu expliquei em algum dos artigos anteriores que o tempo de um algoritmo depende geralmente do tamanho de sua entrada. Com este artigo, pretendo explicar como analisamos um algoritmo baseado nesse tamanho de sua entrada para compará-lo com outros algoritmos e ter uma noção de quanto tempo ele vai demorar.

Para o entendimento ficar mais fácil, vamos partir do seguinte algoritmo (que vamos chamar de Algoritmo 1):

para i \leftarrow{} 1 até n, faça
para j \leftarrow{} 1 até i, faça
  imprima i ×\times{} j ×\times{} n
fim-para
fim-para

O que este algoritmo faz é, depois de receber a entrada nn do usuário, imprimir o produto de nn com todos dois números ii e jj, tal que jinj \leq{} i \leq{} n.

Para medir o custo do algoritmo, nossa análise consistirá em ver quantas vezes cada passo é executado. Mediremos o custo de cada linha (cada passo a ser executado), sempre em função de n, que para este algoritmo é a variável mais importante (aliás, a única variável). Por isso o pseudocódigo do Algoritmo 1 está com suas linhas numeradas. Vamos analisar…

  • Linha 1: Será executada n+1n + 1 vezes.
  • Linha 2: Será executada n×_i=1n+nn \times{} \sum\_{i=1}^{n} + n vezes.
  • Linha 3: Será executada n×_i=1nn \times{} \sum\_{i=1}^{n} vezes.
  • Linhas 4 e 5: Não tem custo. :)

Por que estes números de execução?

Se você já entendeu por que cada passo é executado este número de vezes, pode pular essa parte (continuar a ler a partir da linha horizontal).

Linha 1

O loop para voltará para si mesmo nn vezes, isso é, testará novamente sua condicional e incrementará um. Por sempre testar um condicional, no final ele terá que testar novamente para dizer que já passou de nn. Por isso, ele será executado n+1n+1 vezes, ao invés de simplesmente nn.

Linha 2

Este loop para será executado um número de vezes variável (ii), que irá de 11 a nn. Portanto, ele será executado duas vezes (1 mais “o último condicional”) no primeiro loop de ii, três (2 mais “o último condicional”) no segundo, e por aí vai. Com isso, ele será executado o número de vezes que equivale a soma de 11 a nn, mais nn que são “os últimos condicionais”.

Linha 3

Exatamente o mesmo número que a Linha 2, mas sem “os últimos condicionais” (n-n).


Imprimir algo na tela pode demorar mais do que fazer uma operação, mas a análise de algoritmos é uma coisa bem rústica. Desprezamos todas as constantes, com isso só levando a sério a informação importante: neste caso, apenas nn. Então agora, vamos escrever o tempo de execução do algoritmo, que é a soma dos tempos de execução para cada instrução executada.

T(n)=(n+1)+(_i=1n+n)+(_i=1n)T(n) = (n + 1) + (\sum\_{i=1}^{n} + n) + (\sum\_{i=1}^{n})

Os parênteses não são necessários, mas coloquei para ajudar na visualização separando o custo de cada instrução.

Simplificando esta operação, teremos:

T(n)=n2+3nT(n) = n^{2} + 3n, uma função quadrática.

Ordem de Crescimento

Como eu já disse antes, descobrir o custo de um algoritmo é uma coisa feita sem precisão, porque para entradas realmente grandes (que são casos onde precisamos do computador!) as constantes não importam. Agora vamos determinar a ordem de crescimento de um algoritmo resgatando do nosso algoritmo apenas o valor mais importante, o maior expoente de nn nele, neste caso, n2n^{2}. Se tivéssemos 2n22 n^{2}, por exemplo, também usaríamos apenas n2n^{2} porque o 22 que multiplica também é desprezível!

Vamos agora aprender como representar o custo desse algoritmo usando notações assintóticas com a ordem de crescimento do algoritmo.

Se você não entendeu alguma coisa aí em cima, sugiro reler antes de continuar…

Notações Assintóticas

Sugestão

Principalmente para pessoas pouco habituadas com matemática, essa parte é difícil e cansativa. Quando eu comecei a aprender isto, talvez por causa da matemática tão básica que é ensinada na escola, eu não entendia nada… Mas só quero dar uma dica: se você não entender direito ou achar muito complicado, pule para a próxima linha horizontal ao invés de desistir e dizer que “algoritmos são muito difíceis”. Tentei fazer o artigo para você poder pular essa parte e mesmo assim não parar no estudo dos algoritmos… Depois, com o tempo, você vai aprendendo isso.

As notações que usamos para descrever o tempo de execução de um algoritmo são cinco:

  • Θ\Theta{}
  • OO
  • Ω\Omega{}
  • oo
  • ω\omega{}

Embora essas notações sejam conjuntos, usamos o sinal de igualdade (=) para expressar que f(n)f(n) pertence a algum deles, ao invés de usar o sinal de pertinência (\in{}).

Vou explicá-las, omitindo alguns fatos para tentar facilitar o entendimento, porque eu acho que analisar algoritmos é meio complicado e nessa parte é extremamente difícil ser didático. Mas se você realmente se interessar, você pode me enviar um comentário pedindo mais um artigo sobre isso (e eu terei o prazer de até pesquisar para informar-lhes mais) ou então leia o Capítulo 3 do livro Algoritmos: Teoria e Prática, que acredito que seja bem completo. Gostaria de enfatizar aqui que meu objetivo com essa série é tornar uma introdução a algoritmos simples e não ser uma referência, como é o objetivo, por exemplo, do livro do Cormen [et al].

A notação Θ\Theta{}

Lê-se “theta de gê de ene”.

Θ(g(n))=f(n)\Theta{}(g(n)) = f(n), se existem constantes positivas c_1c\_{1}, c_2c\_{2} e n_0n\_{0} tais que 0c_1g(n)f(n)c_2g(n)0 \leq{} c\_{1} g(n) \leq{} f(n) \leq{} c\_{2} g(n) para todo nn_0n \geq{} n\_{0}.

A notação OO

Lê-se “ó maiúsculo de gê de ene”. Para quando há apenas um limite assintótico superior.

O(g(n))=f(n)O(g(n)) = f(n), se existem constantes positivas cc e n_0n\_{0} tais que 0f(n)cg(n)0 \leq{} f(n) \leq{} cg(n) para todo nn_0n \geq{} n\_{0}.

A notação Ω\Omega{}

Lê-se “omega maiúsculo de gê de ene”. Para quando há apenas um limite assintótico inferior.

Ω(g(n))=f(n)\Omega{}(g(n)) = f(n), se existem constantes positivas cc e n_0n\_{0} tais que 0cg(n)f(n)0 \leq{} cg(n) \leq{} f(n) para todo nn_0n \geq{} n\_{0}.

A notação oo

Lê-se “ó minúsculo de gê de ene”. Para quando há apenas um limite assintótico superior, sem permitir que f(n)=cg(n)f(n) = cg(n). Utiliza-se a notação oo para denotar um limite superior que não é assintoticamente restrito.

o(g(n))=f(n)o(g(n)) = f(n), se para qualquer constante c>0c > 0, existe uma constante n_0>0n\_{0} > 0 tal que 0f(n)cg(n)0 \leq{} f(n) \leq{} cg(n) para todo nn_0n \geq{} n\_{0}.

A notação ω\omega{}

Lê-se “omega minúsculo de gê de ene”. Para quando há apenas um limite assintótico inferior, sem permitir que cg(n)=f(n)cg(n) = f(n). Utiliza-se a notação ω\omega{} para denotar um limite inferior que não é assintoticamente restrito.

ω(g(n))=f(n)\omega{}(g(n)) = f(n), se para qualquer constante c>0c > 0, existe uma constante n_0>0n\_{0} > 0 tal que 0cg(n)f(n)0 \leq{} cg(n) \leq{} f(n) para todo nn_0n \geq{} n\_{0}.

Para analisar problemas mais complexos como, por exemplo, recorrências, existem métodos bastante interessantes, como o Teorema Mestre que o Cormen apresenta no Capítulo 4. É uma boa leitura pra quem se interessou.


Podemos criar várias comparações entre estas funções, mas isto não vem ao caso. O importante é saber em que notação a nossa função se encontra. Com o tempo vamos compreendendo melhor essas fórmulas.

Vamos relembrar o custo de nosso algoritmo… T(n)=n2+3nT(n) = n^{2} + 3n.

Vamos ver em que notação ele pode se encaixar, sabendo que g(n)g(n) seria a ordem de crescimento (parte importante) do nosso custo; no caso, n2n^{2}.

Testamos primeiro se ele encaixa na função Θ(n2)\Theta{}(n^{2}). Vamos substituir f(n)f(n) e g(n)g(n) (naquela função ali em cima, onde diz A notação Θ\Theta{}) pelos valores que conhecemos.

c_1n2n2+3nc_2n2c\_{1}n^{2} \leq{} n^{2} + 3 n \leq{} c\_{2} n^{2}

Se dividirmos tudo por n2n^{2}, obteremos:

c_11+3nc_2c\_{1} \leq{} 1 + \frac{3}{n} \leq{} c\_{2}

Agora separaremos as inequações.

Inequação 1: c_11+3nc\_{1} \leq{} 1 + \frac{3}{n}

Inequação 2: 1+3nc_21 + \frac{3}{n} \leq{} c\_{2}

Para satisfazer a Inequação 1, podemos quase automaticamente perceber que para qualquer n1n \geq{} 1, é válido c_1=1c\_{1} = 1 (ora, por mais que 3n\frac{3}{n} chegue perto de 0, sempre ainda vamos ter a constante 1 adicionada a ele). Para satisfazer a Inequação 2, podemos perceber facilmente que para qualquer n1n \geq{} 1, é válido c_2=4c\_{2} = 4 (a função só tende a diminuir a partir que nn vai aumentando e com n=1n=1, c_2=4c\_{2}=4). Com isso, agora chegamos as três constantes que precisávamos.

n_0n\_{0} (o menor valor de nn) =1= 1; c_1=1c\_{1} = 1; c_2=4c\_{2} = 4.

Logo, concluímos que f(n)=n2+3n=Θ(n2)f(n) = n^{2} + 3n = \Theta{}(n^{2}). Uma função que pertence a Θ\Theta{}, tem um limite assintótico superior e inferior e, portanto, pertenceria também a O(n2)O(n^{2}) e Ω(n2)\Omega{}(n^{2}), mas nem é necessário testar os outros valores porque já identificamos nossa função como “theta de ene ao quadrado”, que é a função mais “retinha” que podemos esperar.

Bom… Nos próximos artigos, veremos que um mesmo problema pode ter várias soluções diferentes com custos ainda mais diferentes! Por isso, é crucial sabermos analisar, mesmo que por cima, qual o algoritmo que é mais eficiente. Vou ficando por aqui…

Menção Honrosa na ORM

Vi ontem no site da Olimpíada Regional de Matemática o resultado deste ano. Fiquei só com uma menção “horrorosa”, no nível 3. Até que tá bom… Eu já não esperava muito, porque em nenhuma das duas fases eu fui bem. Então aproveito pra pensar as coisas pelo lado bom: quem ganha menção honrosa é premiado primeiro na cerimônia de premiação da UFSC! :)

Meu irmão (Bruno) e o Ivo pegaram bronze na mesma categoria… Nas outras categorias, não sei como o pessoal do Colégio foi porque não sei o nome completo das criaturas que fizeram a prova.

Meu fórum, SOSPHP, voltou ao ar depois de uns problemas com o servidor; agora tá de servidor novo! (que chique…) Participem, pô!


O que eu andei lendo por aí…

Férias!

Hoje foi minha última aula desse ano e abertura da OLIS (olimpíada do meu colégio). Começaram extra-oficialmente as férias. Finalmente vou ter um tempinho pra poder estudar informática, matemática e música; aproveitar a praia, viajar, ler… Demorou, hein?

Como toda pessoa organizada (categoria que eu não me enquadro, mas estou tentando), fiz meu “plano” para aproveitar bem essas férias e também para decidir o que eu vou querer no ano que vem. Aqui embaixo está publicado, e sujeito a mudanças (porque meus objetivos sempre podem mudar). Notem também que eu coloquei algumas coisas como “ganhar olimpíada” que seriam conseqüência das outras ações. Além disso, eu coloquei alguns objetivos que podem parecer “sonhos”, mas acho que sempre é bom traçar objetivos difíceis pra tentar ir o mais longe possível.

Informática

Acho que foi a área em que eu menos evoluí nesse ano. É que é incrível que quanto mais eu aprendo, mais percebo que ainda tenho cada vez mais coisa a aprender. Isso não faz sentido matematicamente falando… A informática é desafiante e a gente sempre tem a impressão de que somos ignorantes. É como o Zeh falou num post em seu blog: “O mais legal de ser programador é olhar pra certas coisas que você fez no passado, que achava uma grande idéia, e perceber que aquilo era algo extremamente fedorento.”

Mas vamos lá…

  • Dominar os algoritmos mais básicos de grafos, programação dinâmica e geometria (saber implementá-los sem consulta em C).
  • Obter medalha de ouro na Olimpíada Brasileira de Informática.
  • Participar da Olimpíada Internacional de Informática.
  • Dominar o básico da linguagem C (saber gerenciar memória, usar bibliotecas como ncurses, usar sockets, etc.)
  • Aprender de vez a programar em C/GTK, para criar interfaces gráficas.
  • Dominar conceitos da orientação a objetos (abstração, encapsulamento, herança, poliformismo) e saber implementá-los em Java, C++ e PHP 4 e 5.
  • Aprender um JavaScript mais avançado (saber criar aqueles marquees por exemplo, ou como o cara pode arrastar um div pela tela) e exercitar essas linguagens client-side e Ajax dentro dos padrões web.
  • Saber diferenciar Unix/Linux/FreeBSD/OpenSolaris. Instalar estes outros sistemas no meu laptop.
  • Exorcizar o laptop. Não usar mais nem Flash, abolir o Windows.
  • Converter o laboratório de informática do Colégio Salesiano pra Linux (Edubuntu, que eu conheci essa semana e achei muito massa!).
  • Programar com frameworks.
  • Aprender Awk.
  • Aprender alguma coisa de hardware e de baixo nível (Assembler).

Matemática

Nesse ano, fui mal nas duas olimpíadas (brasileira e catarinense) e mesmo ganhando medalha de bronze na Olimpíada de Maio, não fiquei muito contente. De qualquer maneira, sinto que estou evoluindo na matemática graças as aulas do Vavá e mesmo as do Fabiano, que são lerdas mas às vezes trazem uma novidade.

  • Obter medalha de ouro na Olimpíada Regional de Matemática.
  • Obter medalha na Olimpíada Brasileira de Matemática.
  • Dominar geometria básica (decorar fórmulas dos volumes dos objetos, por exemplo).
  • Fazer exercícios dos Eureka!s
  • Fazer contas mentalmente mais rápido (exemplo: resolver uma Bháskara mentalmente em menos de 15 segundos)
  • Trabalhar com matrizes.
  • Trabalhar com funções de terceiro grau e superiores.
  • Trabalhar com números complexos.
  • Gabaritar a prova de matemática do vestibular do ITA no final do ano.
  • Prosseguir com treinamento para olimpíadas com o professor Vavá.

Física

Física depois desse ano entrando na minha lista de matérias legais e que eu preciso estudar bastante pra passar no ITA… Vamos à lista…

  • Dominar conceitos básicos e conhecer fórmulas básicas (Newton, Kelpler, Galileu, Einstein).
  • Revisar meu livro de física desse ano (2005).
  • Participar da Olimpíada Brasileira de Física.
  • Participar da Olimpíada Brasileira de Astronomia.
  • Prosseguir com grupo de estudos físicos com o professor Valdir.
  • Acertar 75% da prova de física do vestibular do ITA no final do ano.

Trabalho

Resolvi parar de trabalhar no Colégio, porque o salário era muito baixo (cerca de 200 reais é pouco, mesmo pra trabalhar 10 horas por semana) e o emprego fixo é muito chato (tem dias que eu vou lá e não faço nada, outros dias que tem um monte de coisa pra fazer e eu não consigo acabar nada; fora os alunos que vão lá no Lab. de Informática encher o saco – hehehe). Vou pegar mais freelances e acho que vou lucrar mais me dedicando só a isso e aos estudos, tanto financeiramente quanto nos aprendizados. Mas vou fazer uma proposta ao Colégio que é continuar mantendo o site deles (afinal, eles precisam de alguém pra fazer isso), mas fazer de casa e com isso só perder tempo quando precisar de alguma mudança, em casa!

Compras

Compras prioritárias que estou querendo fazer de livros e acessórios nesse ano… Aceito presentes! :D

Passeios e Cursos

Viagens [sendo] programadas…

  • Campinas – SP: Se tudo der certo, pra visitar meu irmão na UNICAMP e participar do Curso de Programação da OBI
  • Porto Alegre – RS: Fórum Internacional do Software Livre
  • Rio de Janeiro – RJ: Não tem nenhum evento não, mas eu queria conhecer.
  • México: Se tudo der certo, estamos lá na olimpíada internacional!

Música

No ano que vem, quero voltar a fazer aula de piano. Acho que farei com a mãe de uma amiga, que dá aula na ADMITA.


Nesse final de semana fomos pra Curitiba (quem acompanha meu feed viu as fotos no Flickr). Meu irmão Bruno fez vestibular pra música/violão na UNICAMP. Ele não achou a prova muito difícil e falou que acertou uns 80%. Ainda tem mais uma fase de prova de conhecimentos gerais e depois é a prova de aptidão (violão). Acho que ele passa… :)

Alguém tem notícias dos caras da UFSC? Já fizemos a final da Olimpíada Regional Catarinense de Matemática (por que eles não mudam o nome pra quem é de fora saber de onde que é e quem é de dentro não pensar que toda a Região Sul participa da olimpíada?) há dois meses, o ano já vai acabar, e NADA! (nem mesmo o gabarito da prova, mesmo sem o resultado final…)

Sempre que eu escrevo posts grandes, eu me perco no meio. Então se alguma parte ficou difícil de entender ou se tem algum erro de português aí, me avisem! :)

Programação Orientada a Objetos

Estou finalmente começando a aprender orientação a objetos. É claro que o conceito eu já conhecia e até como usar “cin” e “cout” no C++, mas agora resolvi estudar a fundo a Programação Orientada a Objetos, porque vejo que ela está cada vez mais comum entre os programadores. Estou aproveitando pra aprender C++, o que pode ser bastante útil em olimpíadas, para ter strings com o tipo string, poder declarar variáveis no meio, além de programar orientado a objetos.

Hmmm… Eu estava lendo uns tutoriais de introdução a POO e agora vou tentar fazer algumas coisas em C++ e em PHP também (porque é uma linguagem que eu domino mais, fica mais fácil entender POO). Se alguém quiser estudar comigo, entre em contato (e a mesma coisa se alguém tiver uma apostila legal e está afim de ajudar).

XUL

Durante as aulas, estou estudando XUL. É uma linguagem de interface gráfica, tipo um HTML, mas que tem umas coisas bem interessantes. O único problema é que só roda em Mozilla… E também estou aumentando bastante meu conhecimento de JavaScript utilizando XUL e iniciando uma fase nova de tableless com DOM. :)

Meetweb, tableless

Semana passada eu peguei dois serviços da Meetweb. São serviços de converter um site para tableless e programá-lo em PHP usando banco de dados MySql (ou seja, minha especialidade). Por isso também, estou entrando nessa nova fase de tableless que citei no parágrafo acima.

Desvendando os segredos do C

É incrível que quando eu estudei C no início eu passei por alguns conceitos que na época eu achava complicados. Além dos operadores binários que o Paulo Matias me ensinou semana passada, ontem é que eu finalmente aprendi as funções de alocação dinâmica do C… E é tão simples! :D

Olimpíada Regional de Matemática

Ontem fiz a prova da segunda fase (final) da Olimpíada Regional (catarinense) de Matemática. Dos cinco problemas, resolvi quatro e acho que acertei três e meio. Um deles eu pensei certo, mas dei a resposta errada… Mas já que a prova era discursiva, acredito que eles dêem no mínimo metade dos 20 pontos do problema. Não sei se dá pra ganhar medalha, porque a prova tava bem fácil então mais gente deve ter ido bem.

Problemas Lógicos

Estou meio parado quanto a solução de problemas lógicos, mas estou estudando bastante para resolvê-los de forma melhor. Por enquanto, nenhum código novo. Tenho uma lista de problemas da UVa para resolver e ainda falta o último problema do capítulo 1 do USACO Training Gateway (Checkers Challenge).

Escola, história, filosofia

Para não citar os fatos inúteis da escola (que são maioria), resolvi elogiar as aulas de história deste terceiro bimestre escrevendo neste artigo principalmente sobre filosofia. (e dessa vez não é só a do software livre!)

Pitágoras

Nesse ano, voltamos a ter aulas de história de verdade, com uma professora de verdade e conteúdo de verdade. Quem conheceu o antigo professor Roberto, sabe do que eu estou falando… ;) Bom… Desde o começo do ano, estou gostando bastante de história. É uma matéria bem interessante que sempre nos faz pensar bastante e usar a lógica (aliás, a lógica lembra a razão, a Aristóteles e aos filósofos gregos). Não tá dando pra usar muito a lógica nas aulas de matemática, pois o professor se limita a ensinar PA, PG, funções de segundo grau e essas babaquices apenas usando fórmulas prontas. Sei que não é sua culpa, existe gente com sérias dificuldades de entendimento, mas acho que a escola muitas vezes é um repetir de fórmulas e exercícios que não ajudam a desenvolver o raciocínio. Então eu acho incrível que neste sentido, as aulas de história estão sendo as melhores deste ano.

Nesse bimestre, a professora Fabiana nos passou um trabalho sobre os filósofos gregos. O meu grupo falou sobre o filósofo Pitágoras, aquele que via números em tudo (e, sim, aquele mesmo que criou o Teorema) e aí comecei a ver uma relação (um pouco estranha) entre a matemática, a lógica, a razão, a filosofia e a história. E já que filosofia é amar a sabedoria, fica mais fácil entender toda essa relação, porque sabedoria é matemática… :D

O Mundo de Sofia

Bom… Agora estou relendo “O Mundo de Sofia”, desta vez lendo e relendo com atenção até as cartas de dezenas de páginas às vezes um pouco complicadas sobre a história de vários filósofos. E fica aí a sugestão desse excelente livro (é interessante as histórias que o autor conta, que deixam coisas complicadas bem mais simples, como entender a filosofia de Demócrito como o brinquedo Lego).

Ahnnn… E acho que esse post foi só pra falar disso mesmo, só para não concluir nada, mas só dizer como vai a escola e que ainda tem alguma coisa para se aprender lá, uma coisa pra fazer pensar lá. :) E, aliás, ainda não tô concluindo nada, só tô vendo as idéias dos filósofos “famosos” e refletindo sobre elas…

Agora em História, continuamos estudando a Grécia, e agora partindo para os etruscos para chegar em Roma, mas fica registrada aqui a minha felicidade por estar tendo a oportunidade de pensar (usando o raciocínio lógico) mesmo nesta disciplina.


Agora mudando radicalmente de assunto para dizer as últimas novidades, além da filosofia…

O beta do Firefox 1.5 saiu, já estou utilizando-o como padrão… Achei ele igual o meu outro Deerpark Alpha (a.k.a. Firefox 1.6a1) Já que no outro post já comentei sobre suas vantagens, pararei por aqui.

Olimpíada Regional de Matemática

A segunda fase da Olimpíada Regional de Matemática (catarinense) acontecerá no dia 24 deste mês e ainda não aprendi nada de novo sem ser filosofia, desde meu péssimo resultado na segunda fase da OBM.

A política no Brasil tá triste, não vejo escolhas sem mudar o sistema político, acabar com o capitalismo e com essa história de querer lucrar em tudo. Mas já que eu também sou um capitalista e nunca estudei direito sobre isso, e já tenho problemas menores suficientes para me incomodar, fica registrada aqui a tristeza mas o conformismo com essa situação. Na realidade, não sei quem não sabia ainda que os políticos brasileiros eram corruptos, mas agora é uma crise mais séria, tá tudo estourando… Não sei o que podemos fazer pra ajudar!

Fiz grandes alterações no meu site… Mudei a organização de todos os links, as regras do módulo ReWrite, adicionei feed do Flickr e criei um sitemap em XML do Google, mudei os permalinks dos artigos, as cores dos comentários, adicionei referências (permalinks) aos comentários… Um monte de coisa! :blink: E ainda tô querendo mexer em outras coisas… ;)

Tô testando uns sistemas de wiki para meu projeto de software livre para leigos, não tô conseguindo achar nada muito legal em PHP. Aquele “PHPWiki” não funciona direito, tive que modificar um monte de coisas e ainda assim apresentou problemas e tô quase decidindo fazer um eu mesmo.

Depois de um muito tempo, joguei RPG novamente este sábado… É meio esquisito interpretar um personagem na Idade Média, já é tão esquisito interpretar nós mesmos! :blink:

O site do Colégio tá quase pronto, estou precisando da biblioteca GD para trabalhar com redimensionamento de imagens e outras coisas com imagens no PHP e o cara que cuida do servidor FreeBSD ficou de instalar para mim, mas ainda não o fez… (gostaria tanto que fosse um Linux que eu mesmo tivesse configurado!)

Richard Stallman

Estou tentando fazer um Linux simples e acessível para minha família usar no computador que compartilha internet com o meu laptop, mas ainda não consegui nem instalar Linux (eu vivo instalando e desinstalando Linux aqui do lado… Esses caras não entendem como Linux é bom, a filosofia é linda e devemos parar de usar MSN e programas da Microsoft!). A mesma coisa eu quero fazer no Colégio depois que acabar de fazer o site. O Laboratório de Informática deveria ser só Linux. O KDE tem programas educativos tão legais, fora outros que podemos achar na internet… E tem programas para Ensino Médio que o nosso Lab. nem tem nem semelhantes. O problema é que ele tem uma grande quantidade de programas para a pré-escola e acho difícil encontrar bons clones para Linux. Eu acho que instalar Linux na escola é uma coisa indispensável e não pretendo sair de lá antes que esta missão esteja cumprida. Quero fazer ainda um esquema bem legal com um servidor e clientes usando NFS/NIS e com os clientes loggando no servidor e facilitando a vida da profa. de informática.

Fiz uma alteração nas Funções ZZ adicionando uma senha ao zzss (proteção de tela para console). O patch está disponível aqui no meu servidor: patch.zz (esse patch foi perdido pelo tempo) e para patchar basta usar patch -p1 apontando para ele o arquivo do patch (patch.zz) e colocar no File to patch a localização do seu arquivo funcoeszz (tem que ser a última versão).

Para finalizar, não tenho produzido muitos códigos / solucionado problemas lógicos, mas tenho pensado bastante logicamente e até ando vendo alguns grafos no pensamento e criando quase inconscientemente uns algoritmos… Embora não esteja implementando ou escrevendo os algoritmos, acho que estou desenvolvendo-os… Hehehe… (parece que eu sou louco, né?)

Coloquei várias imagens aí em cima pro post não ficar muito sem graça, já que ficou um pouco grande… A maioria delas não é tão importante, mas são boas pra saber em que pedaço do texto estamos… :)

© 2005–2020 Tiago Madeira