<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-3006142001944566780</atom:id><lastBuildDate>Fri, 20 Nov 2009 19:25:16 +0000</lastBuildDate><title>Tumulto</title><description>...do cansaço dessa vida, e do peso de ter que ser alguém...</description><link>http://blog.pedro.lamarao.nom.br/</link><managingEditor>noreply@blogger.com (P.)</managingEditor><generator>Blogger</generator><openSearch:totalResults>330</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-6226694480484161093</guid><pubDate>Tue, 17 Nov 2009 00:45:00 +0000</pubDate><atom:updated>2009-11-16T22:50:31.597-02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>filosofia</category><title>A Habilidade da Lentidão</title><description>Na outra semana estivemos no &lt;i&gt;mo kwoon&lt;/i&gt; com um colega novo, aprendendo os primeiros mistérios do &lt;i&gt;kung fu&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Este novo colega, julguei, se enquadrou facilmente no grupo dos afobados; sempre seu discurso o convidava a dar "exemplos" do golpeamentos, e cada um deles mais e mais próximo do corpo da pessoa com quem estava conversando. Assim é a ansiedade de quem conhece a arte marcial através de romances e obras audio-visuais.&lt;br /&gt;&lt;br /&gt;Em um determinado momento, discutindo os princípios do &lt;i&gt;ving tsun&lt;/i&gt;, este novo colega levantou uma questão sobre a eficácia de um posicionamento defensivo: por mais que o outro esteja posicionado adequadamente, eu posso desarmá-lo sendo bem rápido, não posso?&lt;br /&gt;&lt;br /&gt;A objeção padrão a esse tipo de hipótese é simples: e se o outro for tão rápido quanto você? Há diversos caminhos interessantes de discussão que iniciam com essa resposta.&lt;br /&gt;&lt;br /&gt;Nesse dia, porém, me sentido inspirado para falar sobre a minha experiência pessoal. Isso acontece às vezes durante a aula e eu me dou a liberdade de falar porque, sendo um igual, me parece inspirador para os mais novos ouvir sobre as minhas dificuldades e realizações.&lt;br /&gt;&lt;br /&gt;Elaborando o meu relato, eis o que eu tenho a dizer sobre o assunto.&lt;br /&gt;&lt;br /&gt;É claro o poder de agir em alta velocidade é útil e desejável. Mas a percepção de que este poder é o grande poder, ou mesmo o verdadeiro poder, é enganosa. Em particular, os modos de viver e produzir em nossa sociedade constróem um excesso de valor sobre este poder em particular; além do grande apelo dramático de certos filmes.&lt;br /&gt;&lt;br /&gt;Quando eu comecei a treinar artes marciais logo se tornou evidente uma quantidade enorme de tensão no meu corpo. Esta tensão habitava, porém, um corpo vazio do impulso de agir -- o período de treinamento mais particularmente focalizado em "golpear" parecia quase totalmente inútil.&lt;br /&gt;&lt;br /&gt;Mas, como inevitável, em um determinado momento a tensão encontrou seu caminho e se tornou então evidente a ansiedade por agir que estava contendo. É ainda verdade que passo boa parte do meu tempo resolvendo uma ansiedade por agir. Essa ansiedade não resolvida se resolve em impulsos de ação -- de súbito, uma vontade de ler, de súbito, uma vontade de falar, de súbito, uma vontade de produzir, de súbito, uma vontade de não fazer nada.&lt;br /&gt;&lt;br /&gt;Se você está convencido de que esse modo de ser é razoável, então o poder de agir e completar ações em alta velocidade parecerá o ideal da vida. Afinal, se um determinado surto de ação dura pouco, é preciso fazer muito com esse pouco. Assim, quem vive de ansiedades em ansiedades realiza pouco, porque não se pode fazer muito em pouco tempo.&lt;br /&gt;&lt;br /&gt;Estrategicamente, podemos enxergar nessa pessoa a empresa que se vê presa na teia do &lt;i&gt;time to market&lt;/i&gt;. Essa empresa está sempre se "reajustando" ao "mercado", mudando de rumo de acordo com suas "tendências", se "alinhando" com cliente. A cada momento suas prioridares são reavaliadas e alguma outra coisa se torna prioridade máxima.&lt;br /&gt;&lt;br /&gt;Esta empresa nunca realizará as atividades com prioridade não-máxima, nunca realizará os projetos de médio a longo prazo. Ela está cheia da ansiedade por obter os resultados cuja possibilidade só passou a enxergar hoje. Está sempre correndo atrás de algum prejuízo.&lt;br /&gt;&lt;br /&gt;Ela não compreende que a possibilidade que se realiza hoje está amadurecendo desde a tempo passado. Se ela vê hoje as condições de formação da possibilidade futura, poderá agir para obter os resultados do futuro. O indivíduo que se interessa por uma atividade hoje, se trabalhar com paciência, poderá realizar as grandes coisas que exigem muitos dias de atenção.&lt;br /&gt;&lt;br /&gt;Assim, enquanto é sempre possível resolver as crises e se adequar às mutações através da habilidade da rapidez, é também sempre possível resolver as crises e se adequar às mutações através da habilidade da lentidão. Atuar com lentidão exige -- permite! -- atuar com antecipação. Para atuar com antecipação, é preciso ser lento; para atuar com antecipação, é preciso acompanhar com cuidado as correntes das mutações; não se precipitar.&lt;br /&gt;&lt;br /&gt;Não é fácil atuar com lentidão, o que pode não parecer intuitivo. Quando o indivíduo experimenta exercícios simples, como andar a um passo com metade da velocidade do seu passo normal, ele compreende rapidamente que a ansiedade é uma propriedade fundamental do seu corpo -- não obstante a quantidade que ocorre em um e em outro.&lt;br /&gt;&lt;br /&gt;Mesmo a alta velocidade corporal exige o lento acomodamento da mente à situação; quando a mente é um turbilhão, não é possível agir em alta velocidade sob controle; citando um belo &lt;i&gt;anime&lt;/i&gt;, quando um guerreiro usa suas armas fora de controle, ele pode cortar algo que não deseja cortar, ou mesmo cortar aquilo que ele deve defender.&lt;br /&gt;&lt;br /&gt;Se tornou, então, foco do meu treinamento em artes marciais a habilidade de agir lentamente, com eficiência. Pelas razões expostas acima, agir lentamente com eficiência não é uma contradição. É um objetivo necessário a quem acumula tensão e ansiedade; provavelmente seria diferente para disposições pessoais diferentes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-6226694480484161093?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/11/habilidade-da-lentidao.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-5162515058807634604</guid><pubDate>Fri, 13 Nov 2009 13:55:00 +0000</pubDate><atom:updated>2009-11-16T22:17:32.951-02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>As sombras do Ambiente de Programação C++</title><description>Estou realmente escrevendo sobre este assunto! É claro que, até reunir material suficiente para um livro maneiro, vai demorar muito tempo. Até lá espero encontrar alguma publicação legal que aceite artigos.&lt;br /&gt;&lt;br /&gt;Minha motivação inicial para entender os mistérios do ambiente de programação C++ foi estudar a ABI do C++, que seria necessário implementar no sistema operacional C++.&lt;br /&gt;&lt;br /&gt;Existem outros aspectos interessantes desse ambiente, porém, que são pouco focalizados pelas obras educativas sobre a linguagem.&lt;br /&gt;&lt;br /&gt;Um deles é o relacionamento entre o mundo restrito da norma ISO C e o mundo maior do sistema. C fala a você sobre unidades de tradução e estabelece regras mínimas sobre como múltiplas unidades de tradução podem compor um programa válido. Ao redor da linguagem, porém, existe o problema de processar cada uma dessas unidades e produzir de fato um negócio único equivalente a este programa. Existirão então diversos blocos intermediários, os "objetos compilados", e existirá um componente ligador. A norma C não descreve este ligador, apenas impõe seus requisitos.&lt;br /&gt;&lt;br /&gt;Outro é o modo como os mecanismo de linguagem e do sistema são usados na prática como mecanismos de abstração, e como os projetos de engenharia fazem uso desses mecanismos para lidar com problemas reais de configuração. O ambiente como um todo provê diversas maneiras de abstrair certos trechos de código; desde a seleção de arquivos a compilar, onde um arquivo pode conter a listagem para o sistema A enquanto outro contém a listagem para o sistema B; até a composição de bibliotecas dinâmicas no momento da carga na memória, onde o programa usa a versão A da biblioteca no sistema A, e a versão B da biblioteca no sistema B.&lt;br /&gt;&lt;br /&gt;Para lidar com toda essa parafernália sistêmica ao redor do C são imprescindíveis ferramentas que operam fora da linguagem, dirigindo todas as ferramentas de forma conveniente. O projeto de middleware de televisão digital da TQTVD tem, por exemplo, aproximadamente mil unidades de tradução individuais a processar. Certamente o programador não deve chamar as ferramentas uma vez para cada um desses arquivos, sob pena de tornar o dia de trabalho um desperdício de horas absurdo. Existem portanto ferramentas para apoiar essa tarefa que, apesar de não fazer parte da definição da linguagem ou do compilador, são absolutamente imprescindíveis para se trabalhar com ela.&lt;br /&gt;&lt;br /&gt;Tudo isso implica que a expertise no desenvolvimento de sistemas em C++ envolve diversas outras habilidades e técnicas individuais, fora aquelas envolvendo a expressão de programas em C++. Essas outras habilidades e técnicas se tornam tão mais importantes quanto o projeto pressione o programador para fora da abstração de um sistema para o mundo concreto das diversas máquinas.&lt;br /&gt;&lt;br /&gt;Sob outro ângulo, posso comparar as listas de componentes teórica e prática que compõe o pipeline de transformação de código-fonte. Teoricamente, o pipeline C é: pré-processador, compilador, ligador ou arquivador. Na prática do projeto onde estou envolvido é: configurador de build, ferramenta de build, compilador.&lt;br /&gt;&lt;br /&gt;Uma lição que estou tirando de tudo isso é que os melhores pensamentos sobre a linguagem de programação ideal nunca resultariam em um excelente sistema construído se essa linguagem não for implementada em ferramentas adequadas, que suportem um ciclo de desenvolvimento extremamente conveniente. O esquema de compilação separada do C oferece bons mecanismos de abstração, sem dúvida, mas torna o tempo de compilação uma infinitude de "começa e termina" processos.&lt;br /&gt;&lt;br /&gt;Em contra-partida, opiniões sobre características de linguagem de programação do tipo "viagem na maionese" ou "impossível" parecem refletir o fato de que, até então, ninguém soube produzir uma ferramenta que a implementasse. O mecanismo de "export" do C++ por exemplo foi considerado um fracasso; agora que as técnicas de LTO e serialização de ASTs de programas estão se tornando mais difundidas, talvez com mais cinco ou dez anos "export" seja trivial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-5162515058807634604?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/11/as-sombras-do-ambiente-de-programacao-c.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-4479319851296401915</guid><pubDate>Thu, 12 Nov 2009 18:15:00 +0000</pubDate><atom:updated>2009-11-12T16:15:50.576-02:00</atom:updated><title>MIT OpenCourseWare</title><description>Estou cursando &lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/CourseHome/index.htm"&gt;Introdução à Ciência da Computação&lt;/a&gt; no MIT todos os dias de manhã, indo para o trabalho!&lt;br /&gt;&lt;br /&gt;Para quem não sabe, em 2002 o MIT lançou o &lt;a href="http://ocw.mit.edu/"&gt;projeto OpenCourseWare&lt;/a&gt; para publicar material didático dos seus cursos online sob uma licença do &lt;a href="http://www.creativecommons.org/"&gt;Creative Commons&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Alguns cursos do MIT agora têm vídeos das palestras disponíveis como parte do OCW. Dá pra assistir perfeitamente no meu telefone de manhã.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-4479319851296401915?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/11/mit-opencourseware.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-4055248292609290474</guid><pubDate>Mon, 09 Nov 2009 12:03:00 +0000</pubDate><atom:updated>2009-11-09T10:03:04.821-02:00</atom:updated><title>Baixar MP3 e bandalhas no trânsito</title><description>Hoje de manhã presenciei uma peripécia no trânsito que finalmente me iluminou sobre a razão porque eu parei de baixar mp3 na Internet.&lt;br /&gt;&lt;br /&gt;Estávamos seguindo pelo aterro até a Presidente Antônio Carlos e havia um trânsito razoável. Parados do lado daquele monumento de guerra, antes do MAM, vimos um e outro carro passando pela pista interna que tem ali na frente do monumento -- uma pista para um carro que começava um pouco antes e terminava a uns cem metros de onde estávamos.&lt;br /&gt;&lt;br /&gt;Discutimos um pouco a validade daquela peripécia, porque o sujeito não ia ganhar muito tempo com aquilo, e eu pensei que não valia a pena ganhar tão pouco tempo com um truque daqueles.&lt;br /&gt;&lt;br /&gt;Depois, pensei por que não valia a pena; afinal, ganharia-se um tempo zero, certo? Desconsiderando o problema do &lt;a href="http://classemediawayoflife.blogspot.com/2009/09/dica-030-praticar-o-cada-um-por-si-no.html"&gt;primeiro eu da classe média&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Me ocorreu então que tipo de pressa levaria uma pessoa a se desviar da rota normal para tentar economizar tempo. Pensei: espero que esse sujeito esteja economizando um tempo útil, porque de outro modo ele está se aborrecendo à toa. Então me ocorreu um processo de ansiedade que levaria um motorista a procurar rotas "espertas" para chegar mais cedo onde quer que seja.&lt;br /&gt;&lt;br /&gt;Então eu entendi porque eu mesmo nunca faria aquilo: porque um processo de ansiedade tem em geral dois futuros, a satisfação ou a supressão; e satisfazer a uma ansiedade é o mesmo que alimentá-la.&lt;br /&gt;&lt;br /&gt;Esta é a razão porque eu não uso mais programas de baixar mp3, nem tenho um instalado no meu sistema. Quando você tem gosto por música e descobre os navegadores de mp3 surge uma ansiedade -- a ansiedade de ter tudo. O mundo se transforma de um local onde você não pode ouvir tudo que existe, porque precisa transformar recursos em CDs, para um mundo onde você pode ter tudo, em troca de algum tempo de pesquisa e espera. Os baixadores de mp3 são pessoas que se vangloriam por pegar álbuns inteiros, como se baixar músicas individuais fosse indigno e revelasse a condição de ouve-por-modinha ao invés de um apreciador verdadeiro. Os programas passam 24h por dia ligados obtendo as coletâneas mais obscuras encontráveis, entupindo o HD, e o indivíduo faz ALT+TAB frequentemente para observar as barras de progressão de &lt;i&gt;download&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Quando eu percebi essa ansiedade, cortei o hábito.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-4055248292609290474?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/11/baixar-mp3-e-bandalhas-no-transito.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-8150608308716521903</guid><pubDate>Tue, 03 Nov 2009 21:55:00 +0000</pubDate><atom:updated>2009-11-03T19:55:44.016-02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Java vs. C#, uma perspectiva estranha</title><description>Você pode achar o que quiser na disputa entre Java e C#, mas onde na documentação da Microsoft você vai encontrar uma afirmação tão direta, sincera e esclarecedora?&lt;br /&gt;&lt;br /&gt;"Prior to Java 2 Standard Edition, JDK 1.4, the AWT focus subsystem was inadequate."&lt;br /&gt;&lt;br /&gt;http://java.sun.com/javase/6/docs/api/java/awt/doc-files/FocusSpec.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-8150608308716521903?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/11/java-vs-c-uma-perspectiva-estranha.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-4943739368251659661</guid><pubDate>Thu, 29 Oct 2009 17:13:00 +0000</pubDate><atom:updated>2009-10-29T15:13:27.544-02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>bug bizarro no RVCT 2.2</title><description>Descobrimos um bug bizarro no RVCT 2.2 onde a compilação de uma chamada a um operador de conversão do std::auto_ptr gera as seguintes instruções:&lt;br /&gt;&lt;br /&gt;1. push into stack from register&lt;br /&gt;2. unconditionally jump to (1)&lt;br /&gt;&lt;br /&gt;Alguém já viu isso?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-4943739368251659661?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/10/bug-bizarro-no-rvct-22.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-8128039411510990390</guid><pubDate>Tue, 20 Oct 2009 01:02:00 +0000</pubDate><atom:updated>2009-10-19T23:02:00.076-02:00</atom:updated><title>Dell, meu CD arranhou, e agora?</title><description>Está chegando o segundo teste do atendimento ao cliente da Dell. Não posso mais dizer suporte ao cliente porque o meu contrato de suporte expirou, certo?&lt;br /&gt;&lt;br /&gt;Pois bem, o CD do Windows XP que acompanhava a minha primeira máquina Dell arranhou. E adivinha? O Windows XP naquela máquina não inicia mais.&lt;br /&gt;&lt;br /&gt;O que eu quero é bem simples: uma cópia nova deste CD. Posso até mesmo fazer o download, se eles quiserem economizar a mídia e a entrega. Mas será que a Dell vai se prontificar a substituir esse CD?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-8128039411510990390?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/10/dell-meu-cd-arranhou-e-agora.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-7830993040166629851</guid><pubDate>Sat, 17 Oct 2009 19:36:00 +0000</pubDate><atom:updated>2009-10-17T16:38:10.934-03:00</atom:updated><title>Site pessoal</title><description>Estou a fim de um site pessoal mais glamouroso. Acabei de abrir um ticket no &lt;a href="http://registro.br/"&gt;registro.br&lt;/a&gt; pelo domínio pedro.lamarao.nom.br.&lt;br /&gt;&lt;br /&gt;Vou reunir ali &lt;a href="http://sites.google.com/site/pedrolamarao/"&gt;meu site&lt;/a&gt; de Google Sites, e este blog, que já mostra ali no canto o &lt;a href="http://twitter.com/pedrolamarao"&gt;meu feed&lt;/a&gt; do Twitter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-7830993040166629851?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/10/site-pessoal.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-1679840962436983875</guid><pubDate>Thu, 24 Sep 2009 14:29:00 +0000</pubDate><atom:updated>2009-09-24T11:31:01.648-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>SIVUCA</category><title>Sobre o assim chamado golpe de Honduras</title><description>Um direitista safado, e grande amigo, me apontou para este artigo que argumenta sobre a falsidade de se considerar golpe de estado o que está acontecendo agora em Honduras.&lt;br /&gt;&lt;br /&gt;O resumo executivo é: a Constituição de Honduras determina a deposição imediata do Presidente caso ele faça esforços para promover a própria reeleição.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.conjur.com.br/2009-set-22/apoio-zelaya-despreza-processo-constitucional-hondurenho-deposicao"&gt;Leia&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-1679840962436983875?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/09/sobre-o-assim-chamado-golpe-de-honduras.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-7120115301703993572</guid><pubDate>Fri, 18 Sep 2009 20:27:00 +0000</pubDate><atom:updated>2009-09-18T17:29:56.489-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>C++ e puramente funcional</title><description>Usando GCC 4.5, Dehydra e um script maroto, seria possível implementar uma verificação estática de que uma função é puramente funcional?&lt;br /&gt;&lt;br /&gt;__attribute__((user("functionally_pure")) int foo_free_of_side_effects (int x, int y);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-7120115301703993572?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/09/c-e-puramente-funcional.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-991456882861235300</guid><pubDate>Thu, 03 Sep 2009 01:44:00 +0000</pubDate><atom:updated>2009-09-02T23:35:57.211-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>byte, address e dispositivos</title><description>Suponha que você tem uma variante de C++0x onde existem apenas os tipos: byte, address e size. byte é uma sequência de oito bits, address é uma posição na memória e size é a distância entre duas posições na memória.&lt;br /&gt;&lt;br /&gt;Com bytes você pode fazer bit shifting e outras operações próprias de sequências de bits; com address você pode navegar pela memória, obtendo sucessores e predecessores; com size você pode navegar pela memória a passos largos.&lt;br /&gt;&lt;br /&gt;Suponha, além disso, que o programa tem à disposição um allocator que obtém pedaços de memória com tamanho fixo, e acesso a dispositivos por uma API razoável.&lt;br /&gt;&lt;br /&gt;Que tipos de programa você poderia escrever?&lt;br /&gt;&lt;br /&gt;Você poderia copiar dados de um dispositivo para outro:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void copy (device&amp; in, device&amp; out)&lt;br /&gt;{&lt;br /&gt;  const size length = allocator.page_size();&lt;br /&gt;  address buffer = allocator.allocate_page();&lt;br /&gt;&lt;br /&gt;  size n;&lt;br /&gt;  while ((n = in.read(buffer, length)) &gt; 0) out.write(buffer, n);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Você poderia copiar dados, criptografando com XOR:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void copy_and_encrypt (device&amp; in, device&amp; out, byte key)&lt;br /&gt;{&lt;br /&gt;  const size length = allocator.page_size();&lt;br /&gt;  address buffer = allocator.allocate_page();&lt;br /&gt;&lt;br /&gt;  size n;&lt;br /&gt;  while ((n = in.read(buffer, length)) &gt; 0)&lt;br /&gt;  {&lt;br /&gt;    for (address i = buffer; i != buffer + length; ++i) *i ^= key;&lt;br /&gt;    out.write(buffer, n);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Acredito que você poderia realizar praticamente todo tipo de criptografia apenas com operações binárias.&lt;br /&gt;&lt;br /&gt;De onde um programa obteria a chave? De outro dispositivo de entrada, talvez.&lt;br /&gt;&lt;br /&gt;Meu ponto é que nada disso está relacionado com aritmética em domínios numéricos; mesmo com a existência de size no programa, que é claramente uma "quantidade". Ainda é possível escrever programas interessantes mesmo sem a possibilidade de realizar aritmética com valores do tipo size.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-991456882861235300?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/09/byte-address-e-dispositivos.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-7279776522065663243</guid><pubDate>Tue, 01 Sep 2009 00:21:00 +0000</pubDate><atom:updated>2009-08-31T21:44:25.763-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Dualidade memória/dispositivo</title><description>Ainda pensando sobre linguagem de programação e sistema, e na possibilidade de se projetar uma API de dispositivos apenas com &lt;span style="font-family:courier new;"&gt;byte&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;address&lt;&gt;&lt;/span&gt;, me ocorreram os seguintes pensamentos sobre a relação entre os dispositivos e a memória.&lt;br /&gt;&lt;br /&gt;A memória é uma sequência onde ocorrem símbolos, na máquina binária contemporânea esses símbolos são bits e a unidade de armazenagem prática aos programas é o &lt;span style="font-family:courier new;"&gt;byte&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Além disso, na máquina de von Neumann, toda a operação do programa ocorre sobre a memória, inclusive operação sobre dispositivos, que ocorrem ao programa na forma de intervalos especialmente posicionados na memória.&lt;br /&gt;&lt;br /&gt;Programas no sistema Unix, por outro lado, vêem dispositivos na forma de arquivos, com o qual trocam dados; o dispositivo é uma origem de dados e um destino de dados. A API fundamental de dispositivos é &lt;span style="font-family:courier new;"&gt;read&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;write&lt;/span&gt;. A realização básica de um arquivo é o próprio arquivo de dados, ocorrendo em um sistema de arquivamento.&lt;br /&gt;&lt;br /&gt;É claro que o Unix, aplicando sua filosofia de simplicidade, exibe tudo como arquivo, inclusive todos os dispositivos; programas podem trocar dados com qualquer dispositivo representável em &lt;span style="font-family:courier new;"&gt;/dev&lt;/span&gt;. De fato, existe &lt;span style="font-family:courier new;"&gt;/dev/mem&lt;/span&gt; que reflete como um dispositivo a própria memória.&lt;br /&gt;&lt;br /&gt;Por fim, borrando a distinção entre o que o processo de usuário vê e o que o sistema vê, existem os mecanismo de mapeamento em memória, que representam dispositivos (entre outras coisas) como intervalos de memória ao processo.&lt;br /&gt;&lt;br /&gt;É fácil observar que a memória, fisicamente, e o dispositivo, abstratamente, são elementos e conceitos que se substituem e se sobrepõe. A noção de &lt;span style="font-style: italic;"&gt;character device&lt;/span&gt; no Unix parece nascer exatamente daqueles dispositivos cuja natureza é a de um intervalo de átomos, um conceito cuja necessidade surge após a decisão de representar tudo como arquivos.&lt;br /&gt;&lt;br /&gt;A união de memória virtual e o aspecto memória de um dispositivo ocorre no mecanismo de mapeamento em memória; no projeto de uma API de I/O assíncrono, a necessidade de expor páginas da memória de um processo ao &lt;span style="font-style: italic;"&gt;driver&lt;/span&gt; do dispositivo para DMA também ocorre.&lt;br /&gt;&lt;br /&gt;Programas sintonizados à API de arquivos frequentemente desejam comunicar a subprogramas dados em memória, e então a necessidade de um pseudo-dispositivo cuja representação é memória surge.&lt;br /&gt;&lt;br /&gt;Tudo isso implica que o projeto de uma API de dispositivos é o projeto de uma API de memória, e todo projeto de um &lt;span style="font-style: italic;"&gt;abstract data type&lt;/span&gt; dispositivo implica o projeto de um &lt;span style="font-style: italic;"&gt;abstract data type&lt;/span&gt; intervalo-de-memória.&lt;br /&gt;&lt;br /&gt;Que um aspecto ofereça melhor desempenho a um programa é função das necessidades desse programa. Programas que lêem arquivos frequentemente mapeiam este arquivo na memória e o lêem como um intervalo de memória. Programas que computam na memória o &lt;span style="font-style: italic;"&gt;digest&lt;/span&gt; SHA-1 de uma informação frequentemente operam um pseudo-dispositivo onde escrevem blocos fixos de dados iterativamente.&lt;br /&gt;&lt;br /&gt;Fundamentalmente, eis a questão: um dispositivo deve ser convertível para um intervalo-de-memória e vice-versa. O desafio é projetar tal API segundo todos os critérios de boas práticas realisticamente em um sistema.&lt;br /&gt;&lt;br /&gt;Mudando de assunto, eis o projeto 9.1 do &lt;span style="font-style: italic;"&gt;Elements of Programming&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;"Modern computing systems include highly optimized library procedures for copying memory; for example, memmove and memcpy, which use optimization techniques not discussed in this book. Study the procedures provided on your platform, determine the techniques they use (for example, loop unrolling and software pipelining), and design abstract procedures expressing as many of these techniques as possible. What type requirements and preconditions are necessary for each technique? What language extensions would allow a compiler full flexibility to carry out these optimizations?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-7279776522065663243?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/dualidade-memoriadispositivo.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-4788212197291742917</guid><pubDate>Wed, 26 Aug 2009 00:30:00 +0000</pubDate><atom:updated>2009-08-25T23:00:31.916-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Máquina de Turing</title><description>Acho que atingi uma compreensão de como uma máquina de computação contemporânea cumpre os requisitos restritos da máquina universal de computação.&lt;br /&gt;&lt;br /&gt;A máquina universal de computação é uma máquina que opera sobre símbolos ocorrendo um espaço unidimensional infinito. A máquina transforma seu estado de acordo com o símbolo atual; ela pode, por exemplo, avançar ou retroceder no espaço de símbolos, reescrever o símbolo em uma determinada posição, ou qualquer outra coisa.&lt;br /&gt;&lt;br /&gt;A máquina se torna útil com a especificação do conjunto de símbolos representáveis e do significado de todos esses símbolos. Assim, um símbolo pode significar "avance três posições" e outro símbolo pode significa "substitua o próximo símbolo com o símbolo seguinte a esse, e vice-versa.&lt;br /&gt;&lt;br /&gt;É claro que nenhuma máquina concreta terá acesso a um espaço infinito para símbolos; portanto, podemos falar sobre uma máquina universal restrita com espaço finito para símbolos.&lt;br /&gt;&lt;br /&gt;Uma máquina universal binária é uma máquina cujos símbolos são 0 e 1. Uma tal máquina não pode significar muita coisa com apenas um símbolo, mas nada impede que significados especiais sejam atribuídos a sequências específicas de símbolos.&lt;br /&gt;&lt;br /&gt;Assim, podemos falar sobre símbolos complexos, compostos por uma sequência de símbolos, que na máquina binária será uma sequência de 0s e 1s. A máquina binária possui portanto uma regra implícita: enquanto um símbolo complexo não for compreendido, ela avança para o próximo símbolo.&lt;br /&gt;&lt;br /&gt;Quando um símbolo completo é compreendido, a máquina realiza a transformação especificada para aquele símbolo complexo.&lt;br /&gt;&lt;br /&gt;É claro que, em uma máquina concreta, o número de símbolos complexos especificáveis é finito, já que os próprios símbolos complexos devem ser sequências finitas de símbolos fundamentais, e portanto existe uma combinação finita de tais símbolos complexos.&lt;br /&gt;&lt;br /&gt;Mas um conjunto suficientemente grande pode representar todas as operações possíveis sobre uma memória sequencial de símbolos fundamentais, como: se o valor lógico do próximo símbolo complexo for verdade avance para a posição determinada pelo símbolo complexo seguinte a este, senão pelo símbolo complexo duas posições depois.&lt;br /&gt;&lt;br /&gt;Isso é verdade porque, se podemos computar matemática fundamental, podemos computar qualquer coisa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-4788212197291742917?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/maquina-de-turing.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-9125880897422327369</guid><pubDate>Fri, 21 Aug 2009 17:10:00 +0000</pubDate><atom:updated>2009-08-21T15:27:27.137-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Tipos de dados primitivos 2</title><description>Em C++, existe uma certa ambiguidade no significado dos tipos primitivos.&lt;br /&gt;&lt;br /&gt;Tome char, por exemplo. char pode ser apenas char, pode ser signed char ou pode ser unsigned char. Mas char deve ser caractere, certo? Qual é o significado de um caractere ser signed ou unsigned? Nenhuma.&lt;br /&gt;&lt;br /&gt;Existe, é claro, uma razão porque é possível especificar unsigned ou signed char; porque char é um valor inteiro de tamanho 1. De certa forma, char é o menor de todos os int, e foi projetado para ser usado como tal. Em uma máquina convencional, char é um inteiro de 8 bits. C99 na prática exige que char ocupe 8 bits.&lt;br /&gt;&lt;br /&gt;Em C original, o ponteiro para char possuía a propriedade adicional de representar qualquer endereço válido de memória. Portanto, uma função que lê dados de um dispositivo qualquer para a memória aceitaria um parâmetro do tipo ponteiro para char significando o endereço de memória de um buffer.&lt;br /&gt;&lt;br /&gt;É claro que isso provoca uma confusão com outro sigficado de ponteiro para char, a string de bytes terminada por NULL, ou NTBS. Por esse motivo, alguns programas e bibliotecas usam ponteiro para unsigned char para representar segmentos opacos de memória, como buffers de I/O.&lt;br /&gt;&lt;br /&gt;Em C99, qualquer ponteiro é conversível para um ponteiro para algum char. Em C++ isso não é permitido. Em ambas as linguagens, qualquer ponteiro é conversível para um ponteiro para void.&lt;br /&gt;&lt;br /&gt;Aritmética de ponteiro não é permitia para um ponteiro para void, infelizmente; programas que desejam atravessar a memória por qualquer razão devem usar ponteiros para char. Isso exige o uso de conversões por reinterpretação, como a notação de cast com parênteses, ou reinterpret_cast.&lt;br /&gt;&lt;br /&gt;Existem aqui diversas necessidades diferentes. Uma delas é endereçar memória opaca, sem interpretação, e endereçá-la completamente. Outra é representar o menor valor inteiro possível na plataforma. Outra é representar um caractere. Outra é representar um segmento de texto.&lt;br /&gt;&lt;br /&gt;Representar um caractere como o menor inteiro da plataforma é, hoje sabemos, uma ingenuidade, e existem diversas representações de caracteres que usam um número variado dessas unidades para caracteres, ou usam um número fixo de duas ou mais dessas unidades.&lt;br /&gt;&lt;br /&gt;Assim, quando ocorre em um programa um caractere literalmente, como &lt;span style="font-style: italic;"&gt;f&lt;/span&gt;, qual é a quantidade de armazenagem que o valor correspondente ocupa na memória? Depende da representação de caracteres usada no sistema alvo -- e naturalmente na unidade de memória da arquitetura alvo.&lt;br /&gt;&lt;br /&gt;Eu não gosto dessa notação de signed e unsigned. Parece ter havido um problema original em que os ints tiveram de ser subitamente diferenciados entre inteiros e inteiros positivos. Não entendo como isso pode ter sido súbito, mas ainda não conheço bem a história da computação para saber como eram as máquinas quando C foi projetada. Me parece apenas que é um sistema de tipos obsoleto. As máquinas conhecem os naturais, ou inteiros positivos, representados em base 2 e conhece os inteiros representados em base 2 com complemento de dois.&lt;br /&gt;&lt;br /&gt;Caracteres são um outro tipo de informação, distinto de números, apesar de logicamente relacionáveis -- a representação de um caractere é um índice em uma tabela.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-9125880897422327369?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/tipos-de-dados-primitivos-2.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-1888911903431537837</guid><pubDate>Tue, 18 Aug 2009 14:06:00 +0000</pubDate><atom:updated>2009-08-18T12:03:29.070-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Declarações, nomes e objetos</title><description>Uma linguagem como C++ é chamada declarativa porque o elemento central de sua sintaxe é a declaração.&lt;br /&gt;&lt;br /&gt;Uma declaração é uma construção sintática que associa um nome a um sujeito -- ou um identificador e um objeto. O caso simples é a declaração de uma variável.&lt;br /&gt;&lt;br /&gt;Creio que um objeto é um ente totalmente abstrato do discurso, ao contrário do que a literatura sugere. Certamente podemos falar sobre o objeto e descrever suas propriedades; mas na máquina concreta, o significado de um objeto transita entre seus três aspectos fundamentais: seu valor, sua armazenagem e sua localização.&lt;br /&gt;&lt;br /&gt;O tipo de um objeto, por princípio, corresponde ao domínio de seus valores. Assim, podemos considerar os dois tipos primitivos fundamentais que sugeri anteriormente, byte e address&lt;t&gt;. byte é um pseudo-tipo para "o que quer que seja, armazenável na memória". address&lt;t&gt; é o tipo do valor "localização na memória de um valor do tipo T". address&lt;byte&gt; é o tipo do valor "localização na memória do que quer que seja".&lt;br /&gt;&lt;br /&gt;Em C++, a função de "o que quer que seja" é cumprida por char; char é a unidade de memória na máquina abstrata C++. A função de "localização na memória do que quer que seja" é cumprida em parte por void*, para o qual podemos converter qualquer T*, e em parte por char*, que garantidamente pode endereçar qualquer localização válida na memória.&lt;br /&gt;&lt;br /&gt;Valores do tipo byte são apenas copiáveis; é possível, no mínimo, reproduzir o padrão de bits de uma armazenagem para a outra.&lt;br /&gt;Valores do tipo address&lt;t&gt; são copiáveis; além disso, o domínio de address&lt;t&gt; é equivalente ao domínio dos naturais, e suporta a mesma aritmética; por fim, existe a operação de-referência, que transforma um valor address&lt;t&gt; em um valor T.&lt;br /&gt;&lt;br /&gt;Com esses dois tipos podemos fazer muito pouco, mas podemos fazer algo; é possível escrever um programa capaz de copiar dados de um dispositivo para o outro apenas com byte e address&lt;t&gt;. Seria também possível escrever programas capazes de rearranjos e outras operações similares.&lt;br /&gt;&lt;br /&gt;Esses programas não poderiam ser muito sofisticados porque os únicos julgamentos possíveis seriam sobre localizações de objetos, e não seus valores. Seria possível, por exemplo, escrever um programa que inverte uma sequência de bytes, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-1888911903431537837?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/declaracoes-nomes-e-objetos.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-6260156903107536611</guid><pubDate>Mon, 17 Aug 2009 17:12:00 +0000</pubDate><atom:updated>2009-08-17T14:44:29.531-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Tipos de dados primitivos</title><description>Após uma longa considerção sobre o assunto, e bastante tempo livre durante as férias, cheguei a uma opinião sobre que conjunto de tipos de dados primitivos eu gostaria de ver em Pedro C++.&lt;br /&gt;&lt;br /&gt;A idéia de que há signed e unsigned como qualificadores distintos do tipo de dados não me parece muito coerente; um signed integer e um unsigned integer são valores em domínios completamente distintos. De fato, um unsigned integer é um natural, e foi essa intuição que me levou eventualmente a compilar a seguinte lista:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;byte&lt;/li&gt;&lt;li&gt;address&lt;/li&gt;&lt;li&gt;natural&lt;/li&gt;&lt;li&gt;integer&lt;/li&gt;&lt;li&gt;rational&lt;/li&gt;&lt;li&gt;real&lt;/li&gt;&lt;li&gt;complex&lt;/li&gt;&lt;/ul&gt;Com os tipos primitivos byte a address seria possível escrever um sistema capaz de transportar dados entre dispositivos. Um tal sistema, ou sub-sistema, não tem interesse na representação de um dado; isso percebe-se claramente nas APIs de I/O do Unix, cujo tipo de dado é void*. Este tipo, em Pedro C++, seria um address&lt;byte&gt;.&lt;br /&gt;&lt;br /&gt;Para a computação matemática pura temos a seleção completa de domínios algébricos. natural, integer e real são verdadeiramente primitivos, enquanto rational e complex são derivados destes. Em uma máquina convencional, natural é representado diretamente em base 2, integer é representado em base 2 por complemento de dois, e real é representado na forma dada em IEEE 754. Uma linguagem rica permitira que esses tipos sejam genéricos no tamanho; natural&lt;16&gt; é um natural ocupando dois bytes, integer&lt;64&gt; é um inteiro ocupando 8 bytes.&lt;br /&gt;&lt;br /&gt;Deve ser possível, com base em natural, implementar qualquer domínio homomórfico com os naturais, como por exemplo caracteres em um mapa de caracteres.&lt;br /&gt;&lt;br /&gt;É claro que nada disso é remotamente suficiente para uma linguagem na prática; é preciso ainda falar sobre muitas coisas muito simples, como a representação e o tipo de valores representados literalmente no programa etc.&lt;br /&gt;&lt;br /&gt;NOTA: não tenho certeza se "homomórfico" foi a palavra certa ali em cima.&lt;br /&gt;&lt;/byte&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-6260156903107536611?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/tipos-de-dados-primitivos.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-4101376501650419301</guid><pubDate>Tue, 11 Aug 2009 13:58:00 +0000</pubDate><atom:updated>2009-08-11T11:01:09.053-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title></title><description>Por que eu desejo escrever explicitamente sobre o ambiente de programação C++?&lt;br /&gt;Por que existem documentos com frases assim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;To compile your programs, link with the C++CSP2 library. On GCC this can be achieved by using the "-lcppcsp2" option on the command-line.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se eu tentar compilar o programa de exemplo deste documento seguindo essas instruções à risca ocorerrá o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/usr/bin/ld: cannot find -lcppcsp2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;collect2: ld returned 1 exit status&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por quê? Por que você não pode ingenuamente dizer quais bibliotecas você quer; o ambiente de ligação de programas com bibliotecas envolve a localização da biblioteca. Onde ela está?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-4101376501650419301?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/por-que-eu-desejo-escrever.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-2232101557362215681</guid><pubDate>Mon, 10 Aug 2009 18:48:00 +0000</pubDate><atom:updated>2009-08-10T15:53:15.118-03:00</atom:updated><title>Concordar Dói</title><description>Estou lendo agora artigos sobre certas construções em máquinas programáveis chamadas "corotinas". O artigo que eu estou terminando de ler nesse exato momento insinua, cheira, pinta, sugere e diz explicitamente que "corotinas" são muito melhores que "subrotinas" por infinitas razões.&lt;br /&gt;&lt;br /&gt;Compreender o que é "corotina" para esse autor me obriga a compreender como "corotina" é melhor que "subrotina"; talvez depois de compreender como isso é verdade para essa pessoa, eu saberia destilar meu próprio conhecimento.&lt;br /&gt;&lt;br /&gt;É intrigante como esse concordar é revoltante. A leitura do texto é difícil por essa razão; eu não quero concordar com julgamentos sobre o valor do que eu estou aprendendo agora.&lt;br /&gt;&lt;br /&gt;Porém, acho interessante como a idéia de concordar com uma idéia temporariamente, a título de argumentação, é tão difícil. A mente rejeita este estado de acordo, mesmo que breve, como se realizá-lo por um breve momento fosse já uma desestruturação da ordem estabelecida.&lt;br /&gt;&lt;br /&gt;E isso digo eu, que não estou particularmente interessado em defender "subrotinas". Como é seria a experiência de aprendizado de uma pessoa pessoalmente determinada a gostar de "subrotinas"? Será que esse aprendizado é possível?&lt;br /&gt;&lt;br /&gt;Creio que há aqui um defeito no texto, se estiver nele codificada uma intenção de educar; o texto me rejeita, tanto quanto eu o rejeito.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-2232101557362215681?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/concordar-doi.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-2140712304034009268</guid><pubDate>Sat, 08 Aug 2009 16:55:00 +0000</pubDate><atom:updated>2009-08-08T13:59:22.892-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Novo projeto: monografia sobre o ambiente de programação C++</title><description>Como algumas pessoas sabem, um dos meus objetivos de mais longo prazo é projetar um sistema operacional em C++ e aplicar nesse projeto os métodos da orientação ao objetos, da programação genérica e da programação funcional.&lt;br /&gt;&lt;br /&gt;Seria, é claro, ingênuo simplesmente acreditar que essa atividade é como programar uma variante do Unix convencional, meramente usando o compilador C++. A linguagem impõe requisitos muito mais interessantes sobre a ABI do sistema que C, uma linguagem simplória nesse sentido.&lt;br /&gt;&lt;br /&gt;Assim sendo, comecei a estudar a questão da ABI do sistema e como C++ lida com ela, bem como o suporte ao mecanismo central da programação genérica em C++, os templates.&lt;br /&gt;&lt;br /&gt;Tudo isso me sugeriu este novo projeto: escrever uma monografia sobre o ambiente completo de programação em C++, evidenciando detalhes ocultos ao programador, como a atuação do linker, do assembler, do compilador, do loader e mesmo de drivers de compilação como o make.&lt;br /&gt;&lt;br /&gt;Quem sabe esse não será meu primeiro livro publicado?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-2140712304034009268?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/novo-projeto-monografia-sobre-o.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-2335136931165805633</guid><pubDate>Thu, 06 Aug 2009 19:18:00 +0000</pubDate><atom:updated>2009-08-06T16:19:03.610-03:00</atom:updated><title>Comentário do dia</title><description>-- Você não sabe como é bom. É bom demais. Nego me paga pra ler um livro. Sabe como é?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-2335136931165805633?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/comentario-do-dia.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-8506715997943287898</guid><pubDate>Sat, 01 Aug 2009 03:47:00 +0000</pubDate><atom:updated>2009-08-01T00:47:48.224-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Sigyn: componentes genéricos para networking</title><description>Gostaria de anunciar o lançamento da biblioteca Sigyn.&lt;br /&gt;&lt;br /&gt;A Sigyn contém diversos componentes genéricos para o desenvolvimento&lt;br /&gt;de servidores de rede concorrentes. Ela também contém exemplos para&lt;br /&gt;protocolos básicos como chargen e discard.&lt;br /&gt;&lt;br /&gt;O código-fonte da biblioreca está disponível neste repositório&lt;br /&gt;Subversion:&lt;br /&gt;&lt;br /&gt;  http://ccppbrasil.googlecode.com/svn/users/pedro.lamarao/sigyn&lt;br /&gt;&lt;br /&gt;Documentação sobre a biblioteca está disponível aqui:&lt;br /&gt;&lt;br /&gt;  http://code.google.com/p/ccppbrasil/wiki/Sigyn&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-8506715997943287898?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/08/sigyn-componentes-genericos-para.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-8396200423735890975</guid><pubDate>Tue, 28 Jul 2009 16:01:00 +0000</pubDate><atom:updated>2009-07-28T13:52:05.132-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>software</category><title>Pesquisando Sistemas Operacionais</title><description>O iniciante em qualquer nova área de conhecimento sofre muito, na minha experiência, com as exigências transversais ao puro conhecimento que se impõe a ele.&lt;br /&gt;&lt;br /&gt;O programador iniciante, por exemplo, sofre com a ferramenta de compilação, com o ambiente de compilação, com as peculiaridades do linker e do loader no sistema que ele está usando.&lt;br /&gt;&lt;br /&gt;Da mesma forma, quem deseja iniciar uma pesquisa em sistemas operacionais deve lidar com problemas transversais aos algortimos de escalonamento e gerência de memória, como a singela atividade de bootar o kernel.&lt;br /&gt;&lt;br /&gt;Reencontrei hoje uma ferramenta que me auxiliou muito nas minhas primeiras tentativas: o GRUB. Essa ferramenta não só facilita o processo de boot, resolvendo os problemas iniciais, como oferece ao kernel um protocolo de início muito similar ao protocolo de início da própria linguagem de programação, com uma função main.&lt;br /&gt;&lt;br /&gt;O projeto GRUB vai além e oferece código-fonte em assembler e C para um kernel capaz de imprimir "Hello World!" de modo que qualquer programador minimamente determinado poderá iniciar seus estudos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-8396200423735890975?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/07/pesquisando-sistemas-operacionais.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-7232555790440326076</guid><pubDate>Fri, 03 Jul 2009 21:00:00 +0000</pubDate><atom:updated>2009-07-03T18:03:45.168-03:00</atom:updated><title>Viagem a São Paulo</title><description>Estarei em São Paulo segunda, terça e quarta-feira da semana que vem.&lt;br /&gt;Se alguém quiser aproveitar, estarei disposto a passear e pegar alguma balada. ;-)&lt;br /&gt;&lt;br /&gt;Ficarei hospedado no Estanplaza Berrini.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-7232555790440326076?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/07/viagem-sao-paulo_03.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-5814721058673503902</guid><pubDate>Fri, 03 Jul 2009 13:40:00 +0000</pubDate><atom:updated>2009-07-03T10:44:17.529-03:00</atom:updated><title>Passei de nível!</title><description>Agora sou um orgulhoso praticante do nível Luk Dim Boon Kwan no &lt;a href="http://www.tangsonvingtsun.com.br/"&gt;Instituto Tang Son Ving Tsun&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-5814721058673503902?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/07/passei-de-nivel.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-3006142001944566780.post-3637975345595697508</guid><pubDate>Thu, 14 May 2009 04:24:00 +0000</pubDate><atom:updated>2009-05-14T01:25:41.761-03:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>anime</category><title>Terra e</title><description>Acabei de terminar de ver Terra e. O nome significa algo como "em direção à Terra". Foi um anime... esplêndido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3006142001944566780-3637975345595697508?l=blog.pedro.lamarao.nom.br' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.pedro.lamarao.nom.br/2009/05/terra-e.html</link><author>noreply@blogger.com (P.)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>