<?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>Eu Podia Tá Matando &#187; programação</title>
	<atom:link href="http://eupodiatamatando.com/tag/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://eupodiatamatando.com</link>
	<description>mas tô aqui blogando</description>
	<lastBuildDate>Mon, 14 Nov 2011 14:28:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Mostrando as horas em C</title>
		<link>http://eupodiatamatando.com/2008/03/29/mostrando-as-horas-em-c/</link>
		<comments>http://eupodiatamatando.com/2008/03/29/mostrando-as-horas-em-c/#comments</comments>
		<pubDate>Thu, 01 Mar 2007 10:00:39 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[rapidinha]]></category>

		<guid isPermaLink="false">http://www.eupodiatamatando.com/2007/03/01/mostrando-as-horas-em-c/</guid>
		<description><![CDATA[Como mostrar as horas num formato 13:40:23 em C. #include&#60;stdio.h&#62; #include&#60;time.h&#62; int main(){ &#160;&#160;&#160;&#160;struct tm *ptr; &#160;&#160;&#160;&#160;time_t tm; &#160;&#160;&#160;&#160;char str[60]; &#160;&#160;&#160;&#160;tm = time(NULL); &#160;&#160;&#160;&#160;ptr = localtime(&#38;tm); &#160;&#160;&#160;&#160;strftime(str ,100 , "%X.\n",ptr); &#160;&#160;&#160;&#160;printf(str); &#160;&#160;&#160;&#160;return 0; } Procurando um livro de programação em C? Buscapé. Posts relacionados Split, comando Python para dividir strings. (13) Código do Facebook Cai [...]]]></description>
			<content:encoded><![CDATA[<p>Como mostrar as horas num formato 13:40:23 em C.</p>
<p><code><br />
#include&lt;stdio.h&gt;<br />
#include&lt;time.h&gt;<br />
int main(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;struct tm *ptr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;time_t tm;<br />
&nbsp;&nbsp;&nbsp;&nbsp;char str[60];<br />
&nbsp;&nbsp;&nbsp;&nbsp;tm = time(NULL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ptr = localtime(&amp;tm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;strftime(str ,100 , "%X.\n",ptr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}<br />
</code></p>
<p style="text-align: center"><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/02/compilando_horas.jpg" alt="Como mostrar as horas em c" /></p>
<p>Procurando um <a href="http://compare.buscape.com.br/proc_unico?id=3482&amp;raiz=3482&amp;ordem=&amp;ids=&amp;nids=&amp;site_origem=1195335&amp;ps=1&amp;kw=programa%E7%E3o&amp;Carac1000000000=c&amp;precomin=&amp;precomax=" title="Achou meu caro">livro de programação em C</a>? Buscapé.<br />
<h3>Posts relacionados</h3>
<ul class="related_post">
<li><a href="http://eupodiatamatando.com/2007/03/05/split-comando-python-para-dividir-strings/" title="Split, comando Python para dividir strings.">Split, comando Python para dividir strings. (13)</a></li>
<li><a href="http://eupodiatamatando.com/2007/08/13/codigo-do-facebook-cai-na-rede/" title="Código do Facebook Cai Na Rede">Código do Facebook Cai Na Rede (15)</a></li>
<li><a href="http://eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/" title="SQLite, Resolvendo Problemas Simples com um Banco Simples">SQLite, Resolvendo Problemas Simples com um Banco Simples (12)</a></li>
<li><a href="http://eupodiatamatando.com/2007/07/30/programa-para-imprimir-ele-mesmo/" title="Programa para imprimir ele mesmo">Programa para imprimir ele mesmo (8)</a></li>
<li><a href="http://eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/" title="Python para extrair informações">Python para extrair informações (14)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://eupodiatamatando.com/2008/03/29/mostrando-as-horas-em-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Código do Facebook Cai Na Rede</title>
		<link>http://eupodiatamatando.com/2007/08/13/codigo-do-facebook-cai-na-rede/</link>
		<comments>http://eupodiatamatando.com/2007/08/13/codigo-do-facebook-cai-na-rede/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 22:29:12 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[Se deu mal]]></category>

		<guid isPermaLink="false">http://www.eupodiatamatando.com/2007/08/13/codigo-do-facebook-cai-na-rede/</guid>
		<description><![CDATA[Alguém fez uma besteira e o código fonte do Facebook (site de relacionamentos bem popular entre universitário nos Estados Unidos.) agora está na rede. - Agora nós somos Ops-Source. Depois do Open Source, agora temos o Ops-Source. E para os Pythonistas, o código-fonte do Reddit também já escapou uma vez, aqui está. E para quem [...]]]></description>
			<content:encoded><![CDATA[<p>Alguém fez uma besteira e o código fonte do <a href="http://www.facebook.com/">Facebook</a> (site de relacionamentos bem popular entre universitário nos Estados Unidos.) agora está na rede.</p>
<p><center><br />
<img src='http://www.eupodiatamatando.com/wp-content/uploads/2007/08/ops_liberei_nosso_codigo.jpg' alt='Facebook: Ops Liberei nosso código fonte' /><br /><small>- Agora nós somos Ops-Source.</small></center></p>
<p>Depois do Open Source, agora temos o Ops-Source. E para os Pythonistas, o código-fonte do <a href="http://www.reddit.com">Reddit</a> também já escapou uma vez, <a href="http://docs.google.com/Doc?id=dd5479k4_31c6jx8q">aqui está</a>.</p>
<p><span id="more-444"></span></p>
<p>E para quem gosta de <a href="http://www.php.net">PHP</a>, aí está o source code do Facebook:</p>
<pre lang="PHP">
include_once $_SERVER['PHP_ROOT'].'/html/init.php';
include_once $_SERVER['PHP_ROOT'].'/lib/home.php';
include_once $_SERVER['PHP_ROOT'].'/lib/requests.php';
include_once $_SERVER['PHP_ROOT'].'/lib/feed/newsfeed.php';
include_once $_SERVER['PHP_ROOT'].'/lib/poke.php';
include_once $_SERVER['PHP_ROOT'].'/lib/share.php';
include_once $_SERVER['PHP_ROOT'].'/lib/orientation.php';
include_once $_SERVER['PHP_ROOT'].'/lib/feed/newsfeed.php';
include_once $_SERVER['PHP_ROOT'].'/lib/mobile/register.php';
include_once $_SERVER['PHP_ROOT'].'/lib/forms_lib.php';
include_once $_SERVER['PHP_ROOT'].'/lib/contact_importer/contact_importer.php';
include_once $_SERVER['PHP_ROOT'].'/lib/feed/util.php';
include_once $_SERVER['PHP_ROOT'].'/lib/hiding_prefs.php';
include_once $_SERVER['PHP_ROOT'].'/lib/abtesting.php';
include_once $_SERVER['PHP_ROOT'].'/lib/friends.php';
include_once $_SERVER['PHP_ROOT'].'/lib/statusupdates.php';

// lib/display/feed.php has to be declared here for scope issues.
// This keeps display/feed.php cleaner and easier to understand.
include_once $_SERVER['PHP_ROOT'].'/lib/display/feed.php';
include_once $_SERVER['PHP_ROOT'].'/lib/monetization_box.php';

// require login
$user = require_login();
print_time('require_login');
param_request(array( 'react' => $PARAM_EXISTS));

// Check and fix broken emails
// LN - disabling due to excessive can_see dirties and sets when enabled.
//check_and_fix_broken_emails($user);

// migrate AIM screenname from profile to screenname table if needed
migrate_screenname ($user);

// homepage announcement variables
$HIDE_ANNOUNCEMENT_BIT = get_site_variable('HIDE_ANNOUNCEMENT_BIT');
$HIDE_INTRO_BITMASK = get_site_variable('HIDE_INTRO_BITMASK');

// redirects
if (is_sponsor_user()) {
redirect('bizhome.php', 'www');
}

include_once $_SERVER['PHP_ROOT'].'/lib/mesg.php';
include_once $_SERVER['PHP_ROOT'].'/lib/invitetool.php';
include_once $_SERVER['PHP_ROOT'].'/lib/grammar.php';
include_once $_SERVER['PHP_ROOT'].'/lib/securityq.php';
include_once $_SERVER['PHP_ROOT'].'/lib/events.php';
include_once $_SERVER['PHP_ROOT'].'/lib/rooster/stories.php';

// todo: password confirmation redirects here (from html/reset.php),
// do we want a confirmation message?

param_get_slashed(array(
'feeduser' => $PARAM_INT, //debug: gets feed for user here
'err' => $PARAM_STRING, // returning from a failed entry on an orientation form
'error' => $PARAM_STRING, // an error can also be here because the profile photo upload code is crazy
'ret' => $PARAM_INT,
'success' => $PARAM_INT, // successful profile picture upload
'jn' => $PARAM_INT, // joined a network for orientation
'np' => $PARAM_INT, // network pending (for work/address network)
'me' => $PARAM_STRING, // mobile error
'mr' => $PARAM_EXISTS, // force mobile reg view
'mobile' => $PARAM_EXISTS, // mobile confirmation code sent
'jif' => $PARAM_EXISTS, // just imported friends
'ied' => $PARAM_STRING, // import email domain
'o' => $PARAM_EXISTS, // first time orientation, passed on confirm
'verified' => $PARAM_EXISTS)); // verified mobile phone

param_post(array(
'leave_orientation' => $PARAM_EXISTS,
'show_orientation' => $PARAM_INT, // show an orientation step
'hide_orientation' => $PARAM_INT)); // skip an orientation step

// homepage actions
if ($req_react &#038;&#038; validate_expiring_hash($req_react, $GLOBALS['url_md5key'])) {
$show_reactivated_message = true;
} else {
$show_reactivated_message = false;
}
tpl_set('show_reactivated_message', $show_reactivated_message);

// upcoming events
events_check_future_events($user); // make sure big tunas haven't moved around
$upcoming_events = events_get_imminent_for_user($user);

// this is all stuff that can be fetched together!
$upcoming_events_short = array();
obj_multiget_short(array_keys($upcoming_events), true, $upcoming_events_short);
$new_pokes = 0;
//only get the next N pokes for display
//where N is set in the dbget to avoid caching issues
$poke_stats = get_num_pokes($user);
get_next_pokes($user, true, $new_pokes);
$poke_count = $poke_stats['unseen'];

$targeted_data = array();
home_get_cache_targeted_data($user, true, $targeted_data);
$announcement_data = array();
home_get_cache_announcement_data($user, true, $announcement_data);
$orientation = 0;
orientation_get_status($user, true, $orientation);
$short_profile = array();
profile_get_short($user, true, $short_profile);
// pure priming stuff
privacy_get_network_settings($user, true);
$presence = array();
mobile_get_presence_data($user, true, $presence);
feedback_get_event_weights($user, true);
// Determine if we want to display the feed intro message
$intro_settings = 0;
user_get_hide_intro_bitmask($user, true, $intro_settings);
$user_friend_finder = true;
contact_importer_get_used_friend_finder($user, true, $used_friend_finder);
$all_requests = requests_get_cache_data($user);
// FIXME?: is it sub-optimal to call this both in requests_get_cache_data and here?
$friends_status = statusupdates_get_recent($user, null, 3);
memcache_dispatch(); // populate cache data

// Merman's Admin profile always links to the Merman's home
if (user_has_obj_attached($user)) {
redirect('mhome.php', 'www');
}

if (is_array($upcoming_events)) {
foreach ($upcoming_events as $event_id => $data) {
$upcoming_events[$event_id]['name'] = txt_set($upcoming_events_short[$event_id]['name']);
}
}

tpl_set('upcoming_events' , $upcoming_events);

// disabled account actions
$disabled_warning = ((IS_DEV_SITE || IS_QA_SITE) &#038;&#038; is_disabled_user($user));
tpl_set('disabled_warning', $disabled_warning);

// new pokes (no more messages here, they are in the top nav!)
if (!user_is_guest($user)) {
tpl_set('poke_count' , $poke_count);
tpl_set('pokes' , $new_pokes);
}

// get announcement computations
tpl_set('targeted_data' , $targeted_data);
tpl_set('announcement_data' , $announcement_data);

// birthday notifications
tpl_set('birthdays' , $birthdays = user_get_birthday_notifications($user, $short_profile));
tpl_set('show_birthdays' , $show_birthdays = (count($birthdays) || !$orientation));

// user info
tpl_set('first_name' , user_get_first_name(txt_set($short_profile['id'])));
tpl_set('user' , $user);

// decide if there are now any requests to show
$show_requests = false;
foreach ($all_requests as $request_category) {
if ($request_category) {
$show_requests = true;
break;
}
}
tpl_set('all_requests', $show_requests ? $all_requests : null);

$permissions = privacy_get_reduced_network_permissions($user, $user);

// status
$user_info = array('user' => $user,
'firstname' => user_get_first_name($user),
'see_all' => '/statusupdates/?ref=hp',
'profile_pic' => make_profile_image_src_direct($user, 'thumb'),
'square_pic' => make_profile_image_src_direct($user, 'square'));

if (!empty($presence) &#038;&#038; $presence['status_time'] > (time() - 60*60*24*7)) {
$status = array('message' => txt_set($presence['status']),
'time' => $presence['status_time'],
'source' => $presence['status_source']);
} else {
$status = array('message' => null, 'time' => null, 'source' => null);
}
tpl_set('user_info', $user_info);

tpl_set('show_status', $show_status = !$orientation);
tpl_set('status', $status);
tpl_set('status_custom', $status_custom = mobile_get_status_custom($user));
tpl_set('friends_status', $friends_status);

// orientation
if ($orientation) {
if ($post_leave_orientation) {
orientation_update_status($user, $orientation, 2);
notification_notify_exit_orientation($user);
dirty_user($user);
redirect('home.php');
} else if (orientation_eligible_exit(array('uid'=>$user)) == 2) {
orientation_update_status($user, $orientation, 1);
notification_notify_exit_orientation($user);
dirty_user($user);
redirect('home.php');
}
}

// timezone - outside of stealth, update user's timezone if necessary
$set_time = !user_is_alpha($user, 'stealth');
tpl_set('timezone_autoset', $set_time );
if ($set_time) {
$daylight_savings = get_site_variable('DAYLIGHT_SAVINGS_ON');
tpl_set('timezone', $short_profile['timezone'] - ($daylight_savings ? 4 : 5) );
}

// set next step if we can
if (!$orientation) {
user_set_next_step($user, $short_profile);
}

// note: don't make this an else with the above statement, because then no news feed stories will be fetched if they're exiting orientation
if ($orientation) {
extract(orientation_get_const());

require_js('js/dynamic_dialog.js');
require_js('js/suggest.js');
require_js('js/typeahead_ns.js');
require_js('js/suggest.js');
require_js('js/editregion.js');
require_js('js/orientation.js');
require_css('css/typeahead.css');
require_css('css/editor.css');

if ($post_hide_orientation &#038;&#038; $post_hide_orientation < = $ORIENTATION_MAX) {
$orientation['orientation_bitmask'] |= ($post_hide_orientation * $ORIENTATION_SKIPPED_MODIFIER);
orientation_update_status($user, $orientation);
} else if ($post_show_orientation &#038;&#038; $post_show_orientation <= $ORIENTATION_MAX) {
$orientation['orientation_bitmask'] &#038;= ~($post_show_orientation * $ORIENTATION_SKIPPED_MODIFIER);
orientation_update_status($user, $orientation);
}

$stories = orientation_get_stories($user, $orientation);
switch ($get_err) {
case $ORIENTATION_ERR_COLLEGE:
$temp = array(); // the affil_retval_msg needs some parameters won't be used
$stories[$ORIENTATION_NETWORK]['failed_college']=affil_retval_msg($get_ret, $temp, $temp);
break;
case $ORIENTATION_ERR_CORP:
$temp = array();
// We special case the network not recognized error here, because affil_retval_msg is retarded.
$stories[$ORIENTATION_NETWORK]['failed_corp'] = ($get_ret == 70) ? 'The email you entered did not match any of our supported networks. ' .
'Click here to see our supported list. ' .
'Go here to suggest your network for the future.'
: affil_retval_msg($get_ret, $temp, $temp);
break;
}

// photo upload error
if ($get_error) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_PROFILE]]['upload_error'] = pic_get_error_text($get_error);
}
// photo upload success
else if ($get_success == 1) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_PROFILE]]['uploaded_pic'] = true;
// join network success
} else if ($get_jn) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]]['joined'] = array(
'id' => $get_jn,
'name' => network_get_name($get_jn));
// network join pending
} else if ($get_np) {

$stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]]['join_pending'] = array(
'id' => $get_np,
'email' => get_affil_email_conf($user, $get_np),
'network' => network_get_name($get_np));
// just imported friend confirmation
} else if ($get_jif) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]]['just_imported_friends'] = true;
$stories[$ORIENTATION_ORDER[$ORIENTATION_NETWORK]]['domain'] = $get_ied;
}

