<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>skhaz's blog</title>
  <link>https://skhaz.github.io/skhaz.com/blog/</link>
  <description>Code::Blog — arquivo restaurado</description>
  <language>pt-BR</language>
  <lastBuildDate>Thu, 09 Apr 2009 15:00:00 GMT</lastBuildDate>
  <item>
    <title>Maquina do Tempo com o Vim</title>
    <link>https://skhaz.github.io/skhaz.com/blog/maquina-do-tempo-com-o-vim/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/maquina-do-tempo-com-o-vim/</guid>
    <pubDate>Thu, 09 Apr 2009 15:00:00 GMT</pubDate>
    <description><![CDATA[Muitas vezes usar o undo e redo resolve a maior parte dos problemas, porém quando aquele trecho que você modificou ou apagou a 10 minutos atrás, quantos undos serão necessários para que se encontre tal modificação? pensando nisso o Vim poss]]></description>
    <content:encoded><![CDATA[<p>Muitas vezes usar o <em>undo</em> e <em>redo </em>resolve a maior parte dos problemas, porém quando aquele trecho que você modificou ou apagou a 10 minutos atrás, quantos undos serão necessários para que se encontre tal modificação? pensando nisso o <a href="https://www.vim.org/" rel="external noopener" target="_blank">Vim</a> possui uma maquina do tempo onde é possível “caminhar” pelo tempo no código.</p>
<p>Retroceder 10 minutos atrás<br/>
<em>:earlier 10m</em></p>
<p>Avançar 30 segundos<br/>
<em>:later 30s</em></p>]]></content:encoded>
  </item>
  <item>
    <title>Hoje, Sexta-feira 13 o Unix time chegará ao valor 1234567890</title>
    <link>https://skhaz.github.io/skhaz.com/blog/hoje-sexta-feira-13-o-unix-time-chegara-ao-valor-1234567890/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/hoje-sexta-feira-13-o-unix-time-chegara-ao-valor-1234567890/</guid>
    <pubDate>Fri, 13 Feb 2009 15:00:00 GMT</pubDate>
    <description><![CDATA[Como muitos já devem saber hoje o Unix Time chegará ao valor de 1234567890 por volta das 23:00 (não confirmei a hora exata) e eu quero acompanhar de perto e ver meus dados sumindo, maquinas travando, etc… então fiz esse “programa” em C++/Qt]]></description>
    <content:encoded><![CDATA[<p style="text-align: left;">Como muitos já devem saber hoje o <a href="http://pt.wikipedia.org/wiki/Era_Unix" rel="external noopener" target="_blank">Unix Time</a> chegará ao valor de 1234567890 por volta das 23:00 (não confirmei a hora exata) e eu quero acompanhar de perto e ver meus dados sumindo, maquinas travando, etc… então fiz esse “programa” em C++/Qt em ~2 minutos que não chega a ter 5 linhas uteis :D </p>
<p style="text-align: left;">
</p><p style="text-align: center;"><span class="missing-media" data-original="http://www.skhaz.com/blog/wp-content/uploads/2009/02/unixsextafeira13-300x240.jpg">Imagem histórica não recuperada</span></p>
<p style="text-align: center;">(clique para ampliar)</p>]]></content:encoded>
  </item>
  <item>
    <title>[Meme] Aleatoriedades</title>
    <link>https://skhaz.github.io/skhaz.com/blog/meme-aleatoriedades/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/meme-aleatoriedades/</guid>
    <pubDate>Thu, 05 Feb 2009 15:00:00 GMT</pubDate>
    <description><![CDATA[O Vinícius do Ponto V me convidou para esse meme, Vamos as regras: Linkar a pessoa que te indicou. Escrever as regras do meme em seu blog. Contar 6 coisas aleatórias sobre você. Indique mais 6 pessoas e coloque os links no final do post. De]]></description>
    <content:encoded><![CDATA[<p>O <a href="http://vinigodoy.wordpress.com/2009/01/15/off-topic-meme-aleatoriedades/" rel="external noopener" target="_blank" title="Vinícius do Ponto V">Vinícius do Ponto V</a> me convidou para esse meme,</p>
<p>Vamos as regras:</p>
<ol>
<li>Linkar a pessoa que te indicou.</li>
<li>Escrever as regras do meme em seu blog.</li>
<li>Contar 6 coisas aleatórias sobre você.</li>
<li>Indique mais 6 pessoas e coloque os links no final do post.</li>
<li>Deixe a pessoa saber que você o indicou, deixando um comentário para ela.</li>
<li>Deixe os indicados saberem quando você publicar seu post.</li>
</ol>
<p>Minhas coisas aleatórias</p>
<ol>
<li>Tenho vontade de ter uma bateria, embora não tenho vontade de participar de uma banda, só por tocar mesmo.</li>
<li>Musica, minha segunda paixão, ouço de tudo de blues a metal, é mais fácil me ver sem calças do que sem fones.</li>
<li>Cerveja, adoro (já outras bebidas como destilados não gosto, nem mesmo vinho).</li>
<li>Gosto muito de ler e estudar e não só assuntos como programação, eletrônica, mais também sobre religiões (embora seja agnóstico), e apesar disso nunca fui bom aluno na escola, na verdade sempre estive entre os piores alunos, e me considero um autodidata nato.</li>
<li>Pessoas diferentes tem idéias diferentes ao meu respeito totalmente opostas, alguns me acham idiota e brincalhão e outros serio e inteligente, não por ter varias personalidades e sim porque sempre tento conhecer as pessoas antes de dizer algo.</li>
<li>Estudar Latex, Vim e Expressões regulares são meus hobbies</li>
</ol>
<p>Convido <a href="http://opinguimdegeladeira.blogspot.com/" rel="external noopener" target="_blank" title="Amanda">Amanda</a>, <a href="http://diesoftgames.blogspot.com/" rel="external noopener" target="_blank" title="DieSoft">Diego</a>, <a href="http://crocidb.wordpress.com/" rel="external noopener" target="_blank" title="Bruno Croci">Bruno Croci</a> os outros que eu não indiquei é porque já foram indicados.</p>]]></content:encoded>
  </item>
  <item>
    <title>Qt agora é LGPL</title>
    <link>https://skhaz.github.io/skhaz.com/blog/qt-agora-e-lgpl/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/qt-agora-e-lgpl/</guid>
    <pubDate>Wed, 14 Jan 2009 15:00:00 GMT</pubDate>
    <description><![CDATA[A Qt agora está disponível também sobre a licença LGPL Mais informções: http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt http://labs.trolltech.com/blogs/2009/01/14/nokia-to-license-qt-under-lgpl/ http://www.qtsoftware.co]]></description>
    <content:encoded><![CDATA[<p>A <a href="http://www.qtsoftware.com/" rel="external noopener" target="_blank" title="Qt">Qt</a> agora está disponível também sobre a licença <a href="http://www.gnu.org/licenses/lgpl.html" rel="external noopener" target="_blank" title="lgpl">LGPL</a></p>
<p>Mais informções:</p>
<ul>
<li><a href="http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt" rel="external noopener" target="_blank">http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt</a></li>
<li><a href="http://labs.trolltech.com/blogs/2009/01/14/nokia-to-license-qt-under-lgpl/" rel="external noopener" target="_blank">http://labs.trolltech.com/blogs/2009/01/14/nokia-to-license-qt-under-lgpl/</a></li>
<li><a href="http://www.qtsoftware.com/about/licensing/frequently-asked-questions" rel="external noopener" target="_blank">http://www.qtsoftware.com/about/licensing/frequently-asked-questions</a></li>
</ul>
<p>Para quem não conhece a LGPL, ela permite ao programador linkar bibliotecas dinamicamente (DLL) sem exigir que o código fonte seja distribuido junto ao binario, tornando possivel usa-la em projetos comercias e não opensource, que ao contrario da GPL mesmo usando linkagem dinamica viola os termos da licença se nao distribuido os fontes.</p>]]></content:encoded>
  </item>
  <item>
    <title>Por onde andas skhaz?</title>
    <link>https://skhaz.github.io/skhaz.com/blog/por-onde-andas-skhaz/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/por-onde-andas-skhaz/</guid>
    <pubDate>Wed, 10 Dec 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Depois de um bom tempo sem postar, devido há inumeras coisas, como mudança de emprego, escolher um toolkit para criação de ‘GUI’s e aprende-lo, o fim de um namoro de 3 anos, e muita correria… enfim o bom filho a casa retorna. A boa noticia ]]></description>
    <content:encoded><![CDATA[<p>Depois de um bom tempo sem postar, devido há inumeras coisas, como mudança de emprego, escolher um toolkit para criação de ‘GUI’s e aprende-lo, o fim de um namoro de 3 anos, e muita correria… enfim o bom filho a casa retorna.</p>
<p>A boa noticia é que aprendi muitas coisas novas (sem maldade xD) como as bibliotecas <a href="http://trolltech.com/" rel="external noopener" target="_blank">Qt</a>, <a href="https://phonon.kde.org/" rel="external noopener" target="_blank">phonon</a>, <a href="http://webkit.org/" rel="external noopener" target="_blank">Webkit</a>, e aprendi mais sobre as que eu já sabia (<a href="http://www.boost.org/" rel="external noopener" target="_blank">boost</a> e stl), expressões regulares e até uma linguagem nova chamada <a href="http://www.ruby-lang.org/pt/" rel="external noopener" target="_blank">Ruby</a></p>
<p>Eu sempre achei a idea de usar combobox, checkbox, etc como filtro uma idea complicada, ter que ficar marcando e depois clicar em filtrar, entao pensei em algo assim, basta voce digitar qualquer atributo do material que já vinha tudo que for relevante, por exemplo “AL TR”, já retorna todos os alumunios que são trifilados. No video da para se ter uma idea do que eu escrevi (claro que não é nenhum google, é bem simples)</p>
<div class="video-embed"><iframe allowfullscreen="" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/IUH4IQg1C8s" title="Vídeo arquivado do post"></iframe></div>
<p>E aqui o codigo responsável pela busca</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> ItemView<span style="color: #008080;">::</span><span style="color: #007788;">filterChanged</span><span style="color: #008000;">(</span><span style="color: #0000ff;">const</span> QString<span style="color: #000040;">&amp;</span> text<span style="color: #008000;">)</span>
<span style="color: #008000;">{</span>
	QString filter, query<span style="color: #008080;">;</span>
	QStringList list <span style="color: #000080;">=</span> text.<span style="color: #007788;">split</span><span style="color: #008000;">(</span><span style="color: #FF0000;">" "</span>, QString<span style="color: #008080;">::</span><span style="color: #007788;">SkipEmptyParts</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span>
 
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">(</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> list.<span style="color: #007788;">size</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">)</span> <span style="color: #008000;">{</span>
		filter.<span style="color: #007788;">append</span><span style="color: #008000;">(</span>QString<span style="color: #008000;">(</span><span style="color: #FF0000;">" %1 nome ILIKE '\%%2\%'"</span><span style="color: #008000;">)</span>.<span style="color: #007788;">arg</span><span style="color: #008000;">(</span>
			list.<span style="color: #007788;">size</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">1</span> <span style="color: #000040;">&amp;&amp;</span> i <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">?</span> <span style="color: #FF0000;">" AND "</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">" "</span><span style="color: #008000;">)</span>.<span style="color: #007788;">arg</span><span style="color: #008000;">(</span>list.<span style="color: #007788;">at</span><span style="color: #008000;">(</span>i<span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">}</span>
 
	model<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setFilter<span style="color: #008000;">(</span>filter<span style="color: #008000;">)</span><span style="color: #008080;">;</span>
<span style="color: #008000;">}</span></pre></td></tr></table></div>
<p>Onde model é um ponteiro do tipo <a href="http://doc.trolltech.com/4.4/qsqltablemodel.html" rel="external noopener" target="_blank">QSqlTableModel</a>, e o metodo setFilter nada mais é do que a inserção da clausa <a href="http://www.w3schools.com/Sql/sql_where.asp" rel="external noopener" target="_blank">WHERE</a></p>
<p>Se voce quer aprender mais como a Qt implementa o padrão de projeto <a href="http://en.wikipedia.org/wiki/Model-view-controller" rel="external noopener" target="_blank">Model-View-Controller</a> leia <a href="http://doc.trolltech.com/4.4/model-view-programming.html" rel="external noopener" target="_blank">aqui</a></p>
<p>É isso ae, espero que gostem, qualquer duvida, critica e/ou sujestões já sabem</p>]]></content:encoded>
  </item>
  <item>
    <title>boost 1.36</title>
    <link>https://skhaz.github.io/skhaz.com/blog/boost-136/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/boost-136/</guid>
    
    <description><![CDATA[Meio atrasado este post mas… dia 14 de agosto foi liberada a nova versão da boost, dentre as novas bibliotecas o destaque fica para Accumulators, Asio e PtrContainer.]]></description>
    <content:encoded><![CDATA[<p>Meio atrasado este post mas… dia 14 de agosto foi liberada a nova versão da boost, dentre as novas bibliotecas o destaque fica para</p>
<p>Accumulators Um framework de calculo incremental</p>
<p>Asio agora com suporte portas serial, raw sockets (fazia falta mesmo), ICMP (mais conhecido como ping) entre outras ‘coisitas’.</p>
<p>PtrContainer Chega de ficar declarando vector de shared_ptr, alem […]</p>]]></content:encoded>
  </item>
  <item>
    <title>Ctrl+C e Ctrl+V</title>
    <link>https://skhaz.github.io/skhaz.com/blog/ctrlc-e-ctrlv/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/ctrlc-e-ctrlv/</guid>
    <pubDate>Wed, 02 Jul 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Em programação não existe plágio, na verdade tudo é refactory em código fonte alheio]]></description>
    <content:encoded><![CDATA[<blockquote><p>Em programação não existe plágio, na verdade tudo é refactory em código fonte alheio</p></blockquote>]]></content:encoded>
  </item>
  <item>
    <title>Wordpress god</title>
    <link>https://skhaz.github.io/skhaz.com/blog/wordpress-god/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/wordpress-god/</guid>
    <pubDate>Mon, 23 Jun 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Achei esse link ao acaso e achei útil para quem usa o wordpress como ferramenta de blogging WORDPRESS GOD: 300+ Tools for Running Your WordPress Blog E para quem usa o VIM , O vimpress esse plugin (do vim, e não do wordpress) permite postar]]></description>
    <content:encoded><![CDATA[<p>Achei esse link ao acaso e achei útil para quem usa o <a href="http://www.wordpress.org/" rel="external noopener" target="_blank">wordpress</a> como ferramenta de <em>blogging</em> <a href="http://mashable.com/2007/08/16/wordpress-god300-tools-for-running-your-wordpress-blog/" rel="external noopener" target="_blank">WORDPRESS GOD: 300+ Tools for Running Your WordPress Blog</a></p>
<p>E para quem usa o <a href="http://www.vim.org/" rel="external noopener" target="_blank">VIM</a>, O <a href="http://www.vim.org/scripts/script.php?script_id=1953" rel="external noopener" target="_blank">vimpress</a> esse plugin (do vim, e não do wordpress) permite postar e editar posts pelo editor sem ter que sair do conforto do vim.</p>]]></content:encoded>
  </item>
  <item>
    <title>7 Habits For Effective Text Editing 2.0</title>
    <link>https://skhaz.github.io/skhaz.com/blog/7-habits-for-effective-text-editing-20/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/7-habits-for-effective-text-editing-20/</guid>
    
    <description><![CDATA[[Via youtube ]]]></description>
    <content:encoded><![CDATA[<div class="video-embed"><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/3vnpf3xQGK0" title="7 Habits For Effective Text Editing 2.0"></iframe></div>
<p>[Via <a href="http://youtube.com/watch?v=3vnpf3xQGK0" rel="external noopener" target="_blank">youtube</a>]</p>]]></content:encoded>
  </item>
  <item>
    <title>Os 10 ultimos mais usados comandos no linux</title>
    <link>https://skhaz.github.io/skhaz.com/blog/os-10-ultimos-mais-usados-comandos-no-linux/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/os-10-ultimos-mais-usados-comandos-no-linux/</guid>
    <pubDate>Thu, 19 Jun 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Achei esse meme e então resolvi participar history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10 Resultado ls cd vim g++ mplayer startx lynx ps mc tar Fica registrado meu “intimado” a todos que lêem me blog]]></description>
    <content:encoded><![CDATA[<p>Achei <a href="http://zyakannazio.eti.br/fudeblog/2007/05/26/os-10-mais-da-linha-de-comando/" rel="external noopener" target="_blank">esse meme</a> e então resolvi participar</p>
<p><code>history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10</code></p>
<p>Resultado</p>
<ol>
<li>ls</li>
<li>cd</li>
<li>vim</li>
<li>g++</li>
<li>mplayer</li>
<li>startx</li>
<li>lynx</li>
<li>ps</li>
<li>mc</li>
<li>tar</li>
</ol>
<p>Fica registrado meu “intimado” a todos que lêem me blog, postarem os 10 ultimo mais usados comando do linux (ou qualquer outro *nix)</p>]]></content:encoded>
  </item>
  <item>
    <title>Instalador da boost</title>
    <link>https://skhaz.github.io/skhaz.com/blog/instalador-da-boost/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/instalador-da-boost/</guid>
    <pubDate>Sun, 08 Jun 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Para quem ainda tem dificuldades para compilar a biblioteca boost , eu encontrei um instalador que baixa os pacotes dependendo de suas escolhas (multithreaded, static, debug, etc) sem contar que nos polpa de ter que esperar pela compilação,]]></description>
    <content:encoded><![CDATA[<p>Para quem ainda tem dificuldades para compilar a biblioteca <a href="http://www.boost.org/" rel="external noopener" target="_blank">boost</a>, eu encontrei um instalador que baixa os pacotes dependendo de suas escolhas (multithreaded, static, debug, etc) sem contar que nos polpa de ter que esperar pela compilação, pena que é só para o Visual C++.<br/>
<span class="missing-media" data-original="http://www.skhaz.com/blog/wp-content/uploads/2008/06/boostconfig1.png">Imagem histórica não recuperada</span></p>
<p><span class="missing-media" data-original="http://www.skhaz.com/blog/wp-content/uploads/2008/06/boostinstaller2.png">Imagem histórica não recuperada</span></p>
<p>O instalador pode ser baixado <a href="http://www.boost-consulting.com/boost_1_35_0_setup.exe" rel="external noopener" target="_blank">aqui</a>, mais informações em <a href="http://www.boost-consulting.com/products/free" rel="external noopener" target="_blank">http://www.boost-consulting.com/products/free</a></p>]]></content:encoded>
  </item>
  <item>
    <title>Agendamento de Tarefas</title>
    <link>https://skhaz.github.io/skhaz.com/blog/agendamento-de-tarefas/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/agendamento-de-tarefas/</guid>
    <pubDate>Thu, 05 Jun 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Essa é minha implementação de um pequeno sistema de agendamento de tarefas, que futuramente usarei em um outro projeto, achei que ficou legal então resolvi postar. Vamos à implementação task.hpp #ifndef _task_hpp #define _task_hpp #include ]]></description>
    <content:encoded><![CDATA[<p>Essa é minha implementação de um pequeno sistema de agendamento de tarefas, que futuramente usarei em um outro projeto, achei que ficou legal então resolvi postar. Vamos à implementação</p>
<p>task.hpp</p>
<pre class="syntax-highlight:cpp">
#ifndef _task_hpp
#define _task_hpp

#include &lt;ctime&gt;
#include &lt;boost /function.hpp&gt;
#include &lt;/boost&gt;&lt;boost /bind.hpp&gt;

class task
{
	public:
		explicit task(const boost::function&lt;void ()&gt;&amp; callback)
		: _call_back(callback)
		, _call_count(0)
		, _total_time_used(0)
		{
		}

		virtual ~task() { }

		virtual void before_task() { }

		void do_task()
		{
			before_task();
			_call_back();
			after_task();
		}

		virtual void after_task() { }

		void set_callback(const boost::function&lt;/void&gt;&lt;void ()&gt;&amp; callback)
		{
			_call_back = callback;
		}

		const boost::function&lt;/void&gt;&lt;void ()&gt;&amp; get_callback() const
		{
			return _call_back;
		}

		bool is_valid() const
		{
			return true;
		}

	private:
		boost::function&lt;/void&gt;&lt;void ()&gt; _call_back;
		std::size_t _call_count;
		std::clock_t _total_time_used;
};

#endif
</pre>
<p>schedule.hpp</p>
<pre class="syntax-highlight:cpp">
#ifndef _schedule_hpp
#define _schedule_hpp

#include &lt;algorithm&gt;
#include &lt;deque&gt;
#include &lt;boost /pool/pool_alloc.hpp&gt;
#include &lt;/boost&gt;&lt;boost /shared_ptr.hpp&gt;
#include &lt;/boost&gt;&lt;boost /noncopyable.hpp&gt;
#include &lt;/boost&gt;&lt;boost /thread/thread.hpp&gt;
#include &lt;/boost&gt;&lt;boost /thread/xtime.hpp&gt;
#include &lt;/boost&gt;&lt;boost /thread/mutex.hpp&gt;

#include "task.hpp"

using std::for_each;
using std::deque;
using boost::shared_ptr;

class task;
typedef shared_ptr&lt;task&gt; task_ptr;
typedef deque&lt;task_ptr , boost::pool_allocator&lt;task_ptr&gt; &gt; deque_task;

class schedule : public boost::noncopyable
{
	public:
		schedule() : job(boost::bind(&amp;schedule::thread_dispatcher, this))
		{
			_thread_sleep.sec = 10;

			try
			{
				job.join();
			}

			catch (boost::thread_interrupted&amp;) { /* don't care... */ }
		}

		virtual ~schedule() { }

		void add_task(const shared_ptr&lt;task&gt;&amp; _task)
		{
			boost::mutex::scoped_lock lock(monitor);

			deque_task::const_iterator it = std::find(_task_pool.begin(),
					_task_pool.end(), _task);

			if (it == _task_pool.end())
			{
				_task_pool.push_back(_task);
			}

			else {
				// duplicate item
			}
		}

		void remove_task(const shared_ptr&lt;/task&gt;&lt;task&gt;&amp; _task)
		{
			boost::mutex::scoped_lock lock(monitor);

			deque_task::iterator it = std::find(_task_pool.begin(),
					_task_pool.end(), _task);

			if (it != _task_pool.end())
			{
				_task_pool.erase(it);
			}

			else {
				// does't exist
			}
		}

	protected:
		void thread_dispatcher()
		{
			for (;;)
			{
				for_each(_task_pool.begin(), _task_pool.end(),
					boost::mem_fn(&amp;task::do_task));

				boost::thread::sleep(_thread_sleep);
			}
		}

	private:
		deque_task _task_pool;
		boost::thread job;
		boost::mutex monitor;
		boost::xtime _thread_sleep;
};

#endif
</pre>
<p>Unidade para testes, main.cpp</p>
<pre class="syntax-highlight:cpp">
#include &lt;iostream&gt;
#include &lt;boost /scoped_ptr.hpp&gt;
#include &lt;/boost&gt;&lt;boost /bind.hpp&gt;

#include "schedule.hpp"

void f1()
{
	std::cout &lt; &lt; "f1()" &lt;&lt; std::endl;
}

void f2()
{
	std::cout &lt;&lt; "f2()" &lt;&lt; std::endl;
}

int main()
{
	boost::scoped_ptr&lt;schedule&gt; _schedule(new schedule());

	shared_ptr&lt;task&gt; _task1 (new task(f1));
	shared_ptr&lt;/task&gt;&lt;task&gt; _task2 (new task(f2));

	_schedule-&gt;add_task(_task1);
	_schedule-&gt;add_task(_task1); // repetido, nao insere...
	_schedule-&gt;add_task(_task2);

	_schedule-&gt;start();

	return 0;
}
</pre>
<p>Agradecimentos</p>
<ul>
<li><a href="http://vertexbuffer.wordpress.com/" rel="external noopener" target="_blank">Daniel</a> pela sugestão de usar fila e apenas uma thread ao invés de uma para cada tarefa e assim evitando busy-waiting</li>
<li><a href="http://www.projetoarret.com.br/" rel="external noopener" target="_blank">Alex</a> pelos testes de compatibilidade com mingw e msvc (vide <a href="http://www.skhaz.com/blog/deque-shared_ptr-for_each-mem_fun-cabummm/" rel="external noopener" target="_blank">mem_fun e shared_ptr</a>)</li>
</ul>
<p><span class="missing-download" data-original="http://www.skhaz.com/blog/wp-content/uploads/2008/06/scheduler.zip">schedule.zip <small>(arquivo não recuperado)</small></span></p>
<p></p>]]></content:encoded>
  </item>
  <item>
    <title>deque + shared_ptr + for_each + mem_fun = cabumm</title>
    <link>https://skhaz.github.io/skhaz.com/blog/deque-shared_ptr-for_each-mem_fun-cabummm/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/deque-shared_ptr-for_each-mem_fun-cabummm/</guid>
    <pubDate>Wed, 28 May 2008 15:00:00 GMT</pubDate>
    <description><![CDATA[Recentemente tive problemas com mem_fun e shared_ptr em um loop for_each Os elementos typedef shared_ptr<task> task_ptr; typedef deque<task_ptr , pool_allocator<task_ptr> > deque_task_ptr; Agora a combinação explosiva for_each(_task_pool.be]]></description>
    <content:encoded><![CDATA[<p>Recentemente tive problemas com mem_fun e shared_ptr em um loop for_each</p>
<p>Os elementos</p>
<pre class="syntax-highlight:cpp">
typedef shared_ptr&lt;task&gt; task_ptr;
typedef deque&lt;task_ptr , pool_allocator&lt;task_ptr&gt; &gt; deque_task_ptr;
</pre>
<p>Agora a combinação explosiva</p>
<pre class="syntax-highlight:cpp">
for_each(_task_pool.begin(), _task_pool.end(),
       std::mem_fun(&amp;task::do_task));
</pre>
<p>O problema está em usar std::mem_fun, ela não suporta chamar métodos de uma classe que estão em um shared_ptr, eu poderia ter usado bind, mais preferi manter o código, como a boost tem sua própria implementação de <a href="http://www.boost.org/doc/libs/1_35_0/libs/bind/mem_fn.html" rel="external noopener" target="_blank">mem_fn</a> ficando assim:</p>
<pre class="syntax-highlight:cpp">
for_each(_task_pool.begin(), _task_pool.end(),
       boost::mem_fn(&amp;task::do_task));
</pre>
<p>Resolvido, obrigado <a href="http://www.projetoarret.com.br/" rel="external noopener" target="_blank">Alex</a> por reportar o problema.<br/>
</p>]]></content:encoded>
  </item>
  <item>
    <title>Meme - Como é seu Desktop</title>
    <link>https://skhaz.github.io/skhaz.com/blog/meme-como-e-seu-desktop/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/meme-como-e-seu-desktop/</guid>
    <pubDate>Mon, 12 May 2008 12:53:46 GMT</pubDate>
    <description><![CDATA[Respondendo ao meme do Vínicius , Eu não gosto de muitos icones no desktop, prefiro usar o “Inicialização Rapida” Imagem histórica não recuperada IDE: Codeblocks, Visual Studio 2008 e wxFormBuilder (valeu a indicação n2liquid ) Jogos: Diabl]]></description>
    <content:encoded><![CDATA[<p><a href="http://vinigodoy.wordpress.com/2008/05/10/meme-como-e-o-seu-desktop/" rel="external noopener" target="_blank">Respondendo ao meme do Vínicius</a>, Eu não gosto de muitos icones no desktop, prefiro usar o “Inicialização Rapida”</p>
<p><span class="missing-media" data-original="http://www.skhaz.com/blog/wp-content/uploads/2008/05/desktop.jpg">Imagem histórica não recuperada</span></p>
<p>IDE: Codeblocks, Visual Studio 2008 e wxFormBuilder (valeu a indicação <a href="http://sonetto.wordpress.com/" rel="external noopener" target="_blank">n2liquid</a>)<br/>
Jogos: Diablo II, Starcraft, Turok 2<br/>
Outros softwares: Winamp, Kaspersky, Opera, Media Player Classic, DVD Shrink, Nero.<br/>
Tem alguns eBooks no canto superior, e no superior esquerdo alguns projetos.<br/>
Tema usado é o Zune, e minha taskbar eu sempre uso com o tamanho dobrado (talvez seja um abito vindo do KDE), Ah é.. e como muita gente limpou o desktop para a “visita”, eu tambem dei uma enxugada no meu xD</p>
<p>A imagem está em baixa resolução porque meu monitor parou de funcionar e estou só com um reserva :(</p>
<p><strong>Edit</strong> Visual Studio com tema modificado<br/>
<span class="missing-media" data-original="http://www.skhaz.com/blog/wp-content/uploads/2008/05/msvczm8-300x225.png">Imagem histórica não recuperada</span></p>]]></content:encoded>
  </item>
  <item>
    <title>Mapa térmico do blog</title>
    <link>https://skhaz.github.io/skhaz.com/blog/mapa-termico-do-blog/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/mapa-termico-do-blog/</guid>
    <pubDate>Fri, 02 May 2008 13:49:13 GMT</pubDate>
    <description><![CDATA[Instalei o ClickHeat no blog, para quem ainda não conhece ele registra os clicks dos visitantes e posteriormente gera gráficos com a temperatura dos clicks, abaixo algumas screenshots do ClickHeat rodando há 2 dias. Imagem histórica não rec]]></description>
    <content:encoded><![CDATA[<p>Instalei o <a href="http://www.labsmedia.com/clickheat/index.html" rel="external noopener" target="_blank">ClickHeat</a> no blog, para quem ainda não conhece ele registra os clicks dos visitantes e posteriormente gera gráficos com a temperatura dos clicks, abaixo algumas screenshots do ClickHeat rodando há 2 dias.</p>
<p><span class="missing-media" data-original="http://img240.imageshack.us/img240/2306/mapakm5.th.png">Imagem histórica não recuperada</span>   <span class="missing-media" data-original="http://img240.imageshack.us/img240/9194/mapatermicoyb6xb3.th.png">Imagem histórica não recuperada</span></p>
<blockquote><p>Os pontos azuis são os clicks, quanto mais avermelhado mais clicks em um determinado ponto</p>
</blockquote>]]></content:encoded>
  </item>
  <item>
    <title>Sistema de Arquivo Virtual usando a PhysicsFS</title>
    <link>https://skhaz.github.io/skhaz.com/blog/sistema-de-arquivo-virtual/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/sistema-de-arquivo-virtual/</guid>
    <pubDate>Thu, 17 Apr 2008 12:29:04 GMT</pubDate>
    <description><![CDATA[O que é PhysicsFS PhysicsFS (Physics File System) ou physfs, fornece uma camada de abstração do sistema de arquivos do sistema operacional. Motivação Quando estava escrevendo a wintermoon estudei varias engines dentre elas a Ogre e a Irrlic]]></description>
    <content:encoded><![CDATA[<p><strong>O que é PhysicsFS</strong><br/>
PhysicsFS (Physics File System) ou physfs, fornece uma camada de abstração do sistema de arquivos do sistema operacional.</p>
<p><strong>Motivação</strong><br/>
Quando estava escrevendo a <a href="http://wintermoon.sourceforge.net/" rel="external noopener" target="_blank">wintermoon</a> estudei varias engines dentre elas a <a href="http://www.ogre3d.org/" rel="external noopener" target="_blank">Ogre</a> e a <a href="http://irrlicht.sourceforge.net/" rel="external noopener" target="_blank">Irrlicht</a> cada uma possui seu próprio sistema de arquivo virtual como descrito acima. mais porque a PhysicsFS? bom além de ser considerada muito segura e portável, ela tem um wrapper para a estrutura SDL_RWops o que facilita muito para projetos usando a biblioteca SDL. Outro ponto forte é a segurança, sua aplicação apenas poderá acessar os diretórios que você escolher, ideal para projetos baseados em scripts.</p>
<p><strong>Recursos</strong><br/>
Formatos suportados</p>
<ul>
<li><em>grp</em> - groupfiles ou seja vários arquivos em um só sem compressão</li>
<li><em>hog</em> - maiores informações em <a href="http://www.descent2.com/ddn/specs/hog" rel="external noopener" target="_blank">href=”http://www.descent2.com/ddn/specs/hog</a></li>
<li><em>lzma</em> - formato popular usado pelo 7z</li>
<li><em>mvl</em> - Descent II Movielib, mais informações em <a href="http://www.descent2.com/ddn/specs/mvl/" rel="external noopener" target="_blank">http://www.descent2.com/ddn/specs/mvl/</a></li>
<li><em>qpak</em> - formato de arquivo usado no Quake 1, Quake 2 e Quake 3</li>
<li><em>wad</em> - usado na engine do DOOM</li>
<li><em>zip</em> - formato popular e muito usado</li>
</ul>
<p><strong>Extras</strong></p>
<ul>
<li><em>selfextract</em> - suporta autoextração do executável</li>
<li><em>ignorecase</em> - torna não case-sensitive (não diferencia maiúsculo de minusculo)</li>
<li><em>wildcard</em> - mascara ex. arquivo.*, *.zip, arqui??.*, *.zi?</li>
<li><em>physfsrwops</em> - abstração da estrutura SDL_RWops (é o que vamos usar, será mais explicado adiante)</li>
<li><em>physfshttpd</em> - Possibilita enviar ou receber arquivos via http</li>
</ul>
<p><span id="more-62"></span></p>
<p>Alem de varias outras coisas, como bind para ruby e .net.</p>
<p><strong>Velocidade</strong><br/>
Como sabemos o acesso ao disco rígido é muito lento, usando um sistema de arquivos virtuais, reduzimos o acesso ao disco conseguindo um ganho de velocidade no carregamento.</p>
<p><strong>Compilando</strong><br/>
Se você usa algum Unix* (*BSD, GNU/Linux, etc) execute os comandos a seguir em algum terminal</p>
<p><code>cmake . &amp;&amp; make &amp;&amp; make install</code></p>
<p>No windows, baixe o cmake ou criar seu próprio projeto na sua IDE preferida.<br/>
Como o Skhaz é um bom menino ele já criou um projeto para o CodeBlocks/mingw32 bem limpo suportando apenas os formatos grp, lzma e zip, se alguem precisar de algum outro formato e não souber adicionar, mande me um email. Não foi adicionado nenhum arquivo da pasta extra, para manter compatibilidade (tive dificuldades em compilar a wintermoon em outras plataformas além do codeblocks/mingw32) caso você queira alguma facilidade da pasta extra, adicione o arquivo ao seu projeto, como explicado adiante.</p>
<p><strong>SDL e PhysicsFS</strong><br/>
A SDL é muito robusta e flexível, possibilitando “sobre escrever” as chamadas de open, read, write e close da estrutura SDL_RWops.</p>
<p>No diretório extras você encontra physfsrwops.c e physfsrwops.h, adicione eles ao seu projeto.</p>
<p>Abaixo segue um exemplo de como usar a physfs, antes de mais nada é preciso inicializar a physfs assim como a SDL</p>
<pre class="syntax-highlight:cpp">
int main(int argc, char** argv)
{
  if (PHYSFS_init(argv[0]) == 0)
  {
    fprintf(stderr, "%s\n", PHYSFS_getLastError());
    exit(-1);
  }

  // ...
</pre>
<p>PHYSFS_init recebe um único parâmetro, em algumas plataformas pode ser NULL, mais por questões de portabilidade aconselho sempre usa-lo.</p>
<p>e também é necessário desnicializar</p>
<pre class="syntax-highlight:cpp">
PHYSFS_deinit();
</pre>
<p>Adicionando alguns diretórios e arquivos</p>
<pre class="syntax-highlight:cpp">
// adiciona o diretório media para a "pesquisa"
PHYSFS_addToSearchPath("media/", true);

// adiciona o arquivo jogador.zip
PHYSFS_addToSearchPath("jogador.zip", true);
</pre>
<pre class="syntax-highlight:cpp">
// PHYSFSRWOPS_openRead se encontra no arquivo physfsrwops.c
// basicamente ela retorna uma estrutura SDL_RWops
// jogador_1.png esta dentro de jogador.zip
SDL_RWops* rwops = PHYSFSRWOPS_openRead("jogador1.png");

// O segundo parâmetro diz a IMG_Load_RW que
// libere o recurso após carrega-lo
SDL_Surface* surface = IMG_Load_RW(rwops, 1);

// Pronto já temos nossa imagem carregada.
</pre>
<p>Listando os arquivos</p>
<pre class="syntax-highlight:cpp">
char **rc = PHYSFS_enumerateFiles("/");
char **i;

for (i = rc; *i != NULL; i++)
     printf("%s\n", *i);

PHYSFS_freeList(rc);
</pre>
<p><strong>Onde</strong><br/>
Voce pode baixar o source e compilar manualmente, para quem usa algum Unix Like, rode o comando <code>cmake . &amp;&amp; make &amp;&amp; make install</code></p>
<ul>
<li>Site oficial da PhysicsFS (<a href="http://icculus.org/physfs/" rel="external noopener" target="_blank">http://icculus.org/physfs/</a>)
</li>
<li>7zip (<a href="http://www.7-zip.org/" rel="external noopener" target="_blank">http://www.7-zip.org/</a>)</li>
<li><span class="missing-download">PhysicsFS já com projeto, fontes e compilada <small>(arquivo não recuperado)</small></span></li>
<li><span class="missing-download">Exemplo completo <small>(arquivo não recuperado)</small></span></li>
</ul>
<p><strong>Dica</strong><br/>
PhysicsFS com mensagens em Português do Brasil: Adicione essa macro PHYSFS_LANG_PORTUGUESE_BR” sem aspas, ou então altere-a no arquivo physfs_internal.h na linha 78</p>
<p><strong>Referencias</strong><br/>
ParaGUI (<a href="http://www.paragui.org/" rel="external noopener" target="_blank">http://www.paragui.org/</a>)<br/>
Irrlicht (<a href="http://irrlicht.sourceforge.net/" rel="external noopener" target="_blank">http://irrlicht.sourceforge.net/</a>)<br/>
Ogre (<a href="http://www.ogre3d.org/" rel="external noopener" target="_blank">http://www.ogre3d.org/</a>)</p>
<p>Não deixem de comentar, criticas, sugestões e elogios são muito bem vindos.</p>]]></content:encoded>
  </item>
  <item>
    <title>try catch no construtor</title>
    <link>https://skhaz.github.io/skhaz.com/blog/try-catch-no-construtor/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/try-catch-no-construtor/</guid>
    <pubDate>Thu, 10 Apr 2008 21:17:04 GMT</pubDate>
    <description><![CDATA[Eu dia antes de publicar este artigo (como tratar exceções nos construtores que encontrei no livro More Exceptional C++ em Constructor Failures) lendo meus feeds vi que o Wanderley Caloni publicou primeiro sobre isso primeiro em Try-catch f]]></description>
    <content:encoded><![CDATA[<p>Eu dia antes de publicar este artigo (como tratar exceções nos construtores que encontrei no livro More Exceptional C++ em Constructor Failures) lendo meus feeds vi que o Wanderley Caloni publicou primeiro sobre isso primeiro em <a href="http://www.caloni.com.br/blog/archives/try-catch-flutuante" rel="external noopener" target="_blank">Try-catch flutuante</a>, o legal é que eu não sabia que nome poderia ser dado à isso :D</p>
<p>Simples e resumido, apesar de ser bem estranho você pode tratar exceções na inicialização dos atributos das classes usando try como você já esta acostumado.<br/>
Exemplo retirado do livro More Exceptional C++</p>
<pre class="syntax-highlight:cpp">
class C : public A
{
    public:
        C() try : A ()
        {
        }
        catch( ... )
        {
        }
};
</pre>
<p><strong>Referencias</strong><br/>
More Exceptional C++<br/>
<a href="http://www.caloni.com.br/blog/archives/try-catch-flutuante" rel="external noopener" target="_blank">Try-catch flutuante - Caloni</a></p>]]></content:encoded>
  </item>
  <item>
    <title>Coder noob eu?</title>
    <link>https://skhaz.github.io/skhaz.com/blog/coder-noob-eu/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/coder-noob-eu/</guid>
    <pubDate>Thu, 10 Apr 2008 20:12:54 GMT</pubDate>
    <description><![CDATA[Conversando hoje com o Jonatas sobre as besteiras muita vezes ditas em alguns fóruns sobre programação, me lembrei de quando eu era chamado de coder noob e preguiçoso por preferir usar std::string ao invez de char* tem cabimento?]]></description>
    <content:encoded><![CDATA[<p>Conversando hoje com o <a href="http://easy2d.sourceforge.net/" rel="external noopener" target="_blank">Jonatas</a> sobre as besteiras muita vezes ditas em alguns fóruns sobre programação, me lembrei de quando eu era chamado de coder noob e preguiçoso por preferir usar std::string ao invez de char* tem cabimento?</p>]]></content:encoded>
  </item>
  <item>
    <title>mutable, o legado</title>
    <link>https://skhaz.github.io/skhaz.com/blog/mutable-o-legado/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/mutable-o-legado/</guid>
    <pubDate>Tue, 08 Apr 2008 20:52:57 GMT</pubDate>
    <description><![CDATA[Continuando nosso artigo mutable, que raios é isso? agora irei demonstrar um segunda maneira de “burlar” o mesmo método const sem usar atributos mutáveis (mutable). Temos a seguinte interface de exemplo, Entity (pure abstract) class Entity ]]></description>
    <content:encoded><![CDATA[<p>Continuando nosso artigo <a href="http://skhaz.wordpress.com/2008/02/05/mutable-que-raios-e-isso/" rel="external noopener" target="_blank">mutable, que raios é isso?</a> agora irei demonstrar um segunda maneira de “burlar” o mesmo método const sem usar atributos mutáveis (mutable).</p>
<p><span id="more-57"></span></p>
<p>Temos a seguinte interface de exemplo, Entity (pure abstract)</p>
<pre class="syntax-highlight:cpp">
class Entity
{
  public:
    virtual void logic() = 0;
    virtual void draw() const = 0;
};
</pre>
<blockquote><p>Note que classes como a acima são muito comuns em vários projetos</p></blockquote>
<p>Agora a classe Player que implementa Entity</p>
<pre class="syntax-highlight:cpp">
class Player : public Entity
{
  public:
    void logic()
    {
    }

    void draw() const
    {
       mDrawCount++;

      // Erro! pois é um método const
    }

  private:
     std::size_t mDrawCount;
};
</pre>
<p>Mais skhaz porque não controlar isso no método logic que não é const? eu tenho bons motivos para isso, um deles é se você implementar um sistema de ticks como descrito no artigo <a href="http://vertexbuffer.wordpress.com/2008/01/29/controle-de-velocidade-de-jogo-com-ticks/" rel="external noopener" target="_blank">Controle de velocidade de jogo com ticks</a> onde quase sempre o método draw <strong>não</strong> será chamado no mesmo ciclo que logic.</p>
<p><strong>ponteiro e const_cast os “vilões”</strong><br/>
Com o uso do cast const_cast podemos burlar o atributo declarado como mutable (assim como para const e volatile) para não constantes.</p>
<pre class="syntax-highlight:cpp">
void Player::draw() const
{
  const_cast&lt;player *&gt;(this)-&gt;mDrawCount++;

  // work fine =D
}
</pre>
<p>Referencia <a href="http://msdn2.microsoft.com/en-us/library/bz6at95h.aspx" rel="external noopener" target="_blank">http://msdn2.microsoft.com/en-us/library/bz6at95h.aspx</a><br/>
Um artigo recomendado pelo nosso amigo danielf sobre mutable <a href="http://www.highprogrammer.com/alan/rants/mutable.html" rel="external noopener" target="_blank">http://www.highprogrammer.com/alan/rants/mutable.html</a></p>]]></content:encoded>
  </item>
  <item>
    <title>Bem vindos</title>
    <link>https://skhaz.github.io/skhaz.com/blog/bem-vindos/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/bem-vindos/</guid>
    <pubDate>Tue, 08 Apr 2008 01:12:05 GMT</pubDate>
    <description><![CDATA[]]></description>
    <content:encoded><![CDATA[]]></content:encoded>
  </item>
  <item>
    <title>A vida é um Jogo?</title>
    <link>https://skhaz.github.io/skhaz.com/blog/a-vida-e-um-jogo/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/a-vida-e-um-jogo/</guid>
    <pubDate>Thu, 20 Mar 2008 17:55:06 GMT</pubDate>
    <description><![CDATA[Desculpem-me, mais eu não pude resistir em postar quando vi essa tirinha :D [Via Cyanide & Happiness ]]]></description>
    <content:encoded><![CDATA[<p>Desculpem-me, mais eu não pude resistir em postar quando vi essa tirinha  :D</p>
<p><a href="/skhaz.com/assets/media/a-vida-e-um-jogo/jogo.jpg" title="The Sims"><img alt="The Sims" decoding="async" loading="lazy" src="/skhaz.com/assets/media/a-vida-e-um-jogo/jogo.thumbnail.jpg"/></a></p>
<p>[Via <a href="http://explosm.net/" rel="external noopener" target="_blank">Cyanide &amp; Happiness</a>]</p>]]></content:encoded>
  </item>
  <item>
    <title>Lançado o Arret</title>
    <link>https://skhaz.github.io/skhaz.com/blog/lancado-arret-3d/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/lancado-arret-3d/</guid>
    <pubDate>Wed, 12 Mar 2008 16:42:49 GMT</pubDate>
    <description><![CDATA[Esse ai sou eu, o alex fugindo da foto para o meio da neblina :D O Arret 0.0.1a escrito totalmente em C++ usando Irrlicht para o cliente e o sistema de colisão foi implementado no servidor usando a biblioteca fisica Newton e partes da ONE ,]]></description>
    <content:encoded><![CDATA[<div><a href="/skhaz.com/assets/media/lancado-arret-3d/arret.png" title="Arret"><img alt="Click para ampliar" decoding="async" loading="lazy" src="/skhaz.com/assets/media/lancado-arret-3d/arret.thumbnail.png"/></a></div>
<p>Esse ai sou eu, o alex fugindo da foto para o meio da neblina :D</p>
<p align="left">O Arret 0.0.1a  escrito totalmente em C++ usando Irrlicht para o cliente e o   sistema de  colisão foi implementado no servidor usando a   biblioteca fisica Newton e partes da <a href="http://skhaz.wordpress.com/2008/02/12/one/" rel="external noopener" target="_blank">ONE</a>, o projeto não é novo, tem uns 3 anos, já foi até  2D usando SDL, mais informações em <a href="http://projetoarret.com.br/" rel="external noopener" target="_blank">http://projetoarret.com.br/</a>.</p>
<p>Apesar de eu não fazer parte da equipe (não por nenhum tipo de desavença, mais sim porque prefiro usar <a href="http://ogre3d.org/" rel="external noopener" target="_blank">Ogre</a>), sempre torci e ajudei o projeto, estamos esperando novas atualizações :D</p>]]></content:encoded>
  </item>
  <item>
    <title>CodeBlocks 8.02</title>
    <link>https://skhaz.github.io/skhaz.com/blog/codeblocks/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/codeblocks/</guid>
    <pubDate>Fri, 07 Mar 2008 12:02:33 GMT</pubDate>
    <description><![CDATA[Recentemente formatei o pc e fui baixar o codeblocks no site e tive a surpresa de encontrar a nova versao 8.02 disponivel, baixei ela e fui procurar os pacotes da nightly build mais nao encontrei… ao iniciar a instalação já notei uma quanti]]></description>
    <content:encoded><![CDATA[<div><a href="/skhaz.com/assets/media/codeblocks/cb_802.jpg" title="About"><img alt="About" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/cb_802.thumbnail.jpg"/></a></div>
<p align="left">Recentemente formatei o pc e fui baixar o codeblocks no <a href="http://www.codeblocks.org/" rel="external noopener" target="_blank">site</a> e tive a  surpresa de encontrar a nova versao 8.02  disponivel, baixei ela  e  fui procurar os pacotes da nightly  build mais nao encontrei… ao  iniciar  a  instalação  já notei  uma quantidade generosa de novos  plugins :)</p>
<p align="left">
</p><p><a href="/skhaz.com/assets/media/codeblocks/cb.jpg" title="CodeBlocks"><img alt="CodeBlocks" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/cb.thumbnail.jpg"/></a> <a href="/skhaz.com/assets/media/codeblocks/main.jpg" title="main.jpg"><img alt="Main" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/main.thumbnail.jpg"/></a></p>
<p align="left"><strong>Destaques</strong></p>
<ul>
<li>
<p align="left"><strong>Instalador</strong></p>
</li>
<p>Nenhuma mudança significativa além de uma splashscreeen, e uma melhor organização dos diretorios</p>
<p align="left"><a href="/skhaz.com/assets/media/codeblocks/instalador.jpg" title="Instalador"><img alt="Instalador" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/instalador.thumbnail.jpg"/></a> <a href="/skhaz.com/assets/media/codeblocks/instalador2.jpg" title="Instalador"><img alt="Instalador" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/instalador2.thumbnail.jpg"/> </a><a href="/skhaz.com/assets/media/codeblocks/dir.jpg" title="Diretorios"><img alt="dir.jpg" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/dir.thumbnail.jpg"/></a></p>
<li>
<p align="left"><strong>Autoversioning</strong></p>
</li>
<p>Bom esse foi o recurso que estava procurando à muito tempo, qual a função dele? bom… ele cria um arquivo .h que contem informações do SVN, como versão, assim você pode criar uma tela “Sobre” igual a do CodeBlocks mostrando a versão do SVN</p>
<p><a href="/skhaz.com/assets/media/codeblocks/integracao_com_svn.thumbnail.jpg" title="Autoversioning"><img alt="Autoversioning" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/integracao_com_svn.thumbnail.jpg"/></a></p>
<li>
<p align="left"><strong>Changelog</strong></p>
</li>
<p>Esse foi outro recurso que gostei muito</p>
<p align="left"><a href="/skhaz.com/assets/media/codeblocks/autoversioning_changelog.jpg" title="Changelog"><img alt="Changelog" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/autoversioning_changelog.thumbnail.jpg"/></a></p>
<li>
<p align="left"><strong>ThreadSearch</strong></p>
</li>
<p>É um sistema de busca muito eficiente, Não tem nada haver com programação paralela :P</p>
<p><a href="/skhaz.com/assets/media/codeblocks/threadsearch_toolbar.jpg" title="ThreadSearch"><img alt="ThreadSearch" decoding="async" loading="lazy" src="/skhaz.com/assets/media/codeblocks/threadsearch_toolbar.thumbnail.jpg"/></a></p></ul>
<p>Mais informações em <a href="http://www.codeblocks.org/features" rel="external noopener" target="_blank">http://www.codeblocks.org/</a></p>]]></content:encoded>
  </item>
  <item>
    <title>Meu mousepad após minha namorada ver…</title>
    <link>https://skhaz.github.io/skhaz.com/blog/meu-mousepad-apos-minha-namorada-ver/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/meu-mousepad-apos-minha-namorada-ver/</guid>
    <pubDate>Mon, 25 Feb 2008 14:39:16 GMT</pubDate>
    <description><![CDATA[Imagem histórica não recuperada Antes que vocês pensem que sou pervertido ao ponto de comprar um mousepad com esse tema, eu ganhei ele de presente de um amigo. Para quem está se perguntando, sim os seios são muito macios e evitam tendinite ]]></description>
    <content:encoded><![CDATA[<p><span class="missing-media" data-original="http://img261.imageshack.us/img261/2865/finalor9.th.png">Imagem histórica não recuperada</span>Antes que vocês pensem que sou pervertido ao ponto de comprar um mousepad com esse tema, eu ganhei ele de presente de um amigo. Para quem está se perguntando, sim os seios são muito macios e evitam tendinite :P</p>]]></content:encoded>
  </item>
  <item>
    <title>Documentação da Wintermoon lançada</title>
    <link>https://skhaz.github.io/skhaz.com/blog/documentacao-da-wintermoon-lancada/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/documentacao-da-wintermoon-lancada/</guid>
    <pubDate>Fri, 22 Feb 2008 13:09:27 GMT</pubDate>
    <description><![CDATA[Finalmente e depois de muito tempo, a documentação do meu projeto Wintermoon foi lançada, versão online se encontra em http://wintermoon.sourceforge.net/wintermoondocs/index.html ou se preferir baixar a versão offline http://wintermoon.sour]]></description>
    <content:encoded><![CDATA[<p>Finalmente e depois de muito tempo, a documentação do meu projeto <a href="http://wintermoon.sourceforge.net/wordpress/" rel="external noopener" target="_blank">Wintermoon</a> foi lançada, versão online se encontra em <a href="http://wintermoon.sourceforge.net/wintermoondocs/index.html" rel="external noopener" target="_blank">http://wintermoon.sourceforge.net/wintermoondocs/index.html</a> ou se preferir baixar a versão offline <a href="http://wintermoon.sourceforge.net/wintermoondocs.zip" rel="external noopener" target="_blank">http://wintermoon.sourceforge.net/wintermoondocs.zip</a>, ainda não está totalmente comentada pois são muitas classes, erros gramaticais, criticas e sugestões são muito bem vindas, elogios mais ainda :D</p>]]></content:encoded>
  </item>
  <item>
    <title>Eliminando o codigo Fanfarrão</title>
    <link>https://skhaz.github.io/skhaz.com/blog/eliminando-o-codigo-fonfarrao/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/eliminando-o-codigo-fonfarrao/</guid>
    <pubDate>Mon, 18 Feb 2008 13:54:31 GMT</pubDate>
    <description><![CDATA[Certo dia estava lendo a Easy2D , e vi uma maneira Interessante, mais não desconhecida de implementar o padrão Singleton usando o std::auto_ptr. Eu já havia me deparado com um problema ao implementar uma classe Singleton, usando os ponteiro]]></description>
    <content:encoded><![CDATA[<p>Certo dia estava lendo a <a href="http://easy2d.sourceforge.net/" rel="external noopener" target="_blank">Easy2D</a>, e vi uma maneira Interessante, mais não desconhecida de implementar o padrão <strong>Singleton</strong> usando o std::auto_ptr. Eu já havia me deparado com um problema ao implementar uma classe Singleton, usando os ponteiros compartilhados da boost (boost::shared_ptr) que é semelhate à std::auto_ptr porem com mais recursos., mais o compilador acusava um erro, pois o destrutor da singleton era protected, eu não poderia deixar o destrutor publico, pois qualquer um podia deletar a instancia da singleton retornaria nulo, Então descobri que poderia passar um segundo parâmetro no construtor ou no método reset do shared_ptr, esse segundo parâmetro era o Deleter, uma classe especial para deletar o ponteiro (na verdade usava apenas o operador () da classe)., então crie uma classe genérica usando template chamada Deleter e à declarava como friend da Singleton, sua implementação ficou assim</p>
<pre class="syntax-highlight:cpp">
template &lt;class T&gt;
class Deleter
{
public:
void operator()(T* ptr)
{
if (ptr != NULL) {
delete ptr;
ptr = NULL;
}
}
};
</pre>
<p>Eu achava perfeito, e ainda podia usar nos for_each da vida, porém ainda era POG…</p>
<p>Uma noite, bebendo e ouvindo musica (metal!), lembrei das magicas que std::mem_fun podia fazer, e resolvi implementa-la, a cobaia foi a classe InputManager da Wintermoon, usando o método <em>teardown</em> de Mouse e Keyboard como Deleter</p>
<pre class="syntax-highlight:cpp">
InputManager::Init()
{
// ...
mKeyboard = boost::shared_ptr&lt;keyboard&gt; (new Keyboard,
std::mem_fun(&amp;amp;Keyboard::teardown));

mMouse = boost::shared_ptr&lt;mouse&gt; (new Mouse,
std::mem_fun(&amp;amp;Mouse::teardown));
}
</pre>
<pre class="syntax-highlight:cpp">
InputManager::Shut()
{
// reset é um membro de shared_ptr, responsavel
// por liberar a memoria do ponteiro
mKeyboard.reset();
mMouse.reset();
}
</pre>
<pre class="syntax-highlight:cpp">
// class Mouse

void Mouse::teardown()
{
// clean up data...
}
</pre>
<pre class="syntax-highlight:cpp">
// class Keyboard

void Keyboard::teardown()
{
// clean up data...
}
</pre>
<p>E não é que funcionou, o código ficou muito mais claro, mais ainda não acabou, ainda não crie a classe Singleton dos meus sonhos, usando shared_ptr, volatile, template, NonCopyable, mais estou no caminho…</p>]]></content:encoded>
  </item>
  <item>
    <title>Qual a cara da sua IDE?</title>
    <link>https://skhaz.github.io/skhaz.com/blog/qual-a-cara-da-sua-ide/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/qual-a-cara-da-sua-ide/</guid>
    <pubDate>Thu, 14 Feb 2008 15:47:34 GMT</pubDate>
    <description><![CDATA[Qual a “cara” da sua IDE? Code::Blocks, Visual Studio, Eclipse, Code Warrior, programa em C++, Java, PHP, Asm, seja lá qual for, deixe uma foto dela aqui. Visual Studio 2005 Pro Code::Blocks Imagem histórica não recuperada Imagem histórica ]]></description>
    <content:encoded><![CDATA[<p>Qual a “cara” da sua IDE? Code::Blocks, Visual Studio, Eclipse, Code Warrior, programa em C++, Java, PHP, Asm, seja lá qual for, deixe uma foto dela aqui.</p>
<p>Visual Studio 2005 Pro                          Code::Blocks</p>
<p><span class="missing-media" data-original="http://img91.imageshack.us/img91/9260/msvczm8.th.png">Imagem histórica não recuperada</span> <span class="missing-media" data-original="http://img405.imageshack.us/img405/1079/2242002764ab16f49f4dofs2.th.png">Imagem histórica não recuperada</span> </p>
<p>Para upar suas fotos use o <a href="http://my.imageshack.us/" rel="external noopener" target="_blank">ImageShack</a> ou qualquer outro serviço de hospedagem.</p>
<p>Baseado no artigo de <a href="http://pliniotorres.wordpress.com/2008/02/01/qual-e-a-cara-da-sua-area-de-trabalho/" rel="external noopener" target="_blank">Plinio Torres - Qual é a cara da sua área de trabalho?</a></p>]]></content:encoded>
  </item>
  <item>
    <title>ONE (Object-Oriented Network Engine)</title>
    <link>https://skhaz.github.io/skhaz.com/blog/one/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/one/</guid>
    <pubDate>Tue, 12 Feb 2008 13:17:41 GMT</pubDate>
    <description><![CDATA[ONE (Object-Oriented Network Engine) É um projeto de minha autoria e de DarkSasori , a idea é criar uma engine para redes (similar a RakNet ), Escrita em C++, usando boost . O que já temos: DNS com cache IPAdrress SocketLayer (Interface) TC]]></description>
    <content:encoded><![CDATA[<p>ONE (Object-Oriented Network Engine)</p>
<p>É um projeto de minha autoria e de <a href="http://programmershell.wordpress.com/" rel="external noopener" target="_blank">DarkSasori</a>, a idea é criar uma engine para redes (similar a <a href="http://www.jenkinssoftware.com/" rel="external noopener" target="_blank">RakNet</a>), Escrita em C++, usando <a href="http://boost.org/" rel="external noopener" target="_blank">boost</a>.</p>
<p>O que já temos:</p>
<ul>
<li> DNS com cache</li>
<li> IPAdrress</li>
<li> SocketLayer (Interface)</li>
<li> TCP::Socket (Implementação de SocketLayer)</li>
<li> UDP::Socket (Implementação de SocketLayer)</li>
<li> ServerInterface</li>
<li> ClientInterface</li>
<li> PeerInterface</li>
<li> Thread</li>
<li> ThreadGroup</li>
<li> ThreadJob</li>
<li> Mutex</li>
<li> ScopedMutex</li>
<li> NetworkInitializer</li>
<li> Documentação (Doxygen)</li>
</ul>
<p>Características:</p>
<ul>
<li> Cache de DNS</li>
<li> Suporte a plugins (.dll ou .so), como Voice, Updater, etc</li>
</ul>
<p>Principais plataformas alvo:</p>
<ul>
<li> Windows <img alt="windows" decoding="async" loading="lazy" src="/skhaz.com/assets/media/one/mb_windows-1.jpg"/></li>
<li> Linux <img alt="linux" decoding="async" loading="lazy" src="/skhaz.com/assets/media/one/linux-ico.jpg"/></li>
<li> MacOS <img alt="mac" decoding="async" loading="lazy" src="/skhaz.com/assets/media/one/mb_mac.jpg"/></li>
<li> BSD</li>
</ul>
<p>Claro, qualquer outra plataforma que possuir sockets e threads, haverá um port da ONE!</p>
<p>Metas:</p>
<ul>
<li> Sistema de plugins usando DLL (50% feito)</li>
<li> Plugin Voice, similar ao RakVoice, usando a biblioteca <a href="http://www.speex.org/" rel="external noopener" target="_blank">speex</a></li>
<li> Compactação usando zlib, bzip2 e lzma</li>
<li> Criptografia (OpenSSL ?)</li>
<li> Suporte ao IPv6 (20%)</li>
</ul>
<p>Quem já usa?</p>
<ul>
<li><a href="http://projetoarret.com.br/" rel="external noopener" target="_blank">Projeto Arret</a> (apenas algums modulos)</li>
</ul>
<p>Licença: <a href="http://www.gnu.org/licenses/lgpl-3.0.txt" rel="external noopener" target="_blank">LGPL 3</a></p>
<p>PS. Eu ainda não disponibilizei o download nem o SVN do projeto, pois ainda não está preparado ainda.</p>]]></content:encoded>
  </item>
  <item>
    <title>Classe std::string STL no VC 6 provoca corrupção da memória</title>
    <link>https://skhaz.github.io/skhaz.com/blog/classe-stdstring-stl-no-vc-6-provoca-corrupcao-da-memoria/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/classe-stdstring-stl-no-vc-6-provoca-corrupcao-da-memoria/</guid>
    <pubDate>Tue, 12 Feb 2008 19:31:22 GMT</pubDate>
    <description><![CDATA[Hoje em dia se torna mais comum computadores com mais de um núcleo, esse bug afeta apenas o Microsoft Visual C++ 6.0, e pode ser um problema para quem usa ele. Referencia Classe std::string STL provoca falhas e uma corrupção da memória em c]]></description>
    <content:encoded><![CDATA[<p>Hoje em dia se torna mais comum computadores com mais de um núcleo, esse bug afeta apenas o Microsoft Visual C++ 6.0, e pode ser um problema para quem usa ele.</p>
<p>Referencia <a href="http://support.microsoft.com/kb/813810/pt" rel="external noopener" target="_blank">Classe std::string STL provoca falhas e uma corrupção da memória em computadores com múltiplos processadores</a></p>]]></content:encoded>
  </item>
  <item>
    <title>Um pouco mais sobre namespace</title>
    <link>https://skhaz.github.io/skhaz.com/blog/um-pouco-mais-sobre-namespace/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/um-pouco-mais-sobre-namespace/</guid>
    <pubDate>Sun, 10 Feb 2008 20:21:04 GMT</pubDate>
    <description><![CDATA[namespaces em C++ são muito poderosos não servem apenas para proteger nomes em conflitos com outras bibliotecas, nos ajudam a implementar patterns como a bridge de uma forma mais clara, alem de deixar o código mais profissional. namespace E]]></description>
    <content:encoded><![CDATA[<p><strong>namespaces</strong> em C++ são muito poderosos não servem apenas para proteger nomes em conflitos com outras bibliotecas, nos ajudam a implementar patterns como a bridge de uma forma mais clara, alem de deixar o código mais profissional.</p>
<pre class="syntax-highlight:cpp">
namespace Engine
{
  namespace Video
  {
     namespace Gui
     {
         class Window
         {
             public:
               virtual ~Window() { }
         };
     }
  }
}
</pre>
<p>Você tambem poderia escrever dessa forma</p>
<pre class="syntax-highlight:cpp">
using namespace Engine;
using namespace Video;
using namespace Gui;

shared_ptr&lt;window&gt; window(new Window);
</pre>
<p>ou então</p>
<pre class="syntax-highlight:cpp">
using Engine::Video::Gui::Window;

shared_ptr&lt;/window&gt;&lt;window&gt; window(new Window);
</pre>
<p>Nesse exemplo usamos muitos namespaces, é raro encontrar casos como esse, apenas encontrei na engine <a href="http://irrlicht.sourceforge.net/" rel="external noopener" target="_blank">Irrlicht</a> (até 3 sub namespaces) e na <a href="http://boost.org/" rel="external noopener" target="_blank">boost</a> (até 5 sub namespaces), o interessante é criar um <em>aliases</em> para o namespace da seguinte forma</p>
<pre class="syntax-highlight:cpp">
// evg é um aliases para Engine::Video::Gui
namespace evg = Engine::Video::Gui;

shared_ptr&lt;evg ::Window&gt; window(new evg::Window);
</pre>
<p>namespace “escopado”</p>
<pre class="syntax-highlight:cpp">
{
  // EVG é um aliases para Engine::Video::Gui
  namespace EVG = Engine::Video::Gui;
  shared_ptr&lt;/evg&gt;&lt;evg ::Window&gt; window(new EVG::Window);
}

{
  // Graphics é um aliases para Engine::Video
  namespace Graphics = Engine::Video;
  shared_ptr&lt;graphics ::Gui::Window&gt; window(new Graphics::Gui::Window);
}

{
  using namespace Engine;
  using namespace Video;
  using namespace Gui;

  shared_ptr&lt;/graphics&gt;&lt;graphics ::Gui::Window&gt; window(new graphics::Gui::Window);
}
</pre>
<p>Veja que cada namespace tem seu próprio escopo.</p>
<p>Como boa pratica de programação prefira declarar apenas as classes que for usar de um namespace, ao invés de declará-lo todo.</p>
<p>Prefira usar</p>
<pre class="syntax-highlight:cpp">
using std::string;
using std::vector;
using std::map;
</pre>
<p>Ao invés de</p>
<pre class="syntax-highlight:cpp">
using namespace std;
</pre>
<p>Ou melhor ainda, se você tiver um projeto que use algum namespace, no seu header principal (global.h, internal.h), assim todos as classes declaradas podem ser usadas dentro do seu namespace, sem ter que ficar usando o <strong>using</strong></p>
<pre class="syntax-highlight:cpp">
namespace Wintermoon
{
  class Root;
  class Image;
  class ImageCache;
  class EventReceiver;
  class InputManager;
  ...

  using std::string;
  using std::vector;
  using std::map;
  using std::set;
  using std::multset;

  using std::for_each;
  using std::find;

  using boost::shared_ptr;
  using boost::scoped_ptr;
}
</pre>
<p></p>]]></content:encoded>
  </item>
  <item>
    <title>Visual Studio 2008</title>
    <link>https://skhaz.github.io/skhaz.com/blog/visual-studio-2008/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/visual-studio-2008/</guid>
    <pubDate>Fri, 08 Feb 2008 14:35:35 GMT</pubDate>
    <description><![CDATA[Minha surpresa ao instalar o M$ Visual Studio 2008, requer o .Net instalado, mesmo optando apenas instalando os pacotes relacionados apenas ao C++. Fora a porção de gente feia que aparece durante o setup… Imagem histórica não recuperada]]></description>
    <content:encoded><![CDATA[<p>Minha surpresa ao instalar o M$ Visual Studio 2008, requer o .Net instalado, mesmo optando apenas instalando os pacotes relacionados apenas ao C++. Fora a porção de gente feia que aparece durante o setup…</p>
<p><span class="missing-media" data-original="http://img406.imageshack.us/img406/7664/msvc9mb0.th.png">Imagem histórica não recuperada</span></p>]]></content:encoded>
  </item>
  <item>
    <title>Wintermoon no Contest da PDJ</title>
    <link>https://skhaz.github.io/skhaz.com/blog/wintermoon-no-contest-da-pdj/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/wintermoon-no-contest-da-pdj/</guid>
    <pubDate>Wed, 06 Feb 2008 16:12:45 GMT</pubDate>
    <description><![CDATA[Recentemente inscrevi meu framework Wintermoon no PDJ Contest na categoria Programação, por enquanto meu único oponente na categoria é o PSPFramework , não vejo nenhuma atualização deles há muito tempo, eles que foram minha inspiração inici]]></description>
    <content:encoded><![CDATA[<p><img alt="wintermoon" decoding="async" loading="lazy" src="/skhaz.com/assets/media/wintermoon-no-contest-da-pdj/header_image1.png"/><br/>Recentemente inscrevi meu framework <a href="http://wintermoon.sourceforge.net/wordpress/" rel="external noopener" target="_blank">Wintermoon</a> no <a href="http://www.programadoresdejogos.com/contests/gpc07/" rel="external noopener" target="_blank">PDJ Contest</a> na categoria <em>Programação,</em> por enquanto meu único  oponente na categoria é o <a href="http://pspframework.sourceforge.net/" rel="external noopener" target="_blank">PSPFramework</a>, não vejo nenhuma atualização deles há muito tempo, eles que foram minha inspiração inicial de colocar o wordpress no sourceforge e transformar o site em blog.</p>
<p>Desejem-me sorte :)</p>]]></content:encoded>
  </item>
  <item>
    <title>Carregando imagens com ou sem canal alpha</title>
    <link>https://skhaz.github.io/skhaz.com/blog/carregando-imagens-com-ou-sem-canal-alpha/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/carregando-imagens-com-ou-sem-canal-alpha/</guid>
    <pubDate>Wed, 06 Feb 2008 19:55:14 GMT</pubDate>
    <description><![CDATA[Muitos já devem ter passado por isso, como descobrir se uma imagem tem ou não o canal alpha (transparência), e como carregá-la corretamente. Eis aqui uma classe que se encarrega de carregar a imagem, e descobrir se tem ou não o canal alpha.]]></description>
    <content:encoded><![CDATA[<p>Muitos já devem ter passado por isso, como descobrir se uma imagem tem ou não o canal alpha (transparência), e como carregá-la corretamente. Eis aqui uma classe que se encarrega de carregar a imagem, e descobrir se tem ou não o canal alpha.</p>
<pre class="syntax-highlight:cpp">
#include &lt;string&gt;
#include "SDL.h"

using std::string;

class Image
{
   public:
      Image();
      virtual ~Image();

      void load(const string&amp;amp; filename, bool transparent = true);

      operator SDL_Surface*() const
      {
         return m_pSurface;
      }

   private:
      SDL_Surface* m_pSurface;
};
</pre>
<p>Vamos à implementação</p>
<pre class="syntax-highlight:cpp">
#include "Image.h"

Image::Image()
: m_pImage(NULL)
{
}

Image::~Image()
{
   if (m_pImage != NULL) {
      SDL_FreeSurface(m_pSurface);
   }
}

void Image::load(const string&amp;amp; filename, bool transparent)
{
   if ((m_pSurface = IMG_Load(filename.c_str())) == NULL)
   {
      throw Exception("%s", IMG_GetError());
   }

   bool hasAlpha = false;

   // Se a imagem tem 32 bits, provalvelmente
   // ela tem o canal alpha, caso contrario ela
   // não tem, e nem precissamos verificar.
   if (m_pSurface-&gt;format-&gt;BitsPerPixel == 32)
   {
      // Percorremos toda a superficie da imagem
      for (int i = 0; i &lt; m_pSurface-&gt;w * m_pSurface-&gt;h; ++i)
      {
         Uint8 r, g, b, a;

         // Mapeamos o pixel e obtemos seus
         // respectivos valores em RGBA
         SDL_GetRGBA(((Uint32*) m_pSurface-&gt;pixels)[i],
                     m_pSurface-&gt;format, &amp;amp;r, &amp;amp;g, &amp;amp;b, &amp;amp;a);

         // Se o canal alpha for diferente de 255 (opaco)
         // então a imagem tem trasparencia
         // finalizamos o loop com o break.
         if (a != 255)
         {
            hasAlpha = true;
            break;
         }
      }
   }

   // Se a imagem tiver o canal de trasparencia
   // optimizamos ela da maneira correta.
   if (hasAlpha) {
      temp = SDL_DisplayFormatAlpha(m_pSurface);
   }

   // Caso contrario, optimizamos para uma
   // superficie sem alpha
   else {
      temp = SDL_DisplayFormat(m_pSurface);

      if (transparent)
      {
         SDL_SetColorKey(temp, (SDL_SRCCOLORKEY | SDL_RLEACCEL | SDL_HWACCEL),
             SDL_MapRGB(SDL_GetVideoSurface()-&gt;format,
             255, 0, 255));
      }
   }

   if (temp)
   {
      SDL_FreeSurface(m_pSurface);
      m_pSurface = temp;
   }
}
</pre>
<p><strong>SDL_GetVideoSurface()</strong> Essa função retorna o ponteiro da superficie do video (a publica, e não a real), veja a documentação da SDL<br/>
para maiores informações</p>
<p><strong>Veja também</strong><br/>
Mais detalhes da estrutura interna da SDL_Surface em <a href="http://diogorbg.blogspot.com/2008/01/sdlsurface-introduo-detalhada.html" rel="external noopener" target="_blank">SDL_Surface - Introdução detalhada</a>, de Diogo_RBG</p>]]></content:encoded>
  </item>
  <item>
    <title>mutable, que raios é isso?</title>
    <link>https://skhaz.github.io/skhaz.com/blog/mutable-que-raios-e-isso/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/mutable-que-raios-e-isso/</guid>
    <pubDate>Tue, 05 Feb 2008 18:13:04 GMT</pubDate>
    <description><![CDATA[Talvez você seja como eu, viciado em usar const, mais muitas vezes nos deparamos com métodos que precisamos alterar algum atributo dentro de um método declarado como const class Image { public: void Draw() const; private: std::size_t m_Blit]]></description>
    <content:encoded><![CDATA[<p>Talvez você seja como eu, viciado em usar const, mais muitas vezes nos deparamos com métodos que precisamos alterar<br/>
algum atributo dentro de um método declarado como const</p>
<pre class="syntax-highlight:cpp">
class Image
{
public:
void Draw() const;

private:
std::size_t m_BlitErrorCount;
}
</pre>
<p>Vejamos esse exemplo do metodo Draw da classe Image<br/>
precisamos implementar um contador de erros do SDL_BlitSurface (sinceramente não vejo utilidade isso)</p>
<pre class="syntax-highlight:cpp">
void Image::Draw() const
{
if (SDL_BlitSurface(mSurface, NULL, Screen, rect) &lt; 0)
{
m_BlitErrorCount++;
// O compilador acusa erro na linha acima
// pois não podemos modificar qualquer
// atributo dentro desse método declarado como const
}
}
</pre>
<p><strong>Como solucionar?</strong></p>
<p>Adicione a palavra reservada <strong><em>mutable</em></strong> na declaração de m_BlitErrorCount, ficando assim:</p>
<pre class="syntax-highlight:cpp">
class Image
{
public:
void Draw() const;

&lt;strong&gt; private:
mutable std::size_t m_BlitErrorCount;
}
</pre>
<p></p>
<p><strong></strong><strong>Veja também</strong></p>
<p><strong>Um outro caso para o uso da mutable é na implementação do design <a href="http://vinigodoy.wordpress.com/2007/12/24/organizando-a-janela-em-classes/" rel="external noopener" target="_blank">Organizando a janela em classes</a>, de nosso amigo Vinícius, onde temos à seguinte declaração do método draw</strong></p>
<pre class="syntax-highlight:cpp">
virtual void draw() const = 0;
</pre>
<p>Usando a palavra reservada mutable na declaração do atributo usado internamente em draw você “burla” o const</p>
<p><strong>Agora seu código compila sem erros :)</strong></p>]]></content:encoded>
  </item>
  <item>
    <title>Classe Timer</title>
    <link>https://skhaz.github.io/skhaz.com/blog/classe-timer/</link>
    <guid isPermaLink="true">https://skhaz.github.io/skhaz.com/blog/classe-timer/</guid>
    <pubDate>Mon, 04 Feb 2008 19:00:08 GMT</pubDate>
    <description><![CDATA[Uma classe indispensável durante a programação de um jogo ou engine, que seja responsável pelas chamadas de métodos em determinado intervalo de tempo durante a execução do aplicativo, que forneça uma maneira passiva e rápida de callbacks, o]]></description>
    <content:encoded><![CDATA[<p>Uma classe indispensável durante a programação de um jogo ou engine, que seja responsável pelas chamadas de métodos em determinado intervalo de tempo durante a execução do aplicativo, que forneça uma maneira passiva e rápida de callbacks, orientada à objetos. Aqui segue um exemplo de tal classe usando o timer da SDL</p>
<p>Declaração da classe Timer</p>
<pre class="syntax-highlight:cpp">
#include "SDL.h"

class Timer
{
public:
Timer();

explicit Timer(Uint32 interval);

virtual ~Timer();

// Adcionamos um timer
// interval O intervalo de tempo do timer
void addTimer(Uint32 interval);

// Remove o timer
void removeTimer();

// Seta um novo intervalo de tempo
void setInterval(Uint32 interval);

// Retorna o valor do intervalo do timer
Uint32 Timer::getInterval() const;

//
// Método puro abstrato chamado em todo
// intervalo definido pelo timer.
// Deve ser implementado na classe filha.
//
virtual void onTimer() = 0;

private:
// Usado internamente, o ponto de entrada do SDL_Timer
static Uint32 entryPoint(Uint32 interval, void* param);

Uint32 mInterval;
SDL_TimerID mTimerID;
};
</pre>
<p>Vamos à implementação</p>
<pre class="syntax-highlight:cpp">
#include "Timer.h"

Timer::Timer()
: mInterval(0)
{
if (SDL_WasInit(SDL_INIT_TIMER) == 0)
{
SDL_InitSubSystem(SDL_INIT_TIMER);
}
}

Timer::Timer(Uint32 interval)
: mInterval(0)
{
if (SDL_WasInit(SDL_INIT_TIMER) == 0)
{
SDL_InitSubSystem(SDL_INIT_TIMER);
}

addTimer(interval);
}

Timer::~Timer()
{
SDL_RemoveTimer(mTimerID);
}

void Timer::addTimer(Uint32 interval)
{
mInterval = interval;
mTimerID = SDL_AddTimer(mInterval, entryPoint, this);
}

void Timer::removeTimer()
{
SDL_RemoveTimer(mTimerID);
}

void Timer::setInterval(Uint32 interval)
{
mInterval = interval;
}

Uint32 Timer::getInterval() const
{
return mInterval;
}

Uint32 Timer::entryPoint(Uint32 interval, void* param)
{
Timer* ptr = reinterpret_cast&lt;timer *&gt;(param);
ptr-&gt;onTimer();
return ptr-&gt;mInterval;
}
</pre>
<p>Exemplo de uso:</p>
<pre class="syntax-highlight:cpp">
#include &lt;iostream&gt;
#include &lt;boost /scoped_ptr.hpp&gt;

#include "SDL.h"
#include "Timer.h"

using std::cout;
using std::endl;
using boost::scoped_ptr;

class Tick : public Timer
{
public:
Tick()
{
// Adicionamos um timer de 1 Segundo
addTimer(1000);
}

~Tick() { }

protected:

// onTImer método puro abstrato
// herdado de Timer, ele será chamado
// todo intervalo definido no timer
void onTimer()
{
cout &lt; &lt; "Tick::onTimer() chamado em " &lt;&lt; SDL_GetTick() &lt;&lt; endl;
}
};

int main()
{
// Criamos a classe Tick
// usamos aqui scoped_ptr para
// que o ponteiro seja deletado
// automaticamente ao sair do escopo
scoped_ptr&lt;tick&gt; tick(new Tick);

// Aguardamos uns 5 segundos
// enquanto isso o timer já esta rodando
// e imprimindo a saida no console ou no stdout.txt
SDL_Delay(5000);

// Agora vamos mudar o intervalo de tempo
// para meio segundo
tick-&gt;setInterval(500);

// Aguardamos mais ums 5 segundos
// O timer continua rodando, mais agora com o
// intervalo de meio segundo e não 1 segundo
SDL_Delay(5000);

// O resultado poderá ser visto no stdout.txt
// ou na saida do console

// Isso mantem o compilador feliz...
return 0;
}
</pre>
<p>Espero que tenha gostado, em breve eu posto as classes Thread, ThreadJob, ThreadGroup e Mutex baseadas nas Threads da SDL (até la vou ter aprendido mais sobre SDL semáforos), sintan-se à vontade de usá-las apenas mantenham os créditos ;D</p>]]></content:encoded>
  </item>
</channel>
</rss>
