|
|
Minha idéia com este blog é postar experiências e soluções para problemas encontrados durante o envolvimento com a tecnologia.
|
|
|
|
Performance com CACHE do ASP.NET
Thursday, May 03, 2007 11:23 AM
Olá pessoal, Vou contar aqui minha experiência com o CACHE do ASP.NET. Para quem não conhece o Cache é um espaço de memória em que podemos guardar qualquer objeto, de forma com que esse possa expirar em algum momento, seja de forma programada ou não.
Comecei a usar o cache do asp.net como meu primeiro recurso. Estava usando para um componente que tratava imagens e criava uma URL que seria lida pelo browser nas tags imgs. De inicio funcionou bem, porém, quando o uso se tornou mais profundo, aleatóriamente, as imagens que eu colocava no cache do asp.net sumiam, muitas vezes imediatamente após ser inseridas. Mais tarde, estudando o cache de forma mais profunda, descobri que isso se devia a falta de memória no servidor. O asp.net retira do cache os itens quando não há memória ram disponível, mesmo que o item ainda não tenha expirado.
A partir daí, comecei a usar o Cache como apoio. Ou seja, se algum item não existe no cache do asp.net, eu crio/busco esse item e insiro no cache. Se ja existe o item eu uso. Com isso você consegue obter uma boa performance em suas aplicações.
Para quem usa muito acesso a dados, você pode guardar algumas tabelas ou arrays de classes no cache. Procure guardar tabelas que você acessa frequentemente, mas que são pouco mutáveis. Por exemplo, listas de tipos para popular dropdownlists.
Então é isso. Quem quiser exemplos de uso do cache escreva.
Um abraço.
Problemas com MagicAjax
Thursday, November 16, 2006 10:39 AM
Para os usuários do MagicAjax, muita gente pode não ter percebido, mas há um bug na versão para o framework 2 quando usamos uma pagina com <head runat="server">. Se você exibir o código fonte gerado vai notar que a tag <head> está lá duas vezes, uma dentro da outra.
<head><head><title> Untitled Page </title></head></head> Então para quem quiser resolver o problema, basta baixar os fontes do site (http://www.magicajax.net/) e trocar a linha 582 do arquivo AjaxCallHelper.cs para
writer.Write(header.Substring(header.IndexOf(">") +1).Replace("</head>", ""));Isso acontece porque o magic ajax precisa sobrepor o render da head, mas ele nao deveria fazer isso na primeira chamada da pagina, mas ele faz.. Com essa linha resolve o problema.
Red Five leva tecnologia .NET até aos terminais Symbian
Wednesday, November 15, 2006 9:48 PM
por pcdebolso, quarta-feira, 28 de Junho de 2006 A empresa sul-africana Red Five Labs anunciou que irá lançar brevemente um implementação do .NET Compact Framework destinada a terminais Symbian S60.
A
unificação da plataforma mais popular do mercado, representando mais de
60% dos Smartphones e PDA Phones existentes, e da tecnologia e
ferramentas de desenvolvimento da Microsoft poderá criar uma nova
janela de oportunidade para a comunidade de programadores.
Permitindo
que as aplicações desenvolvidas para as plataformas Windows Mobile
possam correr sem qualquer tipo de alteração nos terminais da Nokia,
Sony-Ericsson ou Samsung, a solução da Red Five oferece às equipas de
desenvolvimento, operadoras móveis ou fabricantes uma oportunidade de
consolidar e rentabilizar os seus investimentos no segmento móvel. Com
este passo é esperado que mais aplicações para a plataforma rival do
Windows Mobile venham a aparecer, usufruindo do avanço tecnológico que
a plataforma Symbian regista para oferecer serviços mais completos e
inovadores.
http://www.redfivelabs.com/
Resolvendo o bug da combobox no I.E nos Menus do .NET
Monday, November 13, 2006 9:26 AM
Muita gente se depara com um certo "bug" que é muito irritante. Há pouco material na internet pra solução deste problema. O fato é que independente do CSS aplicado sobre comboboxes (DropDownList / <select>), elas sempre ficam por cima de qualquer outra coisa nas páginas.
Mas já foi descoberta uma maneira de fazer com que coisas fiquem por cima da combobox. O problema é que o I.E mostra as caixas dropdown de forma 'windowed' ou seja, ele atribui um HWND para elas, fazendo com que sejam uma janela, ficando assim por cima de qualquer outro componente de uma página.
Enfim, o fato é que somente um componente consegue sobrepor às dropdowns, são as IFRAMES. A técnica é por a Iframe por cima da combo, e o que se quer em cima da combo por cima da iframe, usando o CSS z-index.
A minha idéia foi resolver este problema inicialmente no WebControl Menus do Framework, para isso criei uma classe que herda da classe Menu do .net, sendo possível assim anexar um javascript que aplica a técnica explicada para este WebControl.
Você vai incluir numa Class Library dois arquivos: menu.cs e menu.js sendo este ultimo do tipo Embedded Resource
Este é o menu.cs
[assembly: WebResource("MinhaDLL.menu.js", "text/javascript")]
namespace Web.UI.WebControls {
public class Menu : System.Web.UI.WebControls.Menu { protected override void OnPreRender(EventArgs e) { if (!this.DesignMode) this.Page.ClientScript.RegisterClientScriptResource(this.GetType(), "MinhaDLL.menu.js"); base.OnPreRender(e); }
protected override void Render(HtmlTextWriter writer) { base.Render(writer); if (!this.DesignMode) { string script = "" + "<script type=\"text/javascript\">\r\n" + "Menu_Rescan(\"" + this.ClientID + "\");\r\n" + "</script>"; writer.WriteLine(script); } } } }
Em seguida o arquivo menu.js:
var __Menus = new Array();
function Menu_FindTD(node) { node = node.parentElement; if (!node) { return null; } if (node.tagName == "TD" && node.onmouseover) { return node; } else { return Menu_FindTD(node); } }
function Menu_FindTR(node) { node = node.parentElement; if (!node) { return null; } if (node.tagName == "TR" && node.onmouseover) { return node; } else { return Menu_FindTR(node); } }
function Menu_CreateIframe(objpos) { if (document.createElement) { var iframe = document.createElement("iframe"); iframe.src=""; iframe.frameborder = 0; iframe.style.position = "absolute"; iframe.style.left = objpos.x + "px"; iframe.style.top = objpos.y + "px"; iframe.style.width = objpos.width + "px"; iframe.style.height = objpos.height + "px";
iframe.style.zIndex = 100000; iframe.style.visibility = "visible"; iframe.style.filter = "Alpha(opacity=0)"; if (iframe.style.filters) { iframe.style.filters.item("Alpha").Opacity = 0; } document.body.appendChild(iframe);
return iframe; } }
function Menu_CheckUnhide() { if (__Menus.length > 0) { for(var i =0; i<__Menus.length;i++) { if (__Menus[i].frm && __Menus[i].obj) { __Menus[i].frm.style.visibility=__Menus[i].obj.style.visibility; }
if (__Menus[i].obj.style.visibility=="hidden" && __Menus[i].root) { var node = (__Menus[i].root.tagName.toLowerCase() == "td") ? __Menus[i].root: __Menus[i].root.cells[0]; var nodeTable = WebForm_GetElementByTagName(node, "table"); if (nodeTable.hoverClass) { WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass); } node = nodeTable.rows[0].cells[0].childNodes[0]; if (node.hoverHyperLinkClass) { WebForm_RemoveClassName(node, node.hoverHyperLinkClass); } } } } setTimeout("Menu_CheckUnhide()", 15); }
function Menu_Manipulate(item, isroot) { var node = (item.tagName.toLowerCase() == "td") ? item: item.cells[0]; var nodeTable = WebForm_GetElementByTagName(node, "table"); node = nodeTable.rows[0].cells[0].childNodes[0]; var child = Menu_FindSubMenu(node); if (child) { if (document.all) { Menu_RescanDynamic(child.firstChild); } else { Menu_RescanDynamic(child); } var doCreateItem = -1; if (__Menus.length > 0) { for (var i =0;i<__Menus.length;i++) { if (__Menus[i].obj == child) doCreateItem = i; if (__Menus[i].frm) __Menus[i].frm.style.visibility=__Menus[i].obj.style.visibility; } } var objpos; if (doCreateItem==-1) { objpos = WebForm_GetElementPosition(child); var it = new Object(); it.obj = child; if (document.all) { var frm = Menu_CreateIframe(objpos); it.frm = frm; } if (isroot) { it.root = item; } else { it.root = null; } it.originalpos = objpos; __Menus.push(it); } else { objpos = __Menus[doCreateItem].originalpos; } if (isroot) { Menu_HoverRoot(item);
var top = new Number(child.style.top.replace(/px/ig, "")); child.style.top = (top - 1) + "px"; if (child.parentElement) { child.parentElement.style.top=(top - 1) + "px"; child.parentElement.style.filter = "Alpha(opacity=0)"; } } else { if (document.all) WebForm_SetElementX(child, objpos.x - 3); } child.style.zIndex = 100001; } else { //alert("child not found"); }
}
function Menu_ManipulateDynamic(item) { var node = (item.tagName.toLowerCase() == "tr") ? item: item.rows[0]; var nodeTable = WebForm_GetElementByTagName(node, "table"); node = nodeTable.rows[0].cells[0].childNodes[0]; //var node = Menu_HoverRoot(item); var child = Menu_FindSubMenu(node); if (child) { child.style.zIndex = 100001; } }
function Menu_Rescan(clientid) { var tb = document.getElementById(clientid); var tds = tb.getElementsByTagName("td"); for (var i = 0; i < tds.length; i++) { if (tds[i].onmouseover) { if (tds[i].addEventListener){ tds[i].addEventListener("mouseover", function() {Menu_Manipulate(this, true);}, false); } else if (tds[i].attachEvent){ tds[i].attachEvent("onmouseover", function() { Menu_Manipulate(Menu_FindTD(event.srcElement), true); }); } } } Menu_CheckUnhide(); }
function Menu_RescanDynamic(divroot) { if (divroot) { var trs = divroot.getElementsByTagName("tr"); for (var i = 0; i < trs.length; i++) { if (trs[i].onmouseover) { if (trs[i].addEventListener){ trs[i].addEventListener("mouseover", function() {Menu_ManipulateDynamic(this);}, false); } else if (trs[i].attachEvent){ trs[i].attachEvent("onmouseover", function() { Menu_Manipulate(Menu_FindTR(event.srcElement), false); }); }
} } } }
Agradecimentos à Rachel Carvalho com idéias e principalmente TESTES de estresse!
Ficando por aqui. Espero que tenha sido útil. Deixem seus comentários.
|
|
|
|
|
|
| | Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| 30 | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 14 | 15 | 16 | 17 | 18 | 19 | 20 | | 21 | 22 | 23 | 24 | 25 | 26 | 27 | | 28 | 29 | 30 | 31 | 1 | 2 | 3 | | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
|
|
|
|
|
|
|
|