// Mobile web API params
if ($get_mobile) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]]['sent_code'] = true;
$stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]]['view'] = 'confirm';
}
if ($get_verified) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]]['verified'] = true;
}
if ($get_me) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]]['error'] = $get_me;
}
if ($get_mr) {
$stories[$ORIENTATION_ORDER[$ORIENTATION_MOBILE]]['view'] = 'register';
}

if (orientation_eligible_exit($orientation)) {
tpl_set('orientation_show_exit', true);
}
tpl_set('orientation_stories', $stories);

//if in orientation, we hide all feed intros (all 1's in bitmask)
$intro_settings = -1;

}
tpl_set('orientation', $orientation);

// Rooster Stories
if (!$orientation &#038;&#038;
((get_site_variable('ROOSTER_ENABLED') == 2) ||
(get_site_variable('ROOSTER_DEV_ENABLED') == 2))) {
$rooster_story_count = get_site_variable('ROOSTER_STORY_COUNT');
if (!isset($rooster_story_count)) {
// Set default if something is wrong with the sitevar
$rooster_story_count = 2;
}
$rooster_stories = rooster_get_stories($user, $rooster_story_count, $log_omissions = true);
if (!empty($rooster_stories) &#038;&#038; !empty($rooster_stories['stories'])) {
// Do page-view level logging here
foreach($rooster_stories['stories'] as $story) {
rooster_log_action($user, $story, ROOSTER_LOG_ACTION_VIEW);
}
tpl_set('rooster_stories', $rooster_stories);
}
}

