<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Dragoş Stoenică</title>
	
	<link>http://blog.mindwar.ro</link>
	<description>webdevelopment &amp; stuff</description>
	<lastBuildDate>Mon, 04 May 2009 01:01:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dragos-stoenica-blog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="dragos-stoenica-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>CakePHP si twitter</title>
		<link>http://blog.mindwar.ro/2009/05/03/cakephp-si-twitter/</link>
		<comments>http://blog.mindwar.ro/2009/05/03/cakephp-si-twitter/#comments</comments>
		<pubDate>Sun, 03 May 2009 16:44:16 +0000</pubDate>
		<dc:creator>Dragoş Stoenică</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.mindwar.ro/?p=105</guid>
		<description><![CDATA[Acum ceva timp Andrei Gheorghe a lansat Quizoo (@quizoo) un bot de trivia ce activează pe twitter. În acest post veţi vedea rocket science-ul (sau lipsa acestuia) din spatele unui astfel de bot. În această primă parte vom construi un bot simplu care execută anumite comenzi la intervale de timp, urmând ca într-un viitor post [...]]]></description>
			<content:encoded><![CDATA[<p><span class="dropcap">A</span>cum ceva timp <a href="http://idevelop.ro/">Andrei Gheorghe</a> a lansat <a href="http://www.idevelop.ro/quizoo/">Quizoo</a> (<a href="http://twitter.com/quizoo">@quizoo</a>) un bot de trivia ce activează pe twitter.<br />
În acest post veţi vedea rocket science-ul (sau lipsa acestuia) din spatele unui astfel de bot. În această primă parte vom construi un bot simplu care execută anumite comenzi la intervale de timp, urmând ca într-un viitor post sa il facem să interacţioneze cu userii raspunzând la diferite comenzi.<br />
<span id="more-105"></span></p>
<p>Pentru <del>că sunt leneş</del> good practices voi folosi <em>CakePHP</em>, <em>datasource-ul twitter pentru CakePHP</em>, <em>CakePHP Custom Shells</em> si <em>crontab</em>. De asemenea ghidul presupune că aveţi acces la linia de comandă, acces la crontab si că plănuiţi sa rulaţi cod-ul pe OS X/Linux/BSD sau ceva in genul. </p>
<h2>Să începem, deci</h2>
<p>Primul pas este, evident, obţinerea unui working Cake setup. Lucru explicat în <a href="http://book.cakephp.org/">Cookbook</a> pe larg. Odată trecut de asta este timpul să vedem cum comunicăm cu <a href="http://twitter.com">twitter</a>.</p>
<p>După înregistrarea unui cont la <a href="https://twitter.com/signup">twitter</a> pentru bot este momentul sa trecem la scris cod.<br />
Vom folosi, după cum spuneam,  Datasource-ul twitter scris de <em>Alex Ciobanu (iscandr)</em>. Reţeta este simplă:</p>
<ol>
<li>Se downloadeaza <a href="http://bakery.cakephp.org/articles/download_code/961/block/3">datasource-ul</a></li>
<li>Se pune în <span class="pre">app/models/datasources</span></li>
<li>Se adaugă urmatoarele in <span class="pre">app/config/database.php</span>
<pre class="brush: php">
var $twitter = array(
        &#039;datasource&#039; =&gt; &#039;twitter&#039;,
        &#039;username&#039; =&gt; &#039;username&#039;,
        &#039;password&#039; =&gt; &#039;parola&#039;,
);
</pre>
</li>
<p>Bun asa, să vedem dacă şi merge. O să scriem un mic controller de test.</p>
<p>Întâi modelul<br />
<span class="pre">app/models/tweet.php</span></p>
<pre class="brush: php">
&lt;?php
class Tweet extends AppModel {
	var $useTable = false;
}
?&gt;
</pre>
<p>Apoi controllerul.<br />
<span class="pre">app/controllers/tweets_controller.php</span></p>
<pre class="brush: php">
&lt;?php
class TweetsController extends AppController {
    function post_hello() {
        $this-&gt;Twitter = ConnectionManager::getDataSource(&#039;twitter&#039;);
        $response = $this-&gt;Twitter-&gt;account_verify_credentials();
        $result = $this-&gt;Twitter-&gt;status_update(&quot;ohai, i&#039;m a twitter bot!&quot;);
        debug($response);
        debug($result);
    }
}
?&gt;
</pre>
<p>Dacă totul a mers bine botul vostru ar trebui sa posteze primul său tweet si într-adevar <a href="https://twitter.com/demobot/status/1686718927">se pare că merge</a>.</p>
<p>Codul este destul de banal deci nu cred că mai are nevoie de alte explicaţii.</p>
<h2>Până aici e bine, now what?</h2>
<p>Acum ajungem la partea mai interesantă. Cum executam cod ca cel de mai sus la un anumit interval de timp?<br />
O soluţie ar fi să folosim <a href="http://book.cakephp.org/view/792/HttpSocket">HttpSocket</a> din CakePHP sau cURL să accesam controllerul de mai sus prin simularea unui request dar nu este tocmai elegant. </p>
<p>Vom folosi un alt feature al frameworkului CakePHP numit Custom Shells. Custom Shells în CakePHP permit accesul la tot &#8220;magic-ul&#8221; frameworkului din linia de comandă şi simplifică construirea scripturilor ce urmează să fie rulate din linia de comandă.<br />
Deci să trecem la treabă:</p>
<p><span class="pre">app/vendors/shells/tweet.php</span></p>
<pre class="brush: php">
&lt;?php
class TweetShell extends Shell {
	function main() {
		/* ne conectam la twitter */
		App::import(&#039;ConnectionManager&#039;);

		$this-&gt;Twitter = ConnectionManager::getDataSource(&#039;twitter&#039;);
        $response = $this-&gt;Twitter-&gt;account_verify_credentials();

        /* trimitem tweetul */
        $result = $this-&gt;Twitter-&gt;status_update(&quot;@mindwar ce-ar fi sa scrii si partea a 2-a a tutorialului?!&quot;);

        /* afisam in consola data pt debug */
        $this-&gt;out(&#039;[&#039; . date(&quot;d-M-Y G:i:s&quot;, time()) . &#039;] tweet sent&#039;);
        $this-&gt;hr();
	}
}
?&gt;
</pre>
<p>Rulând shell-ul totul ar trebui să arate cam aşa:</p>
<pre>
twitterbot $ cake/console/cake tweet

Welcome to CakePHP v1.2.2.8120 Console
---------------------------------------------------------------
App : app
Path: demo/twitterbot/app
---------------------------------------------------------------
[03-May-2009 18:46:26] tweet sent
---------------------------------------------------------------

twitterbot $
</pre>
<p>Din nou, se pare că totul a funcţionat şi <a href="https://twitter.com/demobot/status/1687451842">tweet-ul</a> a ajuns.</p>
<h2>În final</h2>
<p>Mai ramâne decat sa-l facem sa trimita tweet-ul la un anumit interval de timp. Lucru pe care îl facem folosind <a href="http://www.manpagez.com/man/5/crontab/">crontab</a>.</p>
<pre>
0 22 * * *       /calea/pana/la/cake/console/cake tweet >> /dev/null 2>&#038;1
</pre>
<p>Acum, în fiecare zi la 10 seara, ar trebui să primesc un reply de la bot în care ma îndeamnă să termin tutorialul. Data viitoare sper sa am o idee mai bună&#8230;</p>
<h6>de citit în continuare:</h6>
<ol class="footnote">
<li><a href="http://book.cakephp.org/view/32/Installation">CakePHP instalation</a></li>
<li><a href="http://bakery.cakephp.org/articles/view/twitter-datasource">CakePHP Twitter datasource</a></li>
<li><a href="http://book.cakephp.org/view/108/The-CakePHP-Console">The CakePHP Console</a></li>
<li><a href="http://book.cakephp.org/view/110/Creating-Shells-Tasks">CakePHP &#8211; Creating shells and tasks</a></li>
<li><a href="http://www.manpagez.com/man/5/crontab/">crontab man page</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.mindwar.ro/2009/05/03/cakephp-si-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pownce shutting down</title>
		<link>http://blog.mindwar.ro/2008/12/02/pownce-shutting-down/</link>
		<comments>http://blog.mindwar.ro/2008/12/02/pownce-shutting-down/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 03:24:13 +0000</pubDate>
		<dc:creator>Dragoş Stoenică</dc:creator>
				<category><![CDATA[social]]></category>
		<category><![CDATA[microblogging]]></category>
		<category><![CDATA[pownce]]></category>

		<guid isPermaLink="false">http://blog.mindwar.ro/?p=29</guid>
		<description><![CDATA[După ce a fost cumpărat de Six Apart, serviciul de microblogging Pownce se va închide pe 15 decembrie. Cei doi developeri, Mike Malone şi Leah Culver, se vor alătura echipei de la Six Apart în timp ce Kevin Rose va rămâne drept advisor. Mai multe detalii pe blogul pownce]]></description>
			<content:encoded><![CDATA[<p><span class="dropcap">D</span>upă ce a fost cumpărat de Six Apart, serviciul de microblogging Pownce se va închide pe 15 decembrie.<br />
<span id="more-29"></span><br />
Cei doi developeri, Mike Malone şi Leah Culver, se vor alătura echipei de la Six Apart în timp ce Kevin Rose va rămâne drept advisor.<br />
Mai multe detalii pe <a href="http://blog.pownce.com/2008/12/01/goodbye-pownce-hello-six-apart/">blogul pownce</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mindwar.ro/2008/12/02/pownce-shutting-down/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geek meet #2 – Craiova</title>
		<link>http://blog.mindwar.ro/2008/12/02/geek-meet-2-craiova/</link>
		<comments>http://blog.mindwar.ro/2008/12/02/geek-meet-2-craiova/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 03:06:52 +0000</pubDate>
		<dc:creator>Dragoş Stoenică</dc:creator>
				<category><![CDATA[networking]]></category>
		<category><![CDATA[craiova]]></category>
		<category><![CDATA[geekmeet]]></category>

		<guid isPermaLink="false">http://blog.mindwar.ro/?p=19</guid>
		<description><![CDATA[A fost şi Geek Meet #2 aici la Craiova. Prezentările au fost interesante. Trebuie să-l felicităm pe Alin Mechenici care a făcut posibilă toată treaba. Au vorbit: Tudor Totolici &#8211; Consultant pe Strategie MB Dragan Cosmina Stefanache &#8211; Marketing Online &#8211; Fanurio (Time Tracking Software) Cornel Mitroi – prezentare aplicaţie pentru distribuţie de produse (web [...]]]></description>
			<content:encoded><![CDATA[<p><span class="dropcap">A</span> fost şi Geek Meet #2 aici la Craiova. Prezentările au fost interesante. Trebuie să-l felicităm pe Alin Mechenici care a făcut posibilă toată treaba.<br />
<span id="more-19"></span><br />
Au vorbit:</p>
<ul>
<li>Tudor Totolici &#8211; Consultant pe Strategie MB Dragan</li>
<li>Cosmina Stefanache &#8211; Marketing Online &#8211; Fanurio (Time Tracking Software)</li>
<li>Cornel Mitroi – prezentare aplicaţie pentru distribuţie de produse (web based)</li>
<li>Chris Heilmann &#8211; International Developer Evangelist la Yahoo! Developer Network</li>
</ul>
<p>La cererea publicului, a mai luat cuvantul si Bobby Voicu.</p>
<p><!--more--></p>
<p>Mi-a placut în special Chris şi asta nu numai pentru că s-a văzut că nu e la prima prezentare ci şi datorită subiectului abordat, un subiect &#8220;developer friendly&#8221;.<br />
Slideurile sunt pe <a href="http://www.slideshare.net/cheilmann/resisting-the-feature-creature-presentation">slideshare</a><br />
Poze sunt pe <a href="http://www.flickr.com/photos/mindwar/sets/72157610332191047/">flickr</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mindwar.ro/2008/12/02/geek-meet-2-craiova/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google social graph API</title>
		<link>http://blog.mindwar.ro/2008/02/02/google-social-graph-api/</link>
		<comments>http://blog.mindwar.ro/2008/02/02/google-social-graph-api/#comments</comments>
		<pubDate>Sat, 02 Feb 2008 03:21:28 +0000</pubDate>
		<dc:creator>Dragoş Stoenică</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.mindwar.ro/6-google-social-graph-api/</guid>
		<description><![CDATA[Sau urmatorul pas în social networking. Google foloseşte XFN şi FOAF împreună cu atributele &#8220;me&#8221; sau &#8220;friend&#8221; pentru a determina legătura unei resurse cu tine. Astfel la înregistrarea pe un nou site îţi sunt gasiţi automat prietenii de pe alte reţele. Mai multe informaţii gasim la Google]]></description>
			<content:encoded><![CDATA[<p><span class="dropcap">S</span>au urmatorul pas în social networking.<br />
Google foloseşte <abbr title="XHTML Friends Network">XFN</abbr> şi <abbr title="Friend of a Friend">FOAF</abbr> împreună cu atributele &#8220;me&#8221; sau &#8220;friend&#8221; pentru a determina legătura unei resurse cu tine.<br />
Astfel la înregistrarea pe un nou site îţi sunt gasiţi automat prietenii de pe alte reţele.</p>
<p>Mai multe informaţii gasim la <a href="http://code.google.com/apis/socialgraph/" title="google">Google</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mindwar.ro/2008/02/02/google-social-graph-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

