<?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>Mark J. Wielaard &#187; Frysk</title>
	<atom:link href="http://gnu.wildebeest.org/diary/category/frysk/feed/" rel="self" type="application/rss+xml" />
	<link>http://gnu.wildebeest.org/diary</link>
	<description>Diary</description>
	<lastBuildDate>Thu, 21 Jan 2010 23:33:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Frysk example utilities</title>
		<link>http://gnu.wildebeest.org/diary/2008/03/14/frysk-example-utilities/</link>
		<comments>http://gnu.wildebeest.org/diary/2008/03/14/frysk-example-utilities/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 10:19:17 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2008/03/14/frysk-example-utilities/</guid>
		<description><![CDATA[Phil recently wrote up some examples of utilities created on top of the Frysk framework that you might find handy (part1, part2, part3). We now also have the frysk manual pages online.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://picobot.org/">Phil</a> recently wrote up some examples of utilities created on top of the <a href="http://sourceware.org/frysk/">Frysk</a> framework that you might find handy (<a href="http://picobot.org/wordpress/?p=18">part1</a>, <a href="http://picobot.org/wordpress/?p=19">part2</a>, <a href="http://picobot.org/wordpress/?p=20">part3</a>). We now also have the <a href="http://sourceware.org/frysk/manpages/">frysk manual pages</a> online.</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2008/03/14/frysk-example-utilities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ian Lance Taylor&#8217;s Linker Notes</title>
		<link>http://gnu.wildebeest.org/diary/2007/08/31/ian-lance-taylors-linker-notes/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/08/31/ian-lance-taylors-linker-notes/#comments</comments>
		<pubDate>Fri, 31 Aug 2007 16:20:52 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/08/31/ian-lance-taylors-linker-notes/</guid>
		<description><![CDATA[Ian Lance Taylor is working on a new ELF linker called gold which is designed for speed and will do incremental linking. He is writing notes on how linkers work (with specifics for ELF and i386) which are a must read for everybody interested in these kind of low level technicalities.

Linkers part 1 &#8211; A [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.airs.com/ian/">Ian Lance Taylor</a> is working on a new ELF linker called gold which is designed for speed and will do incremental linking. He is writing notes on how linkers work (with specifics for ELF and i386) which are a must read for everybody interested in these kind of low level technicalities.</p>
<ul>
<li><a href="http://www.airs.com/blog/archives/38">Linkers part 1</a> &#8211; A Personal Introduction and A Technical Introduction.</li>
<li><a href="http://www.airs.com/blog/archives/39">Linkers part 2</a> &#8211; Linker Technical Introduction, Basic Linker Data Types, Basic Linker Operations.</li>
<li><a href="http://www.airs.com/blog/archives/40">Linkers part 3</a> &#8211; Address Spaces, Object File Formats.</li>
<li><a href="http://www.airs.com/blog/archives/41">Linkers part 4</a> &#8211; Shared Libraries (Procedure Linkage Table &#8211; PLT and Global Offset Table &#8211; GOT).</li>
<li><a href="http://www.airs.com/blog/archives/42">Linkers part 5</a> &#8211; Shared Libraries Redux, ELF Symbols.</li>
<li><a href="http://www.airs.com/blog/archives/43">Linkers part 6</a> &#8211; Relocations, Position Dependent Shared Libraries.</li>
</ul>
<p>There will be more notes in the future, but this should keep you occupied for a little while (should make a great weekend read) The writing does jump a little between subjects, just keep on reading and go back over all the notes again in the end. There are some assembler tricks in there so keep your x86 assembly manual handy. Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/08/31/ian-lance-taylors-linker-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stack unwinding</title>
		<link>http://gnu.wildebeest.org/diary/2007/08/23/stack-unwinding/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/08/23/stack-unwinding/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 12:39:33 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/08/23/stack-unwinding/</guid>
		<description><![CDATA[For Frysk I am working to add .debug_frame support to libunwind. Since I didn&#8217;t know that much about stack unwinding and since some of the details are hard to grasp without some historical context I wrote the following to summarize all the relevant documentation pointers that I could find on stack unwinding. Please do let [...]]]></description>
			<content:encoded><![CDATA[<p>For <a href="http://www.sourceware.org/frysk/">Frysk</a> I am working to add <code>.debug_frame</code> support to <a href="http://www.nongnu.org/libunwind/">libunwind</a>. Since I didn&#8217;t know that much about stack unwinding and since some of the details are hard to grasp without some historical context I wrote the following to summarize all the relevant documentation pointers that I could find on stack unwinding. Please do let me know if I got any details wrong (the following is mostly written with <code>x86/x86_64</code> in mind since that is what I am currently interested in).</p>
<p>Unwinding the call stack used to be something only a debugger would do and relied on the executable having a <a href="http://en.wikipedia.org/wiki/Frame_pointer">frame pointer</a> in a dedicated register that points to the bottom of the stack frame for the current function which also contained the return address. Having a frame pointer allows you to quickly walk the call stack and get all the addresses. If you can map those to the names of the relevant functions they are in you have a nice backtrace for the user.</p>
<p>If you want to get more of the state in each call frame then you could rely on each function having a <a href="http://en.wikipedia.org/wiki/Function_prologue">prologue and epilogue</a> that saved and restored the registers of the caller (some architectures like <code>x86</code> even have special instructions to help push and pop the relevant registers on the stack on function entry and return). Given a calling convention for a particular architecture you could use these to reliably find the original registers on the stack, which in turn with some debug info would give you the values of variables and arguments of the functions on the call stack.</p>
<p>Unfortunately compilers got smart and optimized code might not keep a frame pointer (frees up one more register) and might reschedule the function prologue and epilogue instructions between the other instructions in the function. All making it pretty hard for an unwinder to reconstruct the previous call frames on the stack. In particular <code>x86_64</code> does away with a standard frame pointer. You can still get some information back by <a href="http://sourceware.org/gdb/current/onlinedocs/gdbint_3.html#SEC8">conservatively approximating the instructions in the function</a> and guessing at the actual way the various registers are stored but this becomes pretty messy pretty quickly.</p>
<p>To help debuggers still get all the information needed to unwind a stack and restore all needed registers the debugging information (DWARF) generated by compilers was extended to include Call Frame Information (CFI) that allows a debugger to reconstruct the calling pc and registers of a function (see the <a href="http://wiki.dwarfstd.org/">DWARF 3 spec</a> &#8211; section 6.4). This information is stored in the <code>.debug_frame</code> section of an ELF file. It uses a simplified version of the DWARF instructions (not all operands are relevant for reconstructing the registers). This section is not guaranteed to be available, it is not necessarily loaded into memory and can even be split off into its own debug info file in some distributions.</p>
<p>At the same time different languages got constructs (exceptions, continuations, global gotos, asynchronous garbage collectors, etc) which required some sort of reliable unwinding (and in some cases rewinding) of the call stack. Since some optimizations and some newer architectures also did away with a standard frame pointer another way to reliably unwind the stack was needed. This became the exception handler framework (<code>.eh_frame</code>) which is based on the DWARF CFI work but which is slightly different. Unfortunately nobody seems to have documented the precise differences between the formats. So you will have to carefully read both the DWARF standard and the <a href="http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html">LSB core specification Exception Frames</a> side-by-side.</p>
<p>Note that a debugger that wants to walk a stack and recover all registers might need more information than some of these language constructs, which might only need unwind information for specific call sites. Depending on optimizations, architecture and language compiled (and sometimes specific distribution default choices) no, full or partial exception handler unwind information and/or frame pointers are generated (see the <a href="http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html">GCC options</a> <code>-funwind-tables</code> and <code>-fasynchronous-unwind-tables</code>).</p>
<p>Both the DWARF and the exception handler specs are architecture neutral. But since you do need to a mapping between the actual registers and the specs you also need to consult the relevant architecture abi that defines the actual mapping. Sometimes these architecture abi specs also define some DWARF/EH extensions. See for example the <a href="http://www.x86-64.org/documentation/abi.pdf"><code>x86_64</code> abi spec</a> (Section 3.6 and 3.7).</p>
<p>Note that in practice what gcc generates overrides any of the above specs, and if <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32982">a discrepancy is found</a> the spec usually gets updated. And that one should be careful about <a href="http://wiki.dwarfstd.org/index.php?title=DWARF_FAQ#How_big_is_a_DW_FORM_ref_addr.3F">bugs in the old DWARF 2 spec</a> and <a href="http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html">extension of DWARF specified by the LSB</a> (which mostly augment DWARF 2 to be like DWARF 3, at least for the exception handler sections).</p>
<p>If an <code>.eh_frame</code> section is available in an ELF file it is guaranteed to be loaded into memory. But depending on architecture and language being compiled might not be available at all (and neither might the frame pointer or the <code>.debug_frame</code> section). This does also mean that unwind information might be stored differently for different components linked together into a program if they were compiled with different flags or have different source languages, making cross component/language unwinding an interesting exercise.</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/08/23/stack-unwinding/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bad Memory</title>
		<link>http://gnu.wildebeest.org/diary/2007/08/20/bad-memory/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/08/20/bad-memory/#comments</comments>
		<pubDate>Mon, 20 Aug 2007 09:06:01 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/08/20/bad-memory/</guid>
		<description><![CDATA[Once or twice a week my personal server had some weird trouble with httpd, spamassasin or named suddenly crashing. It seemed impossible to replicate but in recent weeks the problem became worse. First I thought it was some software problem. So I decided to upgrade to CentOS 5. But in the middle of the upgrade [...]]]></description>
			<content:encoded><![CDATA[<p>Once or twice a week my personal server had some weird trouble with httpd, spamassasin or named suddenly crashing. It seemed impossible to replicate but in recent weeks the problem became worse. First I thought it was some software problem. So I decided to upgrade to <a href="http://www.centos.org/docs/5/">CentOS 5</a>. But in the middle of the upgrade the installer suddenly crashed. Luckily the upgrade could be resumed after a reboot into the rescue CD, but it was a bit ugly. Even though the disk, CD and memory (hours of running <a href="http://www.memtest.org/">MemTest86+</a>) all looked fine I finally decided to replace the memory. And wow, the server is as stable as can be. Moral of the story, don&#8217;t blame your software (Free Software is uber-stable!) suspect hardware problems (and don&#8217;t think MemTest86+ can actually find all memory problems).</p>
<p>
Now that my server was uber-stable again (and pretty modern because of the CentOS 5 upgrade) I played a bit with setting up a <a href="http://www.selenic.com/mercurial/">Mercurial</a> and <a href="http://trac.edgewall.org/">Trac</a> <a href="http://gnu.wildebeest.org/trac/frysk/">mirror</a> for <a href="http://www.sourceware.org/frysk/">Frysk</a>. This was super easy with <a href="http://fedoraproject.org/wiki/EPEL">EPEL</a> a Fedora spinoff to provide stable packages for the enterprise distros (RHEL, CentOS and Scientific Linux). The only thing missing was <a href="http://progetti.arstecnica.it/tailor/">Tailor</a> but that could be easily build from the Fedora source package. Trac is super nice, easy to configure and theme for small projects. It provides a wiki, roadmap, ticketing/bug system and source browser for various source code management systems (subversion, mercurial, git or bazaar). And you can disable anything you don&#8217;t need (for the Frysk mirror I am only using the source browser). I am definitely going to use Trac plus some distributed source management system for my next project.</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/08/20/bad-memory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perfmon2: A flexible performance monitoring interface for Linux</title>
		<link>http://gnu.wildebeest.org/diary/2007/07/18/perfmon2-a-flexible-performance-monitoring-interface-for-linux/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/07/18/perfmon2-a-flexible-performance-monitoring-interface-for-linux/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 11:50:01 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/07/18/perfmon2-a-flexible-performance-monitoring-interface-for-linux/</guid>
		<description><![CDATA[The 2006 OLS paper Perfmon2: A flexible performance monitoring interface for Linux by Stéphane Eranian gives an overview of designing a generic interface for hardware monitoring for a diverse test of processors. Modern processors have all kinds of support to collect information about cpu cycles used, instruction pipelines, on-chip caches, etc.
Since the Performance Monitoring Unit [...]]]></description>
			<content:encoded><![CDATA[<p>The 2006 OLS paper <a href="https://ols2006.108.redhat.com/reprints/eranian-reprint.pdf">Perfmon2: A flexible performance monitoring interface for Linux</a> by Stéphane Eranian gives an overview of designing a generic interface for hardware monitoring for a diverse test of processors. Modern processors have all kinds of support to collect information about cpu cycles used, instruction pipelines, on-chip caches, etc.</p>
<p>Since the Performance Monitoring Unit (PMU) on different processor architectures are so different and support collecting very different sets of events designing a generic interface is pretty hard. But it looks like <a href="http://perfmon2.sourceforge.net/">perfmon2</a> does present a nice, although somewhat complex, common interface to program the Performance Monitoring Configuration (PMC) registers and read the data collected in the Performance Monitoring Data (PMD) registers. And it provides a somewhat nicer way to program and collect data than having to go through the raw hardware.  It provides things like generic 64-bit counters for events (and in gneeral makes sure that all data structures use fixed-size data types), even if the underlying hardware has smaller counters (doing emulation in software when the hardware counters overflow). And most importantly makes it available to user space in a secure manner, so one doesn&#8217;t need direct hardware access in privileged mode and prevents &#8220;data leaks&#8221; between untrusted processes.</p>
<p>The interface allows for both counting and profiling (sampling) events on a per-thread or per-cpu basis. But whole-process or whole-system profilling is left up to the user (through ptrace attaching a thread and tracking clone events, although exec events do automatically carry over monitoring contexts. Maybe a utrace based framework would make things simpler here, but currently it seems the perfmon2 and utrace patches don&#8217;t mix). The paper is somewhat vague on how and when one can use a mixed per-thread and per-cpu environment, which is somewhat unfortunate since it looks like if an admin is using per-cpu monitoring a self-monitoring process cannot simultaneously use the MPD counters. Self-monitoring is interesting since it means a dynamic runtime environment like hotspot that dynamically regenerates code can easily see &#8220;hot code paths&#8221;. One limitation seems to be that threads using this technique need to be tied to one processor since the monitoring context cannot migrate between CPUs.</p>
<p>The paper gives a good overview of the various techniques used to detect and access the various events supported by the CPU and expose the counters through new system calls, translation files in /sys/kernel from logical registers to actual register names and mapping in read only shared buffers between kernel and user space for self-monitoring threads. The event sets and multiplexing of events is interesting but very abstract. The paper doesn&#8217;t contain any code samples and one is assumed to know the kind of performance event counters modern CPUs support. Things become a little easier if one reads this paper while having access to a system with <code>pfmon</code> tool (and the perfmon2 kernel patch) installed or reading the <a href="http://perfmon2.sourceforge.net/pfmon_usersguide.html">pfmon manual</a> to look at examples to make things a bit more concrete.</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/07/18/perfmon2-a-flexible-performance-monitoring-interface-for-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The 7 dwarves</title>
		<link>http://gnu.wildebeest.org/diary/2007/07/10/the-7-dwarves/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/07/10/the-7-dwarves/#comments</comments>
		<pubDate>Tue, 10 Jul 2007 08:37:25 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/07/10/the-7-dwarves/</guid>
		<description><![CDATA[Arnaldo Carvalho de Melo wrote an interesting paper for OLS: The 7 dwarves: debugging information beyond gdb. Dwarves is a DWARF debugging information library and a set of tools that uses the DWARF information inserted in ELF binaries. The tools can help you understand DWARF and the debug information available in programs (and the kernel) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://oops.ghostprotocols.net:81/blog/">Arnaldo Carvalho de Melo</a> wrote an interesting paper for OLS: <a href="https://ols2006.108.redhat.com/2007/Reprints/melo-Reprint.pdf">The 7 dwarves: debugging information beyond gdb</a>. Dwarves is a <a href="http://dwarfstd.org/">DWARF</a> debugging information library and a set of tools that uses the DWARF information inserted in <a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format" rel="nofollow">ELF</a> binaries<a href="http://sourceware.org/systemtap/" rel="nofollow"></a>. The tools can help you understand DWARF and the debug information available in programs (and the kernel) to do such fun things as finding holes in data structures, cacheline alignment, pack those structures (it can actually decode the debug info and generate C source code for you and explain why and how it moved the fields around) and it can analyse inline decissions made by the compiler and tell you what functions got inlined by the compiler and which were marked for inlining by the programmer. You can also get something like <a href="http://sab39.netreach.com/japi/">japitools</a> for C/C++ with the codiff utility that inspects data structures and function changes between different versions of a binary. One interesting thing is ctracer that can use the information on structs and functions to automatically track changes in those datastructures when it moves through the code. Currently this only works for the kernel and uses raw <a href="http://sourceware.org/systemtap/kprobes/">kprobes</a> to collect statistics. But one idea is to extend this to automatically generate <a href="http://www.sourceware.org/systemtap/">systemtap</a> scripts to gain all the safety guards that systemtap provides for statistics collection of a running kernel and with <a href="https://ols2006.108.redhat.com/2007/Reprints/keniston-Reprint.pdf">uprobes</a> coming it will then extend to user space also.</p>
<p>Another nice paper about DWARF is <a href="http://dwarfstd.org/Debugging%20using%20DWARF.pdf">Introduction to the DWARF Debugging Format</a>, by Michael Eager</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/07/10/the-7-dwarves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>yum source and debug info</title>
		<link>http://gnu.wildebeest.org/diary/2007/04/26/yum-source-and-debug-info/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/04/26/yum-source-and-debug-info/#comments</comments>
		<pubDate>Thu, 26 Apr 2007 07:10:56 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/04/26/yum-source-and-debug-info/</guid>
		<description><![CDATA[Getting package source and debug info isn&#8217;t always as transparent on Fedora as I would like. But there is yum-utils that provides yumdownloader which can get packages given that you know the source package name (is there an easy way to find that out/automate that?).
yumdownloader --enablerepo=core-source --source gcc
(don&#8217;t forget that you have to enable the [...]]]></description>
			<content:encoded><![CDATA[<p>Getting package source and debug info isn&#8217;t always as transparent on <a href="http://www.fedoraproject.org/">Fedora</a> as I would like. But there is <a href="http://wiki.linux.duke.edu/YumUtils">yum-utils</a> that provides yumdownloader which can get packages given that you know the source package name (is there an easy way to find that out/automate that?).</p>
<pre>yumdownloader --enablerepo=core-source --source gcc</pre>
<p>(don&#8217;t forget that you have to enable the correct source repo for the package, also don&#8217;t know whether that can be automated)<br />
Now <a href="http://skvidal.wordpress.com/">Seth Vidal</a> wrote <a href="http://skvidal.wordpress.com/2007/04/26/my-broken-memory-and-debuginfos/">debuginfo-install</a> to get the debug packages (and dependencies) for a package. Now if we could automate all these things in such a way that you automagically get all relevant debug-info and optionally the sources downloaded and installed from <a href="http://www.sourceware.org/frysk/">Frysk</a> when inspecting a package that would be really cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/04/26/yum-source-and-debug-info/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nice tools</title>
		<link>http://gnu.wildebeest.org/diary/2007/04/16/nice-tools/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/04/16/nice-tools/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 19:16:05 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/04/16/nice-tools/</guid>
		<description><![CDATA[
Caolan McNamara &#8211; Backtraces and prelink
Rob Bradford &#8211; OProfileUI Profiling made pretty

]]></description>
			<content:encoded><![CDATA[<ul>
<li>Caolan McNamara &#8211; <a href="http://blogs.linux.ie/caolan/2007/04/16/backtraces-and-prelink/">Backtraces and prelink</a></li>
<li>Rob Bradford &#8211; <a href="http://projects.o-hand.com/oprofileui">OProfileUI</a> <a href="http://www.robster.org.uk/blog/2007/04/16/profiling-made-pretty/">Profiling made pretty</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/04/16/nice-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Planet Frysk</title>
		<link>http://gnu.wildebeest.org/diary/2007/03/26/planet-frysk/</link>
		<comments>http://gnu.wildebeest.org/diary/2007/03/26/planet-frysk/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 14:29:52 +0000</pubDate>
		<dc:creator>Mark Wielaard</dc:creator>
				<category><![CDATA[Frysk]]></category>

		<guid isPermaLink="false">http://gnu.wildebeest.org/diary/2007/03/26/planet-frysk/</guid>
		<description><![CDATA[Phil Muldoon setup Planet Frysk. Cool!
]]></description>
			<content:encoded><![CDATA[<p><a href="http://picobot.org/">Phil Muldoon</a> setup <a href="http://planet.fryskproject.org">Planet Frysk</a>. Cool!</p>
]]></content:encoded>
			<wfw:commentRss>http://gnu.wildebeest.org/diary/2007/03/26/planet-frysk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
