


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OsMeusApontamentos &#187; programar</title>
	<atom:link href="http://blog.osmeusapontamentos.com/index.php/tag/programar/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.osmeusapontamentos.com</link>
	<description></description>
	<lastBuildDate>Wed, 01 Feb 2012 14:20:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>&#8216;ScriptManager&#8217; is ambiguous in the namespace &#8216;System.Web.UI&#8217;</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2009/04/26/scriptmanager-is-ambiguous-in-the-namespace-systemwebui/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2009/04/26/scriptmanager-is-ambiguous-in-the-namespace-systemwebui/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 11:14:08 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[programar]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=1466</guid>
		<description><![CDATA[Ao importar um projecto feito por outra pessoa para a minha máquina, depois de o compilar e publicar comecei a ter o seguinte erro: &#8216;ScriptManager&#8217; is ambiguous in the namespace &#8216;System.Web.UI&#8217;. A única particularidade deste projecto era utilizar o MS Ajax com script manager e update panels. Depois de muitas voltas para tentar resolver esta [...]]]></description>
			<content:encoded><![CDATA[<p>Ao importar um projecto feito por outra pessoa para a minha máquina, depois de o compilar e publicar comecei a ter o seguinte erro:</p>
<p>&#8216;ScriptManager&#8217; is ambiguous in the namespace &#8216;System.Web.UI&#8217;.</p>
<p>A única particularidade deste projecto era utilizar o MS Ajax com script manager e update panels.<br />
Depois de muitas voltas para tentar resolver esta situação, a solução que me parece mais acertada foi a que encontrei <a href="http://weblogs.asp.net/javiervillarreal/archive/2008/01/30/the-type-system-web-ui-scriptmanager-is-ambiguous-it-could-come-from-assembly.aspx#5680517">aqui</a> e consistem em acrescentar no webconfig.xml as seguintes entradas:</p>
<pre lang="xml">
<runtime>
 <assemblybinding xmlns="urn:schemas-microsoft-com:asm.v1">
   <dependentassembly>
     <assemblyidentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
     <bindingredirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
   </dependentassembly>
   <dependentassembly>
     <assemblyidentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
     <bindingredirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
   </dependentassembly>
 </assemblybinding>
</runtime>
</pre>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2009/04/26/scriptmanager-is-ambiguous-in-the-namespace-systemwebui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>asp.net page flow (user controls) #2</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2008/09/25/aspnet-page-flow-user-controls-2/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2008/09/25/aspnet-page-flow-user-controls-2/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 14:33:11 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[programar]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=658</guid>
		<description><![CDATA[A propósito do artigo asp.net page flow (user controls), um colega aqui do meu departamento na Primavera alertou-me (e bem) do eventual perigo da utilização da variáveis estáticas. Onde eu dizia &#8220;Outro pormenor interessante é a utilização de variáveis estáticas (static / shared) que basicamente persistem o seu valor entre postbacks e estão logo disponiveis [...]]]></description>
			<content:encoded><![CDATA[<p>A propósito do artigo <a href="http://blog.osmeusapontamentos.com/?p=567">asp.net page flow (user controls)</a>, um colega aqui do meu departamento na <a href="http://www.primaverabss.com">Primavera</a> alertou-me (e bem) do eventual perigo da utilização da variáveis estáticas.</p>
<p>Onde eu dizia &#8220;Outro pormenor interessante é a utilização de variáveis estáticas (static / shared) que basicamente persistem o seu valor entre postbacks e estão logo disponiveis no primeiro evento &#8211; Init.&#8221;</p>
<p>Deveria ter dito: Naturalmente as variáveis estáticas (static / shared) mantêm o seu valor entre postbacks precisamente pelo facto de serem estáticas e por isso não implicarem a criação de uma nova instância. Ao fim e ao cabo é o padrão singleton em acção. No caso do ASP.Net, como tudo corre dentro do mesmo processo isto quase que se traduz numa espécie de variavel do tipo Application.</p>
<p>alguns links:<a href="http://msdn.microsoft.com/en-us/library/ms973875.aspx"></a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms973875.aspx">Shared Variables in Classes</a> &#8211; A shared variable is created just once for any objects that are declared of a certain class type.<br />
<a href="http://www.velocityreviews.com/forums/showpost.php?s=edcdbde9044ad0ac81c9e36ae0d130fa&amp;p=481922&amp;postcount=9">Persistent to a client action (postback) in ASPNET</a> are<br />
A viewstate item (belongs to the page)<br />
A session item (belongs as IIS part to the client)<br />
A shared variable (belongs to the application)<br />
A cache item (is used by the total application)</p>
<p>When you <a href="http://forums.thedailywtf.com/forums/p/9357/176768.aspx#176768">store data in a static variable</a>, the data is available to all users on the entire AppDomain. If you need a single instance of some object per user, put it in the Session instead.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2008/09/25/aspnet-page-flow-user-controls-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Date Cloud</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2008/09/12/data-cloud/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2008/09/12/data-cloud/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 15:00:42 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[programar]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=624</guid>
		<description><![CDATA[Como preparação para um novo layout aqui fica uma peça que vou precisar que é uma date cloud ou seja seguir o mesmo principio para criar uma tag cloud mas usar isso para criar os links para o arquivo. O ideal é depois transformar isto num plugin mas por enquanto limitei-me a ver qual o [...]]]></description>
			<content:encoded><![CDATA[<p>Como preparação para um novo layout aqui fica uma peça que vou precisar que é uma date cloud ou seja seguir o mesmo principio para criar uma tag cloud mas usar isso para criar os links para o arquivo.<br />
O ideal é depois transformar isto num plugin mas por enquanto limitei-me a ver qual o comportamento normal do wordpress e fiz as alterações necessárias para obter aquilo que pretendia.<br />
em baixo está o exemplo concreto bem como o código.<br />
algumas notas:</p>
<ul>
<li>alterar a função get_archives_link que está em general-template.php<br />
tiver que acrescentar mais um tipo de formato (habitualmente link ou html) porque não pude usar o custom já que ele inseria automaticamente uma quebra de linha
</li>
<li>alterar a função get_archives_link de forma a fazer o processamento necessário para a tag cloud. tão simples quanto ver qual o mês com mais posts e depois enquadrar cada mês no text-size correspondente: smallest, small, normal, large, largest</li>
</ul>
<phpcode>
<?php </p>
<p>$args = 'type=monthly&#038;link=html&#038;before=I&#038;after=A&#038;show_post_count=1';<br />
	global $wpdb, $wp_locale;</p>
<p>	$defaults = array(<br />
		'type' => &#8216;monthly&#8217;, &#8216;limit&#8217; => &#8221;,<br />
		&#8216;format&#8217; => &#8216;html&#8217;, &#8216;before&#8217; => &#8221;,<br />
		&#8216;after&#8217; => &#8221;, &#8216;show_post_count&#8217; => false<br />
	);</p>
<p>	$r = wp_parse_args( $args, $defaults );<br />
	extract( $r, EXTR_SKIP );</p>
<p>	if ( &#8221; == $type )<br />
		$type = &#8216;monthly&#8217;;</p>
<p>	if ( &#8221; != $limit ) {<br />
		$limit = absint($limit);<br />
		$limit = &#8216; LIMIT &#8216;.$limit;<br />
	}</p>
<p>	$before = &#8216;<span style=\'font-size:%1$s\'>&#8216;;<br />
	$after = &#8216;</span>&nbsp;&#8217;;</p>
<p>	// this is what will separate dates on weekly archive links<br />
	$archive_week_separator = &#8216;&#8211;&#8217;;</p>
<p>	// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride<br />
	$archive_date_format_over_ride = 0;</p>
<p>	// options for daily archive (only if you over-ride the general date format)<br />
	$archive_day_date_format = &#8216;Y/m/d&#8217;;</p>
<p>	// options for weekly archive (only if you over-ride the general date format)<br />
	$archive_week_start_date_format = &#8216;Y/m/d&#8217;;<br />
	$archive_week_end_date_format	= &#8216;Y/m/d&#8217;;</p>
<p>	if ( !$archive_date_format_over_ride ) {<br />
		$archive_day_date_format = get_option(&#8216;date_format&#8217;);<br />
		$archive_week_start_date_format = get_option(&#8216;date_format&#8217;);<br />
		$archive_week_end_date_format = get_option(&#8216;date_format&#8217;);<br />
	}</p>
<p>	//filters<br />
	$where = apply_filters(&#8216;getarchives_where&#8217;, &#8220;WHERE post_type = &#8216;post&#8217; AND post_status = &#8216;publish&#8217;&#8221;, $r );<br />
	$join = apply_filters(&#8216;getarchives_join&#8217;, &#8220;&#8221;, $r);	</p>
<p>	if ( &#8216;monthly&#8217; == $type ) {<br />
		$query = &#8220;SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit&#8221;;<br />
		$key = md5($query);<br />
		$cache = wp_cache_get( &#8216;wp_get_archives&#8217; , &#8216;general&#8217;);<br />
		if ( !isset( $cache[ $key ] ) ) {<br />
			$arcresults = $wpdb->get_results($query);<br />
			$cache[ $key ] = $arcresults;<br />
			wp_cache_add( &#8216;wp_get_archives&#8217;, $cache, &#8216;general&#8217; );<br />
		} else {<br />
			$arcresults = $cache[ $key ];<br />
		}<br />
		if ( $arcresults ) {<br />
			$max=0;<br />
			foreach ( $arcresults as $arcresult ) {<br />
				if ($arcresult->posts > $max) $max = $arcresult->posts;<br />
			}<br />
		}</p>
<p>		if ( $arcresults ) {<br />
			$afterafter = $after;<br />
			foreach ( $arcresults as $arcresult ) {<br />
				$url	= get_month_link($arcresult->year,	$arcresult->month);<br />
				$text = sprintf(__(&#8216;%1$s %2$d&#8217;), substr($wp_locale->get_month($arcresult->month), 0, 3), $arcresult->year);</p>
<p>				$tamanho = &#8221;;<br />
				if (($arcresult->posts / $max) >= (6/7))<br />
					$tamanho = &#8216;xx-large&#8217;;<br />
				elseif (($arcresult->posts / $max) >= (5/7))<br />
					$tamanho = &#8216;x-large&#8217;;<br />
				elseif (($arcresult->posts / $max) >= (4/7))<br />
					$tamanho = &#8216;large&#8217;;<br />
				elseif (($arcresult->posts / $max) >= (3/7))<br />
					$tamanho = &#8216;medium&#8217;;<br />
				elseif (($arcresult->posts / $max) >= (2/7))<br />
					$tamanho = &#8216;small&#8217;;<br />
				elseif (($arcresult->posts / $max) >= (1/7))<br />
					$tamanho = &#8216;x-small&#8217;;<br />
				elseif (($arcresult->posts / $max) >= (0))<br />
					$tamanho = &#8216;xx-small&#8217;;</p>
<p>				if ( $show_post_count )<br />
					$after = &#8216;&nbsp;(&#8216;.$arcresult->posts.&#8217;)&#8217; . $afterafter;<br />
				echo vs_get_archives_link($url, $text, &#8216;dataCloud&#8217;, sprintf($before, $tamanho), $after);<br />
			}<br />
		}<br />
	}	</p>
<p>/* link navigation hack by Orien http://icecode.com/ */<br />
function vs_get_archives_link($url, $text, $format = &#8216;html&#8217;, $before = &#8221;, $after = &#8221;) {<br />
	$text = wptexturize($text);<br />
	$title_text = attribute_escape($text);<br />
	$url = clean_url($url);</p>
<p>	if (&#8216;link&#8217; == $format)<br />
		$link_html = &#8220;\t
<link rel='archives' title='$title_text' href='$url' />\n&#8221;;<br />
	elseif (&#8216;option&#8217; == $format)<br />
		$link_html = &#8220;\t<br />
<option value='$url'>$before $text $after</option>
<p>\n&#8221;;<br />
	elseif (&#8216;html&#8217; == $format)<br />
		$link_html = &#8220;\t
<li>$before<a href='$url' title='$title_text'>$text</a>$after</li>
<p>\n&#8221;;<br />
	elseif (&#8216;dataCloud&#8217; == $format)<br />
		$link_html = &#8220;$before<a href='$url' title='$title_text'>$text</a>$after&#8221;;<br />
	else // custom<br />
		$link_html = &#8220;\t$before<a href='$url' title='$title_text'>$text</a>$after\n&#8221;;</p>
<p>	$link_html = apply_filters( &#8220;get_archives_link&#8221;, $link_html );</p>
<p>	return $link_html;<br />
}</p>
<p> ?>
</phpcode>
<pre lang="php">
$args = 'type=monthly&#038;format=link&#038;before=I&#038;after=A&#038;show_post_count=1';
global $wpdb, $wp_locale;

$defaults = array(
	'type' => 'monthly', 'limit' => '',
	'format' => 'html', 'before' => '',
	'after' => '', 'show_post_count' => false
);

$r = wp_parse_args( $args, $defaults );
extract( $r, EXTR_SKIP );

if ( '' == $type )
	$type = 'monthly';

if ( '' != $limit ) {
	$limit = absint($limit);
	$limit = ' LIMIT '.$limit;
}

$before = '<span style=\'font-size:%1$s\'>';
$after = '</span>&nbsp;';

// this is what will separate dates on weekly archive links
$archive_week_separator = '&#8211;';

// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride
$archive_date_format_over_ride = 0;

// options for daily archive (only if you over-ride the general date format)
$archive_day_date_format = 'Y/m/d';

// options for weekly archive (only if you over-ride the general date format)
$archive_week_start_date_format = 'Y/m/d';
$archive_week_end_date_format	= 'Y/m/d';

if ( !$archive_date_format_over_ride ) {
	$archive_day_date_format = get_option('date_format');
	$archive_week_start_date_format = get_option('date_format');
	$archive_week_end_date_format = get_option('date_format');
}

//filters
$where = apply_filters('getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );
$join = apply_filters('getarchives_join', "", $r);	

if ( 'monthly' == $type ) {
	$query = "SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";
	$key = md5($query);
	$cache = wp_cache_get( 'wp_get_archives' , 'general');
	if ( !isset( $cache[ $key ] ) ) {
		$arcresults = $wpdb->get_results($query);
		$cache[ $key ] = $arcresults;
		wp_cache_add( 'wp_get_archives', $cache, 'general' );
	} else {
		$arcresults = $cache[ $key ];
	}
	if ( $arcresults ) {
		$max=0;
		foreach ( $arcresults as $arcresult ) {
			if ($arcresult->posts > $max) $max = $arcresult->posts;
		}
	}

	if ( $arcresults ) {
		$afterafter = $after;
		foreach ( $arcresults as $arcresult ) {
			$url	= get_month_link($arcresult->year,	$arcresult->month);
			$text = sprintf(__('%1$s %2$d'), substr($wp_locale->get_month($arcresult->month), 0, 3), $arcresult->year);

			$tamanho = '';
			if (($arcresult->posts / $max) >= (4/5))
				$tamanho = 'largest';
			elseif (($arcresult->posts / $max) >= (3/5))
				$tamanho = 'large';
			elseif (($arcresult->posts / $max) >= (2/5))
				$tamanho = 'normal';
			elseif (($arcresult->posts / $max) >= (1/5))
				$tamanho = 'small';
			else
				$tamanho = 'smaller';

			if ( $show_post_count )
				$after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
			echo vs_get_archives_link($url, $text, 'dataCloud', sprintf($before, $tamanho), $after);
		}
	}
}	

/* link navigation hack by Orien http://icecode.com/ */
function vs_get_archives_link($url, $text, $format = 'html', $before = '', $after = '') {
	$text = wptexturize($text);
	$title_text = attribute_escape($text);
	$url = clean_url($url);

	if ('link' == $format)
		$link_html = "\t
<link rel='archives' title='$title_text' href='$url' />\n";
	elseif ('option' == $format)
		$link_html = "\t
<option value='$url'>$before $text $after</option>

\n";
	elseif ('html' == $format)
		$link_html = "\t
<li>$before<a href='$url' title='$title_text'>$text</a>$after</li>

\n";
	elseif ('dataCloud' == $format)
		$link_html = "$before<a href='$url' title='$title_text'>$text</a>$after";
	else // custom
		$link_html = "\t$before<a href='$url' title='$title_text'>$text</a>$after\n";

	$link_html = apply_filters( "get_archives_link", $link_html );

	return $link_html;
}
</pre>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2008/09/12/data-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox History</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2008/09/11/firefox-history/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2008/09/11/firefox-history/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 16:24:27 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[programar]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=573</guid>
		<description><![CDATA[como o firefox guarda o historico (paginas por onde passamos) numa base de dados (sqlite) podemos nós proprios fazer uns querizitos para saber aquelas coisas interessantes do tipo qual o site que mais visitei, o dia em que vi mais sites, etc. exemplo: SELECT session,COUNT(* ),MAX(visit_date),MIN(visit_date) FROM moz_historyvisits GROUP BY session ORDER BY COUNT(* ) [...]]]></description>
			<content:encoded><![CDATA[<p>como o firefox guarda o historico (paginas por onde passamos) numa base de dados (sqlite) podemos nós proprios fazer uns querizitos para saber aquelas coisas interessantes do tipo qual o site que mais visitei, o dia em que vi mais sites, etc.</p>
<p><code>exemplo:</code><code><span style="font-size: 10pt; font-family: Courier New;"><code><span style="font-size: 10pt; font-family: Courier New;"><br />
</span></code></span></code><code><span style="font-size: 10pt; font-family: Courier New;"><code><span style="font-size: 10pt; font-family: Courier New;"><span style="color: blue;">SELECT</span> <span style="color: maroon;">session</span><span style="color: silver;">,</span><span style="font-weight: bold; color: fuchsia;">COUNT</span><span style="color: silver;">(</span><span style="color: silver;">*</span> <span style="color: silver;">)</span><span style="color: silver;">,</span><span style="font-weight: bold; color: fuchsia;">MAX</span><span style="color: silver;">(</span><span style="color: maroon;">visit_date</span><span style="color: silver;">)</span><span style="color: silver;">,</span><span style="font-weight: bold; color: fuchsia;">MIN</span><span style="color: silver;">(</span><span style="color: maroon;">visit_date</span><span style="color: silver;">)</span><br />
<span style="color: blue;">FROM</span> <span style="color: maroon;">moz_historyvisits</span><br />
<span style="color: blue;">GROUP</span> <span style="color: blue;">BY</span> <span style="color: maroon;">session</span><br />
<span style="color: blue;">ORDER</span> <span style="color: blue;">BY</span> <span style="font-weight: bold; color: fuchsia;">COUNT</span><span style="color: silver;">(</span><span style="color: silver;">*</span> <span style="color: silver;">)</span> <span style="color: blue;">DESC</span></span></code></span></code></p>
<p>eu executei isto no sqlite manager que é um addon do firefox e depois apontei para %APPDATA%\Mozilla\Firefox\Profiles\ tal e coisa \places.sqlite<br />
como o campo visit_date devolve uma coisa estranha que não é uma data saltei para o vb.net e fiz um programeta para ir mastigar essa informação para ver o que consigo fazer com ela.</p>
<p>tive primeiro que instalar o System.Data.SQLite. Depois tirando um ou outro stress com um erro que dá quando o firefox está aberto (file lock) não tive nenhum problema</p>
<p>Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click</p>
<p>&#8216;%APPDATA%\Mozilla\Firefox\Profiles\<br />
Dim cnn As SQLiteConnection<br />
Try<br />
cnn = New SQLiteConnection(&#8220;data source=c:\Users\vitor.silva\AppData\Roaming\Mozilla\Firefox\Profiles\646vwtnu.default\places.sqlite&#8221;)<br />
cnn.Open()</p>
<p>Dim myCommand As New SQLiteCommand(cnn)<br />
myCommand.CommandText = &#8220;select session, count(*) [numero Sites], max(visit_date) [dataFim], min(visit_date) [dataInicio] FROM moz_historyvisits  group by session order by count(*) desc&#8221;</p>
<p>Dim reader As SQLiteDataReader = myCommand.ExecuteReader()</p>
<p>While reader.Read()<br />
Console.WriteLine(String.Format(&#8220;{0}; {1}; {3}; {2}&#8221;, reader.Item(0).ToString(), reader.Item(1).ToString(), Convert(CLng(reader.Item(2))).ToString(), Convert(CLng(reader.Item(3))).ToString()))<br />
End While<br />
Catch ex As Exception<br />
Debug.Print(ex.ToString())<br />
End Try</p>
<p>End Sub</p>
<p>Private Function Convert(ByVal numero As Long) As DateTime<br />
Dim prTimeInMillis As Long<br />
prTimeInMillis = CLng(CLng(numero) / 1000)</p>
<p>Dim prDateTime As New DateTime(1970, 1, 1)<br />
Return prDateTime.AddMilliseconds(prTimeInMillis)<br />
End Function</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2008/09/11/firefox-history/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>asp.net page flow (user controls)</title>
		<link>http://blog.osmeusapontamentos.com/index.php/2008/09/09/aspnet-page-flow-user-controls/</link>
		<comments>http://blog.osmeusapontamentos.com/index.php/2008/09/09/aspnet-page-flow-user-controls/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 09:32:40 +0000</pubDate>
		<dc:creator>vitorsilva</dc:creator>
				<category><![CDATA[ler/ ver/ ouvir/ passear]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[programar]]></category>

		<guid isPermaLink="false">http://blog.osmeusapontamentos.com/?p=567</guid>
		<description><![CDATA[cenário: aspx que faz o render de todas as outras páginas, aliás System.Web.UI.UserControl main.aspx - userControl.ascx &#8211; componenteExistente.ascx em vez da sequência PreInit, Init, InitComplete, PreLoad, Load, LoadComplete, SaveStateComplete, PreRender, PreRenderComplete de uma aspx tradicional temos uma sequencia bem mais curta de Init, Load e PreRender. Para além de perceber a sequência dos eventos precisava [...]]]></description>
			<content:encoded><![CDATA[<p>cenário:<br />
aspx que faz o render de todas as outras páginas, aliás System.Web.UI.UserControl<br />
main.aspx<br />
- userControl.ascx<br />
&#8211; componenteExistente.ascx</p>
<p>em vez da sequência PreInit, Init, InitComplete, PreLoad, Load, LoadComplete, SaveStateComplete, PreRender, PreRenderComplete de uma aspx tradicional temos uma sequencia bem mais curta de Init, Load e PreRender.<br />
Para além de perceber a sequência dos eventos precisava de saber também como é que os userControls interagiam entre si. Basicamente a sequencia de eventos entre userControls funciona é:</p>
<ul>
<li>de baixo para cima &#8211; os userControls que estiverem definidos no topo da página são processados primeiro</li>
<li>antes do load de fora para dentro &#8211; no caso de haver &#8220;nested&#8221; controls são processados primeiro os userControls que estiverem no nivel hierarquico mais baixo</li>
<li>a partir do load de dentro para fora</li>
<li>em sequência de eventos &#8211; os eventos de um mesmo tipo são todos processados em sequencia, ou seja primeiro processam-se todos os Inits, depois todos os Loads e assim sucessivamente.</li>
<li>o processamento dos eventos dos controlos de uma página, por exemplo Button.Click são feitos depois do Load</li>
</ul>
<p><img style="border:1px solid black" src="img/aspnet_usercontrol_flow.png" alt="" width="500" /><br />
Alguns pormenores a ter em conta:</p>
<ul>
<li>todos os objectos (System.Web.UI.Control) que forem criados dinamicamente têm que ser recriados a cada postback, preferencialmente no evento Init</li>
<li>as propriedades de um objecto são populadas automaticamente na passagem do Init para o Load do userControl respectivo. um pormenor a ter em atenção é que isto aplica-se quer a objectos já existentes na página quer aos criados dinamicamente desde que mantenham o mesmo nome.</li>
<li>o viewstate só fica disponivel no load</li>
</ul>
<p>curiosamente, e ao contrário do que eu pensava, nada disto tem a ver com o viewstate o que se pode comprovar fazendo um trace há execução da página e verificando o estado dobjecto viewstate. Para mais informação ver o artigo: <a href="http://aspalliance.com/articleViewer.aspx?aId=135&amp;pId=">ViewState: All You Wanted to Know </a></p>
<p>Outro pormenor interessante é a utilização de variáveis estáticas (static / shared) que basicamente persistem o seu valor entre postbacks e estão logo disponiveis no primeiro evento &#8211; Init.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.osmeusapontamentos.com/index.php/2008/09/09/aspnet-page-flow-user-controls/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

