<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1729203473305809245</id><updated>2012-01-17T02:42:56.566-08:00</updated><title type='text'>Dominik Seichter's blog: KRename, KBarcode, PoDoFo</title><subtitle type='html'>Information about the development of KBarcode, KRename and PoDoFo - and other OpenSource projects I'm involved in.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-3459457578107219237</id><published>2011-02-06T02:12:00.000-08:00</published><updated>2011-02-06T02:49:20.470-08:00</updated><title type='text'>Directory Management with KRename</title><content type='html'>Yesterday, I got a very interesting e-mail from Todd about using &lt;b&gt;KRename&lt;/b&gt;. His request required one new feature which was added to &lt;a href="http://domseichter.blogspot.com/2010/02/building-krename-trunk-from-svn.html"&gt;KRename SVN&lt;/a&gt; and makes &lt;b&gt;KRename&lt;/b&gt; even more powerful. So, I think his usecase is interesting enough to be shown here.&lt;br /&gt;&lt;br /&gt;First of all, he has several files which he wants to sort into different directories based on parts of their names. If the filename contains the word "essay" it is supposed to go into a subdirectory called "essay/" and the same should be done for the memo's. His example list of files looks like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Work Essay for fred.txt&lt;br /&gt;Work Essay for bob.odt&lt;br /&gt;Work Essay for alice.doc&lt;br /&gt;Work Memo for mary.odt&lt;br /&gt;Work Memo for ben.txt&lt;br /&gt;Work Memo for carey.doc&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;At the end, we want a directory and file structure like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Essay/Work Essay for fred.txt&lt;br /&gt;Essay/Work Essay for bob.odt&lt;br /&gt;Essay/Work Essay for alice.doc&lt;br /&gt;Memo/Work Memo for mary.odt&lt;br /&gt;Memo/Work Memo for ben.txt&lt;br /&gt;Memo/Work Memo for carey.doc&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can create directories in &lt;b&gt;KRename&lt;/b&gt; during renaming of files using the &lt;b&gt;[dirsep]&lt;/b&gt; operator or by simply using a &lt;b&gt;/&lt;/b&gt; (slash) in the template. So, the template &lt;i&gt;newdir[dirsep]$&lt;/i&gt; will create a new directory called &lt;i&gt;newdir&lt;/i&gt; and move all files to this directory. The token $ is &lt;b&gt;KRename'&lt;/b&gt; way of saying, "insert the original filename here".&lt;br /&gt;&lt;br /&gt;Now, one can combine this feature with the powerful regular expressions. Just go to the "Search and Replace ..." dialog and enter the regular expression &lt;b&gt;Work ([\w]+) for&lt;/b&gt; and replace it with &lt;b&gt;\1[direp]Work \1 for&lt;/b&gt;. The backreference &lt;b&gt;\1&lt;/b&gt; inserts a matched string from the regular expression into the results. Thereby, we can include either "memo" or "essay" in the new directory name. The matched part is indicated by brackets in the regular expression.&lt;br /&gt;&lt;br /&gt;To make this work, one new feature was added to &lt;b&gt;KRename&lt;/b&gt;. The dialog contains a new checkbox which allows to enable processing of &lt;b&gt;KRename&lt;/b&gt; tokens in the replacement string of find and replace. We need this feature to process the &lt;i&gt;[dirsep]&lt;/i&gt; token correctly and create a new directory&lt;br /&gt;See the screenshots below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TU57bW5fAzI/AAAAAAAAAEc/SLwscdAMBaA/s1600/krename_regexp1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 144px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TU57bW5fAzI/AAAAAAAAAEc/SLwscdAMBaA/s320/krename_regexp1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5570525499037254450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TU57lIZIfsI/AAAAAAAAAEk/uj9SrPbIdWY/s1600/krename_regexp2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 159px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TU57lIZIfsI/AAAAAAAAAEk/uj9SrPbIdWY/s320/krename_regexp2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5570525666942156482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you have similar interesting usecases for &lt;b&gt;KRename&lt;/b&gt; or questions on how to do thinks, do not hesitate to write a mail to our &lt;a href="mailto:krename-users@lists.sf.net"&gt;mailinglist&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-3459457578107219237?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/3459457578107219237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=3459457578107219237' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3459457578107219237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3459457578107219237'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2011/02/directory-management-with-krename.html' title='Directory Management with KRename'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Yp5wtzmTeNk/TU57bW5fAzI/AAAAAAAAAEc/SLwscdAMBaA/s72-c/krename_regexp1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-5782725942873251455</id><published>2011-01-30T03:58:00.000-08:00</published><updated>2011-01-30T04:11:35.149-08:00</updated><title type='text'>Modifying and analyzing colors in PDF files using podofocolor</title><content type='html'>&lt;h2&gt;What is &lt;i&gt;podofocolor&lt;/i&gt;?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Podofocolor&lt;/i&gt; is the newest addition to the podofo-tools package. It is a command-line tool to analyze and/or modify all colors in a PDF file. This can be done using predefined rules or based on a custom Lua script.&lt;br /&gt;&lt;br /&gt;Basically, &lt;i&gt;podofocolor&lt;/i&gt; opens a PDF file and goes through every page or vector graphics object (e.g. an XObject) and looks at every PDF command. Whenever it encounters a colorspace definition or a PDF command, which sets a color for a following PDF operation like “draw a line” or “fill area with color”, an action can be performed. These actions are either predefined actions or can be defined by implementing a C++ interface or more likely by providing a Lua script. Predefined actions are “convert this color to grayspace” or “print color name to stdout”; however more complicated actions can be easily created as well. As can be seen by the “grayscale”-action, the most powerful feature of the tool is to replace colors in a PDF file. Custom color conversion algorithms can be implemented in Lua and be immediately applied to any PDF file.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How is it useful?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;There are different use-cases for such a tool and I assume users will come up with even more options. Possible usage scenarios that come to my mind can be categorized in two areas: analyzing colors and modifying colors.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Analyzing colors&lt;br /&gt;     &lt;ul&gt;&lt;br /&gt;       &lt;li&gt;Find out, which colorspaces or colors are used in a PDF&lt;/li&gt;&lt;br /&gt;       &lt;li&gt;Verify that certain colors are not used in a PDF&lt;/li&gt;&lt;br /&gt;       &lt;li&gt;Verify that only CMYK or ICC-based colors are used in a PDF&lt;/li&gt;&lt;br /&gt;     &lt;/ul&gt;&lt;br /&gt;     &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Modifying colors&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;     &lt;li&gt;Convert colorspace of a PDF (e.g. convert it to grayscale or CMYK)&lt;/li&gt;&lt;br /&gt;     &lt;li&gt;Convert colors in a PDF to certain corporate colors&lt;/li&gt;&lt;br /&gt;     &lt;li&gt;Split one PDF file into four different PDF files, where each file represents one component of the CMYK colors used in the PDF. As a result, you will receive one PDF containing only the cyan color channel, one containing the yellow one, etc..&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;   &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Usage&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The usage of the command-line tools is simple:&lt;br /&gt;&lt;code&gt;&lt;br /&gt; ./podofocolor [converter] input.pdf output.pdf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Different values are possible to be used as a converter. The table below lists all converters which are currently available:&lt;br /&gt;&lt;table&gt;&lt;br /&gt;   &lt;tr&gt;&lt;br /&gt;    &lt;td&gt;&lt;b&gt;Converter&lt;/b&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;    &lt;td&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;&lt;br /&gt;   &lt;/tr&gt;&lt;br /&gt;   &lt;tr&gt;&lt;br /&gt;     &lt;td&gt;dummy&lt;/td&gt;&lt;br /&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;     &lt;td&gt;This is an example implementation of a converter in C++, which will convert all colors in a PDF to RGB red.&lt;/td&gt;&lt;br /&gt;   &lt;/tr&gt;&lt;br /&gt;   &lt;tr&gt;&lt;br /&gt;     &lt;td&gt;grayscale&lt;/td&gt;&lt;br /&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;     &lt;td&gt;The grayscale converter changes all colors to its grayscale equivalents in a grayscale colorspace.&lt;/td&gt;&lt;br /&gt;   &lt;/tr&gt;&lt;br /&gt;   &lt;tr&gt;&lt;br /&gt;     &lt;td&gt;lua &lt;code&gt;planfile&lt;/code&gt;&lt;/td&gt;&lt;br /&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;     &lt;td&gt;The Lua converter is the most powerful one. It takes a lua file as another parameter. This Lua file provides the color conversion descriptions implemented as Lua functions.&lt;/td&gt;&lt;br /&gt;   &lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;For example, to convert the colors in a PDF file using the included example.lua file, you would use the following command:&lt;br /&gt;&lt;code&gt;&lt;br /&gt; ./podofocolor lua example.lua input.pdf output.pdf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Writing own converters&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;For the tool to be really useful, you will have to create your own converter. This can either be done by implementing the C++ interface IConverter or by creating a small and simple Lua script. If you consider creating a C++ implementation of the interface, the included Doxygen comments will be enough to get you started (Yes, it is that simple! For example, the grayscale converter consists of only 44 lines of source code and most other conversions will be the same size), so we will skip the C++ part and go straight to Lua.&lt;br /&gt;&lt;br /&gt;Lua is a very simple, yet powerful, scripting language. To get started, it is best to download the example.lua file included in PoDoFo. It contains all the necessary function definitions, which you can adapt to your needs.&lt;br /&gt;&lt;br /&gt;We will start with a short example: whenever &lt;i&gt;podofocolor&lt;/i&gt; finds a definition of a stroking color on a PDF page (i.e. a color which is used when drawing lines or curves), it will call one function in the Lua script. The function called depends on the colorspace of the color definition. Currently, there are three different functions that can be called. set_stroking_color_gray will be called when a grayscale color is defined. Similarly, set_stroking_color_rgb or set_stroking_cmyk are called. &lt;br /&gt;The example below shows an implementation of set_stroking_color_rgb with a rather simple implementation. The function gets the three parameters r, g, and b, which refer to the values of the red, green, and blue color components. The values are in the range of 0.0 to 1.0 as it is common in PDF files, where (0.0, 0.0, 0.0) is black and (1.0, 0.0, 0.0) is red. Now to the concrete function implementation: It checks if the passed color is black, if yes it returns a tuple with four values – which is a CMYK color – and thereby converts any occurrence of RGB black to CMYK black. For all other color values a tuple with three values is returned and the RGB color is not changed. Another option would have been to return a tuple with a single value and thereby convert the color to a gray value.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function set_stroking_color_rgb (r,g,b)&lt;br /&gt;   -- convert all black rgb values to cmyk,&lt;br /&gt;   -- leave other as they are&lt;br /&gt;   if r == 0 and&lt;br /&gt;      g == 0 and&lt;br /&gt;      b == 0 then&lt;br /&gt;      return { 0.0, 0.0, 0.0, 1.0 }&lt;br /&gt;   else&lt;br /&gt;      return { r,g,b }&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Other functions in the script provide information about pages, objects, etc...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Limitations&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Currently this tool does not convert images embedded in the PDF file. First of all, the focus of the tools is on modifying colors in PDF files and secondly, there are other tools, which can modify colors in images and/or work with images embedded in PDF files. If there is demand for such a feature, it can be easily added. &lt;i&gt;Podofoimgextract&lt;/i&gt;, another PoDoFo-tool, is a good example of how easy it is to work with images using the PoDoFo API.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Download&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Podofocolor&lt;/i&gt; is currently available in SVN trunk. Instructions on how to get and build PoDoFo trunk can be found on our &lt;a href="http://podofo.sf.net"&gt;website&lt;/a&gt;. It works on all supported platforms, including Windows and Unix systems. We are interested in your feedback! Feel free to drop a mail containing your feedback, comments, or suggestions to our mailing-list &lt;a href="mailto:podofo-users@lists.sourceforge.net"&gt;podofo-users@lists.sourceforge.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-5782725942873251455?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/5782725942873251455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=5782725942873251455' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/5782725942873251455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/5782725942873251455'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2011/01/modifying-and-analyzing-colors-in-pdf.html' title='Modifying and analyzing colors in PDF files using &lt;i&gt;podofocolor&lt;/i&gt;'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-6494365446121064799</id><published>2010-09-15T07:00:00.000-07:00</published><updated>2010-09-15T07:14:28.598-07:00</updated><title type='text'>New sort modes in KRename</title><content type='html'>An often requested feature in &lt;a href="http://www.krename.net"&gt;KRename&lt;/a&gt; was to have more possibilities to sort the files before renaming. This was indeed a major limitation, as it is often eligible to sort files by date or some other criteria.&lt;br /&gt;&lt;br /&gt;Some time ago, I found finally time to add sorting by date and today I finished a new powerful &lt;b&gt;custom sorting&lt;/b&gt; feature, which allows to use any token to be used for sorting, which is supported by one of the plugins provided by &lt;b&gt;KRename&lt;/b&gt;. This means sorting is now possible by almost any criteria, like &lt;b&gt;[filesize]&lt;/b&gt;, &lt;b&gt;[creationdate]&lt;/b&gt;, &lt;b&gt;[user]&lt;/b&gt; or even &lt;b&gt;[##tagTrack]&lt;/b&gt;. Of course, you can choose whether you want to sort ascending, descending or by numbers.&lt;br /&gt;&lt;br /&gt;The screenshot below shows the new selection of sorting options in &lt;b&gt;KRename&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Yp5wtzmTeNk/TJDTFnVhbvI/AAAAAAAAADo/wpmv59FrIAQ/s1600/krename_sort3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 196px; height: 271px;" src="http://2.bp.blogspot.com/_Yp5wtzmTeNk/TJDTFnVhbvI/AAAAAAAAADo/wpmv59FrIAQ/s320/krename_sort3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5517141636940918514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you click on "Custom...", you get a dialog like the one below, to specify what sorting criteria you want to use.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TJDTVeSNXjI/AAAAAAAAADw/lkq1NA2rzog/s1600/krename_sort1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 130px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TJDTVeSNXjI/AAAAAAAAADw/lkq1NA2rzog/s320/krename_sort1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5517141909389008434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The final result might look like this, see the screenshot of Dolphin as a proof that we really sort by &lt;b&gt;[filesize]&lt;/b&gt;:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Yp5wtzmTeNk/TJDUOAKF7PI/AAAAAAAAAD4/h7U-tRWZoJU/s1600/krename_sort2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://4.bp.blogspot.com/_Yp5wtzmTeNk/TJDUOAKF7PI/AAAAAAAAAD4/h7U-tRWZoJU/s320/krename_sort2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5517142880554446066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This feature is currently only available in &lt;a href="http://domseichter.blogspot.com/2010/02/building-krename-trunk-from-svn.html"&gt;KRename SVN trunk&lt;/a&gt;. Still, I would be interested in your &lt;a href="mailto:krename-users@lists.sf.net"&gt;feedback&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-6494365446121064799?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/6494365446121064799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=6494365446121064799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/6494365446121064799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/6494365446121064799'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/09/new-sort-modes-in-krename.html' title='New sort modes in KRename'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Yp5wtzmTeNk/TJDTFnVhbvI/AAAAAAAAADo/wpmv59FrIAQ/s72-c/krename_sort3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-7786440575628363448</id><published>2010-08-17T09:43:00.001-07:00</published><updated>2010-08-19T02:17:46.828-07:00</updated><title type='text'>KBarcode4-light released</title><content type='html'>Where is &lt;a href="http://www.kbarcode.net"&gt;KBarcode&lt;/a&gt; for KDE4? Well, there are porting efforts under way in &lt;a href="https://kbarcode.svn.sf.net/svnroot/kbarcode/trunk"&gt;SVN&lt;/a&gt;, but these are sadly far from completion.&lt;br /&gt;&lt;br /&gt;If you just want to create barcodes easily and save them as image or a PDF, rescue might be near in the form of &lt;a href="https://sourceforge.net/projects/kbarcode/files/KBarcode4-light/0.2/kbarcode4-light-0.2.tar.gz/download"&gt;KBarcode4-light&lt;/a&gt;. &lt;b&gt;KBarcode4-light&lt;/b&gt; is a simple barcode generator for KDE4. It supports many 1D and 2D barcode formats and can export them as images or PDF files.&lt;br /&gt;&lt;br /&gt;It is similar to &lt;a href="http://www.kbarcode.net"&gt;KBarcode&lt;/a&gt; for KDE3, but less powerful. &lt;b&gt;KBarcode4-light&lt;/b&gt; allows only to create single barcodes. As the port for KBarcode is not yet ready and no one knows when it will be ready, &lt;b&gt;KBarcode4-light&lt;/b&gt; provides basic barcode generation for KDE. An additional benefit is that it provides an easy to use interface for Barcode Writer in Pure Postscript.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Yp5wtzmTeNk/TGq9QndfdJI/AAAAAAAAADY/0DlxecQRXEo/s1600/kbarcode4-light1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 277px;" src="http://2.bp.blogspot.com/_Yp5wtzmTeNk/TGq9QndfdJI/AAAAAAAAADY/0DlxecQRXEo/s320/kbarcode4-light1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5506421587582088338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is  written in Python using the amazing PyQt4 Qt bindings and based on &lt;a href="http://www.terryburton.co.uk/barcodewriter/"&gt;Barcode Writer in Pure Postscript&lt;/a&gt; by Terry Burton.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;KBarcode4-light&lt;/b&gt; &lt;a href="https://sourceforge.net/projects/kbarcode/files/KBarcode4-light/0.2/kbarcode4-light-0.2.tar.gz/download"&gt;downloads&lt;/a&gt; are available. It requires Python and PyQt bindings for Qt4, as well as Ghostscript in your PATH. Please submit any feedback to the &lt;b&gt;KBarcode&lt;/b&gt; &lt;a href="mailto:kbarcode-users@lists.sf.net"&gt;mailing list&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Due to a small bug, a new fixed version 0.2 is available for &lt;a href="https://sourceforge.net/projects/kbarcode/files/KBarcode4-light/0.2/kbarcode4-light-0.2.tar.gz/download"&gt;downloads&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-7786440575628363448?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/7786440575628363448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=7786440575628363448' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/7786440575628363448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/7786440575628363448'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/08/kbarcode4-light-released.html' title='KBarcode4-light released'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Yp5wtzmTeNk/TGq9QndfdJI/AAAAAAAAADY/0DlxecQRXEo/s72-c/kbarcode4-light1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-8412066250393952428</id><published>2010-08-07T07:53:00.000-07:00</published><updated>2010-08-07T07:55:26.447-07:00</updated><title type='text'>podofocrop: PDF cropping in 10 lines of code</title><content type='html'>The &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt; tools family got a new member during the last week: &lt;b&gt;podofocrop&lt;/b&gt;. This little tool crops the white margins of pages in PDF files.&lt;br /&gt;&lt;br /&gt;I use tools like these a lot, for example when writing scientific papers or the like, because I try to include all figures as PDF files to have better quality in the final PDF. To do so, it is often necessary to remove the margin around the figure before including it. This is exactly what &lt;b&gt;podofocrop&lt;/b&gt; is doing.&lt;br /&gt;&lt;br /&gt;The figure below illustrates what &lt;b&gt;podofocrop&lt;/b&gt; is doing. Figure (a) shows the input PDF file, we can see a page with a little bit of text and a big white margin. In the next step, Figure (b), &lt;b&gt;podofocrop&lt;/b&gt; calculates the bounding box for the final PDF, i.e. the area on the page that has content and the size to which we want to crop the PDF. &lt;a href="http://www.ghostscript.com/"&gt;Ghostscript&lt;/a&gt; is used for this step and has to be in your PATH. Finally, the PDF is cropped and the new page is much smaller without any disturbing margins.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Yp5wtzmTeNk/TF1zl9p58mI/AAAAAAAAADQ/wWoHylXw93U/s1600/podofocrop.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://4.bp.blogspot.com/_Yp5wtzmTeNk/TF1zl9p58mI/AAAAAAAAADQ/wWoHylXw93U/s320/podofocrop.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5502681415759295074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are interested, get &lt;b&gt;podofocrop&lt;/b&gt; from the &lt;a href="http://podofo.sourceforge.net/download.html"&gt;PoDoFo SVN&lt;/a&gt;. In case of questions, please contact the &lt;a href="http://podofo.sourceforge.net/support.html"&gt;mailing list&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Please note:&lt;/b&gt; Windows support is still experimental and untested so far. It will compile but there are no guarantees that it will work. Help with the Windows port would be greatly appreciated.&lt;br /&gt;&lt;br /&gt;At the end, let we give you one little detail on the implementation, because it is so amazingly simple using &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt;. If you remove the code for parsing command line arguments, communication with Ghostscript and error handling, you see that the tool has only a few lines:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  std::vector&lt;PdfRect&gt; cropBoxes = get_crop_boxes_from_gs( pszInput );&lt;br /&gt;  PdfVariant var;&lt;br /&gt;  PdfMemDocument doc;&lt;br /&gt;  doc.Load( pszInput );&lt;br /&gt;&lt;br /&gt;  for( int i=0;i&lt;doc.GetPageCount(); i++ ) &lt;br /&gt;  {&lt;br /&gt;    PdfPage* pPage = doc.GetPage( i ); &lt;br /&gt;    cropBoxes[i].ToVariant( var );&lt;br /&gt;    pPage-&gt;GetObject()-&gt;GetDictionary().AddKey( PdfName("MediaBox"), var );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  doc.Write( pszOutput );&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-8412066250393952428?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/8412066250393952428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=8412066250393952428' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/8412066250393952428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/8412066250393952428'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/08/podofocrop-pdf-cropping-in-10-lines-of.html' title='podofocrop: PDF cropping in 10 lines of code'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Yp5wtzmTeNk/TF1zl9p58mI/AAAAAAAAADQ/wWoHylXw93U/s72-c/podofocrop.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-3152048186690741537</id><published>2010-07-21T04:00:00.000-07:00</published><updated>2010-07-21T04:02:00.799-07:00</updated><title type='text'>KRename post on SourceForge.net Blog</title><content type='html'>The &lt;a href="http://sourceforge.net/blog/"&gt;SourceForge.net Developers Blog&lt;/a&gt; has a nice little post about &lt;a href="http://sourceforge.net/blog/master-file-renaming-tasks-with-krename/"&gt;KRename&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Take a look!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-3152048186690741537?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/3152048186690741537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=3152048186690741537' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3152048186690741537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3152048186690741537'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/07/krename-post-on-sourceforgenet-blog.html' title='KRename post on SourceForge.net Blog'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-7125816700863655408</id><published>2010-05-29T08:37:00.000-07:00</published><updated>2010-05-29T08:56:10.930-07:00</updated><title type='text'>Organising publications using KRename</title><content type='html'>I have to work with lot's of scientific publications at the moment. That means, I have a large directory with many PDFs that are related to my work. Sometimes, it is cumbersome to find the right PDF or publication to look something up. Of course, I could rename every PDF after I downloaded it by hand, but - you might guess it - I am to lazy for this.&lt;br /&gt;&lt;br /&gt;But help is in sight! I added a plugin to &lt;a href="http://www.krename.net"&gt;KRename&lt;/a&gt;, which can rename files based on meta-data included in PDF files. Organising a large set of publications is now a matter of adding the PDF files to KRename and using the template "&lt;span style="font-style:italic;"&gt;[pdfAuthor] - [pdfTitle]&lt;/span&gt;". Convenient, isn't it? The screenshot below shows &lt;a href="http://www.krename.net"&gt;KRename&lt;/a&gt; while renaming a few PDF files.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TAE4kT_QxUI/AAAAAAAAADI/vzGx2KB3aoE/s1600/krename_podofo2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TAE4kT_QxUI/AAAAAAAAADI/vzGx2KB3aoE/s320/krename_podofo2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476720818351293762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The supported tags are [pdfPages] (number of pages), [pdfProducer], [pdfTitle], [pdfSubject], [pdfKeyword], [pdfCreator] and, [pdfAuthor]. If you have an idea for further meta-tags, do not hesitate to contact me. It should be quite easy to add more information, the current implementation is a matter of 10 lines thanks to the &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt; library used. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TAE4B9f6_qI/AAAAAAAAAC4/EzpQm--vaBc/s1600/krename_podofo1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/TAE4B9f6_qI/AAAAAAAAAC4/EzpQm--vaBc/s320/krename_podofo1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476720228198710946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A pity is that many PDF authors do not add proper meta-data to their PDF files. So, if you are writing on a publication at the moment, please make sure you add your information to the PDF metatags.&lt;br /&gt;&lt;br /&gt;This feature is currently only available in &lt;a href="http://domseichter.blogspot.com/2010/02/building-krename-trunk-from-svn.html"&gt;KRename SVN trunk&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-7125816700863655408?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/7125816700863655408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=7125816700863655408' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/7125816700863655408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/7125816700863655408'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/05/organising-publications-using-krename.html' title='Organising publications using KRename'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Yp5wtzmTeNk/TAE4kT_QxUI/AAAAAAAAADI/vzGx2KB3aoE/s72-c/krename_podofo2.png' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-1834591555119197833</id><published>2010-04-29T15:33:00.000-07:00</published><updated>2010-04-29T15:45:26.248-07:00</updated><title type='text'>PoDoFo Base 14 Font support</title><content type='html'>Today has seen a major contribution to the &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt; PDF library.&lt;br /&gt;&lt;br /&gt;I integrated a patch by &lt;a href="http://www.pdf3d.co.uk/"&gt;Ian Curington and his developers&lt;/a&gt;, which brings support for using the base 14 fonts in PDF files. What are the base 14 fonts, you might ask? &lt;br /&gt;&lt;br /&gt;Every PDF viewer has to ship with these 14 fonts, therefore one can achieve much smaller file sizes, as these particular 14 fonts do not have to be embedded into the PDF. Still, the PDF is displayed the same on every system (&lt;span style="font-style:italic;"&gt;should be displayed ...&lt;/span&gt;), as every PDF viewer has the same font metrics for these fonts. Among the base 14 fonts are Helvetica, Times, Courier and Symbol.&lt;br /&gt;&lt;br /&gt;This contribution makes the base 14 fonts available to everyone creating PDFs using &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt;. As the base 14 fonts are automatically used, whenever you request a PdfFont like Helvetica, this should result in much smaller file sizes for PDFs created with PoDoFo, which only use these fonts. An &lt;a href="http://krename.sourceforge.net/data/podofo-base14.pdf"&gt;example&lt;/a&gt; which does also compare one of the base 14 fonts (Helvetica) to a TrueType font (Arial) is also provided. Okular has some problem displaying the symbol fonts, which I have yet to investigate.&lt;br /&gt;&lt;br /&gt;If you would like to try the change, please grab the latest &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt; from &lt;a href="http://podofo.sourceforge.net/download.html#svn"&gt;SVN&lt;/a&gt;. The change is not included in the latest &lt;a href="http://podofo.sourceforge.net/download.html#podofo"&gt;0.8.0 release&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-1834591555119197833?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/1834591555119197833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=1834591555119197833' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/1834591555119197833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/1834591555119197833'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/04/podofo-base-14-font-support.html' title='PoDoFo Base 14 Font support'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-4654375056981338732</id><published>2010-04-06T12:32:00.000-07:00</published><updated>2010-04-06T12:44:56.944-07:00</updated><title type='text'>A web-radio plasmoid for your desktop</title><content type='html'>Since I am in Limerick, Ireland, I started to listen quite a lot to &lt;a href="http://www.rte.ie/radio/"&gt;RTÉ 2XM&lt;/a&gt;, which is a great web-radio station of the public broadcasting service in Ireland (&lt;a href="http://dynamic.rte.ie/av/live/radio/0304.asx"&gt;Click for webstream&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;RTÉ has a quite nice &lt;a href="http://www.rte.ie/radio/gadgets/player.html"&gt;applet&lt;/a&gt; for the Windows Vista or Windows 7 sidebar. Unfortunately, the do not &lt;span style="font-style:italic;"&gt;yet&lt;/span&gt; offer one for KDE and Plasma. Instead of waiting for the applet, I wrote a little web-radio applet by myself yesterday.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Yp5wtzmTeNk/S7uNYPUZsgI/AAAAAAAAACg/c7235vE6xzA/s1600/plasmaradio1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="http://3.bp.blogspot.com/_Yp5wtzmTeNk/S7uNYPUZsgI/AAAAAAAAACg/c7235vE6xzA/s320/plasmaradio1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5457110821057966594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The plamoid has a simple list of radio stations and a play and a stop button. Easy, isn't it? Of course you can configure the list of stations. If you &lt;a href="http://krename.sourceforge.net/data/plasmaradio-0.1.tar.gz"&gt;download&lt;/a&gt; and install it, it comes preconfigured with all the RTÉ stations and my favourite Austrian station &lt;a href="http://fm4.orf.at"&gt;FM4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Yp5wtzmTeNk/S7uORXlFGlI/AAAAAAAAACo/jW0WGx0fJ9s/s1600/plasmaradio2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 154px;" src="http://4.bp.blogspot.com/_Yp5wtzmTeNk/S7uORXlFGlI/AAAAAAAAACo/jW0WGx0fJ9s/s320/plasmaradio2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5457111802527947346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can download the plasmoid from here: &lt;a href="http://krename.sourceforge.net/data/plasmaradio-0.1.tar.gz"&gt;http://krename.sourceforge.net/data/plasmaradio-0.1.tar.gz&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To install the plasmoid, follow the following steps after downloading it:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;tar xvfz plasmaradio-0.1.tar.gz&lt;br /&gt;cd plasmaradio-0.1&lt;br /&gt;mkdir build&lt;br /&gt;cd build&lt;br /&gt;cmake -DCMAKE_INSTALL_PREFIX=$KDEDIRS ..&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I would be happy to receive some feedback on this little piece of code. By the way, I think it really shows what great stuff can be done in so little time using the KDE4 API.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-4654375056981338732?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/4654375056981338732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=4654375056981338732' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/4654375056981338732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/4654375056981338732'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/04/web-radio-plasmoid-for-your-desktop.html' title='A web-radio plasmoid for your desktop'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Yp5wtzmTeNk/S7uNYPUZsgI/AAAAAAAAACg/c7235vE6xzA/s72-c/plasmaradio1.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-7708631181212173753</id><published>2010-02-24T09:09:00.000-08:00</published><updated>2010-02-24T09:19:33.207-08:00</updated><title type='text'>Detection of architecture violations in C/C++ applications</title><content type='html'>In a small project, I am experimenting with a cleaner and in this case layered architecture for certain parts of &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt;. I think it is a quite usual problem, to have an architecture and a grown application and you would like to check whether the sources adhere to the previously defined architecture. Therefore, it is important to have tools to check for architecture violations. These can be used to validate the architecture at certain points of time or even after each commit to the source repository on a continuous integration server.&lt;br /&gt;&lt;br /&gt;I did not know any tool which can easily do this kind of validations for C/C++ source code, so I came up with a small bash script that does exactly this. The only configuration needed are some rules that define the architecture. Architecture is in this case a layered architecture where certain modules are only allowed to include certain other modules. See image 1 for a small UML diagram of the architecture. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Yp5wtzmTeNk/S4VfjUsatKI/AAAAAAAAACY/zPs_Y5_4EqY/s1600-h/podofo_layers_architecture.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://3.bp.blogspot.com/_Yp5wtzmTeNk/S4VfjUsatKI/AAAAAAAAACY/zPs_Y5_4EqY/s320/podofo_layers_architecture.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5441860785202181282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These rules can be edited at the top of the script:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;RULES="content-&gt;structure  \&lt;br /&gt;    content-&gt;datatype  \&lt;br /&gt;    content-&gt;io \&lt;br /&gt;    content-&gt;util \&lt;br /&gt;    structure-&gt;datatype \&lt;br /&gt;    structure-&gt;io \&lt;br /&gt;    structure-&gt;util \&lt;br /&gt;    datatype-&gt;io \&lt;br /&gt;    datatype-&gt;util \&lt;br /&gt;    io-&gt;util \&lt;br /&gt;    content-&gt;fontconfig \&lt;br /&gt;    content-&gt;Carbon \&lt;br /&gt;    util-&gt;\.\. \&lt;br /&gt;    src-&gt;.* \&lt;br /&gt;    .*-&gt;tr1 \&lt;br /&gt;    .*-&gt;sys"  &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;As you can see, it is also possible to use regular expressions. Also, I had to add some rules for includes like fontconfig (external libraries) that are not available in the UML diagram above. &lt;br /&gt;&lt;br /&gt;The script produces quite a lot of output, but grepping for "violation" shows only the important results:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/S4Vdcpy3JcI/AAAAAAAAACQ/tSkxxw96U2M/s1600-h/check_architecture.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 163px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/S4Vdcpy3JcI/AAAAAAAAACQ/tSkxxw96U2M/s320/check_architecture.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5441858471584015810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are interested you can get the bash script from here: &lt;a href="http://krename.sourceforge.net/data/check_architecture.sh"&gt;check_architecture.sh&lt;/a&gt; The script should be self-explaining and pretty easy to adapt to your needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-7708631181212173753?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/7708631181212173753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=7708631181212173753' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/7708631181212173753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/7708631181212173753'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/02/detection-of-architecture-violations-in.html' title='Detection of architecture violations in C/C++ applications'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Yp5wtzmTeNk/S4VfjUsatKI/AAAAAAAAACY/zPs_Y5_4EqY/s72-c/podofo_layers_architecture.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-1224517953632315069</id><published>2010-02-14T06:31:00.000-08:00</published><updated>2010-02-14T06:37:35.566-08:00</updated><title type='text'>Building KRename trunk from SVN</title><content type='html'>I just noticed that there is no up to date documentation on how to build KRename trunk from SVN on our &lt;a href="http://www.krename.net"&gt;website&lt;/a&gt;. Well, everyone who is interested in getting the latest version of KRename and does not want to wait for the next release - these are the steps to get KRename trunk from SVN and build it.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;svn co https://krename.svn.sourceforge.net/svnroot/krename/trunk krename&lt;br /&gt;cd krename&lt;br /&gt;mkdir build&lt;br /&gt;cd build&lt;br /&gt;cmake -DCMAKE_INSTALL_PREFIX=$KDEDIR ../&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This assumes that $KDEDIR is an environment variable pointing to your KDE installation. You can set $KDEDIR using the following bash command:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;export KDEDIR=/usr&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Most other KDE applications can be built the same way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-1224517953632315069?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/1224517953632315069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=1224517953632315069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/1224517953632315069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/1224517953632315069'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/02/building-krename-trunk-from-svn.html' title='Building KRename trunk from SVN'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-5617814007101773340</id><published>2010-02-06T07:02:00.000-08:00</published><updated>2010-02-06T07:10:56.407-08:00</updated><title type='text'>Generic web-service queries on your desktop using Plasma</title><content type='html'>Some days ago, I applied for a new passport. In Munich, where I currently live, you apply for the passport at the city hall and usually can pick the passport up there 3 weeks later. I was surprised to see that they have a new service: You get an ID number with which you can check the status of your passport via a web-service. So, if you check regularly, the web-service will tell you when your&lt;br /&gt;passport is ready to pick it up.&lt;br /&gt;&lt;br /&gt;What is the usual you do in cases like that? Of course, you write a Plasmoid that checks the web-service periodically and informs you when your passport is ready. This plasmoid - &lt;span style="font-weight: bold;"&gt;PersonalKwery&lt;/span&gt; - can be seen in screenshot 1.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Yp5wtzmTeNk/S22FZM-GwTI/AAAAAAAAAB4/jaegHLhBgHg/s1600-h/personalkwery1.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 149px;" src="http://2.bp.blogspot.com/_Yp5wtzmTeNk/S22FZM-GwTI/AAAAAAAAAB4/jaegHLhBgHg/s320/personalkwery1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5435146993330995506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thinking further about this quick hack, I came to the conclusion that with only a little bit of work, I could create a generic plasmoid that can query webservices and display the result on your desktop. I managed to create a plasmoid that takes the following configuration:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Base URL of the web-service&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Attributes to the URL (like the ID number of my passport, or arguments to a Google query)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;An optional XSLT to transform the results&lt;/li&gt;&lt;br /&gt;&lt;li&gt;An interval, how often the query should be performed&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;With this little configuration you can easily query many web-services. Of course, most users won't be in the mood to create their own XSLT transformations! Therefore it is possible to store the configurations as XML and share them - for example over "get hot new stuff". In this case, users can&lt;br /&gt;download predefined web-service queries and only have to enter a few necessary attribute values. The screenshot below shows the configuration dialog for a query:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Yp5wtzmTeNk/S22Fyc17QCI/AAAAAAAAACI/YUDJyF6T1D4/s1600-h/personalkwery3.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 280px;" src="http://4.bp.blogspot.com/_Yp5wtzmTeNk/S22Fyc17QCI/AAAAAAAAACI/YUDJyF6T1D4/s320/personalkwery3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5435147427088384034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another small example is a simple query, that get's your current internet IP address.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/S22Fo_NuDCI/AAAAAAAAACA/tb0f1RYaUnM/s1600-h/personalkwery2.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 239px; height: 70px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/S22Fo_NuDCI/AAAAAAAAACA/tb0f1RYaUnM/s320/personalkwery2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5435147264516295714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course, the tool is not perfect yet and can be made more user friendly. If you are interested, you can get the tarball here: &lt;a href="http://krename.sourceforge.net/data/personalkwery/personalkwery-0.1.tar.gz"&gt;personalkwery-0.1.tar.gz.&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-5617814007101773340?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/5617814007101773340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=5617814007101773340' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/5617814007101773340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/5617814007101773340'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2010/02/generic-web-service-queries-on-your.html' title='Generic web-service queries on your desktop using Plasma'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Yp5wtzmTeNk/S22FZM-GwTI/AAAAAAAAAB4/jaegHLhBgHg/s72-c/personalkwery1.jpeg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-3065504019323906126</id><published>2009-11-29T01:35:00.002-08:00</published><updated>2009-11-29T01:59:09.541-08:00</updated><title type='text'>"Modifiers" in KRename</title><content type='html'>&lt;a href="http://www.digikam.org/drupal/blog/135"&gt;Andi Clemens&lt;/a&gt; did some amazing work on the batch renamer included and integrated into digiKam. I really like the simple UI and some of the features he included. I think I can get some inspiration from him for KRename (e.g. syntax highlighting).&lt;br /&gt;&lt;br /&gt;Lately he posted over the topic of &lt;a href="http://www.digikam.org/drupal/node/487"&gt;"Modifiers" in the digiKam rename tool&lt;/a&gt;, which he added to digiKams renamer and was not able to find in KRename. Modifiers are a way to convert a token, let's say the name of a directory or the artist of a mp3 in some way before inserting it. For example if you insert the name of the directory into the new filename and the directory name is in all uppercase and to match the look of the new filename, you want it to be inserted in lowercase. In digiKam's renamer it is achieved by the token:&lt;br /&gt;&lt;code&gt;[dir.]{lower}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In KRename you would use:&lt;br /&gt;&lt;code&gt;[%dirname.]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So contrary to Andi's post, KRename has modifiers, too. You can add a modifier before any token (after the opening bracket and before the actual name of the token). The modifierst are those used to insert filename's and convert there case. To list the most important ones: &lt;table&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;$&lt;/td&gt;&lt;td&gt;No conversion, insert the token as it is&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;%&lt;/td&gt;&lt;td&gt;Convert to lowercase&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&amp;&lt;/td&gt;&lt;td&gt;Convert to uppercase&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;Convert every first letter in a word to uppercase&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;##&lt;/td&gt;&lt;td&gt;Format a number with leading zeros&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;So you can even use modifierst to format numbers for tokens that return number. For example [##tagTrack] will insert the track number of a MP3 formatted with one leading zero if the track number is less than 10.&lt;br /&gt;&lt;br /&gt;It is true that KRename does not have a really readable syntax for modifiers here, I think appending {upper} or {lower} like digiKam does it, is a good idea. But there are several other places, too, where the KRename syntax could be improved. I hope that this post will help a few people that also did not know about this feature.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/SxJFDbI3T4I/AAAAAAAAABw/cMhJTqZ81E0/s1600/krename_modifiers.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 223px;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/SxJFDbI3T4I/AAAAAAAAABw/cMhJTqZ81E0/s320/krename_modifiers.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5409462027552247682" /&gt;Modifiers in action&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-3065504019323906126?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/3065504019323906126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=3065504019323906126' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3065504019323906126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3065504019323906126'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2009/11/modifiers-in-krename.html' title='&quot;Modifiers&quot; in KRename'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Yp5wtzmTeNk/SxJFDbI3T4I/AAAAAAAAABw/cMhJTqZ81E0/s72-c/krename_modifiers.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-3907808540632455038</id><published>2008-11-11T10:47:00.001-08:00</published><updated>2008-11-11T10:57:24.643-08:00</updated><title type='text'>KRename on Windows</title><content type='html'>Some time ago - during a longer trip by train - I booted the Windows XP installed on my Eee PC and tried to port &lt;a href="http://www.krename.net"&gt;KRename&lt;/a&gt; to Windows. Thanks to the efforts of the &lt;a href="http://windows.kde.org/"&gt;KDE on Windows team&lt;/a&gt; it was only a matter of about 1-2 hours. &lt;br /&gt;&lt;br /&gt;You don't believe it? Well see the screenshots:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Yp5wtzmTeNk/SRnT1-b_M_I/AAAAAAAAABg/G8G4JNzK4I8/s1600-h/krename_win01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://2.bp.blogspot.com/_Yp5wtzmTeNk/SRnT1-b_M_I/AAAAAAAAABg/G8G4JNzK4I8/s320/krename_win01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5267474163433419762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Yp5wtzmTeNk/SRnT--hDOuI/AAAAAAAAABo/kn-6lC5zQ2I/s1600-h/krename_win02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://2.bp.blogspot.com/_Yp5wtzmTeNk/SRnT--hDOuI/AAAAAAAAABo/kn-6lC5zQ2I/s320/krename_win02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5267474318073477858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am really impressed how easy it is to get KDE on Windows installed and start compiling using Visual Studio. The only changes necessary were related to some Unix syscalls in the Permissions and Date&amp;Time plugin. To try KRename out, it is best to get a current snapshot from &lt;a href="https://krename.svn.sourceforge.net/svnroot/krename"&gt;SVN&lt;/a&gt; (I justed checked in the changes necessary for compilation on Win32).&lt;br /&gt;A pre-compiled binary can be found &lt;a href="http://krename.sourceforge.net/data/krename_win32/krename-20081111.exe"&gt;here&lt;/a&gt;. It requires a working installation of KDE 4.1 for Windows. Simply copy it to %KDEDIR%/bin and it should work. If there is interest I might try to provide a real setup for Windows or create more regularly SVN builds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-3907808540632455038?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/3907808540632455038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=3907808540632455038' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3907808540632455038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3907808540632455038'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2008/11/krename-on-windows.html' title='KRename on Windows'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Yp5wtzmTeNk/SRnT1-b_M_I/AAAAAAAAABg/G8G4JNzK4I8/s72-c/krename_win01.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-1618625893059219188</id><published>2008-10-04T05:45:00.000-07:00</published><updated>2008-10-04T05:51:00.947-07:00</updated><title type='text'>PoDoFoBrowser updates</title><content type='html'>I had finally sometime to work on &lt;a href="http://podofo.sourceforge.net/screenshots.html"&gt;PoDoFoBrowser&lt;/a&gt; again.&lt;br /&gt;&lt;br /&gt;Most notably, I added finally a hex widget so that binary streams can be viewed directly from within PoDoFoBrowser:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Yp5wtzmTeNk/SOdl2K2bYpI/AAAAAAAAABY/LsgOerS6aJM/s1600-h/podofobrowserhex.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_Yp5wtzmTeNk/SOdl2K2bYpI/AAAAAAAAABY/LsgOerS6aJM/s320/podofobrowserhex.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5253279471650955922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Credits for the QHexView widget goes to &lt;a href="http://www.codef00.com/projects.php#QHexView"&gt;Evan Teran&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Other changes include an implementation for &lt;span style="font-style:italic;"&gt;Find and Replace&lt;/span&gt; in text streams and a new &lt;span style="font-style:italic;"&gt;Goto Page&lt;/span&gt; feature. Both will safe you a lot of time when you have to work with content streams.&lt;br /&gt;&lt;br /&gt;To try the changes, get PoDoFoBrowser from &lt;a href="http://podofo.sourceforge.net/download.html#svn"&gt;SVN&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-1618625893059219188?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/1618625893059219188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=1618625893059219188' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/1618625893059219188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/1618625893059219188'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2008/10/podofobrowser-updates.html' title='PoDoFoBrowser updates'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Yp5wtzmTeNk/SOdl2K2bYpI/AAAAAAAAABY/LsgOerS6aJM/s72-c/podofobrowserhex.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-2312815983769872654</id><published>2008-02-26T12:28:00.000-08:00</published><updated>2008-02-26T12:47:41.789-08:00</updated><title type='text'>KRename Video</title><content type='html'>Peter Upfold from &lt;a href="http://fosswire.com/"&gt;fosswire.com&lt;/a&gt; has posted a great video on how to use &lt;a href="http://www.krename.net"&gt;KRename&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think this video is great to show how &lt;a href="http://www.krename.net"&gt;KRename&lt;/a&gt; (or any other application) is working. I love the way he made the video: easy to understand and very well commented! Great work Peter!&lt;br /&gt;&lt;br /&gt;You can find his article including the links to the video &lt;a href="http://fosswire.com/2008/02/26/video-using-krename-from-within-konqueror/"&gt;here&lt;/a&gt;. The video is available as flash for viewing online or as OGG for download.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-2312815983769872654?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/2312815983769872654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=2312815983769872654' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/2312815983769872654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/2312815983769872654'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2008/02/krename-video.html' title='KRename Video'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-5639607674059480575</id><published>2008-02-21T07:21:00.000-08:00</published><updated>2008-02-24T04:52:36.928-08:00</updated><title type='text'>Visualize dependencies of binaries and libraries on Linux</title><content type='html'>&lt;p align="justify"&gt;&lt;b&gt;Update2:&lt;/b&gt; &lt;i&gt;pfee&lt;/i&gt; made some more fixes. The script parses now the dependcies tree correctly using readelf and ldd so that only direct dependencies apear in the graph. The updated version can also be found at &lt;a href="http://krename.sf.net/data/scripts/dependencies.sh"&gt;dependencies.sh&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;b&gt;Update:&lt;/b&gt; Thanks to the feedback from &lt;i&gt;pfee&lt;/i&gt;, I made some fixes to the script. The script is now also available for direct download &lt;a href="http://krename.sf.net/data/scripts/dependencies.sh"&gt;dependencies.sh&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Sometimes it is useful to know the library dependencies of an application or a library on Linux (or Unix). Especially OpenSource applications depend on lot's of libraries which in turn depend on other libraries again. So it is not always quite clear which dependencies your software has.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Imagine you want to package up your software for a customer and need to know on which libraries your software depends. Usually you know which libraries were used during development, but what are the dependencies of these libraries? You have to package &lt;b&gt;all&lt;/b&gt; dependencies so that the customer can use and/or install your software.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;I created a bash-script which uses ldd to find the dependencies of a binary on Linux and &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; to create a dependency graph out of this information. &lt;a href="http://www.benedikthauptmann.de/"&gt;Benedikt Hauptmann&lt;/a&gt; had the idea to show dependencies as a graph - so I cannot take credits for that. Using this script I created the depency graph of &lt;b&gt;TFORMer&lt;/b&gt;, the report generator we are developing at &lt;a href="http://www.tec-it.com"&gt;TEC-IT&lt;/a&gt;. The result is a nice graph showing all the dependencies a user has to have installed before using TFORMer.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_Yp5wtzmTeNk/R72e4TJEWfI/AAAAAAAAAAk/0ByOWCDjmFI/s1600-h/tfprint.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_Yp5wtzmTeNk/R72e4TJEWfI/AAAAAAAAAAk/0ByOWCDjmFI/s320/tfprint.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169462637339367922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Another beautiful graph is the one of &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt;. See below the graph of PoDoFo.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_Yp5wtzmTeNk/R72fgjJEWgI/AAAAAAAAAAs/B5Fkg0ievzE/s1600-h/podofo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_Yp5wtzmTeNk/R72fgjJEWgI/AAAAAAAAAAs/B5Fkg0ievzE/s320/podofo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169463328829102594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;The dependencies of Firefox are way more complex than the examples shown above...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Yp5wtzmTeNk/R72gHzJEWhI/AAAAAAAAAA0/52GZaYAAw7Q/s1600-h/firefox.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_Yp5wtzmTeNk/R72gHzJEWhI/AAAAAAAAAA0/52GZaYAAw7Q/s320/firefox.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5169464003138968082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;If you want to create a graph of your favorite application or library your self, get the script from here. I pulished the simple source code below. &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt;  is the only requirement. Usage is very simple, just pass an application or library as first parameter and the output image as second argument. The script will always create a PNG image:&lt;br/&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;./dependencies.sh /usr/bin/emacs emacs.png&lt;br /&gt;./dependencies.sh /usr/local/lib/libpodofo.so \&lt;br /&gt;                  podofo.png&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;The code of the script is as follows: (Warning: the style sheet cuts of some lines, so better download the script from &lt;a href="http://krename.sf.net/data/scripts/dependencies.sh"&gt;dependencies.sh&lt;/a&gt;)&lt;/p&gt;&lt;br /&gt;&lt;!-- Generator: GNU source-highlight 2.4&lt;br /&gt;by Lorenzo Bettini&lt;br /&gt;http://www.lorenzobettini.it&lt;br /&gt;http://www.gnu.org/software/src-highlite --&gt;&lt;br /&gt;&lt;pre style="font-size:8pt"&gt;&lt;br /&gt;&lt;tt&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;#!/bin/bash&lt;/font&gt;&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# This is the maximum depth to which dependencies are resolved&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#009900"&gt;MAXDEPTH&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#993399"&gt;14&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# analyze a given file on its&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# dependecies using ldd and write&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# the results to a given temporary file&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;#&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# Usage: analyze [OUTPUTFILE] [INPUTFILE]&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#000000"&gt;function analyze&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;local&lt;/font&gt;&lt;/b&gt; &lt;font color="#009900"&gt;OUT&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#993399"&gt;1&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;local&lt;/font&gt;&lt;/b&gt; &lt;font color="#009900"&gt;IN&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#993399"&gt;2&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;local&lt;/font&gt;&lt;/b&gt; &lt;font color="#009900"&gt;NAME&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(basename&lt;/font&gt; &lt;font color="#009900"&gt;$IN)&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;for&lt;/font&gt;&lt;/b&gt; i &lt;b&gt;&lt;font color="#0000FF"&gt;in&lt;/font&gt;&lt;/b&gt; &lt;font color="#009900"&gt;$LIST&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;do&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; &lt;font color="#FF0000"&gt;"$i"&lt;/font&gt; &lt;font color="#990000"&gt;==&lt;/font&gt; &lt;font color="#FF0000"&gt;"$NAME"&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;            &lt;i&gt;&lt;font color="#9A1900"&gt;# This file was already parsed&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;            &lt;b&gt;&lt;font color="#0000FF"&gt;return&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;done&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    &lt;i&gt;&lt;font color="#9A1900"&gt;# Put the file in the list of all files&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;    &lt;font color="#009900"&gt;LIST&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;"$LIST $NAME"&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;    &lt;font color="#009900"&gt;DEPTH&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#990000"&gt;[&lt;/font&gt;&lt;font color="#009900"&gt;$DEPTH&lt;/font&gt; &lt;font color="#990000"&gt;+&lt;/font&gt; &lt;font color="#993399"&gt;1&lt;/font&gt;&lt;font color="#990000"&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; &lt;font color="#009900"&gt;$DEPTH&lt;/font&gt; -ge &lt;font color="#009900"&gt;$MAXDEPTH&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;        echo &lt;font color="#FF0000"&gt;"MAXDEPTH of $MAXDEPTH reached at file $IN."&lt;/font&gt;&lt;br /&gt;        echo &lt;font color="#FF0000"&gt;"Continuing with next file..."&lt;/font&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;return&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"Parsing file:              $IN"&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;    &lt;font color="#009900"&gt;$READELF&lt;/font&gt; &lt;font color="#009900"&gt;$IN&lt;/font&gt; &lt;font color="#990000"&gt;&amp;amp;&amp;gt;&lt;/font&gt; &lt;font color="#009900"&gt;$READELFTMPFILE&lt;/font&gt;&lt;br /&gt;    &lt;font color="#009900"&gt;ELFRET&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#990000"&gt;?&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; &lt;font color="#009900"&gt;$ELFRET&lt;/font&gt; &lt;font color="#990000"&gt;!=&lt;/font&gt; &lt;font color="#993399"&gt;0&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;        echo &lt;font color="#FF0000"&gt;"ERROR: ELF reader returned error code $RET"&lt;/font&gt;&lt;br /&gt;        echo &lt;font color="#FF0000"&gt;"ERROR:"&lt;/font&gt;&lt;br /&gt;        cat &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt;        echo &lt;font color="#FF0000"&gt;"Aborting..."&lt;/font&gt;&lt;br /&gt;        rm &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt;        rm &lt;font color="#009900"&gt;$READELFTMPFILE&lt;/font&gt;&lt;br /&gt;        rm &lt;font color="#009900"&gt;$LDDTMPFILE&lt;/font&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;exit&lt;/font&gt;&lt;/b&gt; &lt;font color="#993399"&gt;1&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;    &lt;font color="#009900"&gt;DEPENDENCIES&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(cat&lt;/font&gt; &lt;font color="#009900"&gt;$READELFTMPFILE&lt;/font&gt; &lt;font color="#990000"&gt;|&lt;/font&gt; grep NEEDED &lt;font color="#990000"&gt;|&lt;/font&gt; awk &lt;font color="#FF0000"&gt;'{if (substr($NF,1,1) == "[") print substr($NF, 2, length($NF) - 2); else print $NF}'&lt;/font&gt;&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;for&lt;/font&gt;&lt;/b&gt; DEP &lt;b&gt;&lt;font color="#0000FF"&gt;in&lt;/font&gt;&lt;/b&gt; &lt;font color="#009900"&gt;$DEPENDENCIES&lt;/font&gt;&lt;font color="#990000"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;do&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; -n &lt;font color="#FF0000"&gt;"$DEP"&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;            ldd &lt;font color="#009900"&gt;$IN&lt;/font&gt; &lt;font color="#990000"&gt;&amp;amp;&amp;gt;&lt;/font&gt; &lt;font color="#009900"&gt;$LDDTMPFILE&lt;/font&gt;&lt;br /&gt;            &lt;font color="#009900"&gt;LDDRET&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#990000"&gt;?&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;            &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; &lt;font color="#009900"&gt;$LDDRET&lt;/font&gt; &lt;font color="#990000"&gt;!=&lt;/font&gt; &lt;font color="#993399"&gt;0&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;                &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;                echo &lt;font color="#FF0000"&gt;"ERROR: ldd returned error code $RET"&lt;/font&gt;&lt;br /&gt;                echo &lt;font color="#FF0000"&gt;"ERROR:"&lt;/font&gt;&lt;br /&gt;                cat &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt;                echo &lt;font color="#FF0000"&gt;"Aborting..."&lt;/font&gt;&lt;br /&gt;                rm &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt;                rm &lt;font color="#009900"&gt;$READELFTMPFILE&lt;/font&gt;&lt;br /&gt;                rm &lt;font color="#009900"&gt;$LDDTMPFILE&lt;/font&gt;&lt;br /&gt;                &lt;b&gt;&lt;font color="#0000FF"&gt;exit&lt;/font&gt;&lt;/b&gt; &lt;font color="#993399"&gt;1&lt;/font&gt;&lt;br /&gt;            &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;            &lt;font color="#009900"&gt;DEPPATH&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(grep&lt;/font&gt; &lt;font color="#009900"&gt;$DEP&lt;/font&gt; &lt;font color="#009900"&gt;$LDDTMPFILE&lt;/font&gt; &lt;font color="#990000"&gt;|&lt;/font&gt; awk &lt;font color="#FF0000"&gt;'{print $3}'&lt;/font&gt;&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;            &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; -n &lt;font color="#FF0000"&gt;"$DEPPATH"&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;            &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;                echo -e &lt;font color="#FF0000"&gt;"  &lt;/font&gt;&lt;font color="#CC33CC"&gt;\"&lt;/font&gt;&lt;font color="#FF0000"&gt;$NAME&lt;/font&gt;&lt;font color="#CC33CC"&gt;\"&lt;/font&gt;&lt;font color="#FF0000"&gt; -&amp;gt; &lt;/font&gt;&lt;font color="#CC33CC"&gt;\"&lt;/font&gt;&lt;font color="#FF0000"&gt;$DEP&lt;/font&gt;&lt;font color="#CC33CC"&gt;\"&lt;/font&gt;&lt;font color="#FF0000"&gt;;"&lt;/font&gt; &lt;font color="#990000"&gt;&amp;gt;&amp;gt;&lt;/font&gt; &lt;font color="#009900"&gt;$OUT&lt;/font&gt;&lt;br /&gt;                analyze &lt;font color="#009900"&gt;$OUT&lt;/font&gt; &lt;font color="#009900"&gt;$DEPPATH&lt;/font&gt;&lt;br /&gt;            &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;        &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;done&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;    &lt;font color="#009900"&gt;DEPTH&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#990000"&gt;[&lt;/font&gt;&lt;font color="#009900"&gt;$DEPTH&lt;/font&gt; - &lt;font color="#993399"&gt;1&lt;/font&gt;&lt;font color="#990000"&gt;]&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;########################################&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# main                                 #&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;########################################&lt;/font&gt;&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; $&lt;i&gt;&lt;font color="#9A1900"&gt;# != 2 ];&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"Usage:"&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"  $0 [filename] [outputimage]"&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;""&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"This tools analyses a shared library or an executable"&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"and generates a dependency graph as an image."&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;""&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"GraphViz must be installed for this tool to work."&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;""&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;exit&lt;/font&gt;&lt;/b&gt; &lt;font color="#993399"&gt;1&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;font color="#009900"&gt;DEPTH&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#993399"&gt;0&lt;/font&gt;&lt;br /&gt;&lt;font color="#009900"&gt;INPUT&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#993399"&gt;1&lt;/font&gt;&lt;br /&gt;&lt;font color="#009900"&gt;OUTPUT&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;$&lt;font color="#993399"&gt;2&lt;/font&gt;&lt;br /&gt;&lt;font color="#009900"&gt;TMPFILE&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(mktemp&lt;/font&gt; -t&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#009900"&gt;LDDTMPFILE&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(mktemp&lt;/font&gt; -t&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#009900"&gt;READELFTMPFILE&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(mktemp&lt;/font&gt; -t&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#009900"&gt;LIST&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;""&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; &lt;font color="#990000"&gt;!&lt;/font&gt; -e &lt;font color="#009900"&gt;$INPUT&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"ERROR: File not found: $INPUT"&lt;/font&gt;&lt;br /&gt;    echo &lt;font color="#FF0000"&gt;"Aborting..."&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;exit&lt;/font&gt;&lt;/b&gt; &lt;font color="#993399"&gt;2&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# Use either readelf or dump&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;# Linux has readelf, Solaris has dump&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;font color="#009900"&gt;READELF&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(type&lt;/font&gt; readelf &lt;font color="#993399"&gt;2&lt;/font&gt;&lt;font color="#990000"&gt;&amp;gt;&lt;/font&gt; /dev/null&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; $&lt;font color="#990000"&gt;?&lt;/font&gt; &lt;font color="#990000"&gt;!=&lt;/font&gt; &lt;font color="#993399"&gt;0&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt; &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#009900"&gt;READELF&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#009900"&gt;$(type&lt;/font&gt; dump &lt;font color="#993399"&gt;2&lt;/font&gt;&lt;font color="#990000"&gt;&amp;gt;&lt;/font&gt; /dev/null&lt;font color="#990000"&gt;)&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;[&lt;/font&gt; $&lt;font color="#990000"&gt;?&lt;/font&gt; &lt;font color="#990000"&gt;!=&lt;/font&gt; &lt;font color="#993399"&gt;0&lt;/font&gt; &lt;font color="#990000"&gt;];&lt;/font&gt; &lt;b&gt;&lt;font color="#0000FF"&gt;then&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;    echo Unable to find ELF reader&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000FF"&gt;exit&lt;/font&gt;&lt;/b&gt; &lt;font color="#993399"&gt;1&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#009900"&gt;READELF&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;"dump -Lv"&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;else&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#009900"&gt;READELF&lt;/font&gt;&lt;font color="#990000"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;"readelf -d"&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;fi&lt;/font&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;echo &lt;font color="#FF0000"&gt;"Analyzing dependencies of: $INPUT"&lt;/font&gt;&lt;br /&gt;echo &lt;font color="#FF0000"&gt;"Creating output as:        $OUTPUT"&lt;/font&gt;&lt;br /&gt;echo &lt;font color="#FF0000"&gt;""&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;echo &lt;font color="#FF0000"&gt;"digraph DependencyTree {"&lt;/font&gt; &lt;font color="#990000"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt;echo &lt;font color="#FF0000"&gt;"  &lt;/font&gt;&lt;font color="#CC33CC"&gt;\"&lt;/font&gt;&lt;font color="#FF0000"&gt;$(basename $INPUT)&lt;/font&gt;&lt;font color="#CC33CC"&gt;\"&lt;/font&gt;&lt;font color="#FF0000"&gt; [shape=box];"&lt;/font&gt; &lt;font color="#990000"&gt;&amp;gt;&amp;gt;&lt;/font&gt; &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt;analyze &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt; &lt;font color="#FF0000"&gt;"$INPUT"&lt;/font&gt;&lt;br /&gt;echo &lt;font color="#FF0000"&gt;"}"&lt;/font&gt; &lt;font color="#990000"&gt;&amp;gt;&amp;gt;&lt;/font&gt; &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;#cat $TMPFILE # output generated dotfile for debugging purposses&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;dot -Tpng &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt; -o&lt;font color="#009900"&gt;$OUTPUT&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;rm &lt;font color="#009900"&gt;$LDDTMPFILE&lt;/font&gt;&lt;br /&gt;rm &lt;font color="#009900"&gt;$TMPFILE&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;exit&lt;/font&gt;&lt;/b&gt; &lt;font color="#993399"&gt;0&lt;/font&gt;&lt;br /&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-5639607674059480575?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/5639607674059480575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=5639607674059480575' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/5639607674059480575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/5639607674059480575'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2008/02/visualize-dependencies-of-binaries-and.html' title='Visualize dependencies of binaries and libraries on Linux'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_Yp5wtzmTeNk/R72e4TJEWfI/AAAAAAAAAAk/0ByOWCDjmFI/s72-c/tfprint.png' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-8595255806041217968</id><published>2007-08-14T05:21:00.001-07:00</published><updated>2007-08-14T05:32:03.839-07:00</updated><title type='text'>Encrypting PDF documents and setting document permissions</title><content type='html'>&lt;p align="justify"&gt;Nowadays many applications are able to create PDF files. Most of them do not support advanced PDF features like encrypting PDF files or setting document permissions. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Document permissions are settings that configure what the user is allowed to do with a PDF file (let's say you can forbid the user to print the PDF file or to extract images from the PDF). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt; includes now a nice commandline utility in its SVN version  (and in the next relase 0.6.0) called &lt;span style="font-weight:bold;"&gt;podofoencrypt&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;podofoencrypt&lt;/span&gt; can be used to encrypt any existing PDF file and set document permissions on the file. You can select between weak rc4v1 encryption and strong rc4v2 encryption. An owner password has always to be set. The owner password is only used internally by PDF processing applications. The optional user password can be used if you want the user to have to enter a password before he can view the PDF in a user application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's see a small example on howto use &lt;span style="font-weight:bold;"&gt;podofoencrypt&lt;/span&gt; to encrypt a PDF file with a user password which allows the user to print the PDF but not to extract text or images from it.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;./podofoencrypt -o dominik -u user --print example.pdf output.pdf   &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A quick look at the document properties dialog in Adobe Reader shows that you are allowed to print the PDF but do nothing else with it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Yp5wtzmTeNk/RsGgWqhdslI/AAAAAAAAAAc/8sVMVCVN5-w/s1600-h/adobe.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_Yp5wtzmTeNk/RsGgWqhdslI/AAAAAAAAAAc/8sVMVCVN5-w/s320/adobe.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5098532564392325714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would like to get some feedback on the new encryption feature of &lt;a href="http://podofo.sf.net"&gt;PoDoFo&lt;/a&gt;  and especially on the new &lt;span style="font-weight:bold;"&gt;podofoencrypt&lt;/span&gt; tool. So please get it from &lt;a href="http://podofo.sourceforge.net/download.html#svn"&gt;svn and try it out&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;   Dom&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-8595255806041217968?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/8595255806041217968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=8595255806041217968' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/8595255806041217968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/8595255806041217968'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2007/08/encrypting-pdf-documents-and-setting.html' title='Encrypting PDF documents and setting document permissions'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_Yp5wtzmTeNk/RsGgWqhdslI/AAAAAAAAAAc/8sVMVCVN5-w/s72-c/adobe.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-962661731745819910</id><published>2007-07-04T11:31:00.000-07:00</published><updated>2007-07-04T11:39:46.582-07:00</updated><title type='text'>TFORMer 5.0.0 released</title><content type='html'>&lt;p align="justify"&gt;&lt;br /&gt;Besides developing OpenSourceSoftware I do also work for &lt;a href="http://www.tec-it.com"&gt;TEC-IT Datenverarbeitung GmbH&lt;/a&gt;. Last week we finally released &lt;b&gt;TFORMer 5.0.0&lt;/b&gt;. A cross platform, easy to use and very powerful report printing framework. &lt;br /&gt;&lt;br&gt;&lt;br /&gt;I worked over the last 3 years on this version and we all put a lot of work into this release. Most importantly, the &lt;b&gt;source is completely portable&lt;/b&gt; over a broad range of platforms and architectures. The &lt;b&gt;Linux&lt;/b&gt; version is relased for several RPM based distributions and as &lt;b&gt;deb for Ubuntu&lt;/b&gt;. AIX, HPUX and Solaris builds are available on request. Please note that the same source is also compiled on Windows (from which we ported it to all these platforms).&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;TFORMer&lt;/b&gt; can print to PDF, PostScript and HTML files and of course to any system printer using CUPS. More output formats will be available with TFORMer 5.1 :) The PDF and PostScript output are really highquality and were the two projects you got me to learn both output formats. &lt;br /&gt;&lt;br&gt;&lt;br /&gt;I am proud of the quality of the Linux version. We ship with an easy to use installer, which installs either an RPM or a DEB. The software is installed, with documentation (PDF format and man page), several templates, demo reports, sample code for C and .Net and of course development libraries for C and C#. After the software has been installed and report is printed automatically (if the users agrees to do so) and everything works - I can't imagine reporting has ever been easier on Linux.&lt;br /&gt;&lt;br&gt;&lt;br /&gt;The C API is great and powerful, but the new &lt;b&gt;.Net API is sexy&lt;/b&gt;! First of all, the wrapper is portable between &lt;b&gt;Mono&lt;/b&gt; on Linux and .Net on Windows. We load the TFORMer.dll when run on Windows and we load libTFORMer.so on Linux when we are executed on Unix. &lt;br /&gt;&lt;br&gt;&lt;br /&gt;Have you ever created a PDF report so easy?&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  // Create a TFORMer Job&lt;br /&gt;  Job job = new Job();&lt;br /&gt;&lt;br /&gt;  // Load a predefined form layout&lt;br /&gt;  job.RepositoryName = "MyForm.tff"M&lt;br /&gt;&lt;br /&gt;  // create an in-memory data-source&lt;br /&gt;  DataSourceRecordSet datasource = new DataSourceRecordSet();&lt;br /&gt;&lt;br /&gt;  // Set some datafields&lt;br /&gt;  job.DataSource = datasource;&lt;br /&gt;  Record record = new Record();&lt;br /&gt;  record.Data.Add("Email", "support@tec-it.com");&lt;br /&gt;  record.Data.Add("JobTitle", "Support Engineer");&lt;br /&gt;  record.Data.Add("Name", "Mr. Harald Backoffice");&lt;br /&gt;  datasource.Records.Add(record);&lt;br /&gt;&lt;br /&gt;  // Set the output file name and type&lt;br /&gt;  job.OutputName = "out.pdf";&lt;br /&gt;  job.PrinterType = PrinterType.PdfFile;&lt;br /&gt;&lt;br /&gt;  // Print &lt;br /&gt;  job.Print();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;Easy - Ja??!&lt;br /&gt;&lt;br&gt;&lt;br /&gt;A free demo version is available (for Windows and several Linux versions). So give it a &lt;a href="http://www.tec-it.com/asp/main/content.asp?mainmenu=Download&amp;sbmenu=Download_TFORMer&amp;content=Download_TFLinux&amp;LN=2&amp;lsitem=Download_TFLinux"&gt;try&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-962661731745819910?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/962661731745819910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=962661731745819910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/962661731745819910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/962661731745819910'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2007/07/tformer-500-released.html' title='TFORMer 5.0.0 released'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-6867620730092395369</id><published>2007-05-28T09:50:00.000-07:00</published><updated>2007-05-28T10:03:36.082-07:00</updated><title type='text'>The future of SchafKopf</title><content type='html'>&lt;p&gt;&lt;br /&gt;Someday &lt;a href="http://schafkopf.berlios.de"&gt;SchafKopf&lt;/a&gt; has to be ported to KDE4. We all know that, but as of now, no one in the team has volunteered to do so (and no one else either). &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;One reason might be that we (Benni, Christian, Lenz and I) all agree that &lt;a href="http://schafkopf.berlios.de"&gt;SchafKopf&lt;/a&gt; in its current state is not really maintainable. We hacked together a nice Card Game which is fun to play - but it is far away from the perfect Schafkopf implementation!&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;While driving home today, after I talked to Lenz over Schafkopf and Python I think it is time to start the discussion about what should be done with &lt;a href="http://schafkopf.berlios.de"&gt;SchafKopf&lt;/a&gt; for KDE4.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;My idea on how it should look - well this is most likely not even my idea but our idea that arose sometime - is the following.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;We need a Schafkopf server process&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Players can connect to this server&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Human and AI players are implemented&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The GUI connects to the server too&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This has the following advantages. We can support different GUIs (Qt4, GTK, console and a web front end similar to all these online poker rooms - just for your favorite Bavarian card game). So we could write a simple Qt4 GUI (should go pretty fast because all logic is in the server) and have a KDE4 port.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;The server can be implemented in another language than the GUI. As a reason we can choose a language that is maybe better suited for AI stuff than C++. My first idea was: Use Common Lisp! Two reasons: Firstly I wanted to learn Common Lisp and secondly it is famous for its usage in AI research. I even hacked together a small server in LISP. It understands the basic Schafkopf rules. You can look at the &lt;a href="http://schafkopf.berlios.de/schafkopf.lisp"&gt;source&lt;/a&gt; if you want. It went pretty fast using Lisp, but it would need some work.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Well, talked to Lenz today and - even if he is a great Lisp fan - he thinks a server in Lisp has two big disadvantages:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Lisp is not very common on users systems. Users will have a hard time compiling SchafKopf&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Only few developers know Common Lisp, so we won't get much code contributions&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;He suggested Python to be used for the server. Python is well known by many developers. We can code in a functional way where necessary, so we should be as fast as when developing in Lisp and python is available on almost every system.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;What can I say? The guy in the black clothes is right! If we want to get a SchafKopf version for KDE4 with a clean source that is maintainable we should &lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;write a SchafKopf server in Python&lt;/li&gt;&lt;br /&gt;&lt;li&gt;write a Qt4 GUI that connects to the server&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Who wants to join me in this project? Any other ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-6867620730092395369?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/6867620730092395369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=6867620730092395369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/6867620730092395369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/6867620730092395369'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2007/05/future-of-schafkopf.html' title='The future of SchafKopf'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-4153211525054458611</id><published>2007-05-21T10:49:00.001-07:00</published><updated>2007-05-21T11:19:33.110-07:00</updated><title type='text'>KRename4 - the porting has begun</title><content type='html'>Porting KRename to KDE4 has started and slowly it is getting into shape. Porting is the wrong word though.... KRename4 will be a rewrite most parts. I think KDE4 is a good point to make a clean application out of KRename.&lt;br /&gt;&lt;br /&gt;KRename 4 will....&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... have the GUI created with designer instead of a hardcoded GUI&lt;/li&gt;&lt;li&gt;... be covered by unit tests: Unit tests are essential to make sure no regressions are introduced. Currently the testing framework is a hand written set of macros, but I might switch to Qt TestLib&lt;/li&gt;&lt;li&gt;... be good designed code: separation between GUI and renaming core&lt;/li&gt;&lt;li&gt;... have comments in the source where appropriate&lt;/li&gt;&lt;/ul&gt;All these changes will hopefully lead to a very clean KRename4. A KRename4 where others can easily contribute code!  The first version will be  a functional identical port of the current KDE3 version and the following version will include some nice features, mostlikely an optional JavaScript interpreter so that you can write custom functions for renaming files.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_Yp5wtzmTeNk/RlHdgzVqzqI/AAAAAAAAAAU/YMJ-AiDb8nM/s1600-h/krename4.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_Yp5wtzmTeNk/RlHdgzVqzqI/AAAAAAAAAAU/YMJ-AiDb8nM/s320/krename4.png" alt="" id="BLOGGER_PHOTO_ID_5067074611375165090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Above you can see how it currently looks, not very different from the KRename 3.0.14 and counters do not work at all.... but it's getting along.&lt;br /&gt;&lt;br /&gt;If you want to give it a try  get it from svn and compile it (requires KDE4 alpha installed and cmake):&lt;br /&gt;&lt;br /&gt;svn co https://krename.svn.sourceforge.net/svnroot/krename/trunk krename&lt;br /&gt;mkdir krename-build&lt;br /&gt;cd krename-build&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;cmake ../krename&lt;br /&gt;make&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here you go :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-4153211525054458611?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/4153211525054458611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=4153211525054458611' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/4153211525054458611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/4153211525054458611'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2007/05/krename4-portine-has-begun.html' title='KRename4 - the porting has begun'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_Yp5wtzmTeNk/RlHdgzVqzqI/AAAAAAAAAAU/YMJ-AiDb8nM/s72-c/krename4.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1729203473305809245.post-3636299747476268871</id><published>2007-05-21T10:45:00.000-07:00</published><updated>2007-05-21T10:48:57.592-07:00</updated><title type='text'>domseichter's blog</title><content type='html'>So ... I started a blog.&lt;br /&gt;&lt;br /&gt;The reason is that I am currently porting KRename (a batch renamer for KDE) to KDE4 and it is going to become great. I want to give some status report here in my blog and hopefully I can show some nice stuff about KRename4 and KDE4 in general.&lt;br /&gt;&lt;br /&gt;Additionally you will find here news on another project I am working on right now: PoDoFo. PoDoFo is a portable PDF generation and parsing library in C++. So if you are interested in PDF: &lt;a href="http://podofo.sf.net"&gt;check it out&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1729203473305809245-3636299747476268871?l=domseichter.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://domseichter.blogspot.com/feeds/3636299747476268871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1729203473305809245&amp;postID=3636299747476268871' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3636299747476268871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1729203473305809245/posts/default/3636299747476268871'/><link rel='alternate' type='text/html' href='http://domseichter.blogspot.com/2007/05/domseichters-blog.html' title='domseichter&apos;s blog'/><author><name>Dominik Seichter</name><uri>http://www.blogger.com/profile/07438239121288182199</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