// set the variables for the home announcement code
$hide_announcement_tpl = ($intro_settings | $HIDE_INTRO_BITMASK) &#038; $HIDE_ANNOUNCEMENT_BIT;
// if on qa/dev site, special rules
$HIDE_INTRO_ON_DEV = get_site_variable('HIDE_INTRO_ON_DEV');
if ((IS_QA_SITE || IS_DEV_SITE) &#038;&#038; !$HIDE_INTRO_ON_DEV) {
$hide_announcement_tpl = 0;
}

tpl_set('hide_announcement', $hide_announcement_tpl);
if($is_candidate = is_candidate_user($user)) {
tpl_set('hide_announcement', false);
}
$home_announcement_tpl = !$hide_announcement_tpl || $is_candidate ? home_get_announcement_info($user) : 0;
tpl_set('home_announcement', $home_announcement_tpl);
tpl_set('hide_announcement_bit', $HIDE_ANNOUNCEMENT_BIT);

$show_friend_finder = !$orientation &#038;&#038; contact_importer_enabled($user) &#038;&#038; !user_get_hiding_pref($user, 'home_friend_finder');
tpl_set('show_friend_finder', $show_friend_finder);
if ($show_friend_finder &#038;&#038; (user_get_friend_count($user) > 20)) {
tpl_set('friend_finder_hide_options', array('text'=>'close',
'onclick'=>"return clearFriendFinder()"));
} else {
tpl_set('friend_finder_hide_options', null);
}

