<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>wisnia's dev blog</title>
	<atom:link href="http://wisniadev.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://wisniadev.wordpress.com</link>
	<description>deczko o programowaniu</description>
	<lastBuildDate>Wed, 27 May 2009 09:35:46 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='wisniadev.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>wisnia's dev blog</title>
		<link>http://wisniadev.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://wisniadev.wordpress.com/osd.xml" title="wisnia&#039;s dev blog" />
	<atom:link rel='hub' href='http://wisniadev.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Matura, wakacje, praca&#8230;</title>
		<link>http://wisniadev.wordpress.com/2009/05/27/matura-wakacje-praca/</link>
		<comments>http://wisniadev.wordpress.com/2009/05/27/matura-wakacje-praca/#comments</comments>
		<pubDate>Wed, 27 May 2009 09:35:46 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=74</guid>
		<description><![CDATA[Witam po prawie półrocznej przerwie ! Dostałem już wolne od szkoły i maturki, która swoją drogą poszła całkiem nieźle, czas na parę nowych wpisów i wieści z frontu<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=74&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Witam po prawie półrocznej przerwie <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> !</p>
<p>Dostałem już wolne od szkoły i maturki, która swoją drogą poszła całkiem nieźle, czas na parę nowych wpisów i wieści z frontu <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=74&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2009/05/27/matura-wakacje-praca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>HowTo: get X and Y position of DOM element in JavaScript</title>
		<link>http://wisniadev.wordpress.com/2008/12/03/howto-get-x-and-y-position-of-dom-element-in-javascript/</link>
		<comments>http://wisniadev.wordpress.com/2008/12/03/howto-get-x-and-y-position-of-dom-element-in-javascript/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 09:50:51 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=64</guid>
		<description><![CDATA[Basically, there is no obvious way to get x and y coordinates of, for example, input element. Why need this? For example to make autocompleter window show always under the given input. I&#8217;m sure that JavaScript frameworks offer this functionality, but when we need slick script adding framework that is 10 times bigger than our [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=64&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Basically, there is no obvious way to get x and y coordinates of, for example, input element. Why need this? For example to make autocompleter window show always under the given input.</p>
<p>I&#8217;m sure that JavaScript frameworks offer this functionality, but when we need slick script adding framework that is 10 times bigger than our software.</p>
<p>Let&#8217;s begin then.</p>
<h3>What JavaScript actually offers?</h3>
<p>Actually we can get element position &#8211; relative to it&#8217;s parent node, it is stored in <strong>offsetLeft </strong>and <strong>offsetTop</strong> properties.</p>
<p>The absolute position is the sum of all relative position, something like relative to root (in this case the BODY element) node position.</p>
<p>Every DOM element has <strong>offsetParent</strong> property, that is reference to parent object. When we reach the root node offsetParent is <em>null</em>. Therefore using we can build a loop that will sum all postions for us.</p>
<h3>The Code</h3>
<p><pre class="brush: jscript;">
function getX(obj){

	var x = 0;

	while(obj.offsetParent) {
		x += obj.offsetLeft;
		obj = obj.offsetParent;
	}

	return x;

}

function getY(obj){

	var y = 0;

	while(obj.offsetParent) {
		y += obj.offsetTop;
		obj = obj.offsetParent;
	}

	return y;

}
</pre></p>
<p>Usage:</p>
<p><pre class="brush: jscript;">
alert( getY(document.getElementById(&quot;element&quot;)) );
</pre></p>
<p>Simple!</p>
<p>In next post we&#8217;ll try to build autocompleter, learning something new and using this functions above&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=64&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/12/03/howto-get-x-and-y-position-of-dom-element-in-javascript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>Making conditional INSERTs in MySQL 5</title>
		<link>http://wisniadev.wordpress.com/2008/12/02/making-conditional-inserts-in-mysql-5/</link>
		<comments>http://wisniadev.wordpress.com/2008/12/02/making-conditional-inserts-in-mysql-5/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 16:44:00 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[insert]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimizations]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=61</guid>
		<description><![CDATA[What? My task was to add some data to the tables that I did not designed, and there I can&#8217;t add some KEYS for me to determine if some rows has the same values in some fields. I&#8217;ve been digging through documentation and this is what I&#8217;ve came up with; How? In MySQL we can [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=61&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>What?</h3>
<p>My task was to add some data to the tables that I did not designed, and there I can&#8217;t add some KEYS for me to determine if some rows has the same values in some fields. I&#8217;ve been digging through documentation and this is what I&#8217;ve came up with;</p>
<h3>How?</h3>
<p>In MySQL we can add some data using <strong>INSERT + SELECT</strong>:</p>
<p><pre class="brush: sql;">INSERT INTO sexy_table (cell1, cell2, cell3) 
SELECT 'valueForCell1', 'valueForCell2', 'valueForCell3'</pre></p>
<p>If there is no fields in select (known as &#8222;rows have gone for a beer&#8221;) INSERT will not continue to execute and no error will be thrown.</p>
<p>Now, to have <strong>empty SELECT </strong>(known as don&#8217;t insert anything!) we have to add some logical conditions that will give us FALSE value. But</p>
<p><pre class="brush: sql;">SELECT 'var1' WHERE 1=2</pre></p>
<p>does not work!<br />
But here a little, tiny, sweet keyword gives us a helping hand: the <strong>DUAL</strong> keyword.<br />
It will act as dummy table, just to have some compilance withl SQL language. So the statement looks like this:</p>
<p><pre class="brush: sql;">SELECT 'var1' FROM DUAL WHERE FALSE</pre></p>
<p>Result: no rows, note that 1=2 is equal to FALSE keyword.</p>
<p>Now, non working, but proper, SQL INSERT (who the hell need it?!)</p>
<p><pre class="brush: sql;">INSERT INTO sexy_table (cell1, cell2, cell3) 
SELECT 'valueForCell1', 'valueForCell2', 'valueForCell3' FROM DUAL WHERE FALSE</pre><br />
using all of this easy stuff above we can solve our problem: how to chceck if data already exists in DB before inserting.</p>
<h3>The Solution</h3>
<p>Assuming that cell1 is the cell that has to be unique:</p>
<h3><pre class="brush: sql;">INSERT INTO sexy_table (cell1, cell2, cell3) 
SELECT 'valueForCell1', 'valueForCell2', 'valueForCell3' FROM DUAL 
WHERE NOT EXISTS( SELECT * FROM sexy_table WHERE cell1 = 'valueForCell1')</pre></h3>
<p>Easy huh? <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Goodbye word</h3>
<p>The example above shows that many of operations we can do before inserting, just use your invention to boost up your queries!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=61&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/12/02/making-conditional-inserts-in-mysql-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>Installing Rockbox on Compact Flash enabled IPod Mini</title>
		<link>http://wisniadev.wordpress.com/2008/09/11/installing-rockbox-on-compact-flash-enabled-ipod-mini/</link>
		<comments>http://wisniadev.wordpress.com/2008/09/11/installing-rockbox-on-compact-flash-enabled-ipod-mini/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 12:44:40 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[cf]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[mini]]></category>
		<category><![CDATA[rockbox]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=52</guid>
		<description><![CDATA[Background My IPod Mini has broken few months ago, and one day i&#8217;ve digged it out and thought that it would be not that stupid to finally get it working by replacing hard disk that caused problems. After googling a little i&#8217;ve figured that Compact Flash card can be a replacement for Microdrives Apple put [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=52&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Background</h3>
<p>My IPod Mini has broken few months ago, and one day i&#8217;ve digged it out and thought that it would be not that stupid to finally get it working by replacing hard disk that caused problems.</p>
<p>After googling a little i&#8217;ve figured that Compact Flash card can be a replacement for Microdrives Apple put in IPods Mini.</p>
<h3>What CF?</h3>
<p>Note that CF you&#8217;ll try to install in IPod has to support True ATA access mode &#8211; before buying check on producer&#8217;s webpage for specifications. I used Transcend 133x 8GB CF card to replace old and broken 6GB Hitachi Microdrive.</p>
<h3>Installing mere IPod firmware</h3>
<p>The eaisiest way is to connect your CF enabled IPod to Windows machine with ITunes, and use &#8222;restore&#8221; option.</p>
<p>On Linux you&#8217;ll have to <strong>dd</strong> firmware directly to the firmware partition &#8211; the corresponding tutorial how to do this you&#8217;ll find on rockbox.org</p>
<h3>Installing Rockbox</h3>
<p>To get Rockbox, the ubiquitous music player firmware, you&#8217;ll need 2 things on your IPod: the bootloader and the Rockbox actual firmware.</p>
<p>Rockbox can be installed in normal way, just by unpacking latest build suitable for your device (can be found on <a href="http://build.rockbox.org/">http://build.rockbox.org/</a>), or using <a href="http://www.rockbox.org/wiki/RockboxUtility">RockboxUtility</a></p>
<p>Bootloader is installed by IPodPatcher console program that can be found on <a href="http://www.rockbox.org/twiki/bin/view/Main/IpodPatcher">http://www.rockbox.org/twiki/bin/view/Main/IpodPatcher</a> , however the image that it contains doesn&#8217;t like CF cards, more precisely it soes not recognize partitions that are made on IPod (first ~30MB partition for firmware, rest for stuff). Happily some people made working bootloaders for us, that can be found on:</p>
<p><a href="IPod Mini 1st gen">http://www.rockbox.org/tracker/task/8901?getfile=16426</a> <em>IPod Mini 1st gen<br />
</em><a href="http://www.rockbox.org/tracker/task/8901?getfile=16980">http://www.rockbox.org/tracker/task/8901?getfile=16980</a> <em>IPod Mini 2nd gen</em><em><br />
</em></p>
<p>Installation goes as described:</p>
<ol>
<li>Download ipodpatcher.exe and proper bootloader, save it to one folder</li>
<li>Connect IPod in <em>disk mode</em><br />
If you ecounter some problems with getting IPod in disk mode try rebooting it by pressing <strong>SELECT+MENU</strong> for a  moment and then pressing <strong>SELECT+PLAY </strong>when apple appears &#8211; try several times, it&#8217;ll succeed <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Run cmd.exe, navigate to the folder where you&#8217;ve saved ipodpatcher.exe</li>
<li>Run<br />
&gt;<strong>ipodpatcher.exe &#8211;add-bootloader bootloader.ipod</strong></li>
<li>You&#8217;ll be texted with something
<pre>[INFO] Scanning disk devices...
[INFO] Ipod found - 2nd Generation Mini ("winpod") - disk device 1
[INFO] Reading partition table from \\.\PhysicalDrive1
[INFO] Sector size is 512 bytes
[INFO] Part    Start Sector    End Sector   Size (MB)   Typ
[INFO]    0              63         80324        39.2   Empty (0x00)
[INFO]    1           80325      15662302      7608.4   W95 FAT32 (0x0b)
[INFO] Ipod model: 2nd Generation Mini ("winpod")
[INFO] Checksum OK in bootloader.ipod
[INFO] Reading original firmware...
[INFO]  Wrote 3452928 bytes to firmware partition
[INFO] Bootloader bootloader.ipod written to device.</pre>
</li>
</ol>
<p>Now unplug your IPod and eventually reboot it using SELECT+MENU, Rockbox should now boot.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/wisniadev.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/wisniadev.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=52&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/09/11/installing-rockbox-on-compact-flash-enabled-ipod-mini/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>Memcache &#8211; wykorzystanie i subiektywnie dobre praktyki w PHP, klasa Singletona</title>
		<link>http://wisniadev.wordpress.com/2008/09/01/memcache-wykorzystanie-i-subiektywnie-dobre-praktyki-w-php-klasa-singletona/</link>
		<comments>http://wisniadev.wordpress.com/2008/09/01/memcache-wykorzystanie-i-subiektywnie-dobre-praktyki-w-php-klasa-singletona/#comments</comments>
		<pubDate>Mon, 01 Sep 2008 19:57:14 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=35</guid>
		<description><![CDATA[Słowem wstępu W poprzednim poście opisałem czym jest memcache i jak go zainstalować i sprawić żeby PHP mogło się z nim komunikować. W tym poście zajmiemy się tym właściwie czego potrzebujemy: wykorzystaniem memcache do zastosowań praktycznych Kiedy stosować memcache? Kiedy się tylko da. Ja wykorzystywałem memcache do: Zapisywania statystyk które pojawiają się na stronie (np. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=35&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Słowem wstępu</h3>
<p>W poprzednim poście opisałem czym jest memcache i jak go zainstalować i sprawić żeby PHP mogło się z nim komunikować. W tym poście zajmiemy się tym właściwie czego potrzebujemy: wykorzystaniem memcache do zastosowań praktycznych</p>
<h3>Kiedy stosować memcache?</h3>
<p>Kiedy się tylko da. Ja wykorzystywałem memcache do:</p>
<ol>
<li>Zapisywania statystyk które pojawiają się na stronie (np. ilość userów na stronie &#8211; przykład poniżej, ilość ogłoszeń w bazie etc.)</li>
<li>Przechowywania danych o userze na stronie (jego dane &#8222;profilowe&#8221;, często pobierane z bazy, przy niezoptymalizowanych zapytaniach, mogą być przechowywane w pamięci serwera)</li>
<li>Przechowywania listy kategorii na stronie &#8211; rzecz nieczęsto zmieniana.</li>
</ol>
<p>Generalizując memcache nadaje się do przechowywania danych których pobranie z bazy danych/internetu/innych (przecież źródłem danych nie zawsze jest baza!) zajmuje dużo czasu lub są pobierane często podczas odwiedzania strony, i nie są to dane często zmieniające się. Niby oczywistość ale warto o tym wszystkim pamiętać przy decyzji czy memcache czy też nie.</p>
<p>Oczywiście prościej posłużyć się miernikiem czasu który nam zwyczajnie powie co jest szybsze: baza czy memcache; prawie zawsze powie memcache ale trzeba jeszcze brać pod uwagę że zasoby pamięciowe serwera memcached są ograniczone i przechowywanie pełnych wyników wyszukiwania albo całych listingów postów w memcache nie jest zbyt dobrym pomysłem.</p>
<p>Jeżeli chodzi o liczniki &#8211; postów, komentarzy etc. &#8211; memcache oferuje całkiem wygodne funkcje dekrementacji/inkrementacji o których poniżej.</p>
<h3>Dokumentacja</h3>
<p>Na <a href="http://pl.php.net/memcache">http://pl.php.net/memcache</a> znajduje się pełna dokumentacja API memcache w PHP.</p>
<h3>Prosty przykład połączenia</h3>
<p>To zadziała na domyślnych ustawieniach</p>
<p><pre class="brush: php;">&lt;?php

// Polacz z memcache
$memcache = new Memcache;
$memcache-&gt;connect('localhost', 11211) or die (&quot;Could not connect&quot;);

// Czy NIE ma danych w memcache?
if(! $data = $memcache-&gt;get('blog_testarray')) {

 // Nie ma danych - zapisujemy nowe do memcache 
 $data = array(
 'time' =&gt; time(),
 'string' =&gt; 'obtained from memcache or not?'
 );

 $memcache-&gt;set('blog_testarray', $data, false, 10);
}

// W tym punkcie mamy obecną zmienną $data
// Albo pobraną z memcache poprzez linijkę
//
// if(! $data = $memcache-&gt;get('blog_testarray')) {
//
// Albo zdefiniowaną w linii 11

// Pokaż co dostaliśmy
var_dump($data);

?&gt;

</pre></p>
<p>Zauważ, że operacja w linii 8 nie jest porównaniem &#8211; to przypisanie do zmiennej $data danych zwróconych przez metodę $memcache-&gt;get().<br />
Metoda ta zwróci fałsz jeżeli podanego klucza nie ma w memcache &#8211; co odwrócone wykrzyknikiem da nam prawdę; Wtedy całość wyrażenia w ifie jest prawdą.</p>
<p>Opisana powyżej składnia sprawdzania czy dane są w memcache wydała mi się całkiem wygodna i właśnie z niej będziemy w tym poście korzystać. Uogólniając:</p>
<p><pre class="brush: php;">&lt;?php

if(! $data = $memcache-&gt;get('klucz w memcache - dowolny')) {

 // Definicja danych - pobranie z bazy etc etc + zapisanie do memcache 
 $data = foo(). bar();
 $memcache-&gt;set('klucz w memcache - dowolny', $data, false, 10 /* Czas ważności keszu */);

}

?&gt;

</pre></p>
<h3>Co można przechowywać w memcache?</h3>
<p>Dowolną zmienną, którą da się serializować &#8211; tablice, stringi etc. Wyjątkiem są zmienne resource &#8211; np. link do połączenia z plikiem, handler do pliku zwrócony przez fopen() etc.</p>
<p>Teraz trochę o przechowywaniu <em>obiektów:</em></p>
<ol>
<li>Jeżeli obiekt posiada metody __sleep() i __wakeup() to zostaną one wykonane przez memcache</li>
<li>Należy pamiętać o tym żeby __sleep() zwracało tablicę właściwości (pól) obiektu do zapisania w memcache &#8211; nie zwrócenie tablicy spowoduje wygenerowanie błędu na poziomie E_NOTICE.</li>
</ol>
<h3>Singleton</h3>
<p>Memcache jest idealnym materiałem na singletona.</p>
<p>Tak dla przypomnienia: ordynarnie rzecz ujmując <strong>singleton</strong> to taki obiekt który jest jeden na cały kod.</p>
<p>Nie ma sensu za każdym razem łączyć się z memcache i o ile chcemy uniknąć zabawy w zmienne globalne lub też w przekazywanie za każdym razem obiektu memcache przez parametr, możemy wykorzystać wzorzec singletona. /* O wzorcach też w sumie możnaby napisać jakiegoś posta, nie? */</p>
<p>Oto całkiem prosty przykład singletona dla Memcache:</p>
<p><pre class="brush: php;">&lt;?php

/**
 * Memcache sandwitched in The Singleton bread
 *
 * @author Artek Wiśniewski
 * @license BSD
 */
class nsMemcache extends Memcache {

 /**
  * memcached host
  *
  */
 const HOST = 'localhost';

 /**
  * memcached port
  *
  */
 const PORT = 11211;

 /**
  * Instance will be held here
  *
  * @var nsMemcache
  */
 private static $_instance;

 /**
  * Private constructor
  * only class itself can make instances of itself
  * we are doing this to prevent creating multiple objects of nsMemcache
  *
  */
 private function __construct() { 

 	$this-&gt;automatedConnect();

 }

 /**
  * This method will connect memcache to server using const values defined above.
  *
  * @throws Exception when connection failed
  */
 private function automatedConnect() {

 	if(! $this-&gt;connect(nsMemcache::HOST, nsMemcache::PORT))
 		throw new Exception('Could not connect to the memcached server');

 }

 /**
  * Return ready and connected nsMemcache object
  *
  * @return nsMemcache
  */
 public static function getInstance() {

 	// is singleton present?
 	if(! isset(nsMemcache::$_instance))
 		nsMemcache::$_instance = new nsMemcache();

 	// return one and the same object constantly
 	return nsMemcache::$_instance;

 }

}

?&gt;
</pre></p>
<p>Mam nadzieję że komuś się przyda <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>A na wzorce (którem znam i stosowałem) zapraszam do następnego posta&#8230;</p>
<p>Aaaaa i bym zapomniał, jak tego używać?<br />
Ustawiamy sobie stałe HOST i PORT, klasę includujemy, i potem w dowolnym miejscu kodu:</p>
<p><pre class="brush: php;">&lt;?

$mc = nsMemcache::getInstance();
$val = $mc-&gt;get('some_funky_key');
// works like normal Memcache class...
// ...

?&gt;
</pre></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/wisniadev.wordpress.com/35/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/wisniadev.wordpress.com/35/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=35&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/09/01/memcache-wykorzystanie-i-subiektywnie-dobre-praktyki-w-php-klasa-singletona/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>memcache &#8211; instalacja w Windows, PHP</title>
		<link>http://wisniadev.wordpress.com/2008/08/25/memcache-instalacja-w-windows-php/</link>
		<comments>http://wisniadev.wordpress.com/2008/08/25/memcache-instalacja-w-windows-php/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 10:45:23 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=20</guid>
		<description><![CDATA[Słowo wstępu Jak wszyscy wiemy czasem na stronach podajemy dane które wcale nie muszą być aktualne za każdym razem kiedy je serwujemy &#8211; tak jest np. ze statystykami ilości ogłoszeń na marketo.pl. Podobnie może być z licznikami, powiedzmy, ilości komentarzy, które wystarczy odświeżać tylko przy ściśle określonych sytuacjach takich jak dodanie/usunięcie komentarza &#8211; w ten [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=20&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><strong>Słowo wstępu</strong></h3>
<p>Jak wszyscy wiemy czasem na stronach podajemy dane które wcale nie muszą być aktualne za każdym razem kiedy je serwujemy &#8211; tak jest np. ze statystykami ilości ogłoszeń na marketo.pl. Podobnie może być z licznikami, powiedzmy, ilości komentarzy, które wystarczy odświeżać tylko przy ściśle określonych sytuacjach takich jak dodanie/usunięcie komentarza &#8211; w ten sposób nie bombardujemy za każdym razem bazy COUNT()&#8217;ami.</p>
<p>Memcache jest <em>biblioteką</em> &#8211; dokładniej <em>daemonem z interfejsem sieciowym</em> &#8211; umożliwiającym nam przechowywanie praktycznie dowolnej wartości pod podanym kluczem (identyfikatorem typu string) w pamięci serwera. Mając dobry hosting możemy sobie zarezerwować np. całe 2-3GB pamięci tylko dla memcache i w ten sposób zbudować stronę szybką niczym jurna dziewica.</p>
<h3><strong>Instalacja pod linuxem</strong></h3>
<p>Skoro używasz linuxa to sobie poradzisz z instalacją memcached.</p>
<h3><strong>Instalacja pod windowsem<br />
</strong></h3>
<p>Do celów testowych &#8211; nie polecam serwerów na windowsie.<br />
Na początek musimy się zaopatrzyć w daemona memcached; gotowe binaria dla windoze można pobrać z:</p>
<p style="padding-left:30px;"><a href="http://code.jellycan.com/memcached/">http://code.jellycan.com/memcached/ </a></p>
<p>Archiwum wypakowujemy w dowolnym miejscu i teraz mamy 2 opcje do wyboru: memcache jako aplikacja i memcache jako usługa systemu windows;</p>
<p>W wypadku opcji pierwszej jedyne co musimy uczynić to <strong>kliknąć dwukrotnie na ikonkę memcached.exe</strong> &#8211; i już <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Kiedy chcemy częściej korzystać z memcached do testów naszej strony go wykorzystującej warto go zainstalować jako usługę:</p>
<ol>
<li> Uruchamiamy memcached.exe z opcjami <em>memcached.exe -d install</em><br />
<img class="alignnone size-full wp-image-21" src="http://wisniadev.files.wordpress.com/2008/08/memcached_install.png?w=500" alt=""   /></li>
<li>Odpalamy mmc.exe / zarządzanie usługami i uruchamiamy usługę <strong>memcached Server </strong>lub też wykonujemy komendę <em><br />
memcached.exe -d start</em><br />
lub <em><br />
net start &#8222;memcached Server&#8221;</em></li>
</ol>
<h3>Przygotowanie PHP do współpracy z memcache</h3>
<p>Na tym etapie mamy już działający serwer memcache na adresie <em>127.0.0.1</em>, porcie <em>11211</em>.<br />
PHP oferuje rozszerzenie PECL do komunikacji z memcache &#8211; <strong>php_memcache.dll </strong>- jeżeli ta biblioteka znajduje się w katalogu <em>ext </em>twojej instalacji to wystarczy teraz że dodasz (odkomentujesz) w php.ini linijkę</p>
<p style="padding-left:30px;"><em>extension=php_memcache.dll</em></p>
<p>Jeżeli tej biblioteki nie posiadasz to możesz ją pobrać z</p>
<p style="padding-left:30px;"><a href="http://pecl4win.php.net/ext.php/php_memcache.dll">http://pecl4win.php.net/ext.php/php_memcache.dll</a></p>
<p>Teraz restartujemy naszego Apache i dla pewności w <em>phpinfo()</em> możemy sprawdzić czy moduł został załadowany;</p>
<p><img class="alignnone size-full wp-image-24" src="http://wisniadev.files.wordpress.com/2008/08/memc1.png?w=500&#038;h=239" alt="" width="500" height="239" /></p>
<p>Gdyby moduł nie został załadowany można sprawdzić czy nie ma jakiś dodatkowych plików php.ini do wyedytowania (np. w XAMPP jest ich bodajże 6)</p>
<h3>Słowo zakończenia</h3>
<p>Teraz już można bawić memcache w PHP, szczegóły kodowania, wygodne praktyki i przykładowe zastosowania opiszę w następnym poście.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/wisniadev.wordpress.com/20/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/wisniadev.wordpress.com/20/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=20&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/08/25/memcache-instalacja-w-windows-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>

		<media:content url="http://wisniadev.files.wordpress.com/2008/08/memcached_install.png" medium="image" />

		<media:content url="http://wisniadev.files.wordpress.com/2008/08/memc1.png" medium="image" />
	</item>
		<item>
		<title>marketo.pl</title>
		<link>http://wisniadev.wordpress.com/2008/08/18/marketopl/</link>
		<comments>http://wisniadev.wordpress.com/2008/08/18/marketopl/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 14:24:50 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[netsource]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=14</guid>
		<description><![CDATA[Z serii &#8222;patrzcie co spłodziłem&#8221;: Marketo.pl jest serwisem łączącym agregator ogłoszeń drobnych z różnych serwisów ogłoszeniowych (olx.pl, marketeo.pl, ale.gratka.pl, gumtree.pl, dwukropek.pl, kupsprzedaj.pl) oraz wyszukiwarkę szperającą w tychże ogłoszeniach. Nad serwisem pracowałem z Nazinem i popełnienie tegoż oprogramowania zajęło nam koło miesiąca, do jego budowy wykorzystaliśmy nasz framework netSource (hell yeah, do takich zastosowań idealny) działający [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=14&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Z serii &#8222;patrzcie co spłodziłem&#8221;:</p>
<p><a href="http://marketo.pl" target="_blank">Marketo.pl</a> jest serwisem łączącym agregator ogłoszeń drobnych z różnych serwisów ogłoszeniowych (olx.pl, marketeo.pl, ale.gratka.pl, gumtree.pl, dwukropek.pl, kupsprzedaj.pl) oraz wyszukiwarkę szperającą w tychże ogłoszeniach.</p>
<p>Nad serwisem pracowałem z Nazinem i popełnienie tegoż oprogramowania zajęło nam koło miesiąca, do jego budowy wykorzystaliśmy nasz framework netSource (hell yeah, do takich zastosowań idealny) działający na PHP5 + hardkorowo wykorzystywaną bazę MySQL 5 (niektóre zapytania przerażają). Oprócz tego mamy podpowiadanie fraz szukania (na razie tylko w zaawansowanych) oparte na mootools. Między linijkami kodu przewija się też memcache. Grafikę wykonał gość z zewnątrz.</p>
<p>Agregacje z innych serwisów wykonuję podframework korzystający z bibliotek netSource (dobrze się złożyło że mieliśmy coś podobnego napisanego już wcześniej) i mnóóóóóóóóóóóóóstwo pregów.</p>
<p>Zapraszam do testów i zgłaszania błędów &#8211; których się nie dopatrzyłem, a na pewno gdzieś czekają pod powierzchnią gotowe by uderzyć.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/wisniadev.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/wisniadev.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=14&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/08/18/marketopl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>Wyciąganie treści taga (znacznika) HTML wyrażeniami regularnymi perl (preg)</title>
		<link>http://wisniadev.wordpress.com/2008/08/18/wyciaganie-calosci-taga-html-poprzez-jednego-prega-jol/</link>
		<comments>http://wisniadev.wordpress.com/2008/08/18/wyciaganie-calosci-taga-html-poprzez-jednego-prega-jol/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 14:01:33 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[preg]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=4</guid>
		<description><![CDATA[Piszę sobie właśnie pobieranie newsów z różnych stron internetowych, wszystko parsuję sobie za pomocą wygodnych pregów wbudowanych w php. O ile wyciaganie prostych wartości z znaczników HTML nie było problemem i można je zrobić za pomocą wyrażenia &#60;htmltag&#62;([^&#60;]+)&#60;/htmltag&#62; (pobieraj wszystko do znaku &#8222;&#60;&#8222;) tak problem się pojawił jak przyszła potrzeba wyciągnięcia jakiejś większej struktury htmlowej, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=4&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Piszę sobie właśnie pobieranie newsów z różnych stron internetowych, wszystko parsuję sobie za pomocą wygodnych pregów wbudowanych w php. O ile wyciaganie prostych wartości z znaczników HTML nie było problemem i można je zrobić za pomocą wyrażenia</p>
<blockquote><p>&lt;htmltag&gt;<strong>([^&lt;]+)</strong>&lt;/htmltag&gt; (pobieraj wszystko do znaku &#8222;<strong>&lt;</strong>&#8222;)</p></blockquote>
<p>tak problem się pojawił jak przyszła potrzeba wyciągnięcia jakiejś większej struktury htmlowej, zawierającej child tagi i białe spacje. Krzykniecie lazy dot? No nie do końca, trochę mi to problemów sprawiło, stąd ten post <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Przykładowo chcemy do otrzymać wszystko co się znajduje w divie od id &#8222;postexcerpt&#8221;:</p>
<p><pre class="brush: xml;">
&lt;div id=&quot;postexcerpt&quot; class=&quot;postbox if-js-closed&quot;&gt;
&lt;h3&gt;Excerpt&lt;/h3&gt;
&lt;label class=&quot;hidden&quot; for=&quot;excerpt&quot;&gt;Excerpt&lt;/label&gt;&lt;textarea rows=&quot;1&quot; cols=&quot;40&quot; name=&quot;excerpt&quot; tabindex=&quot;6&quot; id=&quot;excerpt&quot;&gt;&lt;/textarea&gt;
			Excerpts are optional hand-crafted summaries of your content. You can &lt;a href=&quot;http://codex.wordpress.org/Template_Tags/the_excerpt&quot; target=&quot;_blank&quot;&gt;use them in your template&lt;/a&gt;&lt;/div&gt;
</pre></p>
<p>Oczywiście można sobie całość przeparsować i dojść do tego co chcemy poprzez DOM, ale zeżre nam to mnóstwo czasu i mocy którą możemy zmarnować gdzie indziej.</p>
<p>Początkowo próbowałem wyrażenia</p>
<blockquote><p>/&lt;div id=&#8221;postexcerpt&#8221; class=&#8221;postbox if-js-closed&#8221;&gt;<strong>(?&lt;text&gt;.*?)</strong>&lt;\/div&gt;/</p></blockquote>
<p>Mój wierny towarzysz, <strong>.*? </strong>,<strong> </strong>tutaj sobie nie radził, więc zacząłem szukać po necie, dokumentacjach i wyszło na to że problem się rozwiązał po kombinacjach własnych &#8211; mianowicie lazy dot nie przewiduje w sobie białych spacji, należy je dołączyć. Powstaje nam wyrażenie</p>
<blockquote><p>/&lt;div id=&#8221;postexcerpt&#8221; class=&#8221;postbox if-js-closed&#8221;&gt;<strong>(?&lt;text&gt;(\s|.)*?)</strong>&lt;\/div&gt;/</p></blockquote>
<p>W postaci gotowego kodu php</p>
<p><pre class="brush: php;">&lt;?php $newsContent = '
&lt;div id=&quot;postexcerpt&quot; class=&quot;postbox if-js-closed&quot;&gt;
&lt;h3&gt;Excerpt&lt;/h3&gt;
&lt;label class=&quot;hidden&quot; for=&quot;excerpt&quot;&gt;Excerpt&lt;/label&gt;&lt;textarea rows=&quot;1&quot; cols=&quot;40&quot; name=&quot;excerpt&quot; tabindex=&quot;6&quot; id=&quot;excerpt&quot;&gt;&lt;/textarea&gt;
 	Excerpts are optional hand-crafted summaries of your content. You can &lt;a href=&quot;http://codex.wordpress.org/Template_Tags/the_excerpt&quot; target=&quot;_blank&quot;&gt;use them in your template&lt;/a&gt;&lt;/div&gt;
';

preg_match('/
&lt;div id=&quot;postexcerpt&quot; class=&quot;postbox if-js-closed&quot;&gt;(?&lt;text&gt;(\s|.)*?)&lt;\/div&gt;/', $newsContent, $reg);
var_dump($reg);
?&gt;</pre></p>
<p>który da nam<br />
<code><br />
array(4) {<br />
[0]=&gt;<br />
string(424) "&lt;div id="postexcerpt" class="postbox if-js-closed"&gt;<br />
&lt;h3&gt;Excerpt&lt;/h3&gt;<br />
&lt;p class="inside"&gt;<br />
&lt;label class="hidden" for="excerpt"&gt;Excerpt&lt;/label&gt;&lt;textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"&gt;&lt;/textarea&gt;<br />
Excerpts are optional hand-crafted summaries of your content. You can &lt;a href="http://codex.wordpress.org/Template_Tags/the_excerpt" target="_blank"&gt;use them in your template&lt;/a&gt;<br />
&lt;/p&gt;<br />
&lt;/div&gt;"<strong></strong></code></p>
<p><code><strong>["text"]=&gt;<br />
string(367) "<br />
&lt;h3&gt;Excerpt&lt;/h3&gt;<br />
&lt;p class="inside"&gt;<br />
&lt;label class="hidden" for="excerpt"&gt;Excerpt&lt;/label&gt;&lt;textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"&gt;&lt;/textarea&gt;<br />
Excerpts are optional hand-crafted summaries of your content. You can &lt;a href="http://codex.wordpress.org/Template_Tags/the_excerpt" target="_blank"&gt;use them in your template&lt;/a&gt;<br />
&lt;/p&gt;<br />
"</strong></code></p>
<p><code>[1]=&gt;<br />
string(367) "<br />
&lt;h3&gt;Excerpt&lt;/h3&gt;<br />
&lt;p class="inside"&gt;<br />
&lt;label class="hidden" for="excerpt"&gt;Excerpt&lt;/label&gt;&lt;textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"&gt;&lt;/textarea&gt;<br />
Excerpts are optional hand-crafted summaries of your content. You can &lt;a href="http://codex.wordpress.org/Template_Tags/the_excerpt" target="_blank"&gt;use them in your template&lt;/a&gt;<br />
&lt;/p&gt;<br />
"<br />
[2]=&gt;<br />
string(1) "<br />
"<br />
}</code></p>
<p>Minus tego taki że preg nie rozpozna nam struktury drzewiastej i w razie wystąpienia innego diva wewnątrz naszego przeszukiwanego taga to zapytanie się wysypie i nie wyciągnie całego taga. Tutaj dobrym rozwiązaniem mogłoby być explodowanie na poszczególne divy i zliczanie ile jest otwartych i ile zamkniętych, póki co nie miałem z tym do czynienia i nie zanosi się na to <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><code></p>
<p></code></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/wisniadev.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/wisniadev.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=4&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/08/18/wyciaganie-calosci-taga-html-poprzez-jednego-prega-jol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
		<item>
		<title>Nowy devblog</title>
		<link>http://wisniadev.wordpress.com/2008/08/18/nowy-devblog/</link>
		<comments>http://wisniadev.wordpress.com/2008/08/18/nowy-devblog/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 14:00:19 +0000</pubDate>
		<dc:creator>wisnia</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wisniadev.wordpress.com/?p=7</guid>
		<description><![CDATA[Witaj na moim nowym devblogu, do którego mam nadzieję wreszcie coś sensownie popiszę Czasem się zdarzy mi rozwiązać nietypowy dla mnie problem, może komuś się przyda trochę wiedzy przedstawionej tutaj. Tak czy inaczej, zapraszam do czytania<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=7&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Witaj na moim nowym devblogu, do którego mam nadzieję wreszcie coś sensownie popiszę <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Czasem się zdarzy mi rozwiązać nietypowy dla mnie problem, może komuś się przyda trochę wiedzy przedstawionej tutaj.</p>
<p>Tak czy inaczej, zapraszam do czytania <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/wisniadev.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/wisniadev.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wisniadev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/wisniadev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/wisniadev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/wisniadev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/wisniadev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/wisniadev.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/wisniadev.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/wisniadev.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wisniadev.wordpress.com&amp;blog=4541131&amp;post=7&amp;subd=wisniadev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://wisniadev.wordpress.com/2008/08/18/nowy-devblog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/75975ddf2bf2482d363fa39464b75744?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">wisnia</media:title>
		</media:content>
	</item>
	</channel>
</rss>
