<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dariusz on Software Quality</title>
	<atom:link href="http://blog.aplikacja.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aplikacja.info</link>
	<description>Software Engineering Process and Tools</description>
	<lastBuildDate>Sat, 25 May 2013 10:55:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Migration to python subprocess module</title>
		<link>http://blog.aplikacja.info/2013/05/migration-to-python-subprocess-module/</link>
		<comments>http://blog.aplikacja.info/2013/05/migration-to-python-subprocess-module/#comments</comments>
		<pubDate>Sat, 25 May 2013 10:55:19 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1992</guid>
		<description><![CDATA[After recent OS upgrade one of my unit tests started to fail (to be precise it started to hang). Quickly check showed me that CGI process started by os.popen() hanged. The old source code: f = os.popen("./cgi_script.cgi &#62; /dev/null", "w") f.write(postBody) f.flush() f.close() As os.popen() is deprecated now (I know, it&#8217;s a very old codebase [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.aplikacja.info/wp-content/uploads/2011/10/python-logo.gif"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  class="alignright size-full wp-image-1622" title="python-logo" src="http://blog.aplikacja.info/wp-content/uploads/2011/10/python-logo.gif" alt="" width="211" height="71" /></a>After recent OS upgrade one of my unit tests started to fail (to be precise it started to hang). Quickly check showed me that <strong>CGI process started by os.popen() hanged</strong>. The old source code:</p>
<blockquote>
<pre>f = os.popen("./cgi_script.cgi &gt; /dev/null", "w")
f.write(postBody)
f.flush()
f.close()</pre>
</blockquote>
<p>As <strong>os.popen() is deprecated</strong> now (I know, it&#8217;s a very old codebase that started with Python 1.5) I&#8217;ve moved to new <a href="http://docs.python.org/2/library/subprocess.html">subprocess module</a>:</p>
<blockquote>
<pre>fNull = file("/dev/null", "w")
p = subprocess.Popen("./cgi_script.cgi", shell=False, bufsize=1024, stdin = subprocess.PIPE, stdout = fNull)
fw = p.stdin
fw.write(postBody)
fw.flush()
fw.close()
del p</pre>
</blockquote>
<p>As you can see it&#8217;s more verbose now but I&#8217;ve eliminated shell (slightly <strong>faster operation</strong>).</p>
<p>Some notes found during migration:</p>
<ul>
<li>without &#8220;del p&#8221; process may be <strong>not terminated</strong> causing problems with DB state (CGI proces updates database and test checks this state later)</li>
<li>I/O configuration is more flexible than os.popen() &#8211; you can make pipes more easily</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/05/migration-to-python-subprocess-module/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Server flood automatic detection</title>
		<link>http://blog.aplikacja.info/2013/05/server-flood-automatic-detection/</link>
		<comments>http://blog.aplikacja.info/2013/05/server-flood-automatic-detection/#comments</comments>
		<pubDate>Wed, 22 May 2013 23:04:14 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[network]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1983</guid>
		<description><![CDATA[Mu current customer develops embedded devices used by many end users in Netherlands. In order to save server load devices use multicasts for downloading data: every device registers itself on multicast channel using IGMP and listens to UDP packets. No connections to be managed results in lower overhead. However, some data (or some requests) cannot [...]]]></description>
			<content:encoded><![CDATA[<p>Mu current customer develops embedded devices used by many end users in Netherlands. In order to save server load devices use <strong>multicasts for downloading data</strong>: every device registers itself on multicast channel using IGMP and listens to UDP packets. No connections to be managed results in lower overhead.</p>
<p>However, some data (or some requests) cannot be downloaded from multicasts channels and <strong>HTTP/HTTPS must be used</strong> to interact with server. As the number of devices is very high special methods have been used in order not to overload backend servers (randomised delays, client software optimization).</p>
<p>Consequently, small bug in client software that will trigger more events than usual <strong>can be very dangerous</strong> to whole system stability (because the effect of thousands of devices &#8211; perfect DDOS may kill back-end). In order to catch such errant behaviour as soon as possible I&#8217;ve developed daily report that controls server usage in my customer office.</p>
<p>First of all, we need to locate the most &#8220;interesting&#8221; device by IP address from logs (we list top 20 IPs based on server usage):</p>
<pre>    ssh $server "cat /path-to-logs/localhost_access_log.$date.log" | awk '
        {
            t[$1 " " $7]++
            ip[$1]++
        }
        END {
            for(a in t) { print t[a], a }
            max = 0
            max_ip = ""
            for(a in ip) { if(ip[a] &gt; max) { max=ip[a]; max_ip=a; } }
            print max_ip &gt; "/tmp/max_ip"
        }
    ' | sort -n | tail -20
    IP="`cat /tmp/max_ip`"</pre>
<p>Then selected IP will be examined hour-by-hour to locate patterns in behavior:</p>
<p><span id="more-1983"></span></p>
<blockquote>
<pre>ssh $server "cat /path-to-logs/localhost_access_log.$date.log" | awk -v "SEARCH=$IP" '
{ sub(/:[0-9][0-9]:[0-9][0-9]$/, "", $4); TIME=$4; s[TIME]; }
$0 ~ SEARCH { s[TIME]++;}
END { for(a in s) { print a, s[a] } }
' $* | sort</pre>
</blockquote>
<p>Sample results with included requested URLs:</p>
<blockquote>
<pre>Number of calls on 2013-05-22, server: tm2

3 192.168.4.101 /path/nPVR getseries
3 192.168.4.101 /path/reminder get
3 192.168.4.101 /path/rentedItems
3 192.168.4.101 /path/stbProperties get
3 192.168.4.101 /path/subscriberInfo
3 192.168.4.140 /path/autoConfig
6 192.168.4.249 /path/authenticate
6 192.168.4.249 /path/favorite get
6 192.168.4.249 /path/rentedItems
6 192.168.4.249 /path/stbProperties get
7 192.168.4.249 /path/reminder get
7 192.168.4.249 /path/subscriberInfo
8 192.168.4.140 /path/authenticate
8 192.168.4.249 /path/nPVR get
8 192.168.4.249 /path/nPVR getseries
16 192.168.4.254 /path/subscriberInfo
25 192.168.4.254 /path/nPVR get
25 192.168.4.254 /path/nPVR getseries
83 192.168.4.254 /path/favorite get
98 192.168.4.254 /path/reminder get

192.168.4.254 activity per hour:

[22/May/2013:00
[22/May/2013:01
[22/May/2013:02
[22/May/2013:03
[22/May/2013:04
[22/May/2013:05
[22/May/2013:06
[22/May/2013:07
[22/May/2013:08
[22/May/2013:09
[22/May/2013:10
[22/May/2013:11
[22/May/2013:12 8
[22/May/2013:13 4
[22/May/2013:14 16
[22/May/2013:15 18
[22/May/2013:16 12
[22/May/2013:17 50
<strong>[22/May/2013:18 24
[22/May/2013:19 24
[22/May/2013:20 24
[22/May/2013:21 24
[22/May/2013:22 24
[22/May/2013:23 22</strong></pre>
</blockquote>
<p>We can see that 192.168.4.254 device <strong>started to spam server 24 times per hour</strong> from 18:00 until midnight (imagine thousands of devices that synchronously send requests to back-end the same way). This device logs will be thoroughly examined for possible reason for that behaviour.</p>
<p>At Aplikacja.info, we believe that software problems <strong>must be located as early as possible</strong> (even during development process). In above example we re-use existing development environment to catch problems that might be discovered in production with huge user base.</p>
<p>The general idea is to move <strong>detection and neutralisation of a problem</strong> into this direction:</p>
<blockquote><p>1. end user -&gt; 2. customer&#8217;s QA -&gt; 3. development company&#8217;s QA -&gt; 4. developer (runtime) -&gt; 5. developer (build time)</p></blockquote>
<p>The more distance from end user a bug is detected and fixed <strong>the better for us</strong>. I hope you would love to squash problems the same way.</p>
<p>Happy hunting!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/05/server-flood-automatic-detection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google.com performance analysis over few years</title>
		<link>http://blog.aplikacja.info/2013/05/google-com-performance-analysis-over-few-years/</link>
		<comments>http://blog.aplikacja.info/2013/05/google-com-performance-analysis-over-few-years/#comments</comments>
		<pubDate>Wed, 22 May 2013 22:19:02 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[su]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1976</guid>
		<description><![CDATA[Time is money. No doubt about that. The more time your customer waits for your service response the less coins may hit your pocket. You may ask: why? If your page loading is too slow your &#8220;almost&#8221; customer hits back in his browser and selects another link from sponsored links Google provides him. You loose [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Time is money</strong>. No doubt about that. The more time your customer waits for your service response the less coins may hit your pocket. You may ask: why? If your page loading is too slow your &#8220;almost&#8221; customer hits back in his browser and selects another link from sponsored links Google provides him. You loose this customer in favour of another supplier.</p>
<p><strong>What about Google?</strong> Was their service (no kidding, it is a sevrice that searches information, paid by ads) always so blazingly fast? Let&#8217;s check this site performance monitored from London server over few years:</p>
<p><a href="http://blog.aplikacja.info/wp-content/uploads/2013/05/193.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-full wp-image-1977" title="193" src="http://blog.aplikacja.info/wp-content/uploads/2013/05/193.png" alt="" width="454" height="345" /></a>As we can see there were some <strong>small problems in 2009</strong> (~5% of requests required more than 1 second to be processed). Not so bad.</p>
<p><span id="more-1976"></span></p>
<p>In order to <strong>double check our measurement results</strong> there are monitor result from Newark, USA:</p>
<p><a href="http://blog.aplikacja.info/wp-content/uploads/2013/05/194.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-full wp-image-1978" title="194" src="http://blog.aplikacja.info/wp-content/uploads/2013/05/194.png" alt="" width="454" height="335" /></a>As you can see there were also (small) performance problems in 2009, in some months <strong>~2.5% of requests</strong> were processed in more than 10 seconds. <strong>Still pretty damn good</strong>.</p>
<p>You can see current stats for google <a href="http://site-uptime.net/su.cgi/report?publicKey=quoot2Wah3Bahf4IDie5megahfuchoes">here</a>, thanks to <a href="http://site-uptime.net">site-uptime.net</a> &#8211; <strong>site uptime monitor</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/05/google-com-performance-analysis-over-few-years/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP(S) exchange analysis using Wireshark</title>
		<link>http://blog.aplikacja.info/2013/05/https-exchange-analysis-using-wireshark/</link>
		<comments>http://blog.aplikacja.info/2013/05/https-exchange-analysis-using-wireshark/#comments</comments>
		<pubDate>Wed, 01 May 2013 11:33:09 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[network]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1969</guid>
		<description><![CDATA[Wireshark is a tool that allows to scan network packets and make analysis of network connection without direct access to server or client. Today we will show simple method to analyse TCP connections using this tool. TCP connection is composed of many IP packets, connected by common strem index number. You can select particular TCP [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wireshark.org/">Wireshark</a> is a tool that allows to scan network packets and make analysis of network connection without direct access to server or client. Today we will show simple method to analyse TCP connections using this tool.</p>
<p><strong>TCP connection</strong> is composed of many IP packets, connected by common strem index number. You can select particular TCP stream using Analyze / Follow TCP stream option or directly select given stream by it&#8217;s index:</p>
<blockquote><p>tcp.stream eq 9</p></blockquote>
<p>If you want track <strong>every opened connection</strong> you can check 1st packet of every TCP stream opened to particular server IP (213.75.34.114 in our example):</p>
<blockquote><p>tcp.flags.syn==1 and tcp.flags.ack==0 and ip.dst == 213.75.34.114</p></blockquote>
<p>Note that with <strong>HTTP/1.1</strong> things may be more complicated as this protocol supports &#8220;Persistent/Keep Alive&#8221; mode that allows multiple requests over one connection, so you may see only one packet with &#8220;tcp.flags.syn==1 and tcp.flags.ack==0&#8243;. In order to scan full exchange you have to analyse protocol contents for request / response pairs.</p>
<p>Another complication is <strong>HTTPS (HTTP over SSL layer)</strong> &#8211; you won&#8217;t be able even to count requests (if using &#8220;Keep Alive&#8221; mode). In this scenario you have to check traffic after HTTPS node or just inspect server logs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/05/https-exchange-analysis-using-wireshark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can you compete in crowded area?</title>
		<link>http://blog.aplikacja.info/2013/04/can-you-compete-in-crowded-area/</link>
		<comments>http://blog.aplikacja.info/2013/04/can-you-compete-in-crowded-area/#comments</comments>
		<pubDate>Sat, 27 Apr 2013 21:53:49 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[competition]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1966</guid>
		<description><![CDATA[Can you compete in crowded area? Below you will find two sample projects announced on guru.com. First: is hardware-related work, 2nd is a plain database: Notice the difference in proposals counters. 1st project has no bids as it&#8217;s: complicated: real time compression probably will require hardware support thus it requires pretty complicated embedding of  H264 [...]]]></description>
			<content:encoded><![CDATA[<p>Can you compete in crowded area?</p>
<p>Below you will find <strong>two sample projects</strong> announced on <a href="http://guru.com">guru.com</a>. First: is hardware-related work, 2nd is a plain database:</p>
<p><a href="http://blog.aplikacja.info/wp-content/uploads/2013/04/192.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-full wp-image-1967" title="192" src="http://blog.aplikacja.info/wp-content/uploads/2013/04/192.png" alt="" width="600" height="326" /></a></p>
<p>Notice <strong>the difference in proposals counters</strong>. 1st project has no bids as it&#8217;s:</p>
<ul>
<li><strong>complicated</strong>: real time compression probably will require hardware support thus it requires pretty complicated embedding of  H264 encoder on FPGA chip</li>
<li><strong>unpopular</strong>: I bet hardware guys are outnumbered by PHP programmers with ratio 1 to 1000</li>
<li><strong>risky</strong>: you cannot work on high level of abstraction leaving all the ugly details (OS services, memory management, &#8230;) for lower layers</li>
</ul>
<p>2nd project has <strong>many proposals</strong> and I bet there are many talented Hindi specialists that will do the job for 20% of offer you expect to earn. So you will loose with your bid (make no money).</p>
<p>The general idea is to <strong>find a niche</strong> that is not easy to reach by other software development companies to be able to compete in smaller market. Even if you have brilliant PHP programmers you have to limit your project budget expectations according to 100s others PHP-related companies around, the one with highest quality / cost will win.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/04/can-you-compete-in-crowded-area/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automated tests reorgnization</title>
		<link>http://blog.aplikacja.info/2013/04/automated-tests-reorgnization/</link>
		<comments>http://blog.aplikacja.info/2013/04/automated-tests-reorgnization/#comments</comments>
		<pubDate>Sun, 21 Apr 2013 06:36:09 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1958</guid>
		<description><![CDATA[My customer develops software for embedded devices using Linux. In the very beginning of this project we faced low stability of builds produced due to complicated nature of platform (C++, manual memory management, new APIs to learn). Of course QA located such bugs, but it was triggered before release on release branches. In order to [...]]]></description>
			<content:encoded><![CDATA[<p>My customer develops software for embedded devices using Linux. In the very beginning of this project we faced <strong>low stability of builds</strong> produced due to complicated nature of platform (C++, manual memory management, new APIs to learn). Of course QA located such bugs, but it was triggered before release on release branches.</p>
<p>In order to support QA and track current state of software stability I added <a href="http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/">automated random tests</a> feature:</p>
<p><a href="http://blog.aplikacja.info/wp-content/uploads/2013/04/random-3.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-full wp-image-1961" title="random-3" src="http://blog.aplikacja.info/wp-content/uploads/2013/04/random-3.png" alt="" width="483" height="195" /></a></p>
<p>Every build produced by the build system hits testing devices automatically and crash / failed asserts  / warnings reports are published to developers (daily, in aggregated form).</p>
<p><span id="more-1958"></span></p>
<p>We tracked <strong>every release branch</strong> (assuming it&#8217;s the most important point for quality measurements). The situation was like on diagram below.</p>
<p style="text-align: center;"><a href="http://blog.aplikacja.info/wp-content/uploads/2013/04/random-1.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter  wp-image-1959" title="random-1" src="http://blog.aplikacja.info/wp-content/uploads/2013/04/random-1.png" alt="" width="503" height="373" /></a></p>
<p style="text-align: left;">The obvious problem you may notice is related to <strong>multiple release branches</strong> that must be tested (some support branches live for few months). For every new branch you have to setup new testing device (I decided to attach one device per one tested version). This solution was not scalable and not very easy to maintain.</p>
<p style="text-align: left;">If we assume that every fix done for release branch (2.0.3 for example) hits at last his master branch (2.0) it&#8217;s obvious that potential regressions can be tracked automatically using <strong>only master branches</strong>:</p>
<p style="text-align: left;"><a href="http://blog.aplikacja.info/wp-content/uploads/2013/04/random-2.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter  wp-image-1960" title="random-2" src="http://blog.aplikacja.info/wp-content/uploads/2013/04/random-2.png" alt="" width="511" height="342" /></a>Benefits are quite obvious:</p>
<ul>
<li><strong>regression cause detection</strong> during normal development (on master branch) is done more accurately &#8211; we are able to say that given problem was added new change X on day Y near hour Z &#8211; it&#8217;s visible from automatic tests outcomes (crashes / failed asserts starting from version X)</li>
<li><strong>less reconfiguration overhead</strong> &#8211; main development lines are changed less frequently that release branches</li>
<li><strong>more resources for multi-platform tests</strong>: if there&#8217;s less points in source tree to track we can focus on duplicating hardware for automatic tests &#8211; some bugs are hardware-related</li>
</ul>
<p>Drawbacks:</p>
<ul>
<li><strong>we don&#8217;t track exact released versions</strong>: that&#8217;s true, but we have QA for this purpose (to test final builds)</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/04/automated-tests-reorgnization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Openembedded: tracking dependencies, the effective way</title>
		<link>http://blog.aplikacja.info/2013/04/openembedded-tracking-dependencies-the-effective-way/</link>
		<comments>http://blog.aplikacja.info/2013/04/openembedded-tracking-dependencies-the-effective-way/#comments</comments>
		<pubDate>Fri, 19 Apr 2013 08:26:10 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[oe]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1954</guid>
		<description><![CDATA[Openembedded is a tool to build Linux-based distribudions from source where you can customize almost every aspect of operating system and it&#8217;s default components. Used mainly for embedded systems development. I&#8217;ll show today how you can check easily (command-line, of course) dependencies chain. Sometimes you want to see why particular package has been included into [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://openembedded.org">Openembedded</a> is a tool to build Linux-based distribudions from source where you can customize almost every aspect of operating system and it&#8217;s default components. Used mainly for embedded systems development. I&#8217;ll show today how you can check easily (command-line, of course) dependencies chain.</p>
<p>Sometimes you want to see <strong>why particular package has been included</strong> into the image.</p>
<blockquote><p>$ bitbake -g devel-image<br />
NOTE: Handling BitBake files: \ (1205/1205) [100 %]<br />
Parsing of 1205 .bb files complete (1130 cached, 75 parsed). 1548 targets, 13 skipped, 0 masked, 0 errors.<br />
NOTE: Resolving any missing task queue dependencies<br />
NOTE: preferred version 1.0.0a of openssl-native not available (for item openssl-native)<br />
NOTE: Preparing runqueue<br />
PN dependencies saved to &#8216;pn-depends.dot&#8217;<br />
Package dependencies saved to &#8216;package-depends.dot&#8217;<br />
Task dependencies saved to &#8216;task-depends.dot&#8217;</p></blockquote>
<p>By using:</p>
<blockquote><p>grep package-name pn-depends.dot</p></blockquote>
<p>you can track what is <strong>the dependency chain</strong> for particular package, for example, let&#8217;s see what&#8217;s the reason for inclusion of readline in resulting filesystem:</p>
<blockquote><p>$ grep &#8216;&gt;.*readline&#8217; pn-depends.dot<br />
&#8220;gdb&#8221; -&gt; &#8220;readline&#8221;<br />
&#8220;python-native&#8221; -&gt; &#8220;readline-native&#8221;<br />
&#8220;sqlite3-native&#8221; -&gt; &#8220;readline-native&#8221;<br />
<strong>&#8220;sqlite3&#8243; -&gt; &#8220;readline&#8221;</strong><br />
&#8220;readline&#8221; -&gt; &#8220;readline&#8221; [style=dashed]</p>
<p>$ grep &#8216;&gt;.*sqlite3&#8242; pn-depends.dot<br />
&#8220;python-native&#8221; -&gt; &#8220;sqlite3-native&#8221;<br />
&#8220;qt4-embedded&#8221; -&gt; &#8220;sqlite3&#8243;<br />
&#8220;utc-devel-image&#8221; -&gt; &#8220;sqlite3&#8243;<br />
&#8220;sqlite3&#8243; -&gt; &#8220;sqlite3&#8243; [style=dashed]<br />
<strong>&#8220;devel-image&#8221; -&gt; &#8220;sqlite3&#8243; [style=dashed]</strong><br />
&#8220;devel-image&#8221; -&gt; &#8220;sqlite3-dbg&#8221; [style=dashed]</p></blockquote>
<p>As we can see that it&#8217;s the &#8220;devel-image&#8221; that requested &#8220;sqlite3&#8243; and then &#8220;readline&#8221; was incorporated <strong>as a dependency</strong>.</p>
<p>*.dot fomat can be <strong>visualised</strong>, but it&#8217;s useles feature as the resulting graph may be too big to analyse.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/04/openembedded-tracking-dependencies-the-effective-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ignore sockets during tar backup</title>
		<link>http://blog.aplikacja.info/2013/04/ignore-sockets-during-tar-backup/</link>
		<comments>http://blog.aplikacja.info/2013/04/ignore-sockets-during-tar-backup/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 07:24:28 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[sh]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1946</guid>
		<description><![CDATA[If you want to skip error sockets-related code during backup of whole filesystem you will be surprised there&#8217;s no &#8211;ignore-sockets switch. But there&#8217;s elegant method to to that: cd / sudo find . -type s &#62; /tmp/sockets.lst if sudo tar zcvpf $TMP_FILE --one-file-system --exclude-from=/tmp/sockets.lst -C / . then     echo backup OK fi]]></description>
			<content:encoded><![CDATA[<p>If you want to skip error sockets-related code during backup of whole filesystem you will be surprised there&#8217;s no &#8211;ignore-sockets switch. But there&#8217;s elegant method to to that:</p>
<blockquote>
<pre>cd /
sudo find . -type s &gt; /tmp/sockets.lst
if sudo tar zcvpf $TMP_FILE --one-file-system --exclude-from=/tmp/sockets.lst -C / .
then
    echo backup OK
fi</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/04/ignore-sockets-during-tar-backup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP auto quotes escape in allegro.pl</title>
		<link>http://blog.aplikacja.info/2013/04/php-auto-quotes-escape-in-allegro-pl/</link>
		<comments>http://blog.aplikacja.info/2013/04/php-auto-quotes-escape-in-allegro-pl/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 14:50:04 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1942</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.aplikacja.info/wp-content/uploads/2013/04/174.png"><img style=' display: block; margin-right: auto; margin-left: auto;'  class="aligncenter size-full wp-image-1943" title="174" src="http://blog.aplikacja.info/wp-content/uploads/2013/04/174.png" alt="" width="468" height="244" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/04/php-auto-quotes-escape-in-allegro-pl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use tcpdump to sniff HTTP requests</title>
		<link>http://blog.aplikacja.info/2013/04/use-tcpdump-to-sniff-http-requests/</link>
		<comments>http://blog.aplikacja.info/2013/04/use-tcpdump-to-sniff-http-requests/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 08:04:12 +0000</pubDate>
		<dc:creator>dariusz.cieslak</dc:creator>
				<category><![CDATA[en]]></category>
		<category><![CDATA[network]]></category>

		<guid isPermaLink="false">http://blog.aplikacja.info/?p=1937</guid>
		<description><![CDATA[Sometimes you are interested if the software issues proper HTTP requests to the server. You have three options here: checking client logs and assume all HTTP requests are reported checking server logs to see what have been issued using tcpdump for traffic monitoring I&#8217;ll show you 3rd method &#8211; it&#8217;s useful if you don&#8217;t have [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.aplikacja.info/wp-content/uploads/2012/02/cable-ethernet.jpg"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  class="alignright size-thumbnail wp-image-1744" title="cable-ethernet" src="http://blog.aplikacja.info/wp-content/uploads/2012/02/cable-ethernet-150x150.jpg" alt="" width="150" height="150" /></a>Sometimes you are interested if the software issues <strong>proper HTTP requests</strong> to the server. You have three options here:</p>
<ol>
<li>checking <strong>client logs</strong> and assume all HTTP requests are reported</li>
<li>checking <strong>server logs</strong> to see what have been issued</li>
<li>using tcpdump for <strong>traffic monitoring</strong></li>
</ol>
<p>I&#8217;ll show you 3rd method &#8211; it&#8217;s useful if you don&#8217;t have access to server nor to client logs.</p>
<blockquote>
<pre>$ sudo tcpdump -s 1024 -l -A dst 192.168.3.120 -i eth0 | grep HTTP
..Hp.c..GET /url/path?param1=value1&amp;OpCode=add&amp;ChannelID=101434 HTTP/1.1
.....c.*GET /url/path?param2=value2&amp;OpCode=add&amp;ChannelID=101434 HTTP/1.1</pre>
</blockquote>
<p>192.168.3.120 is the server IP address.</p>
<p>Pretty simple and <strong>more elegant</strong> solution than using full wireshark (and you can use it having only console access).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aplikacja.info/2013/04/use-tcpdump-to-sniff-http-requests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