$account_info = user_get_account_info($user);
$account_create_time = $account_info['time'];

tpl_set('show_friend_finder_top',
!$used_friend_finder);

tpl_set('user', $user);

// MONETIZATION BOX
$minimize_monetization_box = user_get_hiding_pref($user, 'home_monetization');
$show_monetization_box = (!$orientation &#038;&#038;
get_site_variable('HOMEPAGE_MONETIZATION_BOX'));
tpl_set('show_monetization_box', $show_monetization_box);
tpl_set('minimize_monetization_box', $minimize_monetization_box);

if ($show_monetization_box) {
$monetization_box_data = monetization_box_user_get_data($user);
txt_set('monetization_box_data', $monetization_box_data);
}

// ORIENTATION
if ($orientation) {
$network_ids = id_get_networks($user);
$network_names = multiget_network_name($network_ids);
$in_corp_network = in_array($GLOBALS['TYPE_CORP'], array_map('extract_network_type', $network_ids));
$show_corp_search = $in_corp_network ||
get_age(user_get_basic_info_attr($user, 'birthday')) >= 21;
$pending_hs = is_hs_pending_user($user);
$hs_id = null;
$hs_name = null;
if ($pending_hs) {
foreach (id_get_pending_networks($user) as $network) {
if (extract_network_type($network['network_key']) == $GLOBALS['TYPE_HS']) {
$hs_id = $network['network_key'];
$hs_name = network_get_name($hs_id);
break;
}
}
}
//$orientation_people = orientation_get_friend_and_inviter_ids($user);
$orientation_people = array('friends' => user_get_all_friends($user),
'pending' => array_keys(user_get_friend_requests($user)),
'inviters'=> array(), // wc: don't show inviters for now
);
$orientation_info = array_merge($orientation_people,
array('network_names' => $network_names,
'show_corp_search' => $show_corp_search,
'pending_hs' => array('hs_id'=>$hs_id,
'hs_name'=>$hs_name),
'user' => $user,
));
tpl_set('orientation_info', $orientation_info);

tpl_set('simple_orientation_first_login', $get_o); // unused right now
}

// Roughly determine page length for ads
// first, try page length using right-hand panel
$ads_page_length_data = 3 + // 3 for profile pic + next step
($show_friend_finder ? 1 : 0) +
($show_status ? ($status_custom ? count($friends_status) : 0) : 0) +
($show_monetization_box ? 1 : 0) +
($show_birthdays ? count($birthdays) : 0) +
count($new_pokes);

// page length using feed stories
if ($orientation) {
$ads_page_length_data = max($ads_page_length_data, count($stories) * 5);
}
tpl_set('ads_page_length_data', $ads_page_length_data);

$feed_stories = null;
if (!$orientation) { // if they're not in orientation they get other cool stuff
// ad_insert: the ad type to try to insert for the user
// (0 if we don't want to try an insert)
$ad_insert = get_site_variable('FEED_ADS_ENABLE_INSERTS');

$feed_off = false;

if (check_super($user) &#038;&#038; $get_feeduser){
$feed_stories = user_get_displayable_stories($get_feeduser, 0, null, $ad_insert);
} else if (can_see($user, $user, 'feed')) {
$feed_stories = user_get_displayable_stories($user, 0, null, $ad_insert);
} else {
$feed_off = true;
}

// Friend's Feed Selector - Requires dev.php constant
if (is_friendfeed_user($user)) {
$friendfeed = array();
$friendfeed['feeduser'] = $get_feeduser;
$friendfeed['feeduser_name'] = user_get_name($get_feeduser);
$friendfeed['friends'] = user_get_all_friends($user);
tpl_set('friendfeed', $friendfeed);
}

$feed_stories = feed_adjust_timezone($user, $feed_stories);

tpl_set('feed_off', $feed_off ? redirect('privacy.php?view=feeds', null, false) : false);
}
tpl_set('feed_stories', $feed_stories);

