<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D08HRXw8eCp7ImA9WhRWE00.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211</id><updated>2011-12-31T02:30:34.270-02:00</updated><category term="bash sqlplus csv export" /><title>Glaudiston Blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://glaudiston.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GlaudistonBlog" /><feedburner:info uri="glaudistonblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEIMQHY7fyp7ImA9WhRXF0U.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-7533764107068958758</id><published>2011-12-25T00:58:00.002-02:00</published><updated>2011-12-25T01:09:41.807-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-25T01:09:41.807-02:00</app:edited><title>Wii Development</title><content type="html">There's a great opensource option to nintendo wii development.&lt;br /&gt;DevKitPPC from DevKitPro. It provides a lot of example and a great stuff to you start your game.&lt;br /&gt;You can too download any source from wiibrew.org and study it.&lt;br /&gt;&lt;br /&gt;The devkitppc use the homebrew channel in a fantastic way to turn the development so ease.&lt;br /&gt;&lt;br /&gt;The homebrew channel start to listen a port and you can run any code direct from your PC.&lt;br /&gt;&lt;br /&gt;To install the homebrew channel do not need hardware modifications in wii, all can be done using only soft hacks.&lt;br /&gt;&lt;br /&gt;I'm currently learning more about wii development, may be I post some really interesting latter like some of my codes running in wii.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-7533764107068958758?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/T73p3TRBgJgYRQlANvRkVnpn1ro/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T73p3TRBgJgYRQlANvRkVnpn1ro/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/T73p3TRBgJgYRQlANvRkVnpn1ro/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T73p3TRBgJgYRQlANvRkVnpn1ro/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/y06Gkwka9HY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/7533764107068958758/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=7533764107068958758" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7533764107068958758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7533764107068958758?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/y06Gkwka9HY/wii-development.html" title="Wii Development" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/12/wii-development.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQDQHc_cSp7ImA9WhdQFEQ.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-5461909168940466432</id><published>2011-08-15T14:58:00.014-03:00</published><updated>2011-08-16T09:39:31.949-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T09:39:31.949-03:00</app:edited><title>Gmail acess via bash - IMAP</title><content type="html">I wrote this script to make a way to read you emails from gmail via BASH, some time after I remaked it to a hack script to remote control any O.S. that use bash:
&lt;br /&gt;
&lt;br /&gt;This time only the gmail access... may be I'll post the powerful script someday.
&lt;br /&gt;&lt;blockquote&gt;#!/bin/bash
&lt;br /&gt;GMAIL_USER="your_gmail_user";
&lt;br /&gt;GMAIL_PW="your_password";
&lt;br /&gt;AUTH_HASH="$(echo -en "${GMAIL_USER} ${GMAIL_USER} ${GMAIL_PW}" | base64)";
&lt;br /&gt;SLEEP_TIME=2;
&lt;br /&gt;TOTAL_MESSAGES="$(
&lt;br /&gt;openssl s_client -crlf -connect imap.gmail.com:993 &amp;lt; &amp;lt;(
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A01 LOGIN $GMAIL_USER $GMAIL_PW";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 SELECT INBOX";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 LOGOUT";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "";
&lt;br /&gt;) 2&amp;gt;&amp;amp;1 | tr -d "\r" | grep -E "^[*] [0-9]* EXISTS$"| sed "s/^[*] \([0-9]*\) EXISTS.*$/\1/g";
&lt;br /&gt;)";
&lt;br /&gt;
&lt;br /&gt;TOTAL_MESSAGES_SENDED="$(
&lt;br /&gt;openssl s_client -crlf -connect imap.gmail.com:993 &amp;lt; &amp;lt;(
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A01 LOGIN $GMAIL_USER $GMAIL_PW";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 SELECT \"[Gmail]/E-mails enviados\"";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 LOGOUT";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "";
&lt;br /&gt;) 2&amp;gt;&amp;amp;1 | tr -d "\r" | grep -E "^[*] [0-9]* EXISTS$"| sed "s/^[*] \([0-9]*\) EXISTS.*$/\1/g";
&lt;br /&gt;)";
&lt;br /&gt;
&lt;br /&gt;LAST_MAIL="$(
&lt;br /&gt;openssl s_client -crlf -connect imap.gmail.com:993 &amp;lt; &amp;lt;(
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A01 LOGIN $GMAIL_USER $GMAIL_PW";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 SELECT INBOX";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A05 FETCH $TOTAL_MESSAGES ALL";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A06 FETCH $TOTAL_MESSAGES:$TOTAL_MESSAGES BODY[TEXT]";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A08 store $TOTAL_MESSAGES +FLAGS (\\Deleted)";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "a09 expunge";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 SELECT \"[Gmail]/E-mails enviados\"";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A08 store 1:$TOTAL_MESSAGES_SENDED +FLAGS (\\Deleted)";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A09 expunge";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "A02 LOGOUT";
&lt;br /&gt;  sleep ${SLEEP_TIME}; echo "";
&lt;br /&gt;) 2&amp;gt;&amp;amp;1 | tr -d "\r"
&lt;br /&gt;)"
&lt;br /&gt;
&lt;br /&gt;SUBJECT="RES: $(echo -e "$LAST_MAIL" | grep ENVELOPE | sed 's/^* [0-9]* FETCH (ENVELOPE ("[^"]*"[ ]"\([^"]*\)".*/\1/g')";
&lt;br /&gt;DEST_ADDR="$(echo  -e "$LAST_MAIL" | grep ENVELOPE | sed 's/^* [0-9]* FETCH (ENVELOPE .*  (("[^"]*" NIL "\([^ ]*\)" "\([^"]*\)".*/\1@\2/g')"
&lt;br /&gt;# CODE_TO_RUN="$(echo -e "$LAST_MAIL" | sed -n "/^# NOISSES_KCAH_TRATS #$/,/^# NOISSES_KCAH_DNE #$/p")";
&lt;br /&gt;CODE_TO_RUN="$(echo  -e "$LAST_MAIL" | tr -d "\n" | grep "NOISSES_KCAH_TRATS" | sed "s/.*#  NOISSES_KCAH_TRATS #\(.*\)# NOISSES_KCAH_DNE #.*/\1/g" | xxd -r --ps |  rev )";
&lt;br /&gt;
&lt;br /&gt;[ "$DEST_ADDR" == "mailer-daemon@google.com" ] &amp;amp;&amp;amp; break;
&lt;br /&gt;grep "Delivery to the following recipient failed permanently" &amp;lt;( echo -e "${LAST_MAIL}" ) &amp;amp;&amp;amp; break;
&lt;br /&gt;(( ${TOTAL_MESSAGES:=0} == 0 )) &amp;amp;&amp;amp; break;
&lt;br /&gt;
&lt;br /&gt;MAIL_BODY="$(
&lt;br /&gt;  {
&lt;br /&gt;  [ echo -e "
&lt;br /&gt;  # ---------------------------------------------------------- #
&lt;br /&gt;  # RESPONSE VIA BASH #
&lt;br /&gt;  # --------------------- ORIGINAL MESSAGE ------------------- #
&lt;br /&gt;  \n${LAST_MAIL}
&lt;br /&gt;  ";
&lt;br /&gt;  }
&lt;br /&gt;)";
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;openssl s_client -crlf -connect smtp.gmail.com:465 &amp;lt; &amp;lt;(
&lt;br /&gt;  sleep $SLEEP_TIME; echo "ehlo ${GMAIL_USER}";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "AUTH PLAIN ${AUTH_HASH}";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "mail from:&amp;lt;${GMAIL_USER}@gmail.com&amp;gt;";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "rcpt to:";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "rcpt to:&amp;lt;${DEST_ADDR}&amp;gt;";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "DATA";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "From: ${GMAIL_USER}";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "Subject: $SUBJECT";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "To: ${DEST_ADDR}";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "";
&lt;br /&gt;  sleep $SLEEP_TIME; echo -e "${MAIL_BODY}";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "";
&lt;br /&gt;  sleep $SLEEP_TIME; echo ".";
&lt;br /&gt;  sleep $SLEEP_TIME; echo "quit";
&lt;br /&gt;  sleep $SLEEP_TIME;
&lt;br /&gt;) 2&amp;gt;&amp;amp;1 | cat - &amp;gt; /dev/null
&lt;br /&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-5461909168940466432?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kVBvkUeb6hoCdtjK_YQBlPlxROo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kVBvkUeb6hoCdtjK_YQBlPlxROo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kVBvkUeb6hoCdtjK_YQBlPlxROo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kVBvkUeb6hoCdtjK_YQBlPlxROo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/PbRJFXI3-6Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/5461909168940466432/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=5461909168940466432" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/5461909168940466432?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/5461909168940466432?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/PbRJFXI3-6Y/gmail-acess-via-bash-imap.html" title="Gmail acess via bash - IMAP" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/08/gmail-acess-via-bash-imap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QNQnsyfCp7ImA9WhZXFEg.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-1643447789693646573</id><published>2011-05-03T17:42:00.000-03:00</published><updated>2011-05-03T17:43:13.594-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T17:43:13.594-03:00</app:edited><title>Running various commands in bash with limits</title><content type="html">Running various commands in bash with limits&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# Run various commands at sametime in bash&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;NUM_MAX_THREADS=200;&lt;br /&gt;IN_FILE="filein.txt";&lt;br /&gt;OUT_FILE="fileout.txt";&lt;br /&gt;CURR_LINE=0;&lt;br /&gt;SECONDS=0;&lt;br /&gt;SECONDS_AVG=0;&lt;br /&gt;TOTAL_LINES=$(cat $IN_FILE | wc -l);&lt;br /&gt;LINE_START_AT="$1";&lt;br /&gt;&lt;br /&gt;# echo the time statistics&lt;br /&gt;time (&lt;br /&gt;    # read the in file&lt;br /&gt;    cat $IN_FILE |&lt;br /&gt;        # get the row,&lt;br /&gt;        while read LINE;&lt;br /&gt;            do&lt;br /&gt;            # jumps at the start line&lt;br /&gt;            if [[ $CURR_LINE -lt $LINE_START_AT ]]; then&lt;br /&gt;                    echo "Jumping line... $(( CURR_LINE++ ))";&lt;br /&gt;                    continue;&lt;br /&gt;            fi;&lt;br /&gt;            # if don't got processed&lt;br /&gt;            if [[ $(grep $LINE $OUT_FILE|wc -l) -eq 0 ]]; then&lt;br /&gt;                    # check the number of threads running&lt;br /&gt;                    THREADS_IN_USE=$( ps -Afe | grep wget | grep 'YOURCOMMAND' | wc -l );&lt;br /&gt;                    # if over the limits, wait to free...&lt;br /&gt;                    while [[ $THREADS_IN_USE -gt $NUM_MAX_THREADS ]];&lt;br /&gt;                        do echo "WAITING THREADS TO GET DONE ($THREADS_IN_USE RUNNING)...";&lt;br /&gt;                        sleep 1;&lt;br /&gt;                        THREADS_IN_USE=$( ps -Afe | grep wget | grep 'YOURCOMMAND' | wc -l );&lt;br /&gt;                    done;&lt;br /&gt;                    # runs the command&lt;br /&gt;                    {&lt;br /&gt;                            echo $( YOURCOMMAND "$LINE" ) &amp;gt;&amp;gt; $OUT_FILE;&lt;br /&gt;                    } &amp;amp;&lt;br /&gt;            fi;&lt;br /&gt;            # TIP, use my estimate.sh to get the remaining time.&lt;br /&gt;            # get the process average per second.&lt;br /&gt;            NUM_LINES_DONE=$(cat $OUT_FILE | wc -l);&lt;br /&gt;            SECONDS=$(date "+%s");&lt;br /&gt;            if [[ $SECONDS -gt $(( SECONDS_AVG + 10 )) ]]; then&lt;br /&gt;                    SECONDS_ACTUAL=$(( SECONDS - SECONDS_AVG ));&lt;br /&gt;                    NUM_LINES_DONE_MEDIA=$(( NUM_LINES_DONE - NUM_LINES_DONE_ANT ));&lt;br /&gt;                    NUM_LINES_DONE_ANT=$NUM_LINES_DONE;&lt;br /&gt;                    SECONDS_AVG=$SECONDS;&lt;br /&gt;                    MEDIA=$(( NUM_LINES_DONE_MEDIA / SECONDS_ACTUAL ));&lt;br /&gt;                    NUM_LINES_REMAINING=$(( TOTAL_LINES - NUM_LINES_DONE ));&lt;br /&gt;                    REMAINING_TIME=$(( NUM_LINES_REMAINING * MEDIA ));&lt;br /&gt;            fi;&lt;br /&gt;            # echoes the status and qtd of active threads&lt;br /&gt;            echo "Threads running: ${THREADS_IN_USE}, Lines done: $NUM_LINES_DONE, processing line: $(( CURR_LINE++)), MEDIA: $MEDIA Lines/Second, Remaining time: $REMAINING_TIME SECONDS;";&lt;br /&gt;        done;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-1643447789693646573?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-TKU3yLs1dQOaiEmqyl26ljhnV8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-TKU3yLs1dQOaiEmqyl26ljhnV8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-TKU3yLs1dQOaiEmqyl26ljhnV8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-TKU3yLs1dQOaiEmqyl26ljhnV8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/X6v2adbNW34" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/1643447789693646573/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=1643447789693646573" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1643447789693646573?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1643447789693646573?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/X6v2adbNW34/running-various-commands-in-bash-with.html" title="Running various commands in bash with limits" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/05/running-various-commands-in-bash-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYMR3g_cSp7ImA9WhZXFEg.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-2906522811814962115</id><published>2011-05-03T17:21:00.002-03:00</published><updated>2011-05-03T17:23:06.649-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T17:23:06.649-03:00</app:edited><title>give color to your scripts</title><content type="html">Use the below codes in bash using 'echo -e ' to colorize your output.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;#&lt;br /&gt;# Description:&lt;br /&gt;#&lt;br /&gt;#    Prints a color table of 8bg * 8fg * 2 states (regular/bold)&lt;br /&gt;#&lt;br /&gt;# Copyright:&lt;br /&gt;#&lt;br /&gt;#    (C) 2009 Wolfgang Frisch &amp;lt;xororand@unfoog.de&amp;gt;&lt;br /&gt;#&lt;br /&gt;# License:&lt;br /&gt;#&lt;br /&gt;#    This program is free software: you can redistribute it and/or modify&lt;br /&gt;#    it under the terms of the GNU General Public License as published by&lt;br /&gt;#    the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;#    (at your option) any later version.&lt;br /&gt;#&lt;br /&gt;#    This program is distributed in the hope that it will be useful,&lt;br /&gt;#    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;#    GNU General Public License for more details.&lt;br /&gt;#&lt;br /&gt;#    You should have received a copy of the GNU General Public License&lt;br /&gt;#    along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;&lt;br /&gt;echo&lt;br /&gt;echo Table for 16-color terminal escape sequences.&lt;br /&gt;echo Replace ESC with \\033 in bash.&lt;br /&gt;echo&lt;br /&gt;echo "Background | Foreground colors"&lt;br /&gt;echo "---------------------------------------------------------------------"&lt;br /&gt;for((bg=40;bg&amp;lt;=47;bg++)); do&lt;br /&gt;        for((bold=0;bold&amp;lt;=1;bold++)) do&lt;br /&gt;                echo -en "\033[0m"" ESC[${bg}m   | "&lt;br /&gt;                for((fg=30;fg&amp;lt;=37;fg++)); do&lt;br /&gt;                        if [ $bold == "0" ]; then&lt;br /&gt;                                echo -en "\033[${bg}m\033[${fg}m [${fg}m  "&lt;br /&gt;                        else&lt;br /&gt;                                echo -en "\033[${bg}m\033[1;${fg}m [1;${fg}m"&lt;br /&gt;                        fi&lt;br /&gt;                done&lt;br /&gt;                echo -e "\033[0m"&lt;br /&gt;        done&lt;br /&gt;        echo "--------------------------------------------------------------------- "&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;echo&lt;br /&gt;echo&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-2906522811814962115?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zlVMtOHnMziVZ30XHDB0wyiHFLs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zlVMtOHnMziVZ30XHDB0wyiHFLs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zlVMtOHnMziVZ30XHDB0wyiHFLs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zlVMtOHnMziVZ30XHDB0wyiHFLs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/TktZH1NUHXM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/2906522811814962115/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=2906522811814962115" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/2906522811814962115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/2906522811814962115?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/TktZH1NUHXM/give-color-to-your-scripts.html" title="give color to your scripts" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/05/give-color-to-your-scripts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4EQ346eyp7ImA9WhZXFEg.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-6550687466845462210</id><published>2011-05-03T17:14:00.003-03:00</published><updated>2011-05-03T17:18:22.013-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T17:18:22.013-03:00</app:edited><title>estimate.sh</title><content type="html">A cool script whoted by myself to calculate the remaining time to a file achieve a number of lines.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;devtools:/srv/scripts # cat estimate.sh&lt;br /&gt;#!/bin/bash&lt;br /&gt;# estimate the remaining time for a file to achieve a number&lt;br /&gt;# of lines&lt;br /&gt;# usage&lt;br /&gt;#       &amp;lt;scriptName&amp;gt; &amp;lt;fileName&amp;gt; &amp;lt;totaloflines&amp;gt;&lt;br /&gt;file="$1";&lt;br /&gt;vmax=$2;&lt;br /&gt;tini=$(date +%s);&lt;br /&gt;vini=$(cat $file | wc -l);&lt;br /&gt;while ( sleep 1 );&lt;br /&gt;do&lt;br /&gt;        # get the current number of rows&lt;br /&gt;        vact=$(cat $file | wc -l);&lt;br /&gt;        # get the rows recovered since the start of script&lt;br /&gt;        vela=$((vact-vini));&lt;br /&gt;        # get the current time in seconds&lt;br /&gt;        tact=$(date +%s);&lt;br /&gt;        # get the time elapsed in seconds since the start of script&lt;br /&gt;        tela=$((tact-tini));&lt;br /&gt;&lt;br /&gt;        # discover the average of rows added per second&lt;br /&gt;        if (( $tela &amp;gt; 0 )); then&lt;br /&gt;                vave=$((vela / tela));&lt;br /&gt;        fi;&lt;br /&gt;        # get rows remaining&lt;br /&gt;        vrem=$(( vmax - vact ))&lt;br /&gt;        # get the estimated remaining time&lt;br /&gt;        if (( $vave &amp;gt; 0 )); then&lt;br /&gt;                trem=$(( vrem / vave ))&lt;br /&gt;        fi;&lt;br /&gt;&lt;br /&gt;        hr=$((trem / 3600 ))&lt;br /&gt;        mr=$((trem / 60 % 60 ))&lt;br /&gt;        sr=$((trem % 60 ))&lt;br /&gt;&lt;br /&gt;        echo "Linhas processadas: $vact; linhas restantes: $vrem; tempo restante: $hr:$mr:$sr;";&lt;br /&gt;done;&lt;scriptname&gt;&lt;filename&gt;&lt;totaloflines&gt;&lt;/totaloflines&gt;&lt;/filename&gt;&lt;/scriptname&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-6550687466845462210?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9J9Mcz2bYkl-u6Is-hHMano0xts/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9J9Mcz2bYkl-u6Is-hHMano0xts/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9J9Mcz2bYkl-u6Is-hHMano0xts/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9J9Mcz2bYkl-u6Is-hHMano0xts/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/RtHkHZgvkXE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/6550687466845462210/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=6550687466845462210" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6550687466845462210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6550687466845462210?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/RtHkHZgvkXE/estimatesh.html" title="estimate.sh" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/05/estimatesh.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIEQnYzcSp7ImA9WhZXFEg.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-4483826483281949529</id><published>2011-05-03T17:10:00.002-03:00</published><updated>2011-05-03T17:11:43.889-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T17:11:43.889-03:00</app:edited><title>gnu bash script template</title><content type="html">If you want to do a nice script in gnu way you may think useful:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#&lt;br /&gt;# A sample program illustrating shell option parsing.&lt;br /&gt;#&lt;br /&gt;# Copyright (C) 2007 by Bob Proulx &amp;lt;[EMAIL PROTECTED]&amp;gt;.&lt;br /&gt;#&lt;br /&gt;# This program is free software; you can redistribute it and/or modify&lt;br /&gt;# it under the terms of the GNU General Public License as published by&lt;br /&gt;# the Free Software Foundation; either version 2, or (at your option)&lt;br /&gt;# any later version.&lt;br /&gt;#&lt;br /&gt;# This program is distributed in the hope that it will be useful,&lt;br /&gt;# but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;# GNU General Public License for more details.&lt;br /&gt;#&lt;br /&gt;# You should have received a copy of the GNU General Public License&lt;br /&gt;# along with this program; if not, write to the Free Software Foundation,&lt;br /&gt;# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.&lt;br /&gt;&lt;br /&gt;version=0.0&lt;br /&gt;&lt;br /&gt;progname=$(basename $0)&lt;br /&gt;&lt;br /&gt;print_help()&lt;br /&gt;{&lt;br /&gt;    cat &amp;lt;&amp;lt;'EOF'&lt;br /&gt;Usage: exampleprog [options] SOURCE...&lt;br /&gt;  or:  exampleprog [options] DIRECTORY&lt;br /&gt;&lt;br /&gt;Do something with something.  Write your man page description here.&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;      --help          print this help message&lt;br /&gt;      --version       print program version&lt;br /&gt;  -a, --alpha         do alpa&lt;br /&gt;  -b, --bravo=STRING  do bravo&lt;br /&gt;  -d, --debug         debug program&lt;br /&gt;  -q, --quiet         quiet output&lt;br /&gt;  -v, --verbose       verbose output&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;&lt;br /&gt;The most common use is to run it like this.&lt;br /&gt;&lt;br /&gt;  $ exampleprog&lt;br /&gt;&lt;br /&gt;But sometimes like this.&lt;br /&gt;&lt;br /&gt;  $ exampleprog -q -a --bravo=foo&lt;br /&gt;&lt;br /&gt;Report bugs to &lt;mailing-address&gt;.&lt;br /&gt;EOF&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;print_version()&lt;br /&gt;{&lt;br /&gt;    cat &amp;lt;&lt;eof progname="" version="" copyright="" free="" software="" this="" is="" you="" may="" redistribute="" copies="" of="" it="" under="" the="" terms="" gnu="" general="" public="" license="" org="" licenses="" html=""&gt;.&lt;br /&gt;There is NO WARRANTY, to the extent permitted by law.&lt;br /&gt;&lt;br /&gt;Written by Bob Proulx.&lt;br /&gt;EOF&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SHORTOPTS="ab:dqv"&lt;br /&gt;LONGOPTS="help,version,alpha,bravo:,debug,quiet,verbose"&lt;br /&gt;&lt;br /&gt;if $(getopt -T &amp;gt;/dev/null 2&amp;gt;&amp;amp;1) ; [ $? = 4 ] ; then # New longopts getopt.&lt;br /&gt;    OPTS=$(getopt -o $SHORTOPTS --long $LONGOPTS -n "$progname" -- "$@")&lt;br /&gt;else # Old classic getopt.&lt;br /&gt;    # Special handling for --help and --version on old getopt.&lt;br /&gt;    case $1 in --help) print_help ; exit 0 ;; esac&lt;br /&gt;    case $1 in --version) print_version ; exit 0 ;; esac&lt;br /&gt;    OPTS=$(getopt $SHORTOPTS "$@")&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ $? -ne 0 ]; then&lt;br /&gt;    echo "'$progname --help' for more information" 1&amp;gt;&amp;amp;2&lt;br /&gt;    exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;eval set -- "$OPTS"&lt;br /&gt;&lt;br /&gt;alpha=false&lt;br /&gt;bravo=""&lt;br /&gt;debug=false&lt;br /&gt;quiet=false&lt;br /&gt;verbose=false&lt;br /&gt;while [ $# -gt 0 ]; do&lt;br /&gt;    : debug: $1&lt;br /&gt;    case $1 in&lt;br /&gt;        --help)&lt;br /&gt;            print_help&lt;br /&gt;            exit 0&lt;br /&gt;            ;;&lt;br /&gt;        --version)&lt;br /&gt;            print_version&lt;br /&gt;            exit 0&lt;br /&gt;            ;;&lt;br /&gt;        -a|--alpha)&lt;br /&gt;            alpha=true&lt;br /&gt;            shift&lt;br /&gt;            ;;&lt;br /&gt;        -b|--bravo)&lt;br /&gt;            bravo=$2&lt;br /&gt;            shift 2&lt;br /&gt;            ;;&lt;br /&gt;        -d|--debug)&lt;br /&gt;            debug=true&lt;br /&gt;            shift&lt;br /&gt;            ;;&lt;br /&gt;        -q|--quiet)&lt;br /&gt;            quiet=true&lt;br /&gt;            shift&lt;br /&gt;            ;;&lt;br /&gt;        -v|--verbose)&lt;br /&gt;            verbose=true&lt;br /&gt;            shift&lt;br /&gt;            ;;&lt;br /&gt;        --)&lt;br /&gt;            shift&lt;br /&gt;            break&lt;br /&gt;            ;;&lt;br /&gt;        *)&lt;br /&gt;            echo "Internal Error: option processing error: $1" 1&amp;gt;&amp;amp;2&lt;br /&gt;            exit 1&lt;br /&gt;            ;;&lt;br /&gt;    esac&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;if $verbose; then&lt;br /&gt;   echo "Verbose output here."&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if ! $quiet; then&lt;br /&gt;    echo Say stuff here.&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;$debug &amp;amp;&amp;amp; echo No bugs found here.&lt;br /&gt;&lt;br /&gt;exit 0&lt;/eof&gt;&lt;/mailing-address&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-4483826483281949529?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/r5tjqxImJ9QR-vOWogMo4qhJDkM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r5tjqxImJ9QR-vOWogMo4qhJDkM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/r5tjqxImJ9QR-vOWogMo4qhJDkM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r5tjqxImJ9QR-vOWogMo4qhJDkM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/1mvxD-4hVRE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/4483826483281949529/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=4483826483281949529" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/4483826483281949529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/4483826483281949529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/1mvxD-4hVRE/gnu-bash-script-template.html" title="gnu bash script template" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/05/gnu-bash-script-template.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IBQ30-eCp7ImA9WhZXFUk.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-5020955358771666534</id><published>2011-05-02T15:07:00.006-03:00</published><updated>2011-05-04T17:39:12.350-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-04T17:39:12.350-03:00</app:edited><title>Oracle 10g ugly index/trigger bug</title><content type="html">today, I found a ugly bug in oracle 10g:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;CREATE TABLE TABLE_TESTBUG (&lt;br /&gt;ID_REG NUMBER NOT NULL PRIMARY KEY,&lt;br /&gt;DT_FIELD1 TIMESTAMP(6),&lt;br /&gt;STATUS NUMBER(10)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE TRIGGER TG_TESTBUG&lt;br /&gt;after INSERT OR UPDATE ON TABLE_TESTBUG&lt;br /&gt;FOR EACH ROW&lt;br /&gt;DECLARE&lt;br /&gt;V_VAR NUMBER;&lt;br /&gt;BEGIN&lt;br /&gt;SELECT COUNT(*) INTO V_VAR&lt;br /&gt;FROM DUAL&lt;br /&gt;WHERE TRUNC(SYSDATE)=TRUNC(:new.DT_FIELD1);&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; INSERT INTO TABLE_TESTBUG (ID_REG, DT_FIELD1, STATUS) VALUES (1, SYSDATE, 1);&lt;br /&gt;1 row created.&lt;br /&gt;SQL&amp;gt; INSERT INTO TABLE_TESTBUG (ID_REG, DT_FIELD1, STATUS) VALUES (2, SYSDATE, 1);&lt;br /&gt;1 row created.&lt;br /&gt;SQL&amp;gt; INSERT INTO TABLE_TESTBUG (ID_REG, DT_FIELD1, STATUS) VALUES (3, SYSDATE-1, 1);&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; CREATE INDEX IDX_TESTBUG_1 ON TABLE_TESTBUG (TRUNC(DT_FIELD1),STATUS);&lt;br /&gt;Index created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; UPDATE TABLE_TESTBUG SET STATUS=3 WHERE TRUNC(DT_FIELD1)=TRUNC(SYSDATE);&lt;br /&gt;UPDATE TABLE_TESTBUG SET STATUS=3 WHERE TRUNC(DT_FIELD1)=TRUNC(SYSDATE)&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-03113: end-of-file on communication channel&lt;br /&gt;Process ID: 0&lt;br /&gt;Session ID: 3284 Serial number: 2922&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;In database log:&lt;br /&gt;&lt;blockquote&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;PT-BR&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Tabela normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-US" lang="EN-US"&gt;Errors in file /opt/oracle/admin/*****/udump/*****_ora_24645.trc:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language:EN-US" lang="EN-US"&gt;ORA-07445: exception encountered: core dump [_intel_fast_memcpy.A()+10] [SIGSEGV] [Invalid permissions for mapped object] [0x2AE125E59000] [] []&lt;/span&gt;&lt;/p&gt;  &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;If you drop the index or disable the trigger or do not use the timestamp field in update, everythings is alright...&lt;br /&gt;&lt;br /&gt;I has received it in 5 different oracle databases but all in version 10.2.0.4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The way we founded was create a index by the full field timestamp, not using trunc();&lt;br /&gt;&lt;blockquote&gt;SQL&amp;gt;drop index idx_testbug_1;&lt;br /&gt;Index dropped.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt;create index idx_textbug_1 on table_testbug (dt_field1);&lt;br /&gt;Index created.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;All things works ok... I know... it's not the best option, but a workaround...&lt;br /&gt;Remember:&lt;br /&gt;&lt;blockquote&gt;To use index you need to use "between", not "trunc"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;no more for now...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-5020955358771666534?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UNNBcoN3ca4yCSdNgTMqkl46XYs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UNNBcoN3ca4yCSdNgTMqkl46XYs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UNNBcoN3ca4yCSdNgTMqkl46XYs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UNNBcoN3ca4yCSdNgTMqkl46XYs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/gNIn692L334" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/5020955358771666534/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=5020955358771666534" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/5020955358771666534?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/5020955358771666534?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/gNIn692L334/oracle-10g-uggly-indextrigger-bug.html" title="Oracle 10g ugly index/trigger bug" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/05/oracle-10g-uggly-indextrigger-bug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YDSH86fSp7ImA9WhZXEEw.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-3109062540692109221</id><published>2011-04-28T12:15:00.006-03:00</published><updated>2011-04-28T14:19:39.115-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-28T14:19:39.115-03:00</app:edited><title>Shifting accents in Javascript</title><content type="html">Sorry about the little post... I'm out of time...&lt;br /&gt;&lt;br /&gt;There's 2 big problemns for accentuation of letters, codepages and database.&lt;br /&gt;In Oracle for sample, A char 'Á' use 2 positions of a column varchar2 and can cause a error:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;ORA-12899: value too large for column "OWNER_NAME"."TABLE_NAME"."COLUMN_NAME" (actual: 98, maximum: 50)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I created the follow script to bypass it.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var arrayAcentos  = ['Á','á','Â','â','À','à','Å','å','Ã','ã','Ä','ä','Æ','æ','É','é','Ê','ê','È','è','Ë','ë','Ð','ð','Í','í','Î','î','Ì','ì','Ï','ï','Ó','ó','Ô','ô','Ò','ò','Ø','ø','Õ','õ','Ö','ö','Ú','ú','Û','û','Ù','ù','Ü','ü','Ç','ç','Ñ','ñ','Ý','ý'];&lt;br /&gt;var arraySemAcentos = ['A','a','A','a','A','a','A','a','A','a','A','a','&amp;amp;','&amp;amp;','E','e','E','e','E','e','E','e','D','o','I','i','I','i','I','i','I','i','O','o','O','o','O','o','0','0','O','o','O','o','U','u','U','u','U','u','U','u','C','c','N','n','Y','y'];&lt;br /&gt;function removeAcentos(e) {&lt;br /&gt;var k = e.keyCode ? e.keyCode : e.charCode;&lt;br /&gt;var a = String.fromCharCode(k)&lt;br /&gt;var i = -1;&lt;br /&gt;if ( !arrayAcentos.indexOf ) {&lt;br /&gt;      for(var n = 0; n &amp;lt; arrayAcentos.length; n++)&lt;br /&gt;          if(arrayAcentos[n] == a) i=n;&lt;br /&gt;} else {&lt;br /&gt; i = arrayAcentos.indexOf(a);&lt;br /&gt;}&lt;br /&gt;if (i == -1) return;&lt;br /&gt;var b = arraySemAcentos[i];&lt;br /&gt;if ( e.keyCode &amp;amp;&amp;amp; String.fromCharCode(e.keyCode) == a ) {&lt;br /&gt; e.keyCode = b.charCodeAt(0)&lt;br /&gt; return&lt;br /&gt;}&lt;br /&gt;if (String.fromCharCode(e.charCode) == a) {&lt;br /&gt;  var newEvent = document.createEvent("KeyEvents")&lt;br /&gt;  newEvent.initKeyEvent("keypress", true, true, document.defaultView,&lt;br /&gt;                        e.ctrlKey, e.altKey, e.shiftKey,&lt;br /&gt;                        e.metaKey, 0, b.charCodeAt(0))&lt;br /&gt;  e.preventDefault()&lt;br /&gt;  e.target.dispatchEvent(newEvent)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;input onkeypress="return removeAcentos(event)" /&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-3109062540692109221?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GMWiGPgY0WTXROJp9TiCi_UyPag/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GMWiGPgY0WTXROJp9TiCi_UyPag/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GMWiGPgY0WTXROJp9TiCi_UyPag/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GMWiGPgY0WTXROJp9TiCi_UyPag/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/ZJskunR0bP0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/3109062540692109221/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=3109062540692109221" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/3109062540692109221?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/3109062540692109221?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/ZJskunR0bP0/remocao-de-acentos-em-javascript.html" title="Shifting accents in Javascript" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2011/04/remocao-de-acentos-em-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcDRHs_fyp7ImA9Wx5UF0g.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-7588906636200017600</id><published>2010-10-22T09:56:00.005-02:00</published><updated>2010-10-22T12:01:15.547-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-22T12:01:15.547-02:00</app:edited><title>sqlplus: activate sqlplus history</title><content type="html">Natively oracle's sqlplus do not permit search history for previous commands.&lt;br /&gt;&lt;br /&gt;There's a way to do it with rlwrap. you can also do a alias to always use it.&lt;br /&gt;&lt;br /&gt;rlwrap depends of gnu readline, it's secure to download and install:&lt;br /&gt;&lt;a href="ftp://ftp.gnu.org/gnu/readline/"&gt;ftp://ftp.gnu.org/gnu/readline/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;tar xvf readline-6.1.tar.gz&lt;br /&gt;cd readline-6.1;&lt;br /&gt;./configure --prefix=/usr;&lt;br /&gt;make;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;as root or sudo:&lt;br /&gt;&lt;blockquote&gt;make install;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now download the rlwrap from:&lt;br /&gt;&lt;a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/"&gt;http://utopia.knoware.nl/~hlub/uck/rlwrap/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;unzip, compile and install:&lt;br /&gt;&lt;blockquote&gt;tar xvf rlwrap-0.37.tar.gz&lt;br /&gt;cd rlwrap-0.37;&lt;br /&gt;./configure --prefix=/usr;&lt;br /&gt;make;&lt;/blockquote&gt;&lt;br /&gt;as root or sudo:&lt;br /&gt;&lt;blockquote&gt;make install;&lt;br /&gt;ldconfig;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;To make things ease:&lt;br /&gt;&lt;blockquote&gt;alias sqlplus="rlwrap sqlplus"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You can add the above line(alias) to /etc/bash.bashrc or ~/.bashrc to make it persistent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-7588906636200017600?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OP5XckOv-IqdtrhAZQYBgYlkzAg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OP5XckOv-IqdtrhAZQYBgYlkzAg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OP5XckOv-IqdtrhAZQYBgYlkzAg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OP5XckOv-IqdtrhAZQYBgYlkzAg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/6eAqyQJPTyA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/7588906636200017600/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=7588906636200017600" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7588906636200017600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7588906636200017600?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/6eAqyQJPTyA/sqlplus-activate-sqlplus-history.html" title="sqlplus: activate sqlplus history" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2010/10/sqlplus-activate-sqlplus-history.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YDR3s7eSp7ImA9Wx5VFEU.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-1565106420129400382</id><published>2010-10-06T16:38:00.004-03:00</published><updated>2010-10-07T17:59:36.501-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-07T17:59:36.501-03:00</app:edited><title>BASH: How to recover a output stdin and stderr process disowned with disown or nohup</title><content type="html">Wow strace is great.&lt;br /&gt;&lt;br /&gt;I discovered it today and its fantastic.&lt;br /&gt;&lt;br /&gt;it's a process sniffer... a GREAT hacking tool... you can see all communication between libraries and the application... GREAT GREAT GREAT!&lt;br /&gt;&lt;br /&gt;but in practical world only one bit for now:&lt;br /&gt;&lt;br /&gt;When you forgot to redirect a output of a important process at start, that can not be stoped or restarted for now, but you need to read the output that is redirected to /dev/null, how do you do ?&lt;br /&gt;&lt;br /&gt;strace can do this trick.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;strace -e write=1,2 -p $PID 2&gt;&amp;1 | sed -un "/^ |/p" | sed -ue "s/^.\{9\}\(.\{50\}\).\+/\1/g" -e 's/ //g' | xxd -r -p;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Sample:&lt;br /&gt;&lt;blockquote&gt;{ i=0; while sleep 1; do echo -e "writing a long line to stdout 1 [AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] 2 [BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB] 3 [CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC] \nline2 == var i=$((i  ))";done; } &gt; /dev/null &amp; PID=$!&lt;/blockquote&gt;&lt;br /&gt;this will create a background process with no output, but we have now the PID in var $PID, then you can sniffer the stdout and stderr with this trick:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;strace -e write=1,2 -p $PID 2&gt;&amp;1 | sed -un "/^ |/p" | sed -ue "s/^.\{9\}\(.\{50\}\).\+/\1/g" -e 's/ //g' | xxd -r -p;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-1565106420129400382?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Br6CJyWBLHwLPtHiWbp5D3QvOJQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Br6CJyWBLHwLPtHiWbp5D3QvOJQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Br6CJyWBLHwLPtHiWbp5D3QvOJQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Br6CJyWBLHwLPtHiWbp5D3QvOJQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/QaRhrLE7MGM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/1565106420129400382/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=1565106420129400382" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1565106420129400382?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1565106420129400382?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/QaRhrLE7MGM/bash-how-to-recover-output-stdin-and.html" title="BASH: How to recover a output stdin and stderr process disowned with disown or nohup" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2010/10/bash-how-to-recover-output-stdin-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AEQ3s6fyp7ImA9Wx5TGU8.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-7883405774894556397</id><published>2010-07-29T13:24:00.004-03:00</published><updated>2010-08-04T08:35:02.517-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-04T08:35:02.517-03:00</app:edited><title>sqlplus: list query result one column per console row - bash way</title><content type="html">&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;# transform horizontal sqlplus data in vertical&lt;br /&gt;# vsqlplus "owner/password@alias" "SELECT * FROM TABLE_NAME;";&lt;br /&gt;#&lt;br /&gt;# PS1: DO NOT WORK WITH SH ONLY WITH BASH!&lt;br /&gt;# PS2: USE ";" AT END OF QUERY&lt;br /&gt;# PS3: ALWAYS USE NAMED COLUMNS&lt;br /&gt;#      SELECT COUNT(*) FROM TABLE - DO NOT WORK&lt;br /&gt;#      SELECT COUNT(*) AS TOTAL FROM TABLE - DO WORK&lt;br /&gt;&lt;br /&gt;CONN_STR="$1";&lt;br /&gt;SQL_QUERY="$2";&lt;br /&gt;&lt;br /&gt;function vsplit(){&lt;br /&gt;        CONN_STR="$1";&lt;br /&gt;        SQL_QUERY="$2";&lt;br /&gt;        cn=0;&lt;br /&gt;        ROWNUM=-2;&lt;br /&gt;        # echo "EXECUTANDO QUERY \"${SQL_QUERY}\""&lt;br /&gt;        # echo "CONECTADO AO BANCO \"${CONN_STR}\""&lt;br /&gt;        # sqlplus -s "${CONN_STR}" &lt; &lt;( echo "select sysdate from dual;" );&lt;br /&gt;        sqlplus -s "${CONN_STR}" &lt; &lt;(&lt;br /&gt;                echo "set feedback off";&lt;br /&gt;                echo "set colsep \"'\"";&lt;br /&gt;                echo "set lines 32676";&lt;br /&gt;                echo "set pages 8000";&lt;br /&gt;                echo "set timing off";&lt;br /&gt;                echo "${SQL_QUERY}";&lt;br /&gt;                echo "EXIT" ) |&lt;br /&gt;        sed "/^$/d" |&lt;br /&gt;        tr -d '\t' |&lt;br /&gt;        tr -s ' ' |&lt;br /&gt;        while read cols;&lt;br /&gt;        do&lt;br /&gt;                ((++ROWNUM == -1)) &amp;&amp;&lt;br /&gt;                eval "array_cols=( $(echo ${cols} | tr \' ' ') )";&lt;br /&gt;                (( ROWNUM &gt; 0 )) &amp;&amp; (&lt;br /&gt;                        echo "ROWNUM=$ROWNUM";&lt;br /&gt;                        for (( c = 0; c &lt; ${#array_cols[*]}; c++ ));&lt;br /&gt;                        do&lt;br /&gt;                                echo " ${array_cols[(c) % ${#array_cols[*]}]}='$(echo "$cols"|cut -d\' -f$((c+1)) )'";&lt;br /&gt;                        done;&lt;br /&gt;                )&lt;br /&gt;        done;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;# vsplit "${CONN_STR}" "${SQL_QUERY}";&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-7883405774894556397?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bQVoGDMXZsB2p-9jHJVkzIWT_is/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bQVoGDMXZsB2p-9jHJVkzIWT_is/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bQVoGDMXZsB2p-9jHJVkzIWT_is/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bQVoGDMXZsB2p-9jHJVkzIWT_is/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/5vw6kaYmWmM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/7883405774894556397/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=7883405774894556397" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7883405774894556397?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7883405774894556397?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/5vw6kaYmWmM/sqlplus-list-query-result-one-column.html" title="sqlplus: list query result one column per console row - bash way" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2010/07/sqlplus-list-query-result-one-column.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ECR3s4fSp7ImA9Wx5TGU8.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-3292876027662286374</id><published>2010-07-29T13:12:00.006-03:00</published><updated>2010-08-04T08:34:26.535-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-04T08:34:26.535-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bash sqlplus csv export" /><title>sqlplus: export as csv - bash way</title><content type="html">&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;devtools:/srv/scripts # cat export_csv.sh&lt;br /&gt;#!/bin/bash&lt;br /&gt;# export a sql result as csv format&lt;br /&gt;# source export_csv.sh&lt;br /&gt;# export_csv "owner/password@database_alias" "SELECT * FROM TABLE_NAME;";&lt;br /&gt;#&lt;br /&gt;# PS1: DO NOT WORK WITH SH ONLY WITH BASH!&lt;br /&gt;# PS2: USE ";" AT END OF QUERY&lt;br /&gt;# PS3: ALWAYS USE NAMED COLUMNS&lt;br /&gt;#      SELECT COUNT(*) FROM TABLE - DO NOT WORK&lt;br /&gt;#      SELECT COUNT(*) AS TOTAL FROM TABLE - DO WORK&lt;br /&gt;&lt;br /&gt;CONN_STR="$1";&lt;br /&gt;SQL_QUERY="$2";&lt;br /&gt;&lt;br /&gt;function export_csv(){&lt;br /&gt;        CONN_STR="$1";&lt;br /&gt;        SQL_QUERY="$2";&lt;br /&gt;        cn=0;&lt;br /&gt;        ROWNUM=-2;&lt;br /&gt;        array_cols=();&lt;br /&gt;        # echo "EXECUTANDO QUERY \"${SQL_QUERY}\""&lt;br /&gt;        # echo "CONECTADO AO BANCO \"${CONN_STR}\""&lt;br /&gt;        # sqlplus -s "${CONN_STR}" &lt; &lt;( echo "select sysdate from dual;" );&lt;br /&gt;        sqlplus -s "${CONN_STR}" &lt; &lt;(&lt;br /&gt;                echo "set feedback off";&lt;br /&gt;                echo "set colsep \"'\"";&lt;br /&gt;                echo "set lines 32676";&lt;br /&gt;                echo "set pages 8000";&lt;br /&gt;                echo "set timing off";&lt;br /&gt;                echo "alter session set nls_date_format='dd/mm/rrrr hh24:mi:ss';";&lt;br /&gt;                echo "${SQL_QUERY}";&lt;br /&gt;                echo "EXIT" ) | tee query_result |&lt;br /&gt;        sed "/^$/d" |&lt;br /&gt;        tr -d '\t' |&lt;br /&gt;        tr -s ' ' |&lt;br /&gt;        while read cols;&lt;br /&gt;        do&lt;br /&gt;                ((++ROWNUM == -1)) &amp;&amp;&lt;br /&gt;                        eval "array_cols=( $(echo ${cols} | tr -s ' '| tr \' ' ') )" &amp;&amp;&lt;br /&gt;                        echo -n "ROWNUM,$(echo ${cols} | tr -s ' ' | tr \' ' ' | sed "s/ /,/g" )";&lt;br /&gt;                ((ROWNUM == 0)) &amp;&amp; (&lt;br /&gt;                        echo ";";&lt;br /&gt;                )&lt;br /&gt;                (( ROWNUM &gt; 0 )) &amp;&amp; (&lt;br /&gt;                        NCOLS=${#array_cols[*]};&lt;br /&gt;                        (( NCOLS == 0 )) &amp;&amp; NCOLS=1;&lt;br /&gt;                        for (( c = 0; c &lt; $NCOLS; c++ ));&lt;br /&gt;                        do&lt;br /&gt;                                (( c == 0 )) &amp;&amp; echo -n "'${ROWNUM}','$(echo "$cols"|cut -d\' -f$((c+1)) )'" || echo -n ",'$(echo "$cols"|cut -d\' -f$((c+1)) )'";&lt;br /&gt;                        done;&lt;br /&gt;                        echo ";";&lt;br /&gt;                )&lt;br /&gt;        done;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;# export_csv "${CONN_STR}" "${SQL_QUERY}";&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-3292876027662286374?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qHYzyql1kuuQvA6AXBueBXJxAEY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qHYzyql1kuuQvA6AXBueBXJxAEY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qHYzyql1kuuQvA6AXBueBXJxAEY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qHYzyql1kuuQvA6AXBueBXJxAEY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/p3x6KVOlquc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/3292876027662286374/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=3292876027662286374" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/3292876027662286374?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/3292876027662286374?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/p3x6KVOlquc/sqlplus-export-as-csv-bash-way.html" title="sqlplus: export as csv - bash way" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2010/07/sqlplus-export-as-csv-bash-way.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcDQ306fip7ImA9WxFbEEU.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-963499211753077834</id><published>2010-07-02T13:04:00.003-03:00</published><updated>2010-07-02T13:11:12.316-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-02T13:11:12.316-03:00</app:edited><title>Firefox e Chrome são mais usados do que IE</title><content type="html">Um site muito conceituado para os desenvolvedores é o w3schools, que traz uma referência muito completa sobre desenvolvimento web. Mesmo os mais experientes costumam tirar suas dúvidas frequentemente neste site.&lt;br /&gt;&lt;br /&gt;Pois bem, o w3schools guarda uma base de dados de estatísticas de uso de browsers, esta base tem mostrado o crescimento do uso dos browsers não microsoft, principalmente Mozilla Firefox e Google Chrome, neste momento:&lt;br /&gt;&lt;table class="reference" border="1" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width="16%"&gt;2010&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_explorer.asp"&gt;IE8&lt;/a&gt;&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_explorer.asp"&gt;IE7&lt;/a&gt;&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_explorer.asp"&gt;IE6&lt;/a&gt;&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_firefox.asp"&gt;Firefox&lt;/a&gt;&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_chrome.asp"&gt;Chrome&lt;/a&gt;&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_safari.asp"&gt;Safari&lt;/a&gt;&lt;/th&gt;     &lt;th width="12%"&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_opera.asp"&gt;Opera&lt;/a&gt;&lt;/th&gt;   &lt;/tr&gt;  &lt;tr&gt;     &lt;td&gt;May&lt;/td&gt;     &lt;td&gt;16.0%&lt;/td&gt;     &lt;td&gt;9.1%&lt;/td&gt;     &lt;td&gt;7.1%&lt;/td&gt;     &lt;td&gt;46.9%&lt;/td&gt;     &lt;td&gt;14.5%&lt;/td&gt;     &lt;td&gt;3.5%&lt;/td&gt;     &lt;td&gt;2.2%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;A referência e todo o histórico de estatísticas está em:&lt;br /&gt;&lt;a href="http://www.w3schools.com/browsers/browsers_stats.asp"&gt;http://www.w3schools.com/browsers/browsers_stats.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Isto para mim, e para todos que já sofreram tentando resolver problemas causados pela falta de padrão(w3c) e erros do IE, é uma notícia fantástica.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-963499211753077834?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lr0h-oB0RVyCPsPBb3d_bcInb9U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lr0h-oB0RVyCPsPBb3d_bcInb9U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lr0h-oB0RVyCPsPBb3d_bcInb9U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lr0h-oB0RVyCPsPBb3d_bcInb9U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/c9M6pxwHUMY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/963499211753077834/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=963499211753077834" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/963499211753077834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/963499211753077834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/c9M6pxwHUMY/firefox-e-chrome-sao-mais-usados-do-que.html" title="Firefox e Chrome são mais usados do que IE" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2010/07/firefox-e-chrome-sao-mais-usados-do-que.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMMQ3o5fyp7ImA9WxFbEEU.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-6870754050539515664</id><published>2010-07-02T12:36:00.003-03:00</published><updated>2010-07-02T13:01:22.427-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-02T13:01:22.427-03:00</app:edited><title>Shell script é mais que útil, é necessário</title><content type="html">Tem muita gente que não tem noção dos benefícios que uma linguagem de script porde trazer.&lt;br /&gt;&lt;br /&gt;Eu sou fã de carteirinha do Bash, utilizo sempre bash para facilitar meu trabalho.&lt;br /&gt;Claro que a performance de execução não é a melhor. Mas por outro lado o desenvolvimento destas soluções são muito mais ágeis.&lt;br /&gt;&lt;br /&gt;Pra quem não tem muita experiência, uma dica de ouro é o site &lt;a href="http://www.commandlinefu.com/commands/browse"&gt;http://www.commandlinefu.com/commands/browse&lt;/a&gt;, que relata comandos pequenos e úteis aos usuários do bash.&lt;br /&gt;&lt;br /&gt;Existem centenas de idéias doque fazer com bash.&lt;br /&gt;&lt;br /&gt;No momento, utilizo bash para verificações automatizadas do sistema, agendadas no cron para garantir que todos os pontos do sistema estejam funcionais. Verifico entre outras coisas, se todos os bancos de dados, dblinks, aplicações e webservices estão acessíveis. No final do script sempre envio email para todos os interessados. Pode-se até enviar SMS, mas para isto é necessário contratar um serviço de alguma operadora, no Brasil não temos outra opção.&lt;br /&gt;&lt;br /&gt;Uso também bash para fazer via linha de comando consultas e ações que necessitam de interação com páginas da internet ou webservices. Para isto basta integrar com wget.&lt;br /&gt;&lt;br /&gt;Não acho legal fazer um post muito grande sobre o assunto, em breve farei outro post ensinando como criar um comando (bash script)  para o acesso a páginas com browsers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-6870754050539515664?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_cqmK7riYEQnlamIkWevN10HK4Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_cqmK7riYEQnlamIkWevN10HK4Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_cqmK7riYEQnlamIkWevN10HK4Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_cqmK7riYEQnlamIkWevN10HK4Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/EL4JL8z2Ks4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/6870754050539515664/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=6870754050539515664" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6870754050539515664?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6870754050539515664?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/EL4JL8z2Ks4/shell-script-e-mais-que-util-e.html" title="Shell script é mais que útil, é necessário" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2010/07/shell-script-e-mais-que-util-e.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFQXw4eCp7ImA9WxdbEk8.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-4694092396884169258</id><published>2008-08-08T16:33:00.003-03:00</published><updated>2008-08-08T16:41:50.230-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-08T16:41:50.230-03:00</app:edited><title>Melhores Práticas no tratamento de erros(Exceptions) em java:</title><content type="html">Java define 2 tipos de Exceptions:&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;Checked Exceptions&lt;/li&gt;&lt;/ul&gt;       Exceptions que extendem a classe Exception o código cliente sempre tem que tratar a possível  exception com um catch, tratando, ou throws, jogando pra cima o erro.&lt;br /&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;Unchecked Exceptions&lt;/li&gt;&lt;/ul&gt;     Todas as Exceptions que extendem a classe RuntimeException. A RuntimeException exception também extende a classe Exception, mas tem um tratamento diferenciado. O código cliente não é obrigado a tratar estas excessões.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Definindo Exceptions:&lt;/span&gt;&lt;br /&gt;1 - Sempre que o código cliente não puder fazer algo com a exception use Unchecked Exceptions.&lt;br /&gt;2 - Preserve a encapsulação do erro (Nunca use throw new Exception("erro neste metodo tal") em um catch)&lt;br /&gt;3 - Não crie novas Exceptions customizadas se não forem adicionar informações importantes para o código cliente.&lt;br /&gt;4 - Documente as Exceptions (javadoc com @throws, e documentacao do projeto)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Usando Exceptions:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1 - Sempre se certificar que não deixou nada aberto como conexão a banco (usar o finally)&lt;br /&gt;2 - Não usar exceptions para controle de código... Exceptions são para situações excepcionais, não para sempre serem chamadas em uma determinada rotina.&lt;br /&gt;3 - Nunca suprimir/ignorar Exceptions. Se a excessão não deve ser tratada ou não existe sentido o tratamento da excessão no codigo cliente, converta-a para RuntimeException(Unchecked Exception).&lt;br /&gt;4 - Não capture/trate a excessão no nível principal (catch (Exception ex))&lt;br /&gt;5 - Log Excessões apenas uma vez. Várias entradas no log confundem a depuração.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=2"&gt;http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abs,&lt;br /&gt;Ton&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-4694092396884169258?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E04bwf2gOC_p0ccAESGNtnF9b0o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E04bwf2gOC_p0ccAESGNtnF9b0o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E04bwf2gOC_p0ccAESGNtnF9b0o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E04bwf2gOC_p0ccAESGNtnF9b0o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/USJN3Gl_kw4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/4694092396884169258/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=4694092396884169258" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/4694092396884169258?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/4694092396884169258?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/USJN3Gl_kw4/melhores-prticas-no-tratamento-de.html" title="Melhores Práticas no tratamento de erros(Exceptions) em java:" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/08/melhores-prticas-no-tratamento-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUHRHo_eSp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-1156109361777730378</id><published>2008-06-27T10:39:00.003-03:00</published><updated>2008-06-27T10:43:55.441-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:43:55.441-03:00</app:edited><title>Pronto! Mensagens migradas, Inaugurando Oficialmente Blog!!!</title><content type="html">Até aqui, todas as mensagens foram migradas dos últimos 3 anos em meu antigo blog (http://glaudiston.spaces.live.com)&lt;br /&gt;&lt;br /&gt;A partir daqui eu estarei postando com mais frequência.&lt;br /&gt;&lt;br /&gt;Também adicionei o adsense do google... Assim poderei testar este recurso, e quem sabe, complementar um pouco da renda familiar.&lt;br /&gt;&lt;br /&gt;Vou continuar seguindo o mesmo padrão tecnológico e alguns posts pessoais... mas principalmente tecnológico.&lt;br /&gt;Afinal é um blog sobre desenvolvimento, o Meu desenvolvimento. Que compartilho para poder aprender mais, ter um ponto de referência e reflexão, e ajudar outros, que como eu, vivem do que encontram na internet relacionado a tecnologia.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;Atenciosamente,&lt;br /&gt;Glaudiston Gomes&lt;br /&gt;Especialista em TI.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-1156109361777730378?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BkP1G_VHt6zDALAzf6CpFI-e3Rs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BkP1G_VHt6zDALAzf6CpFI-e3Rs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BkP1G_VHt6zDALAzf6CpFI-e3Rs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BkP1G_VHt6zDALAzf6CpFI-e3Rs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/Coc2PRBYgQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/1156109361777730378/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=1156109361777730378" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1156109361777730378?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1156109361777730378?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/Coc2PRBYgQw/pronto-mensagens-migradas-inaugurando.html" title="Pronto! Mensagens migradas, Inaugurando Oficialmente Blog!!!" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/pronto-mensagens-migradas-inaugurando.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEERX05eCp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-6006598980928080939</id><published>2008-06-27T10:32:00.000-03:00</published><updated>2008-06-27T10:33:24.320-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:33:24.320-03:00</app:edited><title>2008-06-20 - Adeus propagandas</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!345"&gt;20 de junho&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!345"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21345.entry?&amp;amp;_c02_vws=1"&gt;Adeus propagandas&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!345" class="bvMsg"&gt; Faz um tempo que quero compartilhar este plugin do firefox, que faz milagres para melhorar a experiência com a internet.&lt;br /&gt;por padrão, o AdBlock Plus já bloqueia a maioria das propagandas, e permite a personalização do restante.&lt;br /&gt;&lt;br /&gt;Imagine usar o windows live mail sem o banner, sem propagandas, sem perda de espaço.&lt;br /&gt;&lt;br /&gt;Por padrão depois de instalado o adblock plus, o banner do live spaces e do live mail já não vai aparecer, mas o espaço ainda vai estar lá.&lt;br /&gt;Para remover o espaço vazio, até então usado pelo banner do live mail, é só adicionar o filtro:&lt;br /&gt;#div(RadAd_Banner)&lt;br /&gt;Já para remover os banners do spaces.live.com, é só adicionar o filtro:&lt;br /&gt;#div(AdContainer)&lt;br /&gt;o resultado são páginas limpas mais seguras e muito menos cansativas.&lt;br /&gt;&lt;br /&gt;Pra quem quer ser feliz e testar este milagre da tecnologia é só baixar o plugin do firefox e nunca mais usar o desnecessário e obsoleto Microsoft Internet Explorer.&lt;br /&gt;&lt;br /&gt;Segue o link do addon:&lt;br /&gt;&lt;a href="http://adblockplus.org/en/installation"&gt;http://adblockplus.org/en/installation&lt;/a&gt;&lt;br /&gt;e do firefox:&lt;br /&gt;&lt;a href="http://www.getfirefox.com/"&gt;http://www.getfirefox.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abraços,&lt;br /&gt;Ton&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;13:04&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-6006598980928080939?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PSEyY1b8Ebtl0P8jTmJOrLugoeU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PSEyY1b8Ebtl0P8jTmJOrLugoeU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PSEyY1b8Ebtl0P8jTmJOrLugoeU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PSEyY1b8Ebtl0P8jTmJOrLugoeU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/lFAWsmdqZ4Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/6006598980928080939/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=6006598980928080939" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6006598980928080939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6006598980928080939?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/lFAWsmdqZ4Q/2008-06-20-adeus-propagandas.html" title="2008-06-20 - Adeus propagandas" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2008-06-20-adeus-propagandas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMDSXszcCp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-7157797238530073190</id><published>2008-06-27T10:30:00.000-03:00</published><updated>2008-06-27T10:31:18.588-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:31:18.588-03:00</app:edited><title>2008-01-04 - Introdução ao Kernel Linux</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!314"&gt;04 de janeiro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!314"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21314.entry?&amp;amp;_c02_vws=1"&gt;Introdução ao Kernel Linux&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!314" class="bvMsg"&gt;    Para quem não entende muito bem este lance de kernel do linux, vou explicar superficialmente:&lt;br /&gt;    O Linux em sí é um "programa" chamado kernel que controla a parte física do computador(Hardware).&lt;br /&gt;    Estes programas do tipo kernel só podem ser usados por outros programas, e são o coração do computador. O kernel é o Sistema Operacional puro, que controla o processador, memória e instruções de hardware, entre outras coisas.&lt;br /&gt;    Todo sistema operacional(O.S.) tem seu kernel. Claro que por causa dos infindáveis tipos de hardware, é necessário que se tenha outros programas ou informações que o kernel precisa para controlar o hardware, estes programas são chamados no windows de drivers, e no linux de modulos.&lt;br /&gt;    Muitos tipos de hardwares são suportados diretamente pelo kernel do linux, mas se você não tem um hardware específico em seu computador, então você não precisa do módulo dele instalado pra você. No Windows você não tem saída. Todos os dispositivos de hardware que vêm com suporte nativo do windows estão lá. Querendo você ou não, e ocupando um espaço desnecessário em sua instalação. Por isto existe no linux a opção de configurar o kernel, ativando apenas o que você precisa. Assim você tem a liberdade de criar o seu sistema personalizado, enxuto e íntegro.&lt;br /&gt;    A configuração do kernel do linux é simples. O difícil é você adquirir os conhecimentos necessários do seu hardware e das opções do kernel que você quer. É necessário que você estude muito a documentação do kernel para ter este conhecimento.&lt;br /&gt;    As distros nada mais são, do que uma configuração compilada do kernel do linux somados a um pacote de programas. Tudo pra facilitar a vida de usuários que normalmente não têm o conhecimento necessário para criar sua própria distro, ou simplesmente acham perca de tempo reinventar a roda.&lt;br /&gt;&lt;br /&gt;Espero que esta breve e resumida informação seja útil.&lt;br /&gt;&lt;br /&gt;Abs,&lt;br /&gt;Ton&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;15:22&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-7157797238530073190?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n6aDgxoifstpMTTHfXFTGFd5Sas/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n6aDgxoifstpMTTHfXFTGFd5Sas/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n6aDgxoifstpMTTHfXFTGFd5Sas/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n6aDgxoifstpMTTHfXFTGFd5Sas/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/WMu69cKoJZk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/7157797238530073190/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=7157797238530073190" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7157797238530073190?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/7157797238530073190?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/WMu69cKoJZk/2008-01-04-introduo-ao-kernel-linux.html" title="2008-01-04 - Introdução ao Kernel Linux" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2008-01-04-introduo-ao-kernel-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGQX8ycCp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-6930724843890506255</id><published>2008-06-27T10:29:00.000-03:00</published><updated>2008-06-27T10:30:20.198-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:30:20.198-03:00</app:edited><title>2007-12-23 - Desafio, um jogo 2D até dia 23-12-2007 ... Feito!</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!313"&gt;23 de dezembro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!313"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21313.entry?&amp;amp;_c02_vws=1"&gt;Desafio, um jogo 2D até dia 23-12-2007 ... Feito!&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!313" class="bvMsg"&gt;No início deste mês aceitei um desafio do meu amigo Bill Guedes no forum programadoresdejogos.com.br, aqui está o desafio:&lt;br /&gt;&lt;a href="http://www.programadoresdejogos.com/forum/viewtopic.php?t=9193&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=0"&gt;http://www.programadoresdejogos.com/forum/viewtopic.php?t=9193&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se trata de um desafio para testar os conhecimento e capacidades de colocar estes conhecimentos em prática: "Quem consegue fazer um jogo do tipo space invaders até o dia 23 ?".&lt;br /&gt;Como achei a idéia simples, e eu tinha outras prioridades, trabalhei pouco nela, só peguei firme nesta ultima semana, quando acordei do fato que o prazo estava acabando.&lt;br /&gt;&lt;br /&gt;No final das contas, fiquei satisfeito com o resultado, fiz o jogo com usando o autotools, em bibliotecas divididas para o ambiente, o menu e o jogo em si.&lt;br /&gt;Coloquei audio... e está bem jogável.&lt;br /&gt;&lt;br /&gt;Sei que tem alguns detalhes errados, e falta algumas coisas do que eu havia pensado em fazer, mas já está bom. Pelo meno concluí a tempo.&lt;br /&gt;&lt;br /&gt;Quem quiser testar este jogo "beta", pegue-o no meu projeto &lt;a href="http://bombas.sf.net/"&gt;bombas.sf.net&lt;/a&gt; no link de downloads&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;15:54&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-6930724843890506255?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/M_TD4W4JE4_F5R-wDeQe6vPTwnU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M_TD4W4JE4_F5R-wDeQe6vPTwnU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/M_TD4W4JE4_F5R-wDeQe6vPTwnU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M_TD4W4JE4_F5R-wDeQe6vPTwnU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/LXJKkaXLFnU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/6930724843890506255/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=6930724843890506255" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6930724843890506255?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/6930724843890506255?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/LXJKkaXLFnU/2007-12-23-desafio-um-jogo-2d-at-dia-23.html" title="2007-12-23 - Desafio, um jogo 2D até dia 23-12-2007 ... Feito!" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-12-23-desafio-um-jogo-2d-at-dia-23.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDSHw8eip7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-631379393770713487</id><published>2008-06-27T10:28:00.002-03:00</published><updated>2008-06-27T10:29:39.272-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:29:39.272-03:00</app:edited><title>2007-12-10 - autotools parte2 - adicionando dependencias</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!303"&gt;10 de dezembro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!303"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21303.entry?&amp;amp;_c02_vws=1"&gt;autotools parte2 - adicionando dependencias&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!303" class="bvMsg"&gt;Bem, no artigo anterior, já expliquei como funciona o autotools:&lt;br /&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21298.entry"&gt;http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!298.entry&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Agora vou explicar como adicionar dependências.&lt;br /&gt;&lt;br /&gt;Neste exemplo, vou puxar pro lado de desenvolvimento de games, usando SDL que é uma biblioteca portável, que tem funções de controle de hardware entre outras coisas que facilitam muito nossa vida, e outras bibliotecas derivadas do SDL, como o SDL_image para controle de imagens de vários formatos, o SDL_mixer para o controle de mid, wav, ogg e mp3, o SDL_gfx, para rotação e zoom de imagens ou filmes, o SDL_mpeg para reprodução de filmes... etc.&lt;br /&gt;&lt;br /&gt;Vamos começar com a teoria:&lt;br /&gt;Pelo que já vimos, você deve ter percebido que o autotools trabalha com macros, macros são funções prontas, programas que você passa um comando com parâmetros ou não e eles executam determinadas funções.&lt;br /&gt;Você também já deve ter percebido que estas configurações são centralizadas nos arquivos configure.ac e Makefile.am. Sim... continua assim, porém vamos colocar mais um arquivo importante: o acinclude.m4 .&lt;br /&gt;&lt;br /&gt;acinclude.m4:&lt;br /&gt;    Este arquivo é uma forma de adicionar macros que podem ser usadas dentro do configure.ac, por exemplo: o Sam Lantinga, desenvolvedor do SDL, criou um arquivo chamado sdl.m4 que está no código fonte do SDL, você pode baixar este código na página do SDL em &lt;a href="http://www.libsdl.org/"&gt;http://www.libsdl.org&lt;/a&gt;, e copiar este arquivo sdl.m4 para o nosso diretório base. depois disto é só adicionar sdl.m4 em nosso arquivo acinclude.m4.in ou acinclude.m4, adicionar o teste desta biblioteca no arquivo configure.ac e executar o autogen.sh&lt;br /&gt;Depois de copiar o sdl.m4, só é necessário adionar uma linha com o conteudo sdl.m4 no acinclude.m4.in ... NÃO é preciso nada como #include sdl.m4 ... apenas o sdl.m4... depois disto o script de teste no configure.ac, deve ser colocado na parte de libraries é assim:&lt;br /&gt;&lt;pre&gt;dnl Check for SDL&lt;br /&gt;SDL_VERSION=1.2.0&lt;br /&gt;AM_PATH_SDL($SDL_VERSION,&lt;br /&gt;        :,&lt;br /&gt;        AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!])&lt;br /&gt;)&lt;br /&gt;CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"&lt;br /&gt;LIBS="$LIBS $SDL_LIBS"&lt;/pre&gt;Para mais informações, consulte o artigo: &lt;a href="http://www.samhart.com/snh/files/docs/sdl-kdev/sdl-kdev-mini-how2-2.html"&gt;http://www.samhart.com/snh/files/docs/sdl-kdev/sdl-kdev-mini-how2-2.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Agora se tudo está certo, você pode executar nosso script de reconfiguração (vide artigo anteiror citado acima):&lt;br /&gt;$ sh autogen.sh&lt;br /&gt;&lt;br /&gt;O resultado esperado é:&lt;br /&gt; sh autogen.sh&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking whether build environment is sane... yes&lt;br /&gt;checking for a thread-safe mkdir -p... /bin/mkdir -p&lt;br /&gt;checking for gawk... gawk&lt;br /&gt;checking whether make sets $(MAKE)... yes&lt;br /&gt;checking for gcc... gcc&lt;br /&gt;checking for C compiler default output file name... a.out&lt;br /&gt;checking whether the C compiler works... yes&lt;br /&gt;checking whether we are cross compiling... no&lt;br /&gt;checking for suffix of executables...&lt;br /&gt;checking for suffix of object files... o&lt;br /&gt;checking whether we are using the GNU C compiler... yes&lt;br /&gt;checking whether gcc accepts -g... yes&lt;br /&gt;checking for gcc option to accept ISO C89... none needed&lt;br /&gt;checking for style of include used by make... GNU&lt;br /&gt;checking dependency style of gcc... gcc3&lt;br /&gt;checking for sdl-config... /usr/bin/sdl-config&lt;br /&gt;checking for SDL - version &gt;= 1.2.0... yes&lt;br /&gt;configure: creating ./config.status&lt;br /&gt;config.status: creating Makefile&lt;br /&gt;config.status: creating src/Makefile&lt;br /&gt;config.status: creating config.h&lt;br /&gt;config.status: config.h is unchanged&lt;br /&gt;config.status: executing depfiles commands&lt;br /&gt;&lt;br /&gt;Observe que agora temos uma parte onde o SDL está sendo checado por uma versão superior à 1.2.0&lt;br /&gt;&lt;br /&gt;Isto é suficiente pro SDL, mas e quando temos outras dependências que não nos dão as macros m4 prontas ?&lt;br /&gt;A primeira coisa é procurar no google... muitas vezes, no código fonte não vem o arquivo m4, mas alguém criou e postou em algum lugar. Então, se você encontrar vai simplificar muito seu configure.ac da forma q fizemos acima. Mas se o google não achar ? como fazer ?&lt;br /&gt;&lt;br /&gt;Neste caso, você pode criar seu arquivo m4, ou pode simplesmente adicionar o uma verificação no configure.ac, só q vai poluir um pouco nosso arquivo configure.ac que até então está bem simples.&lt;br /&gt;&lt;br /&gt;Depois vou postar mais entrada a respeito disto: autotools, criando seu próprio m4.&lt;br /&gt;&lt;br /&gt;Por hora é só. Tenho que fazer algum código também &lt;img src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/smile_tongue.gif" title="Tongue out" alt="Tongue out" style="vertical-align: middle;" /&gt;&lt;br /&gt;&lt;br /&gt;Abs,&lt;br /&gt;Ton&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;14:44&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-631379393770713487?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DW1fVUuvq33px9QOdhZEQH4ML8w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DW1fVUuvq33px9QOdhZEQH4ML8w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DW1fVUuvq33px9QOdhZEQH4ML8w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DW1fVUuvq33px9QOdhZEQH4ML8w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/P49h2XNk5Gg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/631379393770713487/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=631379393770713487" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/631379393770713487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/631379393770713487?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/P49h2XNk5Gg/2007-12-10-autotools-parte2-adicionando.html" title="2007-12-10 - autotools parte2 - adicionando dependencias" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-12-10-autotools-parte2-adicionando.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQGSXk8eCp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-2790430607824481643</id><published>2008-06-27T10:28:00.001-03:00</published><updated>2008-06-27T10:28:48.770-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:28:48.770-03:00</app:edited><title>2007-12-07 - ifconfig não funciona??? net-tools!!!</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!302"&gt;07 de dezembro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!302"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21302.entry?&amp;amp;_c02_vws=1"&gt;ifconfig não funciona??? net-tools!!!&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!302" class="bvMsg"&gt;Hahaaa!!!&lt;br /&gt;&lt;br /&gt;Usando o LinuxFromScratch, e tentando executar alguns programas que configuram VPN, tive vários problemas, e testando, descobri que o problema é que o ifconfig que eu estava usando era o do netutils, e não o do net-tools... segue alguns:&lt;br /&gt;'ifconfig: can not resolve`down`: No address associated with name"&lt;br /&gt;"ifconfig: cannot resolve `up': No address associated with name"&lt;br /&gt;"ifconfig eth0 up"&lt;br /&gt;"ifconfig: can not resolve `up': Unknown host"&lt;br /&gt;# ifconfig -a&lt;br /&gt;ifconfig: option requires an argument -- a&lt;br /&gt;Usage: ifconfig [OPTION]... [SYSTEM OPTION]...&lt;br /&gt;Try `ifconfig --help' for more information.': No address associated with name"&lt;br /&gt;"ifconfig: can not resolve `up': No address associated with name"&lt;br /&gt;"ifconfig eth0 up"&lt;br /&gt;"ifconfig: can not resolve `up': Unknown host"&lt;br /&gt;# ifconfig -a&lt;br /&gt;ifconfig: option requires an argument -- a&lt;br /&gt;Usage: ifconfig [OPTION]... [SYSTEM OPTION]...&lt;br /&gt;&lt;br /&gt;E o incrível, é q o google não acha nenhum resultado com a maioria destas pesquisas.&lt;br /&gt;&lt;br /&gt;O LFS Book bem q me avisou pra não instalar o ifconfig do netutils... mas não disse q tinha ifconfig no net-tools tbm... então eu q fiquei quebrando a cabeça e consegui resolver com a ajuda do Guedes... valeu mais esta Bill!&lt;br /&gt;&lt;br /&gt;resumindo, é só instalar o net-tools:&lt;br /&gt;http://www.linuxfromscratch.org/blfs/view/stable/basicnet/net-tools.html&lt;br /&gt;&lt;br /&gt;Abs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;15:06&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-2790430607824481643?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MGyxdAstH3I3_xMiQ1F4XJNh48Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MGyxdAstH3I3_xMiQ1F4XJNh48Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MGyxdAstH3I3_xMiQ1F4XJNh48Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MGyxdAstH3I3_xMiQ1F4XJNh48Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/VlbdOh8iFow" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/2790430607824481643/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=2790430607824481643" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/2790430607824481643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/2790430607824481643?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/VlbdOh8iFow/2007-12-07-ifconfig-no-funciona-net.html" title="2007-12-07 - ifconfig não funciona??? net-tools!!!" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-12-07-ifconfig-no-funciona-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUDRnkzeip7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-8690073942269792991</id><published>2008-06-27T10:27:00.001-03:00</published><updated>2008-06-27T10:27:57.782-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:27:57.782-03:00</app:edited><title>2007-11-22 - Autotools, ah se todos usassem !!!</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!298"&gt;22 de novembro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!298"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21298.entry?&amp;amp;_c02_vws=1"&gt;Autotools, ah se todos usassem !!!&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!298" class="bvMsg"&gt;autotools é um conjunto de ferramentas que simplifica a verificação de dependências e compilação de programas.&lt;br /&gt;&lt;br /&gt;É tão usado no mundo opensource que é até um padrão usado e recomendado pelo gnu.&lt;br /&gt;tudo se torna simples quando se tem um projeto usando autotools...&lt;br /&gt;Você apenas descompacta os fontes com:&lt;br /&gt;tar xvf nomedoarquivo.tar.bz2&lt;br /&gt;depois usa:&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;br /&gt;Se o código depender de outro componente que não exista em seu ambiente, ele vai ser detectado no ./configure ... sendo assim fica fácil descobrir o que está faltando e instalar esta dependência antes de executar o make que é a parte demorada do processo.&lt;br /&gt;&lt;br /&gt;O make é a compilação do programa... isto costuma demorar... e muitas vezes tem que executar centenas de subcompilações com linhas de comandos que incluem várias bibliotecas e que seria inviável para um usuário digitá-las na mão, um script para esta compilação poderia ser mantido pelo desenvolvedor do programa, mas daria muito trabalho a ele. É aqui que entra o autotools, ele cria este script automaticamente com um esforço mínimo do desenvolvedor.&lt;br /&gt;Mas infelismente muitos projetos não o usam.&lt;br /&gt;&lt;br /&gt;Vou mostrar em um exemplo prático como é fácil e prático usá-lo.&lt;br /&gt;&lt;br /&gt;Vamos criar um novo diretório com o nome autotools-example:&lt;br /&gt;$ mkdir autotools-example&lt;br /&gt;$ cd autotools-example&lt;br /&gt;&lt;br /&gt;teremos um subdiretório src onde ficaram os fontes:&lt;br /&gt;$ mkdir src&lt;br /&gt;&lt;br /&gt;e agora vamos criar um arquivo representando o nosso código:&lt;br /&gt;cat &gt; src/main.c &lt;&lt; "EOF"&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;        printf("funciona!!!\n");&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;pronto... já temos um código do programa, hora de usar o autotools pra compilar.&lt;br /&gt;O autotools precisa de um arquivo de referência onde ele vai pesquisar para saber o nome do programa que está sendo compilado e qual é a versão atual, onde estão os arquivos fontes, além de validações obrigatórias ou opcionais, como por exemplo um programa que pode ou não ter suporte a som, dependendo de um parâmetro que o usuário passa para o ./configure... também é no configure.ac que o desenvolvedor personaliza mensagens para o usuário e adiciona verificações adicionais para certificar que o código será compilado.&lt;br /&gt;&lt;br /&gt;parece complicado né ? mas na prática é simples... olhe:&lt;br /&gt;Primeiro use o autoscan que varre todos os arquivos do diretório e subdiretórios para detectar os arquivos fontes e criar o configure.ac que é um dos arquivos essenciais do autotools que o programador deve editar.&lt;br /&gt;$ autoscan&lt;br /&gt;agora devem ter sido criados 2 arquivos: autoscan.log e configure.scan.&lt;br /&gt;&lt;br /&gt;o arquivo configure.scan é o configure.ac que nós precisamos para o autotools, e que foi criado automaticamente pelo comando autoscan e o autoscan.log registra algum erro ou mensagens ocorridas durante o processo do autoscan.&lt;br /&gt;renomeie o arquivo configure.scan para configure.ac :&lt;br /&gt;$ mv configure.scan configure.ac&lt;br /&gt;&lt;br /&gt;vamos olhar o conteúdo do configure.ac e analisar o que precisaremos atualizar:&lt;br /&gt;$ more configure.ac&lt;br /&gt;#                                                -*- Autoconf -*-&lt;br /&gt;# Process this file with autoconf to produce a configure script&lt;br /&gt;&lt;br /&gt;AC_PREREQ(2.61)&lt;br /&gt;AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)&lt;br /&gt;AC_CONFIG_SRCDIR([src/main.c])&lt;br /&gt;AC_CONFIG_HEADER([config.h])&lt;br /&gt;&lt;br /&gt;# Checks for programs.&lt;br /&gt;AC_PROG_CC&lt;br /&gt;&lt;br /&gt;# Checks for libraries.&lt;br /&gt;&lt;br /&gt;# Checks for header files.&lt;br /&gt;&lt;br /&gt;# Checks for typedefs, structures, and compiler characteristics.&lt;br /&gt;&lt;br /&gt;# Checks for library functions.&lt;br /&gt;&lt;br /&gt;AC_OUTPUT&lt;br /&gt;&lt;br /&gt;bom... vamos ver...&lt;br /&gt;todas as linhas começando com #(sharp, cerquilha, ou jogo da velha, como preverir) são comentários, e ignorados pelo autotools, então a primeira linha de código é:&lt;br /&gt;AC_PREREQ(2.61)&lt;br /&gt;está dizendo que no ambiente onde será compilado, deve existir instalado o autotools versão 2.61 ou superior.&lt;br /&gt;&lt;br /&gt;Logo após vem:&lt;br /&gt;AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)&lt;br /&gt;aqui temos o lugar onde dizemos ao autotools qual é o nosso programa, a versão do nosso programa, e o endereço de email para onde os usuários devem mandar emails em caso de erros. atualize isto como preferir como no exemplo abaixo:&lt;br /&gt;AC_INIT(autotools-example, 1.0, [seuemail at dominio dot com] )&lt;br /&gt;&lt;br /&gt;depois temos:&lt;br /&gt;AC_CONFIG_SRCDIR([src/main.c])&lt;br /&gt;aqui ele detectou corretamente o nosso diretório de códigos fontes.&lt;br /&gt;&lt;br /&gt;AC_CONFIG_HEADER([config.h])&lt;br /&gt;este arquivo config.h deve pelo comando autoheader e server para definir variáveis de compilação para o autotools, como o PACKAGE_NAME, opções ativas por padrão... etc...&lt;br /&gt;$ autoheader&lt;br /&gt;&lt;br /&gt;agora vamos criar nosso script configure...&lt;br /&gt;$ autoconf&lt;br /&gt;&lt;br /&gt;pronto... se tudo deu certo, agora você terá um arquivo configure em seu diretório, execute-o:&lt;br /&gt;$ ./configure&lt;br /&gt;&lt;br /&gt;ele vai verificar tudo pela primeira vez e criar o config.h...&lt;br /&gt;&lt;br /&gt;mas ainda precisamos cuidar do automake que irá compilar o nosso projeto.&lt;br /&gt;para isto precisamos adicionar um AM_INIT_AUTOMAKE( nomedoprograma, versao ) no configure.ac, então adicione isto logo abaixo de AC_CONFIG_HEADER.&lt;br /&gt;AM_INIT_AUTOMAKE(exemplo, 1.0)&lt;br /&gt;&lt;br /&gt;além disto também é necessário informar quais Makefiles precisam ser criados... então no finao do arquivo configure.ac altere a linha AC_OUTPUT para:&lt;br /&gt;AC_OUTPUT([&lt;br /&gt;        Makefile&lt;br /&gt;        src/Makefile&lt;br /&gt;])&lt;br /&gt;&lt;br /&gt;pronto, agora execute um autoreconf para atualizar os arquivos:&lt;br /&gt;$ autoreconf&lt;br /&gt;vamos atualizar o automake agora com o parâmetro --add-missing, para que ele crie os arquivos faltantes:&lt;br /&gt;$ automake --add-missing&lt;br /&gt;&lt;br /&gt;agora um ultimo passo é criar o Makefile.am que é bem simples:&lt;br /&gt;cat &gt; Makefile.am &lt;&lt; "EOF"&lt;br /&gt;SUBDIRS = src&lt;br /&gt;&lt;br /&gt;EXTRA_DIST = NOTES autogen.sh&lt;br /&gt;&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;e um Makefile.ac no diretório de fontes, onde informaremos quem deve ser compilado:&lt;br /&gt;cat &gt; src/Makefile.am &lt;&lt;"EOF"&lt;br /&gt;bin_PROGRAMS = exemplo&lt;br /&gt;exemplo_SOURCES = main.c&lt;br /&gt;&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;vamos criar um script pra reconfigurar os arquivos, já fizemos isto, mas precisaremos fazer varias vezes durante o desenvolvimento, um script vai ajudar muito:&lt;br /&gt;&lt;br /&gt;cat &gt; autogen.sh &lt;&lt;"EOF"&lt;br /&gt;#!/bin/sh&lt;br /&gt;#&lt;br /&gt;aclocal&lt;br /&gt;automake --add-missing --foreign&lt;br /&gt;autoconf&lt;br /&gt;&lt;br /&gt;./configure $*&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;agora execute ele:&lt;br /&gt;$ sh autogen.sh&lt;br /&gt;&lt;br /&gt;bem... se vc executar o automake:&lt;br /&gt;$ automake&lt;br /&gt;vai receber várias mensagens de erros dizendo q ele não encontrou arquivos necessários... alguns podem ser criados automaticamentes com o parâmetro --add-missing... então vamos criá-los:&lt;br /&gt;$ automake --add-missing&lt;br /&gt;$ touch NEWS README AUTHORS ChangeLog&lt;br /&gt;&lt;br /&gt;lembre-se de transformar os links simbólicos possivelmente criados pelo automake --add-missing em arquivos reais antes de compartilhar seu projeto, vc pode fazer isto copiando os arquivos dos links e substituindo-os.&lt;br /&gt;&lt;br /&gt;Neste ponto já deve estar tudo pronto, e você já pode executar:&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;&lt;br /&gt;e já deve ter um arquivo executavel com o nome exemplo na pasta src... então execute:&lt;br /&gt;$ src/exemplo&lt;br /&gt;funciona!!!&lt;br /&gt;&lt;br /&gt;se apareceu funciona!!! parabéns, vc acaba de criar seu primeiro projeto com autotools...&lt;br /&gt;&lt;br /&gt;depois vou mostrar como gerenciar dependências, como o SDL e outros...&lt;br /&gt;&lt;br /&gt;Qualquer dúvida usem os comentários.&lt;br /&gt;Abs...&lt;br /&gt;Ton&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;23:34&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-8690073942269792991?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YTAF2DSAY8Q-dGEvRUE3TMuT-eA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YTAF2DSAY8Q-dGEvRUE3TMuT-eA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YTAF2DSAY8Q-dGEvRUE3TMuT-eA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YTAF2DSAY8Q-dGEvRUE3TMuT-eA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/PGPdD45XUWo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/8690073942269792991/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=8690073942269792991" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/8690073942269792991?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/8690073942269792991?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/PGPdD45XUWo/2007-11-22-autotools-ah-se-todos.html" title="2007-11-22 - Autotools, ah se todos usassem !!!" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-11-22-autotools-ah-se-todos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYCQ3szeSp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-3684926022103100524</id><published>2008-06-27T10:22:00.001-03:00</published><updated>2008-06-27T10:26:02.581-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:26:02.581-03:00</app:edited><title>2007-11-21 - Odisséia do Desenvolvimento de Jogos</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!259"&gt;21 de novembro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!259"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21259.entry?&amp;amp;_c02_vws=1"&gt;Odisséia do Desenvolvimento de Jogos&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!259" class="bvMsg"&gt;Odisséia do Desenvolvimento de Jogos&lt;br /&gt;====================================&lt;br /&gt;    Olá, meu nome é Glaudiston, atualmente sou um desenvolvedor IBM, mas sempre que sobra algum tempo&lt;br /&gt;tento desenvolver alguma coisa voltada à jogos e realidade virtual.&lt;br /&gt;&lt;br /&gt;    Vou tentar manter este documento atualizado como um manual para os que estiverem interessados&lt;br /&gt;em desenvolvimento de jogos, e também para minha própria referência, afinal compartilhar&lt;br /&gt;é a melhor forma de não errar denovo. =)&lt;br /&gt;&lt;br /&gt;Por onde começar&lt;br /&gt;================&lt;br /&gt;    Primeiro decidi que queria fazer jogos, e pagaria o preço por isto, então comecei a pesquisar...&lt;br /&gt;    De início pensei que daria conta facilmente, afinal me achava muito inteligente,&lt;br /&gt;    mas descobri que não é bem assim... é necessário muita dedicação, perseverança e ajuda.&lt;br /&gt;    Este é quase um passo a passo, mas se você não está disposto a passar horas intermináveis&lt;br /&gt;    quebrando a cabeça com detalhes, pode parar de ler, você ainda não está pronto.&lt;br /&gt;   &lt;br /&gt;O que é necessário saber/ter para desenvolver jogos&lt;br /&gt;===================================================&lt;br /&gt;Tudo pode ser conseguido sem custo na internet, mas o aprendizado é penoso.&lt;br /&gt;Para criar um jogo você precisa de:&lt;br /&gt; * Escrever a Lógica do seu jogo,&lt;br /&gt; * Escolher uma Linguagem,&lt;br /&gt; * Escolher a API(rotinas prontas),&lt;br /&gt;    * interface(janelas, resolução, tela cheia, cores)&lt;br /&gt;    * Entrada(Joysticks, Mouse, teclado)&lt;br /&gt;    * conexão(TCP/IP, multiplayer)&lt;br /&gt;    * audio(musicas, sons, mp3)&lt;br /&gt;    * Detecção de colisão&lt;br /&gt;    * Gerenciamento de gráficos 3D&lt;br /&gt; * Configurar o ambiente(talvez a parte mais difícil),&lt;br /&gt;    * Fazer download certos de cada opção escolhida&lt;br /&gt;    * Instalar e configurar corretamente&lt;br /&gt;    * Aprender a compilar cada opção necessária no jogo&lt;br /&gt;&lt;br /&gt;Escrever a Lógica do seu jogo&lt;br /&gt;=============================&lt;br /&gt;Você tem uma idéia do que quer que seu jogo faça, talvez até saiba de cór tudo,&lt;br /&gt;mas acredite, precisa colocar isto por escrito.&lt;br /&gt;Isto te dá um ponto de partida... e evita que você se perca em seus objetivos.&lt;br /&gt;Existem diagramas UML e uma estrutura muito grande que pode te confundir se&lt;br /&gt;vc se aprofundar nesta parte... Jogos grandes são escritos por times e tem profissionais&lt;br /&gt;por conta de ficar criando documentações para serem implementados por outros...&lt;br /&gt;isto é muito bom, mas não é o caso, pelo menos não o meu.&lt;br /&gt;&lt;br /&gt;Não tente criar "O JOGO" de primeira&lt;br /&gt;====================================&lt;br /&gt;Primeiro porque para ser introduzido ao desenvolvimento de jogos é necessário ser humilde.&lt;br /&gt;Isto mesmo, comece de baixo... crie jogos 2D simples para aprender lógica e conseguir&lt;br /&gt;continuar motivado, sabendo que já conseguiu fazer alguma coisa.&lt;br /&gt;Sem falar que criando estes joginhos 2D vc acaba tendo muitas idéias de como usá-los&lt;br /&gt;dentro do seu jogo, então de certa forma, você já está trabalhando "NO JOGO".&lt;br /&gt;&lt;br /&gt;Se tentar criar um jogo fantástico de primeira, vai esbarrar em muitas barreiras que já&lt;br /&gt;deveria ter superado quando criava joguinhos pequenos e relativamente simples, e como&lt;br /&gt;não conseguiu fazer nenhum jogo antes, pode chegar à falsa conclusão que não é capaz disto.&lt;br /&gt;&lt;br /&gt;Lembre-se: "Motivação é Essencial."&lt;br /&gt;&lt;br /&gt;    Eu já tentei criar uma engine completa para um mundo virtual melhor que o secondlife...&lt;br /&gt;na verdade pegando as melhores opções de jogabilidade dele mesclando um idéias do GTA e&lt;br /&gt;the sims... nfsu2... etc... com certeza a engine para o Jogo de meus sonhos...&lt;br /&gt;O resultado é que chegou em um ponto que não consegui mais passar... então desisti por&lt;br /&gt;um bom tempo... ainda tenho o código, algum dia conseguirei retomá-lo.&lt;br /&gt;    Fique tão triste por não conseguir que voltei apenas a jogar e admirar os programadores&lt;br /&gt;que conseguem criar tais jogos... quase venerando os desenvolvedores da EA Games dentre&lt;br /&gt;outras empresas que fazem coisas fantástica escovando bits.&lt;br /&gt;    Mas depois de continuar na programação comercial por muito tempo e com mais maturidade,&lt;br /&gt;voltei a sonhar... Afinal se cheguei na IBM, porque não posso chegar na EA ?&lt;br /&gt;Mas desta vez pretendo começar realmente do zero, como tem que ser para um novato em jogos.&lt;br /&gt;Vou relatar tudo para entender onde estou errando, ajudar os outros será conseguência.&lt;br /&gt;&lt;br /&gt;    Hoje tenho uma lógica mais aprofundada e entendo melhor a necessidade de documentar o que&lt;br /&gt;deve ser feito antes de começar o código em sí.&lt;br /&gt;&lt;br /&gt;    Aí você diz: "Mas eu não quero fazer joguinhos... quero fazer jogos 3D!!!"&lt;br /&gt;Eu sei... nem eu... a pesar de que existem muitos joguinhos 2D bem melhores q 3D, estou&lt;br /&gt;fazendo isto pra aprender e conseguir chegar ao final do desenvolvimento de um jogo 3D.&lt;br /&gt;E Nem sempre fazemos oque queremos.&lt;br /&gt;&lt;br /&gt;    Certo, já entendi que devo criar jogos básicos, e conseguir concluí-los antes de passar&lt;br /&gt;ao jogo que realmente quero concluir.&lt;br /&gt;&lt;br /&gt;Jogos que podemos criar para treinar lógica&lt;br /&gt;===========================================&lt;br /&gt;Campo Minado,&lt;br /&gt;Paciência,&lt;br /&gt;Pong,&lt;br /&gt;Tetris,&lt;br /&gt;Tiro ao alvo,&lt;br /&gt;Invaders,&lt;br /&gt;pac-man,&lt;br /&gt;Damas,&lt;br /&gt;&lt;br /&gt;Lógica do nosso primeiro jogo: Campo minado&lt;br /&gt;===========================================&lt;br /&gt;Descrição:&lt;br /&gt;    Campo minado é um jogo muito simples de cálculos matemáticos, e muito divertido também.&lt;br /&gt;Funcionamento:&lt;br /&gt;    O jogador inicia o jogo e aparece para ele uma espécie de tabuleiro de botões,&lt;br /&gt;    e uma quantidade de bombas escondidas em alguns botões,&lt;br /&gt;    se o jogador clica em um botão que tem uma bomba, ele perde o jogo,&lt;br /&gt;    se clica em um botão que não tem bomba, mas está próximo(faz fronteira) com uma&lt;br /&gt;    ou mais bombas, aparece o nr de bombas que existem nas proximidades, esta é a única&lt;br /&gt;    pista que o jogador tem para descobrir quais quadrados têm bomba e quais não têm,&lt;br /&gt;    e se não tem bombas nas proximidades, o jogo automaticamente abre as fonteiras até&lt;br /&gt;    não encontrar mais fonteiras sem números.&lt;br /&gt;&lt;br /&gt;Opções e comportamento do jogo:&lt;br /&gt;    Ao Abrir o jogo o usuário tem as opções:&lt;br /&gt;        Novo jogo&lt;br /&gt;            Ao clicar em novo jogo, as opções são:&lt;br /&gt;            Novo jogo&lt;br /&gt;                * Monta novamente um novo jogo pro usuário&lt;br /&gt;                  Esta montagem é feita criando os botões visíveis ao jogador, e espalhando&lt;br /&gt;                  as bombas aleatoriamente nestes de maneira oculta ao jogador.&lt;br /&gt;                * Zera o cronômetro&lt;br /&gt;                * Aguarda o primeiro clique do jogador&lt;br /&gt;            Sair do Jogo&lt;br /&gt;                Fecha o programa&lt;br /&gt;            ----------------&lt;br /&gt;            Clicar em um botão(fazer uma nova jogada)&lt;br /&gt;                * No primeiro clique o cronômetro é disparado e o jogo começa.&lt;br /&gt;                * Se o jogador clicou em quadrado com uma bomba o jogo termina, ele perdeu +(&lt;br /&gt;                * Se o jogador clicou em quadrado sem bomba, e não existe bomba de fronteira com este&lt;br /&gt;                    quadrado, o quadrado é aberto, e outros quadrados de fronteira são abertos&lt;br /&gt;                    recursivamente até esgotarem-se os quadrados que não tem bombas nas fronteiras&lt;br /&gt;                * Se o jogador clicou em um quadrado sem bomba, mas que tem bomba em um dos quadrados&lt;br /&gt;                    de fronteira, imprime no quadrado clicado, o nr de bombas que existe nas fonteiras&lt;br /&gt;                * Se não restam mais quadrados sem bombas, o jogo termina, ele venceu. =D&lt;br /&gt;                    Ao vencer são guardados os dados nas estatísticas.&lt;br /&gt;        Estatísticas&lt;br /&gt;            Ao Clicar em Estatísticas o jogo mostra uma lista em ordem de maior dificuldade e menor tempo&lt;br /&gt;            com os dados:&lt;br /&gt;            Nome jogador, Data, Tempo gasto, dificuldade&lt;br /&gt;           &lt;br /&gt;            Podemos definir a dificuldade como a possibilidade de erro em um chute,&lt;br /&gt;            por exemplo, se ele tiver 30 bombas em um tabuleiro de 200 quadrados,&lt;br /&gt;            dizemos q a dificuldade era (30/200)*100 = 15&lt;br /&gt;            então nossa fórmula será (bombas/quadrados)*100&lt;br /&gt;        Opções&lt;br /&gt;            Permite ao usuário definir a quantidade de bombas e o tamanho do tabuleiro&lt;br /&gt;        Sair do jogo&lt;br /&gt;            Fecha o programa&lt;br /&gt;&lt;br /&gt;Analisando possíveis problemas&lt;br /&gt;==============================&lt;br /&gt;Lendo atentamente este comportamento do jogo notei as seguintes dificuldades:&lt;br /&gt;Como gerenciar todos os itens e bombas em memória?&lt;br /&gt;    Penso que a melhor opção seria trabalhar com arrays... pra quem não conhece,&lt;br /&gt;    são como matrizes da matemática, todos já vimos isto na escola se não me engano no fim do ensino fundamental.&lt;br /&gt;    ficaria algo como isto:&lt;br /&gt;        int linsize=10;                    // Numero de colunas&lt;br /&gt;        int colsize=10;                    // Numero de linhas&lt;br /&gt;        int campo[linsize][colsize];    //&lt;br /&gt;        int bombas=10;                    // As bombas não são arrays então posso colocar o valor certo&lt;br /&gt;        após a rotina distribuir as 10 bombas randomizadas... ficaria algo como:&lt;br /&gt;            campo[0] = {0,0,0,0,0,0,1,0,0,0};&lt;br /&gt;            campo[1] = {0,0,1,0,0,0,0,0,0,0};&lt;br /&gt;            campo[2] = {0,0,0,0,0,0,0,0,0,0};&lt;br /&gt;            campo[3] = {0,0,0,1,0,1,0,0,0,0};&lt;br /&gt;            campo[4] = {0,0,1,0,0,0,0,0,0,0};&lt;br /&gt;            campo[5] = {0,1,0,0,0,0,1,0,1,0};&lt;br /&gt;            campo[6] = {0,0,0,0,0,0,0,0,0,0};&lt;br /&gt;            campo[7] = {0,0,0,1,0,0,0,0,0,0};&lt;br /&gt;            campo[8] = {0,0,0,0,0,0,0,0,0,0};&lt;br /&gt;            campo[9] = {0,0,0,0,0,0,1,0,0,0};&lt;br /&gt;        Os zeros são onde não existem bombas e os 1 são onde existem...&lt;br /&gt;        Observe que existem apenas dez "1" espalhados no array que é nosso tabuleiro&lt;br /&gt;    Porém em C não é possível definir um array por variáveis... é possível em java e outras linguagens mais&lt;br /&gt;    alto-nivel q C... Isto complica um pouco... sem isto não poderíamos permitir ao jogador definir o tamanho.&lt;br /&gt;    No máximo conseguiríamos predefinir niveis pra ele.   &lt;br /&gt;    Uma boa saída é o malloc e trabalhar com ponteiros... vamos ver:&lt;br /&gt;   &lt;br /&gt;    campo = malloc(linhas*colunas * sizeof(int));&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;Mas como espalhar as bombas?&lt;br /&gt;    Isto é bem simples dependendo da linguagem, na maioria tem algo como rnd ou randomize&lt;br /&gt;    que nos permite fazer isto com muita facilidade.&lt;br /&gt;    Mas não é o caso de C, onde a handomização é feita sempre na mesma sequência, o q deixaria nosso&lt;br /&gt;    jogo no mínimo previsível.&lt;br /&gt;    Neste caso da C, pensei em gerar a randomização baseada na data, hora completa incluindo os&lt;br /&gt;    milisegundos... e me veio outro problema, por padrão não é possível pegar os milisegundos no C,&lt;br /&gt;    não no ANSI C... e como gosto de seguir padrões de portabilidade, encontrei uma boa saída...&lt;br /&gt;    o SDL possui uma forma de calcular o framerate que disponibiliza uma variável atualizada em&lt;br /&gt;    milisegundos.... o SDL_GetTicks()... vamos trabalhar com ela para gerar a randomização.&lt;br /&gt;&lt;br /&gt;Primeiro faça simples, depois complique gradativamente&lt;br /&gt;Vamos primeiro fazer um código que permita o usuário acessar os menus em modo texto mesmo...&lt;br /&gt;Assim você vai aprender a base do C&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;Iniciar um novo Jogo&lt;br /&gt;Sair&lt;br /&gt;        Campo minado lógica:&lt;br /&gt;        define tamano de campo como 10 linhas e 10 colunas num total de 100 quadrantes.&lt;br /&gt;        int linsize=9;&lt;br /&gt;        int colsize=9;&lt;br /&gt;        campo[linsize][colsize]         //O array começa do zero, sendo assim, se usar 10 vai gerar um array de 11 posições, por isto usamos o array de 9&lt;br /&gt;        usuário iniciou um novo jogo.&lt;br /&gt;            rotina distribui 10 bombas randomizadas... algo como:&lt;br /&gt;            campo[0][0,0,0,0,0,0,1,0,0,0]&lt;br /&gt;            campo[1][0,0,1,0,0,0,0,0,0,0]&lt;br /&gt;            campo[2][0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;            campo[3][0,0,0,1,0,1,0,0,0,0]&lt;br /&gt;            campo[4][0,0,1,0,0,0,0,0,0,0]&lt;br /&gt;            campo[5][0,1,0,0,0,0,1,0,1,0]&lt;br /&gt;            campo[6][0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;            campo[7][0,0,0,1,0,0,0,0,0,0]&lt;br /&gt;            campo[8][0,0,0,0,0,0,0,0,0,0]&lt;br /&gt;            campo[9][0,0,0,0,0,0,1,0,0,0]&lt;br /&gt;           &lt;br /&gt;            Totaliza os quadrantes livres:&lt;br /&gt;            int quadranteslivres = 0;&lt;br /&gt;            for (int i=0; i&amp;lt;=linsize; i++)&lt;br /&gt;            {&lt;br /&gt;                for(int j=0; j&amp;lt;=colsize; j++)&lt;br /&gt;                {&lt;br /&gt;                    if (campo[i,j]==0)&lt;br /&gt;                        quadranteslivres += campo&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;       &lt;br /&gt;        usuáro seleciona um item:&lt;br /&gt;            linhasel=3;&lt;br /&gt;            colsel=2;&lt;br /&gt;            caso campo[linhasel,colsel]==1&lt;br /&gt;                tem bomba, explode, game over.&lt;br /&gt;                revelabombas();&lt;br /&gt;            caso campo[linhasel,colsel]==0&lt;br /&gt;                // Rotina calcula quantidade de bombas próximas:&lt;br /&gt;                int bombasproximas = 0;&lt;br /&gt;                for (int i=-1; i&amp;lt;2; i++)&lt;br /&gt;                {&lt;br /&gt;                    if (linhasel+i&amp;gt;=0 &amp;amp;&amp;amp; linhasel+i&amp;lt;linsize)&lt;br /&gt;                    {&lt;br /&gt;                        for(int j=-1; j&amp;lt;2; j++)&lt;br /&gt;                        {&lt;br /&gt;                            if (colsel+j&amp;gt;=0 &amp;amp;&amp;amp; colsel&amp;lt;colsize)&lt;br /&gt;                                bombasproximas += campo[linhasel+i, colsel+j];&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                caso itensproximos==0&lt;br /&gt;                    não tem bombas na fronteira, rotina abre todos os ítens próximos recursivamente até esgotar itens de fronteira sem bombas próximas.&lt;br /&gt;                caso itensproximos &amp;gt; 0&lt;br /&gt;                    Apenas relata ao usuário a quantidade de bombas nas proximidades.&lt;br /&gt;               &lt;br /&gt;                // incrementa quadrantesabertos&lt;br /&gt;                quadrantesabertos++;&lt;br /&gt;                Verifica se existe mais algum quadrante livre,&lt;br /&gt;                if (quadranteslivres-quadrantesabertos&amp;gt;0)&lt;br /&gt;                    caso exista o relata ao usuário.&lt;br /&gt;                    e aguarda a próxima jogada.&lt;br /&gt;                else&lt;br /&gt;                    caso não exista o usuário ganhou o jogo. Parabéns pra ele =)&lt;br /&gt;        usuário desiste do jogo:&lt;br /&gt;            gameover;&lt;br /&gt;            revelabombas();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A Escolha da Linguagem&lt;br /&gt;======================&lt;br /&gt;    Teoricamente, você pode usar quase todas as linguagens para criar seu jogo, porém algumas se destacam&lt;br /&gt;C, C++, Java, .Net(C#, VB.NET, etc)...&lt;br /&gt;    Eu programo em todas estas linguagens, principalmente em java, que se destaca muito pela portabilidade,&lt;br /&gt;que traduzindo é: você escreve um programa no linux, mas roda em qualquer outro lugar onde tenha java...&lt;br /&gt;mas optei por C, por querer algo mais comercial... nos jogos normalmente é usado C++,&lt;br /&gt;mas eu gosto de procedural. =)&lt;br /&gt;&lt;br /&gt;A Escolha das APIs&lt;br /&gt;==================&lt;br /&gt;    Claro que você pode escolher uma engine pronta como a OGRE ou irlitch, mas eu quero conhecer mais do&lt;br /&gt;que estou fazendo, estas APIs encapsulam muito as coisas e mesmo assim ficam complexas.&lt;br /&gt;Decidi montar meu próprio motor...&lt;br /&gt;    Vou usar SDL como API principal para gerenciamento de ambiente, graficos, janelas, mouse, teclado, joys,&lt;br /&gt;sons, etc), bullet physics para detecção de colisão, que é algo extremamente complexo, e OpenGL para 3D.&lt;br /&gt;   &lt;br /&gt;Compilando&lt;br /&gt;==========&lt;br /&gt;gcc fonte.c -o rodar -lmingw32 -lSDLmain -lSDL&lt;br /&gt;&lt;br /&gt;Não mude a sequencia!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;logo vou atualizar isto corrigindo alguns erros e adicionando o autotools para podermos usar os famosos: ./configure ; make ; make install;&lt;br /&gt;&lt;br /&gt;...continua...&lt;br /&gt;&lt;br /&gt;Mas só Deus sabe quando.&lt;br /&gt;&lt;br /&gt;O primeiro grande problema é aprender a compilar o SDL&lt;br /&gt;depois de instalar o gcc e baixar o SDL,&lt;br /&gt;não teria tido problemas com isto no Linux, mas no windows precisei do mingw32 e o SDLmain&lt;br /&gt;pra compilar um código de iniciação do SDL:&lt;br /&gt;gcc helloSDL.c -o helloSDL -lmingw32 -SDLmain -lSDL&lt;br /&gt;&lt;br /&gt;Isto compilou o básico, mas agora enfrento um novo desafio, a compilação do SDL para o SDL_GetTicks&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;23:35&lt;/nobr&gt; |&lt;nobr dir="ltr"&gt;&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-3684926022103100524?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QaaIqB0Ts1R8gzdvyDCH3QNM1EQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QaaIqB0Ts1R8gzdvyDCH3QNM1EQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QaaIqB0Ts1R8gzdvyDCH3QNM1EQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QaaIqB0Ts1R8gzdvyDCH3QNM1EQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/j71zBAFotmM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/3684926022103100524/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=3684926022103100524" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/3684926022103100524?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/3684926022103100524?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/j71zBAFotmM/2007-11-21-odissia-do-desenvolvimento.html" title="2007-11-21 - Odisséia do Desenvolvimento de Jogos" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-11-21-odissia-do-desenvolvimento.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4FQ3w4cSp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-1445074887095045439</id><published>2008-06-27T10:21:00.001-03:00</published><updated>2008-06-27T10:21:52.239-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:21:52.239-03:00</app:edited><title>2007-11-29 - Programação em Camadas (MVC)</title><content type="html">&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!258"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21258.entry?&amp;amp;_c02_vws=1"&gt;Programação em Camadas (MVC)&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!258" class="bvMsg"&gt;Programação em Camadas (MVC)&lt;br /&gt;============================&lt;br /&gt;        Ouve-se muito hoje em dia falar em programação em camadas ou MVC, neste&lt;br /&gt;artigo vou passar um pouco dos meus conhecimentos sobre o assunto, e como este conceito pode&lt;br /&gt;ser colocado em prática no desenvolvimento não só Orientado a Objetos(OOP) mas&lt;br /&gt;também no Procedural.&lt;br /&gt;&lt;br /&gt;        Para começar, MVC significa Model View Controller ou Modelo Visualização&lt;br /&gt;Controle, isto porque é esta a divisão básica da programação em camadas, por&lt;br /&gt;esta razão, você encontra também o termo programação em 3 níveis.&lt;br /&gt;&lt;br /&gt;Mas pra que MVC ?&lt;br /&gt;Em resumo, pra você não se perder no seu código, e ter maior produtividade. Mas vou tentar sei mais específico...&lt;br /&gt;=================&lt;br /&gt;Algumas Razões:&lt;br /&gt;        1. O Mercado usa e quer.&lt;br /&gt;                E com toda razão. Saber usar MVC vai acrescentar&lt;br /&gt;alguns pontos no seu currículo e vários pontos na hora da entrevista.&lt;br /&gt;        2. Programas crescem.&lt;br /&gt;                Quando se faz um programa pequeno é relativamente fácil&lt;br /&gt;gerenciar o que foi feito, então você pode criar seus programinhas sem MVC, e&lt;br /&gt;funcionaram muito bem... praque você vai se preocupar em seguir um padrão?&lt;br /&gt;                Bom... Cada caso é um caso, mas na maioria das vezes esta é&lt;br /&gt;justamente a mente de quem pensa pequeno e não se importa muito com a qualidade&lt;br /&gt;do código que está escrevendo.&lt;br /&gt;                Muitas vezes estes programas crescem e se tornam muito complexos&lt;br /&gt;e quase ilegíveis.&lt;br /&gt;                Então MVC é pra quem pensa grande, pensa no futuro quando você&lt;br /&gt;não estiver entendendo muito o que fez no passado.&lt;br /&gt;&lt;br /&gt;Em que consiste MVC?&lt;br /&gt;====================&lt;br /&gt;        A intenção é dividir todas as funcionalidades do seu programa de forma&lt;br /&gt;que fiquem organizadas nestes 3 níveis. Desta forma além do código ficar bem&lt;br /&gt;legível, será mais fácil dividir tarefas entre vários desenvolvedores. E a&lt;br /&gt;reutilização do código será muito mais simplificada.&lt;br /&gt;&lt;br /&gt;Só pra ressaltar:&lt;br /&gt;&lt;br /&gt;Quais os benefícios do MVC?&lt;br /&gt;===========================&lt;br /&gt;* Código segue um padrão mais legível.&lt;br /&gt;* Menor dificuldade em encontrar e resolver problemas no código.&lt;br /&gt;* Vários programadores pode trabalhar em uma mesma funcionalidade facilmente.&lt;br /&gt;* Novos desenvolvedores que conhecem MVC terão facilidade com o código.&lt;br /&gt;* Reutilização do código muito facilitada. Principalmente usando Shared Objects.&lt;br /&gt;&lt;br /&gt;Mas MVC não é só para Programação Orientada a Objetos (OOP)?&lt;br /&gt;===========================================================&lt;br /&gt;Não. Sei que posso estar começando um frame... mas estou convencido que NÃO!&lt;br /&gt;O que acontece, é que nas linguagens como java que usa conceitos OOP o MVC é&lt;br /&gt;muito enfatizado, e isto nos dá a impressão de que ele é para OOP.&lt;br /&gt;Mas nada impede que se use este conceito em um código procedural.&lt;br /&gt;&lt;br /&gt;E oque significa cada nível ?&lt;br /&gt;=============================       &lt;br /&gt;&lt;br /&gt;    Model (Modelo) :&lt;br /&gt;    ==============&lt;br /&gt;            Nesta camada devem ser implementadas tudo que é essencial ao&lt;br /&gt;funcionamento do recurso... seria o célebro do código.&lt;br /&gt;&lt;br /&gt;    View (Visualização) :&lt;br /&gt;    ===================&lt;br /&gt;            Nesta camada são implementadas as rotinas que o usuário possa&lt;br /&gt;interagir, mesmo que este usuário seja uma outra aplicação, qualquer forma de&lt;br /&gt;interação externa só pode ser feita pelas implemetações desta camada.&lt;br /&gt;&lt;br /&gt;    Controller (Controle) :&lt;br /&gt;    =====================&lt;br /&gt;            Esta é uma camada intermediária que traduz as informações fornecidas&lt;br /&gt;pela camada view para algo legível pela camada Model e vice-versa.&lt;br /&gt;            Muitas vezes ela apenas repassa a chamada. Parece algo desnecessário&lt;br /&gt;mas não se engane, sem ela não seria tão simples a reutilização do código.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exemplo Teórico:&lt;br /&gt;=============&lt;br /&gt;Vamos imaginar que a empresa onde você trabalha solicita que você desenvolva um&lt;br /&gt;programa que leia vários arquivos(ou um banco de dados), faça alguns cálculos complexos e retorne um&lt;br /&gt;vetor com as informações lidas e calculadas para o usuário.&lt;br /&gt;&lt;br /&gt;Isto pode levar algum tempo, não é?&lt;br /&gt;&lt;br /&gt;Mas não é só isto.&lt;br /&gt;Você também precisa criar várias formas do usuário acessar este programa:&lt;br /&gt;Modo texto;&lt;br /&gt;Modo gráfico 2D;&lt;br /&gt;Modo gráfico 3D;&lt;br /&gt;Modo Web;&lt;br /&gt;&lt;br /&gt;Mas não pára por aí. Você também tem que criar isto em um tempo que você, mesmo&lt;br /&gt;sendo o gênio que é, não acredita que conseguirá sozinho... você reclama disto&lt;br /&gt;e seu chefe/gerente diz: Até entendo, mas não posso ampliar o prazo, o que posso fazer&lt;br /&gt;e te disponibilizar mais desenvolvedores.&lt;br /&gt;&lt;br /&gt;"E agora José ???"&lt;br /&gt;&lt;br /&gt;"Está cansado de criar um código e ter que ficar separando fragmentos dele para&lt;br /&gt;copiar e colar em outro código que faz exatamente a mesma coisa mas não sabe&lt;br /&gt;como reutilizá-lo?"&lt;br /&gt;&lt;br /&gt;"ACABARAM SEUS PROBLEMAS!!!"&lt;br /&gt;"Chegou o maginífico, ultra-rápido e revolucionário:&lt;br /&gt; Model Viel Controller ["Programation Planification Tabajara"]. ;-)"&lt;br /&gt;&lt;br /&gt;Você se lembra do MVC... e coloca em prática.&lt;br /&gt;&lt;br /&gt;como ?&lt;br /&gt;&lt;br /&gt;Vamos dividir as tarefas:&lt;br /&gt;* Um primeiro programador vai criar as assinaturas de métodos do código reutilizavel e&lt;br /&gt;salvar em um objeto compartilhado em C podemos pensar no arquiv .h .&lt;br /&gt;Isto vai servir para os outros desenvolvedores criarem as chamadas de método nos&lt;br /&gt;seus programas.&lt;br /&gt;        Depois este programador vai continuar trabalhando na implementação dele.&lt;br /&gt;        Este é nossa camada Model.&lt;br /&gt;&lt;br /&gt;* Um segundo desenvolvedor, irá criar retornos falsos, para serem retornados&lt;br /&gt;para o código dos outros desenvolvedores enquanto este código não fica pronto.&lt;br /&gt;Pra isto ele vai precisar estabelescer padrões de tipo e ojetos&lt;br /&gt;e vai compilar nosso objeto compartilhado falso =|...&lt;br /&gt;Isto será nossa camada Controller (temporária).&lt;br /&gt;&lt;br /&gt;* Um terceiro desenvolvedor vai programando a interface Texto com a estrutura de menus, telas&lt;br /&gt;de boas vindas, ajuda, sobre, aquela frescuragem toda que o usuário quer ter, e&lt;br /&gt;deixando as partes de código que precisa da dita cuja funcionalidade com a&lt;br /&gt;assintatura do método que o segundo desenvolvedor já passou...&lt;br /&gt;mas lembre-se que por enquanto este método vai estar retornando um valor falso...&lt;br /&gt;apenas pra não ficar parado.&lt;br /&gt;&lt;br /&gt;Um exemplo prático que estou criando é o &lt;a target="_blank" href="http://bombas.sf.net/"&gt;http://bombas.sf.net&lt;/a&gt; estou desenvolvendo baseado na lógica&lt;br /&gt;do campominado do windows(winmine.exe) com alguma divertidas funcionalidades&lt;br /&gt;adicionadas.&lt;br /&gt;Minha intenção era criar um jogo que tivesse 3 interfaces, Texto, 2D e 3D.&lt;br /&gt;como a lógica do jogo é uma só, eu pude criar um código de forma que fosse usado&lt;br /&gt;pelos 3 modos do jogo. Compilei este código como um Shared Object que no windows&lt;br /&gt;são as famosas .dll e no linux são os arquivos .so . E assim pude reutilizar&lt;br /&gt;este código compartilhado com os outros modos...&lt;br /&gt;No futuro, se eu quiser usar esta lógica como parte de um outro jogo será só&lt;br /&gt;adicionar esta biblioteca e pronto.&lt;br /&gt;&lt;br /&gt;Queria continuar com isto, mas está ficando muito extenso...&lt;br /&gt;e vocês podem se basear no código do bombas.sf.net que já postei o link acima.&lt;br /&gt;&lt;br /&gt;Também é verdade que estou sem tempo&lt;br /&gt;talvez eu poste futuramente uma parte 2 deste artigo.&lt;br /&gt;&lt;br /&gt;Espero que seja útil a vocês...&lt;br /&gt;Qualquer dúvida, usem os comentários.&lt;br /&gt;&lt;br /&gt;Até a próxima,&lt;br /&gt;Abs.&lt;br /&gt;&lt;/div&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;23:05&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-1445074887095045439?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QxiBoe94qIDBqElTM1yQsOaTWAc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QxiBoe94qIDBqElTM1yQsOaTWAc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QxiBoe94qIDBqElTM1yQsOaTWAc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QxiBoe94qIDBqElTM1yQsOaTWAc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/ZXCxUvI7gxA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/1445074887095045439/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=1445074887095045439" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1445074887095045439?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/1445074887095045439?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/ZXCxUvI7gxA/2007-11-29-programao-em-camadas-mvc.html" title="2007-11-29 - Programação em Camadas (MVC)" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-11-29-programao-em-camadas-mvc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIDQnc4eCp7ImA9WxdXFUo.&quot;"><id>tag:blogger.com,1999:blog-527784892055465211.post-8429498304491002603</id><published>2008-06-27T10:15:00.000-03:00</published><updated>2008-06-27T10:16:13.930-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T10:16:13.930-03:00</app:edited><title>2007-11-12 - UltraStar - A nova geração de karaokê</title><content type="html">&lt;div id="LastMDatecns!50A3054EE15AB96C!283"&gt;12 de novembro&lt;/div&gt;&lt;h4 style="margin-bottom: 0px;" id="subjcns!50A3054EE15AB96C!283"&gt;&lt;a href="http://glaudiston.spaces.live.com/blog/cns%2150A3054EE15AB96C%21283.entry?&amp;amp;_c02_vws=1"&gt;UltraStar - A nova geração de karaokê&lt;/a&gt;&lt;/h4&gt;&lt;div id="msgcns!50A3054EE15AB96C!283" class="bvMsg"&gt;Algumas semandas atrás, minha esposa me pediu que eu conseguisse um programa de karaokê para que ela exercite sua doce voz(para os que não sabem ela é cantora, uma bela cantora com uma linda voz mas continuando... ),&lt;br /&gt;então eu pesquisei...&lt;br /&gt;pesquisei....&lt;br /&gt;De início achei muitos programas de karaokes pagos...&lt;br /&gt;E alguns gratúitos como o kanário que é brasileiro, usa o microsoft agent... aqueles bichinhos do office 2000 e da pesquisa do windows xp...&lt;br /&gt;não gostei muito... tem restrições na versão gratuita... e não estava afim de pagar por um aplicativo tão simples... mas funciona...&lt;br /&gt; depois de algumas semanas ela me pediu algo melhor...&lt;br /&gt;Logo... de volta ao google... pesquisei mais um pouco e encontrei o microke - Muito bom mesmo vale a pena postar os links... além de ser gratuito e sem frescuras de ficar te avisando q existem muitos recursos q não estão ativos porq é gratuito... ele te dá acesso fácil à uma fonte excelente de arquivos de karaoke (.kar) e em outros formatos aceitos por este programa também... vale muito a pena... mas não se compara com nossa próxima descoberta... de qualquer forma segue o link:&lt;br /&gt;&lt;a href="http://www.microke.com.br/new/index.html"&gt;http://www.microke.com.br/new/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mas então, em um momento iluminado, pensei... "Uai... o sf.net deve com certeza ter alguma coisa totalmente gratuita e aberta onde além de deixar minha esposa se divertir, poderia colaborar de alguma forma com o crescimento do projeto..." e foi o que fiz... deixei o oráculo (leia-se google), e fui ao sf.net pesquisar... e o que encontrei me surpreendeu demasiadamente:&lt;br /&gt;&lt;a href="http://sourceforge.net/project/screenshots.php?group_id=191560"&gt;http://sourceforge.net/project/screenshots.php?group_id=191560&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Não posso deixar de compartilhar o quanto fiquei facinado com este aplicativo. Além de ter uma versão portada pra linux, e opcionalmente funcionar via wine esta versão deluxe, conta com um site que permite o download das musicas no formato do aplicativo... o&lt;br /&gt;&lt;a href="http://www.ultrastarsongs.com/"&gt;http://www.ultrastarsongs.com/&lt;/a&gt;&lt;br /&gt;O download é simples e tem um acervo enorme de músicas em inglês... Porém, este site tem um controle muito rígido dos downloads... se tentar burlar pode ser bloqueado por mais de 6 horas... então o melhor é baixar as musicas via torrent... encontrei uma boa fonte em:&lt;br /&gt;&lt;a href="http://www.torrentz.com/search?q=ultrastar"&gt;http://www.torrentz.com/search?q=ultrastar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se você não tem um client de torrent, necessário para este tipo de download, pode usar o firefox (&lt;a href="http://www.getfirefox.com/"&gt;www.getfirefox.com&lt;/a&gt;) com o addon (um plugin) foxtorrent(&lt;a href="http://www.foxtorrent.com/"&gt;http://www.foxtorrent.com/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Depois de baixar e instalar o aplicativo, e as músicas, é só copiar as pastas das musicas com os arquivos txt, mp3/ogg, e imagens para a subpasta songs da pasta onde você instalou o ultrastar.&lt;br /&gt;&lt;br /&gt;A versão Deluxe já vem com uma música pra mostrar o potencial do ultrastar e te dar um bom exemplo de como adicionar novas músicas na pasta... não tem segredo.&lt;br /&gt;&lt;br /&gt;É um aplicativo fantástico para treinar afinação e fonética de inglês... porém tem um outro problema para nós brasileiros... não existem, ou pelo menos eu não encontrei músicas em português...&lt;br /&gt;&lt;br /&gt;Por isto, pesquisei e descobri uma forma eficaz e relativamente simples de converter os arquivos kar que conseguimos usar com outros aplicativos de karaoke como o microke para o txt usado pelo ultrastar... depois disto é só adicionar o MP3... fiz uma música, ficou ótimo... e não foi difícil...&lt;br /&gt;&lt;br /&gt;mas vou tratar disto em um outro post.&lt;br /&gt;&lt;br /&gt;Qualquer dúvida, postem nos comentários e terei prazer em responder...&lt;br /&gt;&lt;br /&gt;Abs,&lt;br /&gt;Ton&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr height="8"&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;a href="http://blufiles.storage.live.com/y1pt62HLCvmQApP3jWouQ39RhKcz-fhAYbl1gkcd3tUTXW3RC83Fe6F_998PiyXUsZv" target="_blank"&gt;&lt;img src="http://blufiles.storage.live.com/y1pt62HLCvmQApP3jWouQ39RkGmw9WJk-7otrCg5cMUeclAKzaKg7juJJIkJLSgBPTi" alt="" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="footerLinks"&gt;&lt;nobr id="blogDT"&gt;13:28&lt;/nobr&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/527784892055465211-8429498304491002603?l=glaudiston.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UiTpa6NSEEVmLjAW30-3HoAxEiw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UiTpa6NSEEVmLjAW30-3HoAxEiw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UiTpa6NSEEVmLjAW30-3HoAxEiw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UiTpa6NSEEVmLjAW30-3HoAxEiw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GlaudistonBlog/~4/YJOoP7UQ6XU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://glaudiston.blogspot.com/feeds/8429498304491002603/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=527784892055465211&amp;postID=8429498304491002603" title="1 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/8429498304491002603?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/527784892055465211/posts/default/8429498304491002603?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GlaudistonBlog/~3/YJOoP7UQ6XU/2007-11-12-ultrastar-nova-gerao-de.html" title="2007-11-12 - UltraStar - A nova geração de karaokê" /><author><name>Glaudiston Gomes da Silva</name><uri>https://profiles.google.com/108815571963742519633</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VWrg4ZVynFk/AAAAAAAAAAI/AAAAAAAAAFo/2XYMmfgmMjw/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://glaudiston.blogspot.com/2008/06/2007-11-12-ultrastar-nova-gerao-de.html</feedburner:origLink></entry></feed>

