<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4057075479181140736</id><updated>2026-02-15T10:32:34.691+00:00</updated><category term="Desenvolvimento"/><category term="Certificações"/><category term="Exames"/><category term="Segurança"/><category term="Performance"/><category term="Programação"/><category term="Arquitectura"/><category term="Novidades"/><category term=".Net Framework 2"/><category term="Qualidade"/><category term="IT"/><category term="Javascript"/><category term="Web"/><category term="Windows"/><category term="Application blocks"/><category term="E-learning"/><category term="Enterprise Library"/><category term="Modelo de dados"/><category term="Object Oriented"/><category term="Padrões"/><title type='text'>Microsoft na AGAP2</title><subtitle type='html'>A agap2 é uma organização global de consultoria em tecnologias de informação. Nesse sentido, a agap2 agrupa 4 Marcas que se diferenciam pelo cariz dos serviços prestados: a agap2 Solutions Delivery; a agap2 Information Techonologies; a agap2 Integration Services;  e a agap2 Training Center.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Pedro Milagres</name><uri>http://www.blogger.com/profile/08943617957117825322</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuTnEfaK1wlel_HlG5vuHImvUHDmASn14Kz9GAADoYDTEVxb7GLeLb3C_nx9Ez7bUU8XchLNnDSJTlfw_FZDkQ1K5bNFBMOXcby-kUEUXl8HlVqKFGuAT4Y9Gj0SkFTw/s220/fotocv.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-3037235054852990270</id><published>2010-12-16T00:15:00.001+00:00</published><updated>2010-12-16T00:15:10.246+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented"/><category scheme="http://www.blogger.com/atom/ns#" term="Padrões"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>Safe Factory pattern - private instance state in JavaScript</title><content type='html'>&lt;p&gt;Apenas quero partilhar convosco um artigo que publiquei no CodeProject acerca de um padrão que descobri que possibilita ter estado privado em instâncias de objectos JavaScript:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.codeproject.com/KB/ajax/SafeFactoryPattern.aspx&quot;&gt;http://www.codeproject.com/KB/ajax/SafeFactoryPattern.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A quem interessar!&lt;/p&gt;  &lt;p&gt;Duarte Cunha Leão&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/3037235054852990270/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/3037235054852990270' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3037235054852990270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3037235054852990270'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2010/12/safe-factory-pattern-private-instance.html' title='Safe Factory pattern - private instance state in JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-6655688575486487492</id><published>2010-04-14T13:12:00.010+01:00</published><updated>2010-04-14T13:52:31.531+01:00</updated><title type='text'>SQL Injection - É ou não possível?</title><content type='html'>Sinceramente!? O que motivou-me a partilhar a questão sobre &lt;strong&gt;SQL Injection&lt;/strong&gt; com os colegas, foi o comentário disponibilizado no post do Luís. Nele, há uma ideia clara de que um ataque de &lt;strong&gt;SQL Injection&lt;/strong&gt; é possível. Ora, é mesmo possível? Interroguei-me!&lt;br /&gt;Daquilo que sei a respeito, não me parece. Respondi!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SQL Injection&lt;/strong&gt; pertence a categoria de &lt;em&gt;execução de comando&lt;/em&gt; cujo objectivo é tomar o controlo da Aplicação Web.&lt;br /&gt;Utiliza-se da construção ilegal de &lt;em&gt;instruções de SQL&lt;/em&gt; através do &lt;em&gt;input&lt;/em&gt; do utilizador.&lt;br /&gt;&lt;br /&gt;Para já, fica caracterizado que para haver &lt;strong&gt;SQL Injection&lt;/strong&gt;, deve haver uma &lt;em&gt;porta&lt;/em&gt; de entrada para os dados.&lt;br /&gt;Se essa &lt;em&gt;porta&lt;/em&gt; -Web form- existir, então a acção de um &lt;em&gt;malicious user&lt;/em&gt; consistirá em executar comandos de SQL contra a Base de Dados da aplicação.&lt;br /&gt;&lt;br /&gt;Da análise do código em causa, o que realmente importa destacar é o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1)&lt;/strong&gt; Não obedece a nenhum &lt;em&gt;Design Pattern&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Spaghetti&lt;/em&gt; à parte, concretamente, não há &lt;em&gt;best pratices&lt;/em&gt; aqui. Penso que este facto contribui negativamente para a Aplicação na qual este código está inserido. É o que caracteriza a verdadeira &lt;em&gt;ameaça&lt;/em&gt;, no âmbito da Arquitectura.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2)&lt;/strong&gt; Existe um ponto de entrada.&lt;br /&gt;A função insertDoc() despoleta todo o fluxo de informação neste contexto, e os seus parâmetros são, ou deveriam ser, &lt;em&gt;inputs&lt;/em&gt; do utilizador. Por exemplo: Centro, Produto e Quantidade.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3)&lt;/strong&gt; A query sql é @parametrizada.&lt;br /&gt;Aqui está o ponto chave de toda a questão! Esta é a primeira linha de defesa contra o ataque SQL Injection.&lt;br /&gt;&lt;br /&gt;Ok. Ao observarmos o &lt;strong&gt;ponto nº 2&lt;/strong&gt;, há algo que devemos nos preocupar: &quot;existe uma porta!&quot;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Rule of thumb&lt;/strong&gt;&lt;br /&gt; -------------&lt;br /&gt; &quot;Não confie no input do utilizador!&quot;&lt;br /&gt;&lt;br /&gt;Na prática, isto significa validar os &lt;em&gt;inputs&lt;/em&gt; do utilizador contra tipo, comprimento, formato, etc.&lt;br /&gt;&lt;br /&gt;E, em relação ao &lt;strong&gt;ponto nº 3&lt;/strong&gt;!? O que é esta &lt;em&gt;cena&lt;/em&gt; de parametrizada?&lt;br /&gt;&lt;br /&gt; &quot;The best way to mitigate SQL Injection attacks is to use parameterized SQL queries.&quot;&lt;br /&gt;&lt;br /&gt;Eu deixei esta sentença na sua forma original, ou seja, em inglês, porque isto é o &lt;em&gt;statement&lt;/em&gt; dos Experts. Ou seja, a Microsoft, por exemplo.&lt;br /&gt;&lt;br /&gt;Isto quer dizer, na prática, que ao utilizar &lt;em&gt;queries&lt;/em&gt; parametrizadas, na verdade, o valor introduzido pelo utilizador está a ser tratado como uma literal e, não, como código executável. &lt;br /&gt;E, ainda, este valor é confrontado com o seu tipo e comprimento. Qualquer coisa fora do que foi definido irá provocar uma excepção. No nosso caso, por exemplo:&lt;br /&gt;&lt;br /&gt;  declare @Centro as char(3);&lt;br /&gt;  declare @produto as char(2);&lt;br /&gt;  declare @quantidade as int; &lt;br /&gt;&lt;br /&gt;Claro! Melhor seria se isto acontecesse em uma Stored Procedure! Se assim não o for e, ao nível do código .Net, podemos utilizar SQLParameter!&lt;br /&gt;&lt;br /&gt;Para concluir, eu sintetizei aqui, um assunto que é muito mais abrangente do que isto. O objectivo foi demonstrar o porquê da minha ideia de que não é possível realizar o ataque &lt;strong&gt;SQL Injection&lt;/strong&gt; com base no código em discussão.&lt;br /&gt;&lt;br /&gt;Assim, a minha opinião é:&lt;br /&gt;&lt;br /&gt;&quot;Não, não é possível utilizar o ataque &lt;strong&gt;SQL Injection&lt;/strong&gt; com base neste código!&quot;&lt;br /&gt;&lt;br /&gt;Agora, &quot;It&#39;s up to You!&quot;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCPD - ASP.NET Developer 3.5</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/6655688575486487492/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/6655688575486487492' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/6655688575486487492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/6655688575486487492'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2010/04/sql-injection-e-ou-nao-possivel.html' title='SQL Injection - É ou não possível?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-6616280849968774488</id><published>2010-01-04T21:10:00.002+00:00</published><updated>2010-01-04T21:16:04.885+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><title type='text'></title><content type='html'>Para responder ao fernando em ( &lt;a href=&quot;http://agap2msft.blogspot.com/2010/01/e-ou-nao-possivel.html&quot;&gt;É ou não possível...&lt;/a&gt; )&lt;br /&gt;&lt;p&gt;Vamos analisar a função.&lt;br /&gt;&lt;br /&gt;11 parametros de entrada em javascript&lt;br /&gt;Uma vez que nesta linguagem as variaveis não são fortemente tipificadas, são onze possibilidades de entrar codigo pois&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Area&lt;/strong&gt; pode ser 01, ou &quot;Select Sum(quantidade) from tregisto inner join ...) por ai fora.&lt;br /&gt;Isto pode se repetir para cada variavel.&lt;br /&gt;Mais a frente digo como.&lt;br /&gt;&lt;br /&gt;Agora o maior problema no meu ponto de vista. A construção de um procedimento em runtime no lado do client com os dados das variaveis:&lt;br /&gt;&lt;strong&gt;-&gt; &quot;; select @operacao=&quot; + Operacao + ,&lt;/strong&gt; permite assignar a variavel @operacao do procedimento o que eu quiser:&lt;br /&gt;. por exemplo tornar um debito num credito.&lt;br /&gt;. igualar ao resultado de um outro procedimento que demore imenso tempo ou que não termine e empaque a bd.&lt;br /&gt;. o que quiserem imaginar.&lt;br /&gt;O mesmo para as outras variaveis.&lt;br /&gt;&lt;br /&gt;Sem falar que fico com o conhecimento da estrutura de dados do sistema ( nome de tabelas, campos)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- &gt; while (incDate &lt;= sysDate)&lt;/strong&gt; { se tornar este loop infinito posso inserir dados até rebentar a BD temos n inserts a ser criados em runtime -&gt; &quot;insert into tregisto (centro, estrutura, area, produto, operacao, tiporegisto, data, userid, quantidade) &quot; +&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Se por fim quiser alterar a variavel &lt;strong&gt;msql&lt;/strong&gt; , visto que é uma string posso em qualquer parte do procedimento fazer drops,&lt;br /&gt;alterar permissões se conhecer a estrutura da tabela de permissões ( que poderia estar exposto em outras partes do codigo)&lt;br /&gt;&lt;br /&gt;para isto basta abrir o IE ou o mozilla com um debuger de javascript, por breakpoints no javascript, adicionar watchs para variaveis  ( Centro, incDate, msql,etc)  e mudar os valores quando parar no breakpoint .&lt;br /&gt;Sem falar que também se pode fazer isto com o Visual Studio, Eclipse, NetBeans que têm ferramentas de depuração mais poderosas.&lt;br /&gt;&lt;br /&gt;function insertDoc(Centro, Estrutura, Area, Produto, Operacao, TipoRegisto, ShortDt, User, Quantidade, sysDate, allow) {&lt;br /&gt;var xml, msql, QantFix, incDate;&lt;br /&gt;var doc, docAttr, docChilds, nor;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;debugger;&lt;br /&gt;&lt;strong&gt;( Break Point Aqui) - a partir daqui alterava os parametros de entrada.&lt;/strong&gt;&lt;br /&gt;incDate = ShortDt;&lt;br /&gt;QantFix = Quantidade;&lt;br /&gt;&lt;br /&gt;if (allow == &quot;A&quot;)&lt;br /&gt;QantFix = calculaQuantidadeACT(Centro, Estrutura, Area, Produto, Operacao, TipoRegisto, ShortDt, User, parseInt(Quantidade), sysDate, allow);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while (incDate &lt;= sysDate) {&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;( Break Point Aqui) - a partir daqui alterava incDate para ser sempre inferior as sysDate .&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;msql = &quot;declare @Centro as char(3); declare @estrutura as char(2); declare @area as char(2); declare @produto as char(2); declare @operacao as char(2); declare @TipoRegisto as char(30); declare @userid as char(8); declare @quantidade as int; declare @allow as char(1); &quot; +&lt;br /&gt;&quot;select @Centro=&#39;&quot; + Centro +&lt;br /&gt;&quot;&#39;; select @estrutura=&quot; + Estrutura +&lt;br /&gt;&quot;; select @area=&quot; + Area +&lt;br /&gt;&quot;; select @produto=&quot; + Produto +&lt;br /&gt;&quot;; select @operacao=&quot; + Operacao +&lt;br /&gt;&quot;; select @TipoRegisto=&#39;&quot; + TipoRegisto +&lt;br /&gt;&quot;&#39;; select @userid=&#39;&quot; + User +&lt;br /&gt;&quot;&#39;; select @quantidade=&quot; + Quantidade +&lt;br /&gt;&quot;; select @allow=&#39;&quot; + allow +&lt;br /&gt;&quot;&#39;; &quot; +&lt;br /&gt;&quot;declare @DTPD as datetime; declare @DT as datetime; select @DTPD=&#39;&quot; + ShortDt +&lt;br /&gt;&quot;&#39;; select @DT=&#39;&quot; + incDate +&lt;br /&gt;&quot;&#39;; declare @RecebidosD as int; declare @PendentesD as int; declare @PendentesDA as int; &quot;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;( Break Point Aqui) - a partir daqui alterava as variaveis do procedimento .&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;if (ShortDt == incDate) {&lt;br /&gt;msql = msql + &quot;&quot; +&lt;br /&gt;&quot;select @RecebidosD=(select quantidade from tregisto &quot; +&lt;br /&gt;&quot;where centro=@Centro and estrutura=@estrutura and area=@area and produto=@produto and operacao=@operacao and tiporegisto=@tiporegisto and data=@DT); &quot; +&lt;br /&gt;&quot;if (@RecebidosD is null) begin &quot; +&lt;br /&gt;&quot;insert into tregisto (centro, estrutura, area, produto, operacao, tiporegisto, data, userid, quantidade) &quot; +&lt;br /&gt;&quot;values (@Centro, @estrutura , @area, @produto, @operacao, @TipoRegisto, @DT, @userid, @quantidade); &quot; +&lt;br /&gt;&quot;select @RecebidosD=(select quantidade from tregisto &quot; +&lt;br /&gt;&quot;where centro=@Centro and estrutura=@estrutura and area=@area and produto=@produto and operacao=@operacao and tiporegisto=@tiporegisto and data=@DT); &quot;&lt;br /&gt;&lt;br /&gt;( Break Point Aqui) - punha mais inserts ou drops ou delete na variavel msql .&lt;br /&gt;&lt;br /&gt;.... (Omitido o resto por questões de brevidade)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;É claro que não seria para qualquer um, mas basta ter vontade e tempo&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/6616280849968774488/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/6616280849968774488' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/6616280849968774488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/6616280849968774488'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2010/01/para-responder-ao-fernando-em-e-ou-nao.html' title=''/><author><name>Joaquim Luis da Luz Ferreira</name><uri>http://www.blogger.com/profile/14574454896113905316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-9071895186292992716</id><published>2010-01-04T18:00:00.006+00:00</published><updated>2010-01-04T18:12:46.888+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><title type='text'>É ou não possível...</title><content type='html'>...com base no código do post &#39;&lt;em&gt;Um exemplo do que não se deve fazer . . .&lt;/em&gt;&#39; do nosso colega Luís Sousa, utilizar o ataque &lt;strong&gt;SQL Injection&lt;/strong&gt;?&lt;br /&gt;As respostas devem ser acompanhadas de justificativas, se possível.&lt;br /&gt;&lt;br /&gt;Obrigado ao Luís pelo exemplo!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abraço e Feliz 2010!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/9071895186292992716/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/9071895186292992716' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/9071895186292992716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/9071895186292992716'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2010/01/e-ou-nao-possivel.html' title='É ou não possível...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-1777915178562100718</id><published>2009-12-21T00:50:00.003+00:00</published><updated>2009-12-21T01:18:36.152+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="Desenvolvimento"/><title type='text'>Model View Controller - MVC</title><content type='html'>O Natal está a aproximar-se e, como em todos os anos nesta época, nos reunimos em mais um jantar de confraternização &lt;em&gt;Agapiano&lt;/em&gt;. Lá, estava presente a Equipa* que está a desenvolver o Portal Corporativo Agap2 e, é em homenagem a eles –da Equipa- que escolhi o tema deste post!&lt;br /&gt;&lt;br /&gt;O Model-View-Controller, padrão de arquitectura adoptado pelo &lt;a href=&quot;http://www.asp.net/mvc/&quot;&gt;ASP.NET MVC&lt;/a&gt; não é novo. Pelo contrário, existe, pelo menos, desde a década de 70.&lt;br /&gt;&lt;br /&gt;Essencialmente, este padrão está assente no conceito de separação em camadas. Com responsabilidades claras para cada componente. O &lt;strong&gt;Model&lt;/strong&gt; representa a camada de dados, o &lt;strong&gt;View&lt;/strong&gt;, a camada de apresentação(UI) e o &lt;strong&gt;Controller&lt;/strong&gt;, a camada de negócio. Este último, pode ser comparado em parte, ao ‘Code Behind’ do ASP.NET Web Forms uma vez que, gere e responde aos &lt;em&gt;inputs&lt;/em&gt; do utilizador.&lt;br /&gt;Tem como diferencial, também, o facto de não utilizar &lt;em&gt;View State&lt;/em&gt; e nem &lt;em&gt;Web Forms&lt;/em&gt;.&lt;br /&gt;Dos benefícios do &lt;a href=&quot;http://www.asp.net/mvc/&quot;&gt;ASP.NET MVC&lt;/a&gt;, eu gosto particularmente de dois:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;URLs ‘roteáveis’&lt;/em&gt; (amigáveis)&lt;br /&gt;Uma vez mais, no ASP.NET Web Forms as URLs ‘apontam’ para ficheiros localizados no disco rígido do Web Server.&lt;br /&gt;&lt;br /&gt;Por exemplo:&lt;br /&gt;http://www.agap2.pt/home.aspx  pode corresponder a x:\webroot\home.aspx  &lt;br /&gt;&lt;br /&gt;No &lt;a href=&quot;http://www.asp.net/mvc/&quot;&gt;ASP.NET MVC&lt;/a&gt; não é assim. URLs não esperam nenhuma correspondência com ficheiros sobre o Web Server. Elas são manipuladas no Controller.&lt;br /&gt;&lt;br /&gt;O desenho de uma &lt;em&gt;URL routing&lt;/em&gt; pode se parecer como isso:&lt;br /&gt;http://www.agap2.pt/rdc { controller = “Competencia”, action= “Rdc” } &lt;br /&gt;&lt;br /&gt;&lt;em&gt;TDD - Test-Driven Development&lt;/em&gt;&lt;br /&gt;Uma abordagem na qual criamos uma unidade de teste e, então, escrevemos código para satisfazer o teste.&lt;br /&gt;A unidade de teste deve representar o comportamento esperado do código que está a ser escrito.&lt;br /&gt;&lt;br /&gt;É importante destacar que, neste momento, o &lt;a href=&quot;http://www.asp.net/mvc/&quot;&gt;ASP.NET MVC&lt;/a&gt; não é o substituto do ASP.NET Web Forms mas, sim, uma alternativa.&lt;br /&gt;&lt;br /&gt;Fica aqui, então, a sugestão para que todos dêem uma espreitadela mais atenta nisto.&lt;br /&gt;&lt;br /&gt;Um abraço e um Feliz Natal!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*&lt;strong&gt;Equipa do Portal Agap2&lt;/strong&gt;&lt;br /&gt;André Oliveira; Joana Paes; Marco Delgado; Michael Castro; Ricardo Peixeiro; Ricardo Pereira; Rui  Raimundo; Vitor Catarino; Vitor Sezefredo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/1777915178562100718/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/1777915178562100718' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/1777915178562100718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/1777915178562100718'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2009/12/model-view-controller-mvc.html' title='Model View Controller - MVC'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-4083807095229458189</id><published>2009-07-07T14:20:00.003+01:00</published><updated>2009-07-07T15:43:51.892+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Desenvolvimento"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>Um exemplo do que não se deve fazer . . .</title><content type='html'>Já há algum tempo que não venho aqui ao blog, os vários projectos por onde tenho passado&lt;br /&gt;no cliente tiram-me o tempo.&lt;br /&gt;&lt;br /&gt;Desta vez, deparei-me com algo, que achei que tinha mesmo de ser partilhado convosco.&lt;br /&gt;&lt;br /&gt;Encontrei uma função Javascript, que é incluída numa página com um código no mínimo curioso, apreciem:&lt;br /&gt;&lt;br /&gt;function insertDoc(Centro, Estrutura, Area, Produto, Operacao, TipoRegisto, ShortDt, User, Quantidade, sysDate, allow) {&lt;br /&gt;   var xml, msql, QantFix, incDate;&lt;br /&gt;   var doc, docAttr, docChilds, nor;&lt;br /&gt;   debugger;&lt;br /&gt;&lt;br /&gt;   incDate = ShortDt;&lt;br /&gt;   QantFix = Quantidade;&lt;br /&gt;&lt;br /&gt;   if (allow == &quot;A&quot;)&lt;br /&gt;       QantFix = calculaQuantidadeACT(Centro, Estrutura, Area, Produto, Operacao, TipoRegisto, ShortDt, User, parseInt(Quantidade), sysDate, allow);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   while (incDate &lt;= sysDate)&lt;br /&gt;   {&lt;br /&gt;       msql = &quot;declare @Centro as char(3); declare @estrutura as char(2); declare @area as char(2); declare @produto as char(2); declare @operacao as char(2); declare @TipoRegisto as char(30); declare @userid as char(8); declare @quantidade as  int; declare @allow as char(1); &quot; +&lt;br /&gt;           &quot;select @Centro=&#39;&quot; + Centro + &quot;&#39;; select @estrutura=&quot; + Estrutura + &quot;; select @area=&quot; + Area + &quot;; select @produto=&quot; + Produto + &quot;; select @operacao=&quot; + Operacao + &quot;; select @TipoRegisto=&#39;&quot; + TipoRegisto + &quot;&#39;; select @userid=&#39;&quot; + User + &quot;&#39;; select @quantidade=&quot; + Quantidade + &quot;; select @allow=&#39;&quot; + allow + &quot;&#39;; &quot; +&lt;br /&gt;           &quot;declare @DTPD as datetime; declare @DT as datetime; select @DTPD=&#39;&quot; + ShortDt + &quot;&#39;;  select @DT=&#39;&quot; + incDate + &quot;&#39;; declare @RecebidosD as int; declare @PendentesD as int; declare @PendentesDA as int; &quot;;&lt;br /&gt;&lt;br /&gt;       if (ShortDt == incDate) {&lt;br /&gt;           msql = msql + &quot;&quot; +&lt;br /&gt;           &quot;select @RecebidosD=(select quantidade from tregisto &quot; +&lt;br /&gt;                               &quot;where centro=@Centro and estrutura=@estrutura and  area=@area and produto=@produto and operacao=@operacao and tiporegisto=@tiporegisto and data=@DT); &quot; +&lt;br /&gt;           &quot;if (@RecebidosD is null) begin &quot; +&lt;br /&gt;               &quot;insert into tregisto (centro, estrutura, area, produto, operacao, tiporegisto, data, userid, quantidade) &quot; +&lt;br /&gt;               &quot;values (@Centro, @estrutura , @area, @produto, @operacao, @TipoRegisto, @DT, @userid, @quantidade); &quot; +&lt;br /&gt;               &quot;select @RecebidosD=(select quantidade from tregisto  &quot; +&lt;br /&gt;                                   &quot;where centro=@Centro and  estrutura=@estrutura and  area=@area and  produto=@produto and  operacao=@operacao and  tiporegisto=@tiporegisto and  data=@DT); &quot;&lt;br /&gt;&lt;br /&gt;.... (Omitido o resto por questões de brevidade)&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Temos aqui um caso clássico de utilização de SQL client side, e disponível na página . . .&lt;br /&gt;&lt;br /&gt;Algo a evitar!</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/4083807095229458189/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/4083807095229458189' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/4083807095229458189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/4083807095229458189'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2009/07/um-exemplo-do-que-nao-se-deve-fazer.html' title='Um exemplo do que não se deve fazer . . .'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-1591119570945095044</id><published>2009-01-14T01:43:00.001+00:00</published><updated>2009-02-14T22:41:08.431+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="Modelo de dados"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Qualidade"/><title type='text'>A Arquitectura Aplicacional — Factores de Sobrevivência</title><content type='html'>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;[Este é o terceiro artigo da série “A Arquitectura Aplicacional” I) &lt;/font&gt;&lt;a href=&quot;http://agap2msft.blogspot.com/2008/10/arquitectura-aplicacional-introduo.html&quot;&gt;&lt;font size=&quot;1&quot;&gt;Introdução&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;1&quot;&gt; II) &lt;/font&gt;&lt;a href=&quot;http://agap2msft.blogspot.com/2008/11/arquitectura-aplicacional-anlise-de.html&quot;&gt;&lt;font size=&quot;1&quot;&gt;Análise de Características&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;1&quot;&gt;]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;No último artigo abordei algumas das características que caracterizam (esta é que não sabiam) uma arquitectura aplicacional. Não foi feita uma análise exaustiva, pelo que, com certeza, muitas características importantes terão não sido referidas. Como exemplo, não foi referida, explicitamente, a vulgar característica «expansibilidade&lt;em&gt;»&lt;/em&gt; &lt;font size=&quot;1&quot;&gt;[reconheço que a palavra não me soa perfeita; mas não consegui encontrar as palavras «escalabilidade» ou «escalável», num dicionário de português (de Portugal), mas apenas: escala, escalar, escalada, escalamento, escalagem e escalador. Por isso, acabei por preferir os tradicionais termos «expansibilidade» e «expansível», utilizados aqui à semelhança de em “slot de expansão”]&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;, que descreve a aptidão de uma arquitectura para poder &lt;em&gt;crescer&lt;/em&gt;, em termos de carga suportada, ou na sua distribuição geográfica.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Neste artigo, exploro algumas características que, julgo, são hoje subestimadas no desenho de sistemas e arquitecturas aplicacionais.&lt;/p&gt;  &lt;p&gt;É comum dar-se muita importância a cada um dos componentes ou módulos de um sistema e menosprezar a importância que tem o que os une, os liga e o que partilham e trocam uns com os outros.&lt;/p&gt;  &lt;h3&gt;A modularidade — as caixas&lt;/h3&gt;  &lt;p&gt;Estamos na época da modularidade, e de pouco mais. Também já não é mau, reconheço que podia ser pior. É-nos suficiente. Satisfaz-nos. Decora as soluções com traços de inteligência e complexidade, o que fica sempre bem. Enche o olho de quem compra. O deslumbramento é tanto que nem se quer saber o que é que está dentro dos módulos, as caixas, pretas. São quartos escuros, geralmente com tanta luz quanta inspiração e cuidado. &lt;/p&gt;  &lt;p&gt;Na pior das hipóteses, se se descobrir que um módulo não presta: deita-se este fora e troca-se por outro. É higiénico, não se toca em mais nada (tal como se faz hoje em dia com as placas de circuito impresso — nem vale a pena tentar descobrir qual o transístor que está queimado).&lt;/p&gt;  &lt;h3&gt;Relação com a mediocridade&lt;/h3&gt;  &lt;p&gt;A modularidade é uma característica imprescindível de qualquer sistema e arquitectura. Só não deve é ser utilizada para esconder o lixo debaixo do tapete. Como qualquer arma, esta pode ser usada bem ou mal. Para flexibilizar, separar, proteger e arrumar, ou para esconder a confusão, o desmazelo e a ignorância.&lt;/p&gt;  &lt;p&gt;Eis algumas máximas, todas elas válidas em devido contexto, mas que, evocadas de cor, facilmente conduzem a um uso medíocre da modularidade:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Depois, se houver tempo, faz-se melhor…”&lt;/p&gt;    &lt;p&gt;“A qualquer altura se substitui…”&lt;/p&gt;    &lt;p&gt;“Faz-se iterativamente e acrescenta-se faseada e oportunamente”&lt;/p&gt;    &lt;p&gt;“É uma questão de compromisso entre isto e aquilo…”&lt;/p&gt;    &lt;p&gt;“O óptimo é inimigo do bom…”&lt;/p&gt;    &lt;p&gt;“Não sejamos mais papistas que o P&lt;strike&gt;á&lt;/strike&gt;apa”.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notem os seguintes, igualmente válidos, dizeres:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Raramente há tempo e oportunidade para melhorar o que já está (mais ou menos) feito”&lt;/p&gt;    &lt;p&gt;“O que nasce torto (ou incompleto) tarde ou nunca se endireita (ou completa)”&lt;/p&gt;    &lt;p&gt;“Quando não há vontade, qualquer razão serve…”&lt;/p&gt;    &lt;p&gt;“O bom também é inimigo do óptimo”&lt;/p&gt;    &lt;p&gt;“Com o mal dos outros posso eu bem”&lt;/p&gt;    &lt;p&gt;“A qualidade compensa, gasta-se agora, ganha-se depois”&lt;/p&gt;    &lt;p&gt;“Para hábil executor é tão mais fácil fazer bem do que mal”&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;A flexibilidade — as ligações&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;A modularidade é tanto acerca de caixas como de ligações. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Deparados com um monólito de 1000 linhas &lt;font size=&quot;1&quot;&gt;[porque não em C#, já que este é um &lt;em&gt;blog&lt;/em&gt; ligado a tecnologias &lt;em&gt;Microsoft&lt;/em&gt;]&lt;/font&gt;, feito por um qualquer colega insano &lt;font size=&quot;1&quot;&gt;[que devia ser mandado para o Campo Pequeno e…]&lt;/font&gt;, a necessidade imperativa de reposição da ordem que invade qualquer programador que se preze, debate-se imediatamente com o seguinte: para separar, há que ligar a seguir. É essa a razão por que mentes preguiçosas, sob a pressão dos prazos, se ficam pelo monólito: “É mais seguro, fica tudo juntinho e não se perde”.&lt;/p&gt;  &lt;p&gt;De que são feitas as ligações? De um fio condutor e dos electrões. Isto na electricidade, é claro, porque no caso das aplicações informáticas, é, surpreendentemente, a mesma coisa. Façamos F = “fio condutor” e E = “electrão”. Entre funções de um programa: F = “variável” e E = “um inteiro”, entre uma página &lt;em&gt;web&lt;/em&gt; e o seu servidor: F = “canal tcp/ip, protocolo http” e E = “conteúdo do &lt;em&gt;body&lt;/em&gt; da mensagem http”, e por aí adiante.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A flexibilidade de um sistema deve-se à flexibilidade das ligações entre os seus módulos. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Uma ligação não é flexível apenas por existir (existo logo sou flexível?). Uma função não está ligada de forma flexível às funções suas chamadoras apenas por ter muitos parâmetros de entrada (e, eventualmente, vários de saída). Não é tanto a quantidade de ligações que traz a flexibilidade, mas antes a qualidade do que as atravessa.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A flexibilidade de um conjunto de ligações é função do número de fins que estas podem produzir.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Eis um exemplo da “vida real”. O corpo humano, assim como muitos outros organismos vivos, é um sistema extraordinariamente flexível. A sua flexibilidade deve-se em grande medida à flexibilidade do seu (sub-)sistema de ligações. Os vasos sanguíneos — o canal condutor, F — ligam todos os pontos do corpo; pelo meio, atravessam barreiras físicas, como as articulações entre os membros, sem prejudicar a sua mobilidade; penetram fundo nos seus órgãos internos. O sangue — o líquido portador — viaja nos vasos sanguíneos levando consigo alimentos, glóbulos e demais agentes de toda a espécie — E.&lt;/p&gt;  &lt;p&gt;A reter:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Todos os sistemas bem sucedidos, que &lt;em&gt;sobrevivem&lt;/em&gt;, perduram e evoluem, são flexíveis. Têm como suporte às ligações entre as suas partes um (sub-)sistema de ligações flexível.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;As coisas&lt;/h3&gt;  &lt;p&gt;O domínio do que é comunicado, do que viaja através dos canais de comunicação, é, na mais geral das hipóteses, todo o conhecimento (“&lt;em&gt;the sky is the limit&lt;/em&gt;”), cujo elemento abstracto se denomina de «coisa». Pode ser uma mensagem, um “objecto”, um número inteiro, uma entidade de negócio, enfim, &lt;em&gt;qualquer&lt;/em&gt; «coisa». &lt;/p&gt;  &lt;p&gt;Quanto mais tipos diferentes de «coisas» puderem passar por uma ligação, maior será a sua flexibilidade. Maior será, também, a dificuldade de lidar com “tanta «coisa»”. Por isso, a utilização &lt;em&gt;eficiente&lt;/em&gt; das ligações, passa por descobrir, para o problema subjacente aos módulos ligados, qual é o menor conjunto de «coisas» que o descreve.&lt;/p&gt;  &lt;p&gt;Actualmente, quando se desenham sistemas e arquitecturas, nmho, não se tira partido de um eficiente desenho do modelo de entidades de negócio. É comum que cada módulo ou camada de um sistema tenha o seu bem diferente modelo de entidades, do mesmo negócio. Não são apenas diferentes vistas parciais de um mesmo modelo, de acordo com as necessidades de cada um. São antes diferentes, contraditórias, e igualmente infiéis representações de um mesmo modelo de negócio, que todos mal conhecem.&lt;/p&gt;  &lt;p&gt;A utilização de um modelo de dados comum em todo um sistema é o maior potenciador da sua eficiência, a todos os níveis, e da simplicidade conseguida nas suas ligações &lt;font size=&quot;1&quot;&gt;[reveja-se o corpo humano]&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;No próximo artigo, abordarei alguns sentidos desafios do desenho de um tal modelo de dados. Até lá. Não resistam. Pensem nisto.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/1591119570945095044/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/1591119570945095044' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/1591119570945095044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/1591119570945095044'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2009/01/arquitectura-aplicacional-factores-de.html' title='A Arquitectura Aplicacional — Factores de Sobrevivência'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-5320600239919798737</id><published>2008-12-23T11:59:00.000+00:00</published><updated>2008-12-23T12:02:14.786+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Desenvolvimento"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>Parallelization is next performance horizon</title><content type='html'>http://weblog.infoworld.com/yager/archives/2008/12/parallelization_1.html</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/5320600239919798737/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/5320600239919798737' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/5320600239919798737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/5320600239919798737'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/12/parallelization-is-next-performance_23.html' title='Parallelization is next performance horizon'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-5406291900796937829</id><published>2008-11-28T11:20:00.001+00:00</published><updated>2008-11-28T11:44:27.423+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net Framework 2"/><category scheme="http://www.blogger.com/atom/ns#" term="Desenvolvimento"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><title type='text'>Cábulas de .Net (e não só)</title><content type='html'>&lt;p&gt;Caros colegas, quantas vezes a nossa produtividade se resume à (rápida) acessibilidade da informação?&lt;/p&gt;  &lt;p&gt;Várias vezes dou por mim à procura, pela centésima vigésima primeira vez, daquele &lt;em&gt;help&lt;/em&gt; porreiro de &lt;em&gt;JavaScript&lt;/em&gt;&lt;em&gt;,&lt;/em&gt; ou, a dizer: “onde é que eu tenho aquele &lt;em&gt;snippet &lt;/em&gt;para escrever o raio de um DOCTYPE de &lt;em&gt;xhtml&lt;/em&gt;&lt;em&gt;…&lt;/em&gt;será que está na &lt;em&gt;pen&lt;/em&gt; ou no computador de casa…”&lt;/p&gt;  &lt;p&gt;Isto é típico das matérias que não usamos todos os dias, mas só dia-sim, dia-não :-).&lt;/p&gt;  &lt;p&gt;Por isso achei um espectáculo encontrar um &lt;em&gt;post &lt;/em&gt;que faz um apanhado de várias “&lt;em&gt;cheat sheets&lt;/em&gt;”, de várias tecnologias, a maioria, prontas a imprimir numa folha A4, ou ver no Acrobat:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://john-sheehan.com/blog/index.php/net-cheat-sheets/&quot;&gt;http://john-sheehan.com/blog/index.php/net-cheat-sheets/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;É claro que as cábulas só interessam a quem sabe mais do que aquilo que elas tiverem, resultado da elevada compressão (com perdas) da informação constante :-)&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/5406291900796937829/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/5406291900796937829' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/5406291900796937829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/5406291900796937829'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/11/cbulas-de-net-e-no-s.html' title='Cábulas de .Net (e não só)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-8260485714275019208</id><published>2008-11-25T02:03:00.001+00:00</published><updated>2009-01-14T01:48:35.529+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="Desenvolvimento"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Qualidade"/><title type='text'>A Arquitectura Aplicacional — Análise de Características</title><content type='html'>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;[Este é o segundo artigo da série “A Arquitectura Aplicacional” I) &lt;/font&gt;&lt;a href=&quot;http://agap2msft.blogspot.com/2008/10/arquitectura-aplicacional-introduo.html&quot;&gt;&lt;font size=&quot;1&quot;&gt;Introdução&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;1&quot;&gt; III) &lt;a href=&quot;http://agap2msft.blogspot.com/2009/01/arquitectura-aplicacional-factores-de.html&quot;&gt;Factores de Sobrevivência&lt;/a&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Depois de tão aplaudida estreia não tenho outro remédio senão continuar a série de artigos sobre a “A Arquitectura Aplicacional”. Agradeço, desde já, os hipotéticos futuros aplausos.&lt;/p&gt;  &lt;p&gt;Hoje, ao ler (mais que tardiamente) o &lt;a href=&quot;http://agap2msft.blogspot.com/2008/11/fazer-tijolos-ou-juntar-tijolos-eis.html&quot;&gt;artigo do Joaquim Ferreira&lt;/a&gt; abriu-se-me o apetite para a escrita!&lt;/p&gt;  &lt;p&gt;Tal como prometi no último artigo, vamos baixar a altitude. Colegas consultores: peço-vos que desabotoem os punhos das camisas e arregacem as mangas, pois vamos sujar um pouco as mãos &lt;font size=&quot;1&quot;&gt;[isto do consultor de colarinho branco e botões de punho não joga, nmho, muito bem com a programação, e com o trabalho em particular, também]&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;No último artigo concluímos que não existe uma só arquitectura aplicacional que seja adequada para servir &lt;em&gt;todos &lt;/em&gt;os sistemas. Mas que, por outro lado, existem características de uma arquitectura que nos permitem classificar e escolher de entre as &lt;em&gt;infinitas&lt;/em&gt; arquitecturas existentes. Que características são essas? As seguintes características são &lt;em&gt;positivas&lt;/em&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;simplicidade&lt;/strong&gt; — a arquitectura é o mais simples possível, sem prejuízo dos seus fins, ou de outras características positivas; facilita a aprendizagem do seu funcionamento, reduz o número de potenciais erros, facilita a alteração &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;modularidade&lt;/strong&gt; — estruturada por módulos (vários módulos cada um com diferentes funções); estes expõem as suas funcionalidades de maneira a que outros as possam utilizar facilmente; esta característica facilita a análise, a utilização, a alteração, a aferição &lt;font size=&quot;1&quot;&gt;[efectuar testes com padrões de Entrada/Saída]&lt;/font&gt; e possibilita a reutilização &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;composicionalidade&lt;/strong&gt; — pressupondo um desenho modular,&amp;#160; os módulos podem utilizar outros módulos para cumprir a sua função; tal representa uma dependência que pode ser obrigatória ou facultativa; no último caso, se a dependência de um módulo não é satisfeita, algumas das funcionalidades do módulo dependente podem não estar activas &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;configurabilidade&lt;/strong&gt; — capacidade de poder alterar ou ajustar a configuração de uma arquitectura através de parâmetros acessíveis externamente &lt;font size=&quot;1&quot;&gt;[a resposta à alteração dos parâmetros pode ou não ser imediata e automática, podendo estar sujeita a um comando de refrescamento, ou, no pior caso, ao reiniciar da aplicação]&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;adaptabilidade&lt;/strong&gt; — a capacidade de adaptação/regulação, automática, a características variantes do meio ambiente (características extrínsecas do sistema) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;robustez &lt;/strong&gt;— força com que uma arquitectura resiste a condições &lt;em&gt;adversas&lt;/em&gt; ou de &lt;em&gt;excepção &lt;/em&gt;do meio ambiente; o conhecido teste do “macaco ao teclado” é uma condição de excepção para qualquer arquitectura, assim como lhe são adversas as falhas em linhas de comunicação e os períodos de sobrecarga no acesso a um componente servidor &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Outras características positivas, muito abrangentes, mas, de fulcral importância:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;eficácia &lt;/strong&gt;— se uma arquitectura satisfaz os seus fins (a cada fim, ou sim ou não); por vezes olha-se para uma arquitectura acabada e apercebesse-se que ficou algo, esquecido ou adiado, de fora &lt;font size=&quot;1&quot;&gt;[confesso que a ortografia da anterior conjugação do verbo «aperceber» fui vê-la ao dicionário e, ainda assim, tenho dúvidas se a utilizei/escrevi bem :-) ]&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;eficiência (&lt;/strong&gt;ou o&lt;strong&gt; inverso do desperdício)&lt;/strong&gt; — o grau de aproveitamento dos recursos ambientais consumidos para o cumprimento do seus fins; a eficiência máxima, o valor 100%, corresponde a uma utilização dos recursos ambientais perfeita para o estrito cumprimento dos seus fins (apenas existe produção de valor e não existe desperdício); a eficiência mínima, o valor 0%, corresponde a um desperdício total: todos os recursos ambientais são gastos em fins que não os pretendidos, não sendo estes últimos sequer atingidos: o mesmo que a ineficácia! &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ajustamento ao problema (&lt;/strong&gt;ou a &lt;strong&gt;fidelidade da representação) &lt;/strong&gt;— quão ajustada está uma arquitectura ao seu fim; quão fiel é a sua representação do problema; um desenho injusto (desajustado) do problema traz consigo ineficiência na composição e no funcionamento; repetidas vezes observo que a complexidade das aplicações se deve a infiéis representações do problema: é como os parafusos &lt;em&gt;philips &lt;/em&gt;(em cruz), podem ser apertados com uma chave de fendas, normal, mas com desnecessário esforço. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Pois, a cada sistema, a arquitectura que lhe seja fiel. &lt;/p&gt;  &lt;p&gt;Muitas outras características existem, com certeza &lt;font size=&quot;1&quot;&gt;[gostaria que o meu leitor imaginário comentasse sobre elas…]&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;Mas há &lt;em&gt;uma&lt;/em&gt; que deixei de fora, de propósito, pois será o tema do próximo artigo.&lt;/p&gt;  &lt;p&gt;Acabámos por não sujar mais do que a ponta dos dedos.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/8260485714275019208/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/8260485714275019208' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8260485714275019208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8260485714275019208'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/11/arquitectura-aplicacional-anlise-de.html' title='A Arquitectura Aplicacional — Análise de Características'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-3035950075632782131</id><published>2008-11-04T11:00:00.021+00:00</published><updated>2008-11-06T09:15:15.123+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net Framework 2"/><category scheme="http://www.blogger.com/atom/ns#" term="Application blocks"/><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise Library"/><title type='text'>Fazer tijolos ou juntar tijolos, eis a questão ...</title><content type='html'>Apôs tanto tempo a dizer que iria começar a escrever no blog, aqui vai a meu 1º input.Antes de mais nada atenção que isto pode ir com algumas gralhas.Porque além de ser burro e preguiçoso, não vou andar a fazer revisão.&lt;br /&gt;&lt;br /&gt;Bem o meu titulo é estranho! Mas se o analisarem com alguma abstracção, se calhar conseguem ver aquilo que eu escondi nele.&lt;br /&gt;Actualmente os programadores debatem-se com o constante trabalho de &quot;fazer tijolos&quot; e perdem pouco tempo a procurar os que já estão feitos. Uma das razões é porque para alguns nunca existe o &quot;tijolo&quot; exactamente como eles querem, outros preguiça de procurar, outros não têm tempo, outros não gostam, etc. Existe sempre uma razão.&lt;br /&gt;&lt;br /&gt;No meu trabalho do dia a dia, verifico que cerca de 75% do nosso tempo consiste em refazer o que já esta feito, muitas vezes mal.Mais tarde verificamos que já alguém o fez e bem melhor. Existem alguns que ao fim de algum tempo tem os seus &quot;private tijolos&quot;. Então já passam para a fase de os &quot;juntar&quot;. Mas muito poucos na realidade utilizam conscientemente &quot;tijolos&quot; de outros para atingir o seu objectivo.&lt;br /&gt;&lt;br /&gt;Chega de falar em tijolos e vamos falar do problema em si. Ao fim de algum tempo muitos dos problemas na programação já foram resolvidos por alguém. As vezes essas soluções estão padronizadas e disponíveis para nós utilizarmos. O problema é saber que existem e como utilizar.&lt;br /&gt;&lt;br /&gt;Para já vou falar de um conjunto de soluções que a Microsoft disponibiliza para uma série de situações, o &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc467894.aspx&quot;&gt; Enterprise library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc467894.aspx&quot;&gt; Enterprise library&lt;/a&gt; não é mais do que um conjunto de unidades &quot;application blocks&quot; configuraveis que podem ser utilizados para resolver uma série de problemas comuns.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO-1DyhL787G8PtTbz5J1aE-FVZlRnpRmvdFv5wAF3X_hwyeWnFo-rq5y_so5483hGugSjZPSfu9I7BBgjs7mutDxPlaM9nv5T1PNaSFNhEuqDi9kOpeoeyJKct33lJwiUOChljXK3hFzo/s1600-h/Ent1.JPG&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 222px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO-1DyhL787G8PtTbz5J1aE-FVZlRnpRmvdFv5wAF3X_hwyeWnFo-rq5y_so5483hGugSjZPSfu9I7BBgjs7mutDxPlaM9nv5T1PNaSFNhEuqDi9kOpeoeyJKct33lJwiUOChljXK3hFzo/s320/Ent1.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5264811636150055090&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como podem verificar na imagem existem uma série de problemas comuns as aplicações.&lt;br /&gt;Em cada nova aplicação lá vamos nós resolver aquilo que &quot;n&quot; vezes já resolvemos.&lt;br /&gt;Ora com esta solução a Microsoft tenta dar mecanismos que possam ser adaptados as nossas aplicações e que permitam uma forma padrão de resolver os problemas mais comuns.&lt;br /&gt;&lt;br /&gt;Inicialmente em janeiro de 2005 a microsoft disponibilizou os seguintes &quot;Apllication Blocks&quot;, na versão 1.0.&lt;br /&gt;• Configuration Application Block&lt;br /&gt;• Data Access Application Block&lt;br /&gt;• Caching Application Block&lt;br /&gt;• Exception Handling Application Block&lt;br /&gt;• Logging and Instrumentation Application Block&lt;br /&gt;• Security Application Block&lt;br /&gt;• Cryptography Application Block&lt;br /&gt;&lt;br /&gt;Com a versão 2.0, actualizou para a framework 2.0 e alterou os modulos de&lt;br /&gt;• Data Access Application Block&lt;br /&gt;• Caching Application Block&lt;br /&gt;• Exception Handling Application Block&lt;br /&gt;• Security Application Block&lt;br /&gt;&lt;br /&gt;E&lt;br /&gt;&lt;br /&gt;. O Logging and Instrumentation Application Block , passou so a ser o Logging&lt;br /&gt;Application Block&lt;br /&gt;&lt;br /&gt;. O funcionalidade de Instrumentation que existia no &quot;Logging and Instrumentation Application Block&quot;  como o Configuration Application Block passaram a ser tranversais as &quot;Application Blocks&quot;.&lt;br /&gt;&lt;br /&gt;Com a versão 3.0 passou a coexistir com novas funcionalidades da framework dot net.&lt;br /&gt;• Windows Presentation Framework&lt;br /&gt;• Windows Communication Framework&lt;br /&gt;• Windows Workflow Foundation&lt;br /&gt;• Windows CardSpace&lt;br /&gt;&lt;br /&gt;Novos &quot;Apllication Blocks&quot; apareceram.&lt;br /&gt;• Validation Application Block&lt;br /&gt;• Policy Injection Application Block&lt;br /&gt;&lt;br /&gt;E outros estão disponiveis mas não são oferecidos no core.&lt;br /&gt;&lt;br /&gt;• Composite UI Application Block:&lt;br /&gt;• Updater Application Block:&lt;br /&gt;• CompositeWeb Application Block&lt;br /&gt;• Page Flow Application Block&lt;br /&gt;• Mobile Composite Application Block&lt;br /&gt;• Mobile Data Access Block&lt;br /&gt;• Mobile Configuration Block&lt;br /&gt;• Mobile Connection Monitor Block&lt;br /&gt;• Mobile Data Subscription Block&lt;br /&gt;• Mobile Disconnected Service Agent Block&lt;br /&gt;• Mobile Endpoint Catalog Block&lt;br /&gt;• Password Authentication Block&lt;br /&gt;&lt;br /&gt;E ainda existe a versão 4.0, que aborda a framework 3,0/3.5, que falarei mais a frente.&lt;br /&gt;&lt;br /&gt;No fundo interessa saber é que existem muitas coisa já feitas que podem ser aproveitadas.E o meu objectivo será nestes &quot;posts&quot;, falar das principais e se possível de todas.&lt;br /&gt;&lt;br /&gt;Agora para terminar, porque ja escrevi muito, deixo só a nota que o próximo post irá falar de como instalar e usar em desenvolvimento e produção estes &quot;Applications Blocks&quot;. Se possível falar em detalhe de um, talvez o de &quot;LOG&quot;, senão fica no &quot;post&quot; seguinte.&lt;br /&gt;&lt;br /&gt;Sabem a vontade é muita o tempo é que não abunda.&lt;br /&gt;&lt;br /&gt;Um abraço, comentem ...</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/3035950075632782131/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/3035950075632782131' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3035950075632782131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3035950075632782131'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/11/fazer-tijolos-ou-juntar-tijolos-eis.html' title='Fazer tijolos ou juntar tijolos, eis a questão ...'/><author><name>Joaquim Luis da Luz Ferreira</name><uri>http://www.blogger.com/profile/14574454896113905316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO-1DyhL787G8PtTbz5J1aE-FVZlRnpRmvdFv5wAF3X_hwyeWnFo-rq5y_so5483hGugSjZPSfu9I7BBgjs7mutDxPlaM9nv5T1PNaSFNhEuqDi9kOpeoeyJKct33lJwiUOChljXK3hFzo/s72-c/Ent1.JPG" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-8255083232196546643</id><published>2008-10-23T02:17:00.001+01:00</published><updated>2009-01-14T01:49:48.189+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><title type='text'>A Arquitectura Aplicacional — Introdução</title><content type='html'>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;[Este é o primeiro artigo da série “A Arquitectura Aplicacional” &lt;font size=&quot;1&quot;&gt;II) &lt;/font&gt;&lt;a href=&quot;http://agap2msft.blogspot.com/2008/11/arquitectura-aplicacional-anlise-de.html&quot;&gt;&lt;font size=&quot;1&quot;&gt;Análise de Características&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;a href=&quot;http://agap2msft.blogspot.com/2008/10/arquitectura-aplicacional-introduo.html&quot;&gt;&lt;font size=&quot;1&quot;&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;1&quot;&gt; III) &lt;a href=&quot;http://agap2msft.blogspot.com/2009/01/arquitectura-aplicacional-factores-de.html&quot;&gt;Factores de Sobrevivência&lt;/a&gt;&lt;/font&gt;&lt;font size=&quot;1&quot;&gt;]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Quero partilhar convosco algumas ideias acerca de arquitecturas para o desenvolvimento de &lt;em&gt;aplicações &lt;/em&gt;(i.e. &lt;em&gt;software&lt;/em&gt;!). Tal como salienta o ambicioso título, vamos descobrir “A Arquitectura Aplicacional” — aquela que será o Santo Graal das arquitecturas aplicacionais. A sério, não vamos descobrir nada de novo. Vamos apenas olhar para aquilo que já conhecemos,&amp;#160; que, provavelmente, já usamos, e dedicar-lhe algum do nosso tempo.&amp;#160; O tema é vasto o suficiente para justificar que o abordemos em vários artigos. Este é o primeiro artigo da série que se seguirá.&lt;/p&gt;  &lt;p&gt;Arquitecturas há muitas, tantas quantas se quiser inventar. No limite da interpretação, cada sistema é uma arquitectura, e há infinitos sistemas. No entanto, tais arquitecturas seriam de pouco valor, para lá dos sistemas que as originaram,&amp;#160; por serem tão talhadas para eles. Já não seriam arquitecturas. Seriam só mais uns sistemas.&lt;/p&gt;  &lt;p&gt;No outro extremo, existiria uma arquitectura tão geral que se aplicaria a todos os infinitos sistemas. Não teria nada de específico. Não serviria para nada. Não seria uma arquitectura. Mas é pena. Eu adorava que existisse.&lt;/p&gt;  &lt;p&gt;Se não existe “A Arquitectura Aplicacional”, existirão pelo menos boas e más arquitecturas. Podemos identificar características destas que nos permitam entendê-las e desenhá-las melhor, quem sabe, até, que permitam abstrair-mo-nos dos sistemas originais.&lt;/p&gt;  &lt;p&gt;A arquitectura clássica (quem sou eu para afirmar isto?) trata do &lt;a href=&quot;http://pt.wikipedia.org/wiki/Arquitectura&quot;&gt;problema da organização do homem no espaço&lt;/a&gt;. Lida com a relação do “homem com os seus objectos”; estes últimos vão desde o mobiliário, aos edifícios e à paisagem. Os objectos da arquitectura aplicacional são outros (passo a piada). São sistemas, processos, componentes, pacotes, entidades, classes, interfaces, tabelas, camadas, contratos, padrões, interacções e mais uns quantos que, sinceramente, não me recordo. A arquitectura aplicacional trata do problema da organização do homem no espaço, virtual.&lt;/p&gt;  &lt;p&gt;É isso então. Temos apenas que compreender melhor a natureza das diferentes relações entre estes objectos (e entre os objectos e o homem). Esse conhecimento, servir-nos-á de guia para desenhar qualquer arquitectura que venha a ser necessária.&lt;/p&gt;  &lt;p&gt;No próximo artigo vamos baixar um pouco a altitude. O ar por aqui é rarefeito.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/8255083232196546643/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/8255083232196546643' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8255083232196546643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8255083232196546643'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/10/arquitectura-aplicacional-introduo.html' title='A Arquitectura Aplicacional — Introdução'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-900159884262679787</id><published>2008-08-07T17:00:00.001+01:00</published><updated>2008-08-07T17:15:53.192+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Certificações"/><category scheme="http://www.blogger.com/atom/ns#" term="Exames"/><title type='text'>Microsoft Certification Roadmap</title><content type='html'>Quais as certificações que existem?&lt;br /&gt;Que exames escolher para obter uma certificação?&lt;br /&gt;E os requisitos? Qual a experiência necessária para cada um deles?&lt;br /&gt;&lt;br /&gt;As respostas a estas e outras questões poderão ser encontradas no seguinte link:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/portugal/technet/formacao/default.mspx#4&quot;&gt;http://www.microsoft.com/portugal/technet/formacao/default.mspx#4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Descarreguem os PDFs de acordo com o vosso perfil:&lt;br /&gt;&lt;br /&gt;-Profissionais de TI&lt;br /&gt;-Programadores</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/900159884262679787/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/900159884262679787' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/900159884262679787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/900159884262679787'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/08/microsoft-certification-roadmap.html' title='Microsoft Certification Roadmap'/><author><name>Sérgio Mértola</name><uri>http://www.blogger.com/profile/13056729026394818517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-2377787613010250157</id><published>2008-08-06T08:41:00.002+01:00</published><updated>2008-08-06T08:46:14.428+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Certificações"/><title type='text'>Resources for Microsoft Certified Professionals</title><content type='html'>Ser Microsoft Certified Professional tem algumas vantagens.&lt;br /&gt;&lt;br /&gt;Nomeadamente um conjunto de recursos que só estão disponíveis a quem&lt;br /&gt;tem uma certificação.&lt;br /&gt;&lt;br /&gt;Um site dedicado aos detentores de certificação:&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/learning/mcp/mcpmembersite.mspx&quot;&gt;http://www.microsoft.com/learning/mcp/mcpmembersite.mspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Um welcome kit que pode ser requisitado do Member Site:&lt;br /&gt;&lt;a href=&quot;https://mcp.microsoft.com/authenticate/login.aspx?ReturnUrl=https://mcp.microsoft.com/mcp/tools/WelcomeKitValidateAddress.aspx&quot;&gt;https://mcp.microsoft.com/authenticate/login.aspx?ReturnUrl=https://mcp.microsoft.com/mcp/tools/WelcomeKitValidateAddress.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Publicar o CV online no site de Membros:&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/learning/mcp/career/default.mspx&quot;&gt;http://www.microsoft.com/learning/mcp/career/default.mspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Explorem os links e descubram todas as vantagens de ser microsoft certified professional.&lt;br /&gt;&lt;br /&gt;Até à próxima.&lt;br /&gt;Luís</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/2377787613010250157/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/2377787613010250157' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/2377787613010250157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/2377787613010250157'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/08/resources-for-microsoft-certified.html' title='Resources for Microsoft Certified Professionals'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-3068869370196804479</id><published>2008-08-05T11:55:00.003+01:00</published><updated>2008-08-05T17:29:10.398+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Certificações"/><category scheme="http://www.blogger.com/atom/ns#" term="Exames"/><title type='text'>Microsoft Second Shot: O Regresso!</title><content type='html'>Nova oportunidade para ir a exame sem receios. A Microsoft voltou a lançar a campanha do &lt;span style=&quot;font-style: italic;&quot;&gt;Second Shot&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;Assim, será possível até &lt;span style=&quot;font-weight: bold;&quot;&gt;30 de Junho de 2009&lt;/span&gt; agendar novo exame e beneficiar desta campanha. Para os menos atentos recordamos a grande vantagem: em caso de insucesso no resultado do exame, será possível fazer nova marcação sem custos adicionais! Sempre são duas possibilidades...&lt;br /&gt;&lt;br /&gt;Apesar do prazo alargado, não vale a pena deixar para depois. Registem-se já.&lt;br /&gt;&lt;br /&gt;Em breve publicaremos mais informações sobre as certificações Microsoft.&lt;br /&gt;&lt;br /&gt;Microsoft Second Shot:&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/learning/mcp/offers/secondshot/default.mspx&quot;&gt;http://www.microsoft.com/learning/mcp/offers/secondshot/default.mspx&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/3068869370196804479/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/3068869370196804479' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3068869370196804479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3068869370196804479'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/08/microsoft-second-shot-o-regresso.html' title='Microsoft Second Shot: O Regresso!'/><author><name>Sérgio Mértola</name><uri>http://www.blogger.com/profile/13056729026394818517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-4320760295231607975</id><published>2008-07-03T00:55:00.001+01:00</published><updated>2008-07-03T01:00:00.787+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Qualidade"/><title type='text'>E por falar em Qualidade...</title><content type='html'>Mais um evento no âmbito da &lt;em&gt;Academia SK&lt;/em&gt;, associada ao &lt;em&gt;Training Center da Agap2&lt;/em&gt;. Trata-se da 4ª conferência, cujo o tema será &lt;strong&gt;Metodologias: PSP e TSP Integração Contínua”&lt;/strong&gt; que será apresentada pelo colega Luis Sousa.&lt;br /&gt;&lt;br /&gt;Quer saber como melhorar a sua própria performance com base em práticas de desenvolvimento de software pré-definidas?&lt;br /&gt;&lt;br /&gt;Participe e descubra o que é e para que servem os dois processos abordados nesta conferência.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Dia 21 de julho de 2008, pelas 19:00h&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Incrições para o e-mail&lt;/strong&gt; &lt;a href=&quot;mailto:carlas@agap2.com&quot;&gt;carlas@agap2.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Parabéns Luís pela iniciativa!&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/4320760295231607975/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/4320760295231607975' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/4320760295231607975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/4320760295231607975'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/07/e-por-falar-em-qualidade.html' title='E por falar em Qualidade...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-2217077289384342950</id><published>2008-06-29T12:02:00.002+01:00</published><updated>2008-06-29T12:30:55.807+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><title type='text'>Contra factos, não há argumentos</title><content type='html'>Segundo o &lt;a href=&quot;http://eval.symantec.com/mktginfo/enterprise/white_papers/ent-whitepaper_internet_security_threat_report_xii_09_2007.en-us.pdf&quot;&gt;2007 Symantec Internet Security Threat Report&lt;/a&gt;, as vulnerabilidades em Aplicações Web, representam 61% de todas as &#39;pragas&#39; conhecidas.&lt;br /&gt;&lt;br /&gt;FYI, eis aqui algumas delas:&lt;br /&gt;&lt;br /&gt;-Cross-Site Scripting&lt;br /&gt;-Cross-Site Request Forgery&lt;br /&gt;-SQL Injection (o famoso!)&lt;br /&gt;-XPATH Injection&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;É, ou não, motivo de preocupação?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/2217077289384342950/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/2217077289384342950' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/2217077289384342950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/2217077289384342950'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/contra-factos-no-h-argumentos.html' title='Contra factos, não há argumentos'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-7126915873962512178</id><published>2008-06-29T11:35:00.004+01:00</published><updated>2008-06-29T11:57:51.207+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><title type='text'>Qualidade!? O que é isso!?</title><content type='html'>Na passada sexta-feira, 27-06-2008, eu estive presente a um evento na Microsoft sobre &lt;em&gt;Qualidade e Rapidez no Desenvolvimento de Soluções,&lt;/em&gt; que faz parte do Ciclo &lt;em&gt;Application Lifecycle Management&lt;/em&gt;. Em um dos temas apresentados, nomeadamente, &lt;em&gt;A qualidade no Desenvolvimento de Softaware&lt;/em&gt;, cuja a &#39;vedeta&#39; principal era o VS 2008, um dos recursos abordados foi o &lt;strong&gt;Code Analysis&lt;/strong&gt; e, foi aqui que eu fiquei completamente &lt;strong&gt;estarrecido!&lt;/strong&gt; Imaginem que, em um auditório com mais de cem pessoas - sem medo de errar - uma pergunta foi &#39;lançada&#39;: &#39;Quem conhece a &#39;ferramenta&#39; &lt;strong&gt;Fxcop&lt;/strong&gt;?&#39; Sinceramente, nem mesmo umas dez pessoas levantaram o dedo :-(&lt;br /&gt;Eu conheço o &lt;strong&gt;Fxcop&lt;/strong&gt; desde a sua primeira versão, lançada em 2002 e, trata-se de uma ferramenta para &lt;strong&gt;Análise de Código&lt;/strong&gt;, chamado, estático. Ela foi aperfeiçoada e, junto com a ferramenta &lt;strong&gt;Code Metrics&lt;/strong&gt;, foi incorporada ao VS 2008.&lt;br /&gt;&lt;br /&gt;E, eu insisto, &#39;não existe Rapidez sem Qualidade&#39;. E, deixo aqui uma pergunta: &#39;Qual é Qualidade do Softaware desenvolvido em Portugal?&#39;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/7126915873962512178/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/7126915873962512178' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/7126915873962512178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/7126915873962512178'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/qualidade-o-que-isso.html' title='Qualidade!? O que é isso!?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-3343737424303695304</id><published>2008-06-18T22:46:00.003+01:00</published><updated>2008-06-18T23:04:24.840+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><title type='text'>Microsoft Security Development Lifecycle (SDL)</title><content type='html'>Para quem ainda não leu, vale a pena. O SDL, é o processo adotado pela Microsoft para o desenvolvimento de software, na própria Microsoft (sem ser redundante).&lt;br /&gt;O objectivo é a descoberta de vulnerabilidades de segurança durante as várias etapas do desenvolvimento de software.&lt;br /&gt;&lt;br /&gt;O documento pode ser obtido em:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=2412c443-27f6-4aac-9883-f55ba5b01814&amp;amp;displaylang=en&quot;&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=2412c443-27f6-4aac-9883-f55ba5b01814&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Boa leitura!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;              Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/3343737424303695304/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/3343737424303695304' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3343737424303695304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/3343737424303695304'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/microsoft-security-development.html' title='Microsoft Security Development Lifecycle (SDL)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-5315716018132740830</id><published>2008-06-10T22:48:00.002+01:00</published><updated>2008-06-10T22:56:55.048+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><title type='text'>&#39;Discutir&#39; segurança(2)</title><content type='html'>Eu penso nas ameaças e naquilo que posso fazer para combatê-las(contramedidas). Para conhecerem algumas dessas ameaças e suas respectivas contramedidas, dêem um &#39;salto&#39; em  &lt;a href=&quot;http://www.microsoft.com/portugal/seguranca/dadescanso/default_home.mspx&quot;&gt;http://www.microsoft.com/portugal/seguranca/dadescanso/default_home.mspx&lt;/a&gt; - A Microsoft Portugal, criou o sitio chamado &#39;&lt;strong&gt;Security MitingPoint&lt;/strong&gt;&#39; - lá, assistam ao webcast &#39;&lt;strong&gt;Threats and Countermeasures&lt;/strong&gt;&#39; em português. Entre outras coisas, este webcast aborda o &#39;&lt;strong&gt;STRIDE Threat Model&lt;/strong&gt;&#39;, que é a técnica usada para identificar e categorizar as ameaças de que uma Aplicação está exposta. Não percam!&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;             Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/5315716018132740830/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/5315716018132740830' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/5315716018132740830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/5315716018132740830'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/discutir-segurana2.html' title='&#39;Discutir&#39; segurança(2)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-7447943423985676323</id><published>2008-06-08T15:23:00.002+01:00</published><updated>2008-06-08T15:41:42.220+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Segurança"/><title type='text'>&#39;Discutir&#39; segurança</title><content type='html'>Quando ouvem falar sobre Segurança em Aplicações Web, o que pensam sobre isto? Partilhem os vossos pensamentos/opiniões aqui, no Blog!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;                Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/7447943423985676323/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/7447943423985676323' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/7447943423985676323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/7447943423985676323'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/discutir-segurana.html' title='&#39;Discutir&#39; segurança'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-8530574206106148529</id><published>2008-06-08T01:15:00.003+01:00</published><updated>2008-06-08T15:41:24.778+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>Princípios fundamentais</title><content type='html'>&quot;...If, as a software developer, you are not considering the correctness, performance and security of the code you are writing, the case can be made that you are not doing your job. When you initially start considering Correctness, Performance and Security, you will find yourself having to focus on one aspect at a time. As they become part of your day-to-day practice you will find that you do not need to focus on a specific aspect, they will simply be part of the way you work. When you have mastered them you will be able to intuitively make tradeoffs, and focus your efforts appropriately...&quot;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Gregor Noriskin&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Microsoft CLR Performance Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No meu caso, isto já faz parte do meu trabalho. Qual é o vosso caso?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/8530574206106148529/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/8530574206106148529' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8530574206106148529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8530574206106148529'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/princpios-fundamentais.html' title='Princípios fundamentais'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-4125455815308445345</id><published>2008-06-06T22:11:00.002+01:00</published><updated>2008-06-08T15:40:40.079+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>&quot;Não concatene Strings dentro de loops&quot;</title><content type='html'>No post anterior(&lt;em&gt;Reflectir sobre performance(2)&lt;/em&gt;), o exemplo utilizado &lt;strong&gt;viola&lt;/strong&gt; esta Regra. Porque, concatenar Strings nesta condição (&lt;em&gt;dentro de loops&lt;/em&gt;), faz com que novos Objectos String sejam criados, assim, precisam ser &lt;em&gt;Garbage Collected&lt;/em&gt;. A Classe &lt;strong&gt;StringBuilder&lt;/strong&gt;, ao contrário, evita o &lt;strong&gt;overhead&lt;/strong&gt; provocado pela criação de Objectos e o &lt;em&gt;Garbage Collection&lt;/em&gt;. Possui,&lt;br /&gt;adicionalmente, a capacidade de desfazer-se do seu buffer original e criar um novo buffer, com o dobro do tamanho, para &#39;acomodar&#39; a String.&lt;br /&gt;Eu sempre que, ao revisar um código, encontar-me diante de algo que viole uma regra qualquer, aplico o &#39;fix&#39; para tal violação. Mesmo em particulares situações, que poderia não aplicá-lo. Desta forma, mantenho a conformidade. Para mim, é uma questão de coerência de uma cultura que não a quero perder.&lt;br /&gt;&lt;br /&gt;Está é a minha opinião.&lt;br /&gt;&lt;br /&gt;Obrigado pelos comentários e,&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/4125455815308445345/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/4125455815308445345' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/4125455815308445345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/4125455815308445345'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/no-concatene-strings-dentro-de-loops.html' title='&quot;Não concatene Strings dentro de loops&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-641592781871169221</id><published>2008-06-06T00:03:00.002+01:00</published><updated>2008-06-06T22:11:01.759+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>Reflectir sobre performance(2)</title><content type='html'>O Visual Studio(VS) disponibiliza vários recursos que nos permitem desenvolver de forma rápida, nossas Aplicações. Essa rapidez, associada, intrinsicamente a produtividade, pode não refletir-se em &quot;&lt;strong&gt;desempenho&lt;/strong&gt;&quot; para a Aplicação. No nosso contexto, tomemos o exemplo mais básico possivel:&lt;br /&gt;Para escrevermos uma estrutura de decisão, digitamos If e, logo em seguida, carregamos a tecla TAB. O VS cria a seguinte estrutura:&lt;br /&gt;&lt;br /&gt;=Produtividade&lt;br /&gt;&lt;br /&gt;if (true)&lt;br /&gt; {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mas, se &lt;em&gt;reflectirmos sobre performance&lt;/em&gt;, quando aplicável, o melhor seria pensarmos em uma estrutura deste tipo:&lt;br /&gt;&lt;br /&gt;=Produtividade e Performance&lt;br /&gt;&lt;br /&gt;switch (switch_on)&lt;br /&gt; {                  &lt;br /&gt;     default:&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Reflectir sobre performance requer algumas prerrogativas, entre elas, saber o que é melhor para o &lt;strong&gt;desempenho&lt;/strong&gt; de uma Aplicação. Isto pode também chamar-se &lt;em&gt;best pratices&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Já agora, o que está mal no código a seguir?&lt;br /&gt;&lt;br /&gt;static void ReflectirSobrePerformance()&lt;br /&gt;      {&lt;br /&gt;         string digitos = string.Empty;&lt;br /&gt;         for(int i = 0; i &lt; 10; i++)&lt;br /&gt;         {&lt;br /&gt;            digitos += i.ToString(currentCulture);&lt;br /&gt;         }&lt;br /&gt;         Console.WriteLine(digitos);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;Reflictam sobre performance!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/641592781871169221/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/641592781871169221' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/641592781871169221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/641592781871169221'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/reflectir-sobre-performance2.html' title='Reflectir sobre performance(2)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4057075479181140736.post-8268874702286165719</id><published>2008-06-04T23:11:00.002+01:00</published><updated>2008-06-04T23:26:43.199+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>Eu prometo!</title><content type='html'>Levante-se, erga a mão direita e repita:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&quot;I promise I will not ship slow code. Speed is a feature I care about. Every day I will pay attention to the performance of my code. I will regularly and methodically measure its speed and size. I will learn, build, or buy the tools I need to do this. It&#39;s my responsibility.&quot;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Jan Gray&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Microsoft CLR Performance Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Até ao próximo post!&lt;br /&gt;&lt;br /&gt;Fernando Oliveira&lt;br /&gt;Agap2 Developer&lt;br /&gt;MCTS - .NET Framework 2.0&lt;br /&gt;               Web Applications</content><link rel='replies' type='application/atom+xml' href='http://agap2msft.blogspot.com/feeds/8268874702286165719/comments/default' title='Enviar feedback'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4057075479181140736/8268874702286165719' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8268874702286165719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4057075479181140736/posts/default/8268874702286165719'/><link rel='alternate' type='text/html' href='http://agap2msft.blogspot.com/2008/06/eu-prometo.html' title='Eu prometo!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>