render_template($_SERVER['PHP_ROOT'].'/html/home.phpt');
</pre>
<p>Seria um bom momento para o Facebook se tornar logo um Software Livre. <img src='http://eupodiatamatando.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/08/livro_php.jpg" alt="Livro de php" align="left" height="91" width="91" />Não entendeu bulhufas? <a href="http://compare.buscape.com.br/categoria?lkout=1&amp;id=3482&amp;kw=php&amp;site_origem=1195335" title="PHP bons livros">Não perca tempo, o que você precisa é de uns bons livros de PHP</a>.</p>
<p>Buscapé.<br />
<h3>Posts relacionados</h3>
<ul class="related_post">
<li><a href="http://eupodiatamatando.com/2007/12/12/quando-um-nao-funciona-tente-outro/" title="Quando um não funciona, tente outro">Quando um não funciona, tente outro (21)</a></li>
<li><a href="http://eupodiatamatando.com/2007/12/04/alguem-me-explica-isso/" title="Alguém me explica isso?">Alguém me explica isso? (11)</a></li>
<li><a href="http://eupodiatamatando.com/2007/09/22/os-piores-empregos-do-mundo-parte-6/" title="Os Piores Empregos do Mundo, parte 6">Os Piores Empregos do Mundo, parte 6 (5)</a></li>
<li><a href="http://eupodiatamatando.com/2007/09/13/ironia-do-destino/" title="Ironia do destino">Ironia do destino (2)</a></li>
<li><a href="http://eupodiatamatando.com/2007/09/06/assalto-no-shopping-center-iguatemi-de-fortaleza/" title="Assalto no Shopping Center Iguatemi de Fortaleza.">Assalto no Shopping Center Iguatemi de Fortaleza. (18)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://eupodiatamatando.com/2007/08/13/codigo-do-facebook-cai-na-rede/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>SQLite, Resolvendo Problemas Simples com um Banco Simples</title>
		<link>http://eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/</link>
		<comments>http://eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 14:58:27 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/</guid>
		<description><![CDATA[Porque levantar um pesado sistema de banco de dados, criar databases, criar tabelas, configurar permissões acessos, configurar usuários, setar portas, rodar daemons só para resolver um problema simples de armazenamento? O SQLite é um banquinho leve e simples para resolver de maneira simples problemas que realmente são simples. Estrutura do SQLite Algumas das vantagens do [...]]]></description>
			<content:encoded><![CDATA[<p>Porque levantar um pesado sistema de banco de dados, criar databases, criar tabelas, configurar permissões acessos, configurar usuários, setar portas, rodar daemons só para resolver um problema simples de armazenamento?</p>
<p>O SQLite é um banquinho leve e simples para resolver de maneira simples problemas que realmente são simples.</p>
<p><span id="more-443"></span></p>
<p style="text-align: center"><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/08/arquitetura_do_sqlite.gif" alt="Diagrama de blocos da arquitetura do sqlite" /><br />
<small>Estrutura do SQLite</small></p>
<p>Algumas das vantagens do SQLite são:</p>
<ul>
<li>Instalação e configuração muito simples.</li>
<li>Implementa boa parte do SQL-92.</li>
<li>Transações ACID &#8211; Atomicidade, Consistência, Isolamento e Durabilidade.</li>
<li>Dados ficam guardados em um único arquivo. Fácil de transportar, fazer backup e manusear.</li>
<li>Suporta base de dados acima de 2 terabytes.</li>
<li>Não depende de outras bibliotecas, é escrito em C puro.</li>
<li>É um software livre e esta disponível sobre domínio público.</li>
</ul>
<p>A instalação dele no Ubuntu ou em outro sistema debian-like é só:</p>
<blockquote><p>sudo apt-get install sqlite</p></blockquote>
<p>Uma vez instalado o SQLite, você pode chamar o prompt do sistema pelo comando sqlite3 (ou somente sqlite, se você instalou uma versão anterior). Chamando o sqlite seguido de um nome de arquivo ele gravará o banco naquele arquivo.</p>
<blockquote><p>$ sqlite teste.db<br />
SQLite version 2.8.17<br />
Enter &#8220;.help&#8221; for instructions<br />
sqlite&gt;</p></blockquote>
<p>Dentro do console você pode usar comandos SQL para criar e manipular as entidades do banco ou usar os comandos que começam com um ponto para acessar comandos do SQLite.</p>
<p>Os comandos que uso mais são:</p>
<ul>
<li><strong>.database</strong> &#8211; lista os bancos e arquivos abertos.</li>
<li><strong>.tables</strong> &#8211; lista as tabelas do banco.</li>
<li><strong>.read coisas.sql -</strong> lê comandos de SQL dentro da arquivo chamado coisas.sql.</li>
<li><strong>.mode column</strong> &#8211; formata a exibição padrão para colunas.</li>
<li><strong>.headers on</strong> &#8211; formata a exibição padrão para exibir os nomes dos campos.</li>
<li><strong>.help </strong>- Ajuda <img src='http://eupodiatamatando.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<h2><strong>Prática 1 &#8211; Agenda de Telefones</strong></h2>
<p>Vamos agora brincar um pouquinho com o SQLite fazendo alguns testes práticos dentro do próprio SQLite.</p>
<p>Vamos passar para o SQLite esse comando de SQL para criarmos uma simples agenda de números telefónicos.</p>
<pre lang="SQL">
CREATE TABLE agenda(
   id INTEGER PRIMARY KEY,
   nome VARCHAR(30),
   tel VARCHAR(20)
);
</pre>
<p>Podemos fazer isso de dentro do SQLite simplesmente digitando linha a linha do comando SQL:</p>
<blockquote><p>$ sqlite telefones.db<br />
SQLite version 2.8.17<br />
Enter &#8220;.help&#8221; for instructions<br />
sqlite> CREATE TABLE agenda(<br />
   &#8230;>    id INTEGER PRIMARY KEY,<br />
   &#8230;>    nome VARCHAR(30),<br />
   &#8230;>    tel VARCHAR(20)<br />
   &#8230;> );<br />
sqlite> </p></blockquote>
<p>Um jeito prático de práticar SQL é guardar os comandos dentro de um arquivo, por exemplo <em>telefones.sql</em>. Depois você entra no SQLite e abre o arquivo com <strong>.read telefones.sql</strong>.</p>
<p>Vamos fazer isso com um comando de SQL maior, que vai destruir qualquer tabela que se chame agenda, criar uma tabela agenda e inserir alguns dados nela.</p>
<pre lang="SQL">
DROP TABLE agenda;
CREATE TABLE agenda(
   id INTEGER PRIMARY KEY,
   nome VARCHAR(30),
   tel VARCHAR(20)
);
INSERT INTO agenda(nome,tel) VALUES ('Central de Transplantes', '0800-8832323');
INSERT INTO agenda(nome,tel) VALUES ('Disque-Silêncio', '3452-6927');
INSERT INTO agenda(nome,tel) VALUES ('Bombeiros', '193');
INSERT INTO agenda(nome,tel) VALUES ('Ambulancia', '192');
INSERT INTO agenda(nome,tel) VALUES ('Policia Militar', '190');
INSERT INTO agenda(nome,tel) VALUES ('Defesa Civil', '199');
INSERT INTO agenda(nome,tel) VALUES ('Disque-Cidade Limpa','0800-851531');
</pre>
<p><small><strong>obs1:</strong> Não precisamos inserir os dados de id porque eles são chaves primárias e vão se preencher sozinhos, sempre cuidando para que duas chaves nunca sejam iguais. <strong>obs2:</strong> Esse números são referentes ao Ceará. Para maiores informações consulte a <a href="http://www.telelistas.net/templates/telefones_uteis.aspx">Telelistas</a>.</small></p>
<p>Depois abrimos o arquivo pelo SQLite e já podemos fazer algumas consultas:</p>
<blockquote><p>$ sqlite telefones.db<br />
SQLite version 2.8.17<br />
Enter &#8220;.help&#8221; for instructions<br />
sqlite> .read telefones.sql<br />
sqlite> SELECT * FROM agenda;<br />
1|Central de Transplantes|0800-8832323<br />
2|Disque-Silêncio|3452-6927<br />
3|Bombeiros|193<br />
4|Ambulancia|192<br />
5|Policia Militar|190<br />
6|Defesa Civil|199<br />
7|Disque-Cidade Limpa|0800-851531
</p></blockquote>
<p>Para selecionar somente alguns campos da tabela faça:</p>
<blockquote><p>sqlite> SELECT nome, tel FROM agenda;<br />
Central de Transplantes|0800-8832323<br />
Disque-Silencio|3452-6927<br />
Bombeiros|193<br />
Ambulancia|192<br />
Policia Militar|190<br />
Defesa Civil|199<br />
Disque-Cidade Limpa|0800-851531</p></blockquote>
<p>Selecionar somente alguns campos da tabela e ordenar a saida pelo nome, faça:</p>
<blockquote><p>sqlite> SELECT nome,tel FROM agenda ORDER BY nome;<br />
Ambulancia|192<br />
Bombeiros|193<br />
Central de Transplantes|0800-8832323<br />
Defesa Civil|199<br />
Disque-Cidade Limpa|0800-851531<br />
Disque-Silêncio|3452-6927<br />
Policia Militar|190
</p></blockquote>
<p>Descobrir de quem eh o telefone 0800-8832323:</p>
<blockquote><p>sqlite> SELECT nome FROM agenda WHERE tel == &#8217;0800-8832323&#8242;;<br />
Central de Transplantes</p></blockquote>
<p>Descobrir que nomes sao da forma disque-alguma-coisa:</p>
<blockquote><p>sqlite> SELECT nome FROM agenda WHERE nome LIKE &#8216;disque%&#8217;;<br />
Disque-Silêncio<br />
Disque-Cidade Limpa
</p></blockquote>
<p>Retirando da tabela agenda o nome e telefone do Disque-Silêncio. Depois vamos dar uma select para ver a agenda e verificar que essa entrada nao esta mais la.</p>
<blockquote><p>sqlite> DELETE FROM agenda WHERE nome == &#8216;Disque-Silêncio&#8217;;<br />
sqlite> select * from agenda;<br />
1|Central de Transplantes|0800-8832323<br />
3|Bombeiros|193<br />
4|Ambulancia|192<br />
5|Policia Militar|190<br />
6|Defesa Civil|199<br />
7|Disque-Cidade Limpa|0800-851531</p></blockquote>
<h2><strong>Prática 2 &#8211; Fórum</strong></h2>
<p>Nesse exemplo vamos ver os TRIGGERS.</p>
<p style="text-align: center">
<img src='http://www.eupodiatamatando.com/wp-content/uploads/2007/08/hora_do_lanche.jpg' alt='Tigres comendo coelhos' /><br />
<small>Eu disse Triggers e não tigers!</small></p>
<p>Trigger quer dizer gatilho. Com triggers você configura ações a serem tomadas quando certos eventos com ocorrem. Eventos que disparam uma trigger podem ser uma inserção, deleção ou atualização de alguma tabela.</p>
<p>Vamos criar uma tabela simples para guardar comentários no estilo de threads em fóruns.</p>
<pre lang="SQL">
DROP TABLE thread;
CREATE TABLE thread(
	id INTEGER PRIMARY KEY,
	pai INTEGER,
	apelido VARCHAR(20),
	texto TEXT,
	respostas INTEGER
);
</pre>
<p>O campo pai vai referenciar qual thread esta thread está referenciando. Vamos convencionar que um pai igual a zero corresponde a uma thread raiz. O campo respostas contara quantas outras threads apontam para esta thread como pai somado com o numero de respostas desses filhos. Vamos convencionar que toda thread começa com o campo respostas igual a zero.</p>
<p>Vamos criar dois triggers. O trigger comentario_novo vai ser disparado quando alguém adicionar uma novo comentario, ele vai procurar o pai daquela thread e adicionar o número de respostas. Mas só isso não basta. O trigger comentario_alterado vai ser disparado quando alguém mexer na campo respostas de uma thread, ele vai procurar o pai daquela thread e adicionar seu número de respostas.</p>
<pre lang="SQL">
CREATE TRIGGER comentario_novo AFTER INSERT ON thread
BEGIN
   UPDATE thread SET respostas = respostas + 1 WHERE id = new.pai;
END;

CREATE TRIGGER comentario_alterado AFTER UPDATE OF respostas ON thread
BEGIN
   UPDATE thread SET respostas = respostas + 1 WHERE id = new.pai;
END;
</pre>
<p><small><strong>obs:</strong> Esse exemplo não cobre todas as possibilidades. Para manter o problema mais simples estou convencionando que não se pode deletar uma thread ou mudar o pai de uma thread.</small></p>
<p>Veja só o que acontece quando colocamos alguns comentários no banco:</p>
<pre LANG="SQL">
INSERT INTO thread(pai, apelido, texto, respostas) VALUES (0, "Jose", "Oi. Alguem conheçe algum site legal?", 0);
INSERT INTO thread(pai, apelido, texto, respostas) VALUES (1, "Maria", "Tem o eupodiatamatando.com <img src='http://eupodiatamatando.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ", 0);
INSERT INTO thread(pai, apelido, texto, respostas) VALUES (2, "Jose", "Valeu Maria!", 0);
INSERT INTO thread(pai, apelido, texto, respostas) VALUES (1, "Pedro", "Eu gosto do br-linux.org", 0);
</pre>
<blockquote><p>sqlite> SELECT * FROM THREAD;<br />
1|0|Jose|Oi. Alguem conheçe algum site legal?|3<br />
2|1|Maria|Tem o eupodiatamatando.com <img src='http://eupodiatamatando.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> |1<br />
3|2|Jose|Valeu Maria!|0<br />
4|1|Pedro|Eu gosto do br-linux.org|0</p></blockquote>
<p>Voilá! Houve um efeito em cascata. Quando disparamos um trigger comentario_novo ele vai modificar uma thread e vai disparar um trigger comentario_alterado, que por sua vez vai disparar outro comentario_alterado até chegar na thread raíz.</p>
<p>Trigger são legais para se colocar alguma lógica dentro do banco e fora do código da aplicação principal. A divisão da lógica entre sua aplicação e o banco vai depender da facilidade de se implementar algo com SQL ou com seu código-fonte e de bom senso.</p>
<h2><strong>Prática 3 &#8211; Misture tudo e coloque Python!</strong></h2>
<p>Python não podia ficar de fora disso tudo <img src='http://eupodiatamatando.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Para instalar o que você precisa:</p>
<blockquote><p># apt-get install python-sqlite</p></blockquote>
<p>Esse é um programa para abrir nossa agenda de telefones do primeiro exemplo:</p>
<pre lang="PYTHON">
#!/usr/bin/env python
import sqlite

conexao = sqlite.connect('telefones.db')
cursor = conexao.cursor()
cursor.execute('SELECT * FROM agenda;')
for i in cursor:
   print i[1], i[2]
</pre>
<p>Em cada iteração de i ele vai ser uma tripla com os campos da sua tabela. Mandamos imprimir os campos 1 e 2 que são o nome e telefone.</p>
<p>Isso vai imprimir isso na tela:</p>
<blockquote><p>
Central de Transplantes 0800-8832323<br />
Disque-Silêncio 3452-6927<br />
Bombeiros 193<br />
Ambulancia 192<br />
Policia Militar 190<br />
Defesa Civil 199<br />
Disque-Cidade Limpa 0800-851531
</p></blockquote>
<p>Vale a pena dar uma chance pro <a href="http://www.sqlite.org">SQLite</a>. <img src='http://eupodiatamatando.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/05/dices.jpg" alt="Dados" align="left" /><br />
Dê uma olhada nos preços de <a href="http://compare.buscape.com.br/proc_unico?id=3482&amp;kw=sql&amp;site_origem=1195335" title="Baratinho">livros sobre SQL</a> ou <a href="http://compare.buscape.com.br/proc_unico?id=3482&amp;kw=banco+de+dados&amp;site_origem=1195335" title="Baratinho você acha">livros sobre banco de dados</a>. Buscapé.</p>
<h3>Posts relacionados</h3>
<ul class="related_post">
<li><a href="http://eupodiatamatando.com/2007/05/26/persistencia-em-python-criando-um-agenda-simples/" title="Persistência em Python, criando uma agenda simples">Persistência em Python, criando uma agenda simples (18)</a></li>
<li><a href="http://eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/" title="Python para extrair informações">Python para extrair informações (14)</a></li>
<li><a href="http://eupodiatamatando.com/2007/05/05/pil-python-imaging-library/" title="PIL: Python Imaging Library">PIL: Python Imaging Library (0)</a></li>
<li><a href="http://eupodiatamatando.com/2007/04/09/sobrecarga-de-operadores-em-python/" title="Sobrecarga de operadores em Python">Sobrecarga de operadores em Python (13)</a></li>
<li><a href="http://eupodiatamatando.com/2007/03/11/preenchendo-com-zeros-a-esquerda/" title="Preenchendo com zeros à esquerda">Preenchendo com zeros à esquerda (1)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Programa para imprimir ele mesmo</title>
		<link>http://eupodiatamatando.com/2007/07/30/programa-para-imprimir-ele-mesmo/</link>
		<comments>http://eupodiatamatando.com/2007/07/30/programa-para-imprimir-ele-mesmo/#comments</comments>
		<pubDate>Mon, 30 Jul 2007 14:19:45 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.eupodiatamatando.com/2007/07/30/programa-para-imprimir-ele-mesmo/</guid>
		<description><![CDATA[Aqui uma tarefa de programação interessante. Escrever o código que imprime ele mesmo. Em Python é isso: import sys me = open(sys.argv[0]) for line in me: print line, me.close() Em Shell Script por Xisberto: cat $0 Em PHP por Paulo André: $file = “teste.php”; $fcontent = file_get_contents($file); highlight_string($fcontent, false); obs: O que eu quero não [...]]]></description>
			<content:encoded><![CDATA[<p>Aqui uma tarefa de programação interessante.<br />
Escrever o código que imprime ele mesmo.</p>
<p><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/07/python_no_espelho.jpg" alt="Python no espelho. Python in a mirror." /></p>
<p>Em Python é isso:</p>
<pre lang="PYTHON">
import sys
me = open(sys.argv[0])
for line in me:
   print line,
me.close()
</pre>
<p>Em Shell Script por <a href="http://xisberto.blogspot.com/">Xisberto</a>:</p>
<pre lang="SHELL">
cat $0
</pre>
<p>Em PHP por Paulo André:</p>
<pre lang="PHP">
$file = “teste.php”;
$fcontent = file_get_contents($file);
highlight_string($fcontent, false);
</pre>
<p><small><strong>obs</strong>: O que eu quero não é o problema de <a href="http://en.wikipedia.org/wiki/Quine_(computing)">Quine</a>, mas sim um programa que abra seu código-fonte e o imprima. Eu uso isso para páginas feitas em Python onde eu quero que o usuário possa ver o código-fonte da aplicação facilmente.</small></p>
<p>Se você fizer em outra linguagem e colocar nos comentários, eu o coloco dentro desse post.</p>
<p><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/07/espelho_oval1.jpg" alt="Espelho oval" align="left" />Aproveite e <a href="http://compare.buscape.com.br/categoria?lkout=1&amp;id=3443&amp;kw=espelho&amp;site_origem=1195335" title="Preços de espelho">dê uma olhada nos melhores preços de espelhos para sua casa</a>.</p>
<p>Buscapé.<br />
<h3>Posts relacionados</h3>
<ul class="related_post">
<li><a href="http://eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/" title="SQLite, Resolvendo Problemas Simples com um Banco Simples">SQLite, Resolvendo Problemas Simples com um Banco Simples (12)</a></li>
<li><a href="http://eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/" title="Python para extrair informações">Python para extrair informações (14)</a></li>
<li><a href="http://eupodiatamatando.com/2007/06/14/a-folha-de-pesca-do-django/" title="A folha de pesca do Django">A folha de pesca do Django (0)</a></li>
<li><a href="http://eupodiatamatando.com/2007/05/26/persistencia-em-python-criando-um-agenda-simples/" title="Persistência em Python, criando uma agenda simples">Persistência em Python, criando uma agenda simples (18)</a></li>
<li><a href="http://eupodiatamatando.com/2007/05/23/livro-python-guia-de-bolso/" title="Livro Python Guia de Bolso">Livro Python Guia de Bolso (14)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://eupodiatamatando.com/2007/07/30/programa-para-imprimir-ele-mesmo/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Python para extrair informações</title>
		<link>http://eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/</link>
		<comments>http://eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/#comments</comments>
		<pubDate>Sat, 28 Jul 2007 15:00:26 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/</guid>
		<description><![CDATA[Python me tem sido muito útil no dia-a-dia para recuperar grandes quantidades de dados codificadas dentro de sites. Por exemplo, eu precisava de todos os nomes de cursos de pós graduação da UFC para depois jogar em uns formulário do Joomla. Esses dados podem ser conseguidos neste site da Capes. Lá os dados estavam assim: [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/07/python_work.jpg" alt="Python agarra homem" align="right" />Python me tem sido muito útil no dia-a-dia para <a href="http://pt.wikipedia.org/wiki/Recupera%C3%A7%C3%A3o_de_informa%C3%A7%C3%A3o" title="Recuperação de dados">recuperar</a> grandes quantidades de dados codificadas dentro de sites.</p>
<p>Por exemplo, eu precisava de todos os nomes de cursos de pós graduação da <a href="http://www.ufc.br" title="Universidade Federal do Ceará">UFC</a> para depois jogar em uns formulário do <a href="http://www.joomla.org" title="Joomla">Joomla</a>. Esses dados podem ser conseguidos <a href="http://servicos.capes.gov.br/projetorelacaocursos/jsp/cursoIesDet.jsp?cd_ies=22001018" title="Capes">neste site da Capes</a>.</p>
<p>Lá os dados estavam assim:</p>
<p style="text-align: center"><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/07/cursos_ufc_na_capes.jpg" alt="Cursos da UFC dentro do site da CAPES" /></p>
<p>Os nomes dos cursos estavam dentro de células de uma grande tabela, com letras todas em maiúsculo. Tentei copiar e colar um a um, na mão, mas eu vi que eu levaria um eternidade para terminar.</p>
<p>A título de exemplo e por segurança, eu salvei uma cópia da página em questão no nosso servidor, para que o script não falhe.</p>
<p>Então, transformamos esse trabalho chato e repetitivo em algo que o Python pode fazer pra você:</p>
<pre line="1" lang="PYTHON">
import urllib
pagina = urllib.urlopen("http://eupodiatamatando.com/downloads/cursos.html")
for linha in pagina:
   if linha.find("cd_programa") != -1:
      tmp = linha.split('&gt;', 1)[1]
      nome = tmp.split('&lt; ', 1)[0]
      print nome
pagina.close()</pre>
<p>A saída desse programa é algo assim:</p>
<blockquote><p> ADMINISTRAÇÃO DE EMPRESAS<br />
AGRONOMIA (FITOTECNIA)<br />
AGRONOMIA (IRRIGAÇÃO E DRENAGEM)<br />
AGRONOMIA (SOLOS E NUTRIÇÃO DE PLANTAS)<br />
AVALIAÇÃO DE POLÍTICAS PÚBLICAS<br />
BIOQUÍMICA<br />
CIÊNCIAS DA COMPUTAÇÃO<br />
&#8230;</p></blockquote>
<p>Da biblioteca urllib nós usamos o urlopen, que puxou a página e guardou num manipulador chamado <em>pagina</em>, como ele implementa o método next, nós podemos iterar sobre ele usando um simples <em>for</em>. Passamos por todas as linhas e sé há a string &#8220;cd_programa&#8221; dentro dela, então nós vamos pegar o que está dentro da tag. Claro que foi necessário perceber analisando o código-fonte da página que todas as células que continham o nome de curso possuim essa substring, mas sempre há algo assim.</p>
<p>O método split, que fatia a string, <a href="http://www.eupodiatamatando.com/2007/03/05/split-comando-python-para-dividir-strings/">já foi discutido aqui antes</a>.</p>
<p>Você deve estar se perguntando, &#8220;Vale a pena criar um programa que lê os dados especificamente de um site e que de uma hora para outra pode parar de funcionar?&#8221;. Sim, vale a pena, simplesmente porque com o tempo você vai escrevendo programas em Python cada vez mais rápido. O código só irá rodar uma vez mas no final você economizou tempo, e de uma maneira inteligente.</p>
<p>Por exemplo, se você quiser saber quais são as notícias que estão em cartaz no Br-linux agora:</p>
<pre lang="PYTHON">
import urllib
pagina = urllib.urlopen("http://br-linux.org")
for linha in pagina:
	if linha.find("node-title") != -1:
		tmp = linha.split('&gt;',2)[2]
		nome = tmp.split('&lt; ',1)[0]
		print nome
pagina.close()</pre>
<p>Isso retorna algo assim:</p>
<blockquote><p>Carregando seus feeds no bolso<br />
Personalize seu teclado com o X e o KDE<br />
Linux na cultura pop: GRUB nos quadrinhos da Marvel<br />
iPod no Linux &#8211; guia ilustrado de uso com o Amarok<br />
Feliz dia do Administrador de Sistemas!<br />
&#8230;</p></blockquote>
<p>Experimente usar isso no dia-a-dia, com o tempo você vai ficando bom em achar os padrões e fica fácil extrair semântica de dentro de um site.</p>
<p><img src="http://www.eupodiatamatando.com/wp-content/uploads/2007/03/livros_python.jpg" alt="Livros Python" align="left" /> Promoção! <a href="http://compare.buscape.com.br/proc_unico?id=3482&amp;kw=python&amp;site_origem=1195335" title="Baratinho você acha">Livros de Como Programar em Python</a>  pelos menores preços você encontra no Buscapé.<br />
<h3>Posts relacionados</h3>
<ul class="related_post">
<li><a href="http://eupodiatamatando.com/2007/08/13/sqlite-resolvendo-problemas-simples-com-um-banco-simples/" title="SQLite, Resolvendo Problemas Simples com um Banco Simples">SQLite, Resolvendo Problemas Simples com um Banco Simples (12)</a></li>
<li><a href="http://eupodiatamatando.com/2007/05/26/persistencia-em-python-criando-um-agenda-simples/" title="Persistência em Python, criando uma agenda simples">Persistência em Python, criando uma agenda simples (18)</a></li>
<li><a href="http://eupodiatamatando.com/2007/03/11/preenchendo-com-zeros-a-esquerda/" title="Preenchendo com zeros à esquerda">Preenchendo com zeros à esquerda (1)</a></li>
<li><a href="http://eupodiatamatando.com/2007/07/30/programa-para-imprimir-ele-mesmo/" title="Programa para imprimir ele mesmo">Programa para imprimir ele mesmo (8)</a></li>
<li><a href="http://eupodiatamatando.com/2007/07/22/java-vs-ruby/" title="Java vs Ruby?">Java vs Ruby? (10)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://eupodiatamatando.com/2007/07/28/python-para-extrair-informacoes/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.690 seconds -->

