<?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-22719251</id><updated>2012-01-24T04:21:34.173-05:00</updated><category term='logging'/><category term='amqp'/><category term='xaml'/><category term='postgresql'/><category term='gnome3'/><category term='libreoffice'/><category term='sysadmin'/><category term='news'/><category term='grpug'/><category term='blogspot'/><category term='malware'/><category term='sope'/><category term='opengroupware opensuse'/><category term='data-retention'/><category term='dbus'/><category term='banshee'/><category term='loonies foss'/><category term='netgear'/><category term='exceptions'/><category term='audio'/><category term='openssue'/><category term='pyamqplib'/><category term='rss'/><category term='social-networking'/><category term='cyrus'/><category term='unicode'/><category term='performance'/><category term='cn=config'/><category term='hg'/><category term='xml'/><category term='xfs'/><category term='centos'/><category term='sysctl'/><category term='bie'/><category term='xmpp'/><category term='java'/><category term='olf2009'/><category term='vmware'/><category term='osc'/><category term='cifs'/><category term='opengroupware coils'/><category term='lwn'/><category term='zeitgesit'/><category term='obs'/><category term='ntp'/><category term='multimedia'/><category term='networking'/><category term='ohiolinux'/><category term='gnome-activity-journal'/><category term='squid syslog logging data-retention'/><category term='gedit'/><category term='geolocation'/><category term='dns'/><category term='samab4'/><category term='zogi'/><category term='windows2008'/><category term='bpml'/><category term='samba4'/><category term='ngobjweb'/><category term='mp3'/><category term='clamav'/><category term='opengroupware'/><category term='cyrus-imapd'/><category term='vcs'/><category term='noise'/><category term='itunes'/><category term='grlug'/><category term='nautilus'/><category term='groupdav'/><category term='npr'/><category term='zeitgeist'/><category term='disk-io'/><category term='podcast'/><category term='workflow'/><category term='networkmanager'/><category term='apple'/><category term='network-administration'/><category term='phpldapadmin'/><category term='fedora'/><category term='bnd'/><category term='conference'/><category term='openoffice'/><category term='evolution'/><category term='gnome'/><category term='compression'/><category term='bing'/><category term='consonance'/><category term='ldap'/><category term='python'/><category term='qt4'/><category term='codec'/><category term='opennms'/><category term='rabbitmq'/><category term='irc'/><category term='productivity'/><category term='mkfs'/><category term='thunderbird'/><category term='suds'/><category term='monodevelop'/><category term='named'/><category term='curses'/><category term='linux'/><category term='soap'/><category term='opensuse'/><category term='sqlite'/><category term='sqlalchemy'/><category term='syslog'/><category term='aix'/><category term='gtk'/><category term='sysadmn'/><category term='xslt'/><category term='bbc'/><category term='commentary'/><category term='openldap'/><category term='pylzma'/><category term='lpd'/><category term='tortoisehg'/><category term='opengroupware coils evolution workflow'/><category term='lpr'/><category term='hacks'/><category term='gnome-tweak-tool'/><category term='ipod'/><category term='twitter'/><category term='cisco-ios'/><category term='administration'/><category term='funambol'/><category term='coils'/><category term='samba'/><category term='zidestore'/><category term='fastmail'/><category term='horde'/><category term='slashdot'/><category term='mono'/><category term='ldif'/><category term='maps'/><category term='mercurial'/><category term='freenode'/><category term='password'/><category term='dynlist'/><category term='block_dump'/><title type='text'>Whitemice Consulting</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default?start-index=101&amp;max-results=100'/><author><name>Whitemice Consulting</name><uri>http://www.blogger.com/profile/00677981044303924618</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>112</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-22719251.post-8139365828806198838</id><published>2012-01-17T16:10:00.000-05:00</published><updated>2012-01-17T16:10:55.670-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='lwn'/><category scheme='http://www.blogger.com/atom/ns#' term='samab4'/><title type='text'>Whither Samba?</title><content type='html'>"&lt;i&gt;What's up with Samba?&lt;/i&gt;" ....&amp;nbsp; "&lt;i&gt;Is Samba4 for real?&lt;/i&gt;" ... "&lt;i&gt;Is Samba4 ever going to be released?&lt;/i&gt;"&amp;nbsp; These questions have been common for several years now. Now we have answers thanks to &lt;a href="https://lwn.net/SubscriberLink/475592/263ca50b47faccfb/"&gt;this excellent article/interview&lt;/a&gt; on &lt;a href="http://www.lwn.net/"&gt;LWN&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8139365828806198838?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8139365828806198838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2012/01/whither-samba.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8139365828806198838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8139365828806198838'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2012/01/whither-samba.html' title='Whither Samba?'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4041506797836468361</id><published>2012-01-03T07:37:00.001-05:00</published><updated>2012-01-03T07:37:34.522-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='banshee'/><category scheme='http://www.blogger.com/atom/ns#' term='npr'/><category scheme='http://www.blogger.com/atom/ns#' term='bbc'/><title type='text'>Streaming the BBC World Service</title><content type='html'>Every leap year the american public radio service becomes obsessed with providing non-stop glossy and shallow coverage of the various &lt;a href="http://theblackjacker.se/wp-content/uploads/2009/06/stupid.jpg"&gt;presidential candidates&lt;/a&gt;, &lt;a href="http://1.bp.blogspot.com/-inrcuqOFJ3M/TZiE7jnNEyI/AAAAAAAAAEk/TrwjhtUq8qA/s1600/StupidAmericans.jpg"&gt;campaigns&lt;/a&gt;, and &lt;a href="http://files.sharenator.com/stupid_Stupid_people_things_and_stuff-s360x450-47644-580.jpg"&gt;caucases&lt;/a&gt;.&amp;nbsp; They report endlessly on various polling results [even though the validity of such polls is in question according to credible statisticians and demographers].&amp;nbsp; Fortunately there is the &lt;a href="http://www.bbc.co.uk/worldservice/"&gt;BBC World Service&lt;/a&gt; which offers an alternative for english speaking listeners exhausted by &lt;a href="http://media.photobucket.com/image/stupid/etremeimprint/stupid.jpg"&gt;caucus mania&lt;/a&gt;.&amp;nbsp; The appropriate links are not easy to find - but they are &lt;a href="http://www.bbc.co.uk/worldservice/institutional/2009/10/091029_internetradiomobilelinks.shtml"&gt;there&lt;/a&gt;. The MP3 link under "&lt;b&gt;World Service English (Internet Schedule)&lt;span style="font-weight: normal;"&gt;"&lt;/span&gt; &lt;span style="font-weight: normal;"&gt;works perfectly when added to &lt;a href="http://banshee.fm/"&gt;Banshee's&lt;/a&gt; radio playlist.&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4041506797836468361?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4041506797836468361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2012/01/streaming-bbc-world-service.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4041506797836468361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4041506797836468361'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2012/01/streaming-bbc-world-service.html' title='Streaming the BBC World Service'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4933558744460772614</id><published>2011-12-12T07:00:00.000-05:00</published><updated>2011-12-12T07:00:36.488-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome3'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='dbus'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><category scheme='http://www.blogger.com/atom/ns#' term='networkmanager'/><title type='text'>Querying Connectivity</title><content type='html'>You're application almost always needs to know if there is a working network connection.&amp;nbsp; This is typically handled by placing the connection attempt in a &lt;i&gt;try...catch&lt;/i&gt; block.&amp;nbsp; That works, but can be slow, and it means the UI can't really adapt to the level of current connectivity.&amp;nbsp; A much better solution is to query the &lt;a href="http://projects.gnome.org/NetworkManager/"&gt;NetworkManager&lt;/a&gt; [used by every &lt;a href="http://www.opensuse.org/en/"&gt;mainstream distribution&lt;/a&gt;] via the System &lt;a href="http://www.freedesktop.org/wiki/Software/dbus"&gt;D-Bus&lt;/a&gt; for the current connectivity.&amp;nbsp; This method is used by many applications from &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt;'s &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt; to &lt;a href="http://www.mozilla.org/"&gt;Mozilla's Firefox&lt;/a&gt; - but it doesn't seem to get much press coverage.&amp;nbsp; So here is a simple example to query connectivity via &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; [assuming &lt;a href="http://projects.gnome.org/NetworkManager/"&gt;NetworkManager&lt;/a&gt; 0.9 or later]:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;&lt;pre&gt;#!/usr/bin/env python&lt;br /&gt;import dbus&lt;br /&gt;&lt;br /&gt;NM_BUS_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 'org.freedesktop.NetworkManager'&lt;br /&gt;NM_OBJECT_PATH&amp;nbsp;&amp;nbsp;&amp;nbsp; = '/org/freedesktop/NetworkManager'&lt;br /&gt;NM_INTERFACE_NAME = 'org.freedesktop.NetworkManager'&lt;br /&gt;NM_STATE_INDEX = {&amp;nbsp; 0: 'Unknown',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10: 'Asleep', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20: 'Disconnected',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30: 'Disconnecting',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40: 'Connecting',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50: 'Connected (Local)',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 60: 'Connected (Site)',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 70: 'Connected (Global)' }&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bus = dbus.SystemBus()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; manager&amp;nbsp;&amp;nbsp; = bus.get_object(NM_BUS_NAME, NM_OBJECT_PATH)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; interface = dbus.Interface(manager, NM_INTERFACE_NAME)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; state = interface.state()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if state in NM_STATE_INDEX:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print('Current Network State: {0}'.format(NM_STATE_INDEX[state]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print('Network Manager state not recognized.')&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;FYI&lt;/b&gt;: if you &lt;a href="http://www.globalsearchnetwork.com/images/continuous-improvement.jpg"&gt;search the interwebz&lt;/a&gt; for the &lt;a href="http://projects.gnome.org/NetworkManager/"&gt;NetworkManager&lt;/a&gt; API specification ... every search engine will send you to the wrong place; either just wrong or to the documentation of an older version of the API.  The current API specification is &lt;a href="http://projects.gnome.org/NetworkManager/developers/api/09/spec.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4933558744460772614?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4933558744460772614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/querying-connectivity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4933558744460772614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4933558744460772614'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/querying-connectivity.html' title='Querying Connectivity'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5187824706432454897</id><published>2011-12-12T06:12:00.000-05:00</published><updated>2011-12-12T06:12:21.943-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome3'/><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='zeitgeist'/><title type='text'>GNOME3 Journal Extension</title><content type='html'>Now that's what I'm talking about!&amp;nbsp; A new extension just showed up on &lt;a href="https://extensions.gnome.org/"&gt;extensions.gnome.org&lt;/a&gt; that adds a "&lt;span style="color: blue;"&gt;Journal&lt;/span&gt;" tab to the already awesome GNOME3 overview.&amp;nbsp; It integrates with &lt;a href="http://live.gnome.org/Zeitgeist"&gt;Zeitgeist&lt;/a&gt; to provide access to recently or heavily used categories of items - sort of like "Recent" but all grown up and with college smarts.&amp;nbsp; And installing it is as easy as clicking "On" [assuming you have &lt;a href="http://live.gnome.org/Zeitgeist"&gt;Zeitgeist&lt;/a&gt; already installed].&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CQLy4M_OC1I/TuXhTTkoYfI/AAAAAAAAAEg/BlJEIfw4Oeg/s1600/Screenshot+at+2011-12-12+06%253A10%253A20.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/-CQLy4M_OC1I/TuXhTTkoYfI/AAAAAAAAAEg/BlJEIfw4Oeg/s400/Screenshot+at+2011-12-12+06%253A10%253A20.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Journal tab in Overview&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;A very handy addition that adds to the same concept provided by the &lt;a href="http://live.gnome.org/GnomeActivityJournal"&gt;gnome-activity-journal&lt;/a&gt; [which is packaged for openSUSE, BTW].&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5187824706432454897?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5187824706432454897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/gnome3-journal-extension_12.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5187824706432454897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5187824706432454897'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/gnome3-journal-extension_12.html' title='GNOME3 Journal Extension'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-CQLy4M_OC1I/TuXhTTkoYfI/AAAAAAAAAEg/BlJEIfw4Oeg/s72-c/Screenshot+at+2011-12-12+06%253A10%253A20.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2280953393544270824</id><published>2011-12-10T09:20:00.001-05:00</published><updated>2011-12-13T20:37:48.416-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openssue'/><category scheme='http://www.blogger.com/atom/ns#' term='sysctl'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Really? A SHMMAX of 36MB</title><content type='html'>I was running some tests on &lt;a href="https://sourceforge.net/projects/coils/"&gt;OpenGroupware Coils&lt;/a&gt; on my new &lt;a href="http://h18000.www1.hp.com/products/quickspecs/12522_div/12522_div.HTML"&gt;HP workstation&lt;/a&gt; - and &lt;a href="http://www.postgresql.org/"&gt;PostgresSQL&lt;/a&gt; seemed to be huffing-and-puffing like an overweight guy trying to run up stairs.&amp;nbsp; Huh.&amp;nbsp; What is the first thing a &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; administraor always checks? The &lt;a href="http://www.postgresql.org/docs/current/static/runtime-config-resource.html"&gt;shared_buffers&lt;/a&gt; parameter [in &lt;span style="color: blue;"&gt;/var/lib/pgsql/data/postgresql.conf&lt;/span&gt;]; the default package typically sets this value to some absurdly small value resulting in dreadful performance.&amp;nbsp; This default value is the principal reason the absurd notion that "&lt;span style="color: #4c1130;"&gt;MySQL is faster than PostgreSQL&lt;/span&gt;" got traction.&amp;nbsp; Sure enough - the default value is 24MB! Yikes.&amp;nbsp; So I changed that setting to a more reasonable 512MB.&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;shared_buffers = 512MB&lt;/blockquote&gt;Then I tried to restart &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;, and it flopped.&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;$ &lt;span style="color: red;"&gt;service postgresql start&lt;/span&gt;&lt;br /&gt;redirecting to systemctl&lt;br /&gt;Job failed. See system logs and 'systemctl status' for details.&lt;/blockquote&gt;Looking in&lt;span style="color: blue;"&gt; /var/log/messages&lt;/span&gt; I see:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;Dec&amp;nbsp; 9 19:27:23 workstation postgresql[7288]: Starting PostgreSQL2011-12-09 19:27:23 EST&amp;nbsp;&amp;nbsp; FATAL:&amp;nbsp; could not create shared memory segment: Invalid argument&lt;br /&gt;Dec&amp;nbsp; 9 19:27:23 workstation postgresql[7288]: 2011-12-09 19:27:23 EST&amp;nbsp;&amp;nbsp; DETAIL:&amp;nbsp; Failed system call was shmget(key=5432001, size=76685312, 03600).&lt;/blockquote&gt;Huh.&amp;nbsp; I remember an error message like that from the &lt;a href="http://www.linuxjournal.com/article/5748"&gt;RedHat 6.x &amp;amp; 7.x&lt;/a&gt; days when the kernel's default settings regarding &lt;a href="http://fscked.org/writings/SHM/shm-5.html"&gt;System V IPC&lt;/a&gt; resources where really low.&amp;nbsp; Back then you possibly had to go look at defines in header files for these values. Fortunately we now have &lt;a href="http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/8/sysctl-man-page.html"&gt;sysctl&lt;/a&gt;.&amp;nbsp; And what does sysctl tell us?&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;$ &lt;span style="color: red;"&gt;sysctl kernel.shmmax&lt;/span&gt;&lt;br /&gt;kernel.shmmax = 33554432&lt;/blockquote&gt;What?!?!&amp;nbsp; That value is in bytes - so the limit is &lt;span style="color: red;"&gt;~32MB&lt;/span&gt;?!&amp;nbsp; This is on a 64-bit installation with 8GB of RAM. That makes no sense at all.&amp;nbsp; Time to change that to something reasonable:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;$ sysctl -w kernel.shmmax=1000000000&lt;/blockquote&gt;And now "&lt;span style="color: blue;"&gt;service postgresql start&lt;/span&gt;" succeeds.&amp;nbsp; The &lt;a href="http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/8/ipcs-man-page.html"&gt;&lt;span style="color: blue;"&gt;ipcs&lt;/span&gt;&lt;/a&gt; command which reports System V IPC resources allocated in the system shows that the &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; engine has allocated the expected buffer pool:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;&lt;pre&gt;$ &lt;span style="color: red;"&gt;ipcs&lt;/span&gt;&lt;br /&gt;------ Shared Memory Segments --------&lt;br /&gt;key&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shmid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owner&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perms&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nattch&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;0x0052e2c1 1212416&amp;nbsp;&amp;nbsp;&amp;nbsp; postgres&amp;nbsp;&amp;nbsp; 600&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 572383232&amp;nbsp; 4&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&lt;/blockquote&gt;Once you change a sysctl setting in a helpful way the change has to be added to the &lt;span style="color: blue;"&gt;/etc/sysctl.d/&lt;/span&gt; so that it gets re-applied when the machine reboots;&amp;nbsp; otherwise our &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; instance is going to fail to start next time.&amp;nbsp; Create a file in that directory with a name such as &lt;span style="color: blue;"&gt;postgresql.conf&lt;/span&gt; containing a single line of -&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;kernel.shmmax = 1000000000&lt;/blockquote&gt;The files in &lt;span style="color: blue;"&gt;/etc/sysctl.d/&lt;/span&gt; are processed after distribution and package defaults are applied.&amp;nbsp; It is also possible to edit &lt;span style="color: blue;"&gt;/etc/sysctl.conf&lt;/span&gt;; however manual changes to that file may get overwritten by system management tools.&amp;nbsp; So use the &lt;span style="color: blue;"&gt;/etc/sysctl.d/&lt;/span&gt; strategy to override distribution defaults.&lt;br /&gt;Now, back to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2280953393544270824?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2280953393544270824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/really-shmmax-of-36mb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2280953393544270824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2280953393544270824'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/really-shmmax-of-36mb.html' title='Really? A SHMMAX of 36MB'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2837314439543804242</id><published>2011-12-09T06:12:00.000-05:00</published><updated>2011-12-09T06:12:22.093-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome3'/><title type='text'>"Secret" extensions.gnome.org links</title><content type='html'>The new &lt;a href="https://extensions.gnome.org/"&gt;extensions.gnome.org&lt;/a&gt; is a fabulous idea and well-executed concept. But one issue is that is it isn't easy to visualize what is new; and the content of the site is growing rapidly.&amp;nbsp; As it turns out there is a &lt;i&gt;secret&lt;/i&gt; link to sort extensions by the order they were added: &lt;a href="https://extensions.gnome.org/?sort=recent"&gt;https://extensions.gnome.org/?sort=recent&lt;/a&gt; For all the RSS user's out there the site also provides an RSS feed: &lt;a href="https://extensions.gnome.org/rss/"&gt;https://extensions.gnome.org/rss/&lt;/a&gt; Enjoy!&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;Note: &lt;/b&gt;Seriously people - this site is barely two weeks old.&amp;nbsp; Have some patience. It seems doubtless that the obviously inspired developers will add the "obviously" needed features in due time&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2837314439543804242?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2837314439543804242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/secret-extensionsgnomeorg-links.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2837314439543804242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2837314439543804242'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/secret-extensionsgnomeorg-links.html' title='&quot;Secret&quot; extensions.gnome.org links'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4750994911822194391</id><published>2011-12-07T07:11:00.000-05:00</published><updated>2011-12-07T07:11:26.467-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='vcs'/><category scheme='http://www.blogger.com/atom/ns#' term='tortoisehg'/><title type='text'>TortoiseHg Packages</title><content type='html'>It turns out some kind fellow has packaged &lt;a href="http://tortoisehg.bitbucket.org/"&gt;TortoiseHg&lt;/a&gt; for &lt;a href="http://www.opensuse.org/en/"&gt;openSUSE&lt;/a&gt; 12.1;&amp;nbsp; you can find the packages in the &lt;a href="http://download.opensuse.org/repositories/home:/tzotsos:/vcs/openSUSE_12.1/"&gt;home:tzotsos:vcs&lt;/a&gt; repo.&amp;nbsp; The repo provides not just the Tortoise GUI but the nautilus extensions as well. The only item the packages seem not to provide is a &lt;a href="http://standards.freedesktop.org/desktop-entry-spec/latest/"&gt;.desktop&lt;/a&gt; file for starting the thg application - without a &lt;a href="http://standards.freedesktop.org/desktop-entry-spec/latest/"&gt;.desktop&lt;/a&gt; file &lt;a href="http://www.gnome.org/gnome-3/"&gt;GNOME3&lt;/a&gt; doesn't know the application exists.&amp;nbsp; You can either create the required file using &lt;a href="http://en.wikipedia.org/wiki/Alacarte"&gt;alacarte&lt;/a&gt; or by hand; if by hand open the [new] file at &lt;span style="color: blue;"&gt;~/.local/share/applications/tortoise.desktop&lt;/span&gt; and paste in:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;&lt;pre&gt;#!/usr/bin/env xdg-open&lt;br /&gt;&lt;br /&gt;[Desktop Entry]&lt;br /&gt;Version=1.0&lt;br /&gt;Type=Application&lt;br /&gt;Terminal=false&lt;br /&gt;Icon[en_US]=/usr/share/pixmaps/tortoisehg/icons/thg_logo_92x50.png&lt;br /&gt;Exec=/usr/bin/thg&lt;br /&gt;Name[en_US]=Tortoise Hg&lt;br /&gt;Comment[en_US]=Mercurial Client&lt;br /&gt;Name=Tortoise Hg&lt;br /&gt;Comment=Mercurial Client&lt;br /&gt;Icon=/usr/share/pixmaps/tortoisehg/icons/thg_logo_92x50.png&lt;/pre&gt;&lt;/blockquote&gt;Now &lt;a href="http://www.gnome.org/gnome-3/"&gt;GNOME3&lt;/a&gt; will know about the thg application and you can launch it via the application search as well as add it to your launcher.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4750994911822194391?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4750994911822194391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/tortoisehg-packages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4750994911822194391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4750994911822194391'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/tortoisehg-packages.html' title='TortoiseHg Packages'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6078531376173679171</id><published>2011-12-05T07:39:00.001-05:00</published><updated>2011-12-05T07:48:49.464-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rabbitmq'/><category scheme='http://www.blogger.com/atom/ns#' term='amqp'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><title type='text'>Enabling the RabbitMQ Management Plugin</title><content type='html'>Prior to 2.7.x version of &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; it was necessary to manually install the plug-ins that provided the management interface [as well as their dependencies]. Now in the 2.7.x series the management interface plug-in and related dependencies are included - but &lt;b&gt;not&lt;/b&gt; enabled by default.&amp;nbsp; The management plug-in must be toggled into the enabled state using the new &lt;a href="http://www.rabbitmq.com/plugins.html"&gt;rabbitmq-plugins&lt;/a&gt; command.&amp;nbsp; Enabling a plug-in will automatically enable any other plug-ins that the specified plug-in depends on Whenever you enable or disable a plug-in you must restart the sever.&lt;br /&gt;If you have a brand new 2.7.x instance installed, turn on the plug-in with: &lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;service rabbitmq-server stop&lt;br /&gt;rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;service rabbitmq-server restart&lt;/blockquote&gt;When you performed the &lt;a href="http://www.rabbitmq.com/plugins.html"&gt;rabbitmq-plugins&lt;/a&gt; command you should have seen the following output:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow;"&gt;The following plugins have been enabled:&lt;br /&gt;&amp;nbsp; mochiweb&lt;br /&gt;&amp;nbsp; webmachine&lt;br /&gt;&amp;nbsp; rabbitmq_mochiweb&lt;br /&gt;&amp;nbsp; amqp_client&lt;br /&gt;&amp;nbsp; rabbitmq_management_agent&lt;br /&gt;&amp;nbsp; rabbitmq_management&lt;/blockquote&gt;You management interface at TCP/55672 should be available.&amp;nbsp; The initial login and password are "guest" and "guest".&amp;nbsp; You want to change those.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6078531376173679171?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6078531376173679171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/enabling-rabbitmq-management-plugin.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6078531376173679171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6078531376173679171'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/enabling-rabbitmq-management-plugin.html' title='Enabling the RabbitMQ Management Plugin'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8873687869371648416</id><published>2011-12-03T17:21:00.003-05:00</published><updated>2011-12-05T07:29:01.762-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rabbitmq'/><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='amqp'/><title type='text'>Idjit's Guide To Installing RabbitMQ on openSUSE 12.1</title><content type='html'>The &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; team provides a generic SUSE RPM which works on &lt;a href="http://www.opensuse.org/en/"&gt;openSUSE&lt;/a&gt; 11.x, &lt;a href="http://www.opensuse.org/en/"&gt;openSUSE&lt;/a&gt; 12.1, and I presume on the pay-to-play versions of &lt;a href="http://www.suse.com/"&gt;SuSE&lt;/a&gt; Enterprise Server.  About the only real dependency for &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; is the &lt;a href="http://www.erlang.org/"&gt;erlang&lt;/a&gt; platform which is packages in the &lt;a href="http://www.erlang.org/"&gt;erlang&lt;/a&gt; language repo. So the only real trick is getting the RabbitMQ package itself [from this page].&amp;nbsp; Then install and start is as simple as:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow;"&gt;zypper in http://download.opensuse.org/repositories/devel:/languages:/erlang/openSUSE_12.1 erlang&lt;br /&gt;zypper in erlang&lt;br /&gt;wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.7.0/rabbitmq-server-2.7.0-1.suse.noarch.rpm&lt;br /&gt;rpm -Uvh rabbitmq-server-2.7.0-1.suse.noarch.rpm&lt;br /&gt;service rabbitmq-server start&lt;/blockquote&gt;Now you probably want to do some configuration and provisioning using the &lt;a href="http://www.rabbitmq.com/man/rabbitmqctl.1.man.html"&gt;rabbitmqctl&lt;/a&gt; command; but your &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; instance is up and running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8873687869371648416?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8873687869371648416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/idjits-guide-to-installing-rabbitmq-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8873687869371648416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8873687869371648416'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/idjits-guide-to-installing-rabbitmq-on.html' title='Idjit&apos;s Guide To Installing RabbitMQ on openSUSE 12.1'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8622863697208650237</id><published>2011-12-01T09:00:00.000-05:00</published><updated>2011-12-01T09:00:42.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gedit'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Using gedit to make a list of values into a set.</title><content type='html'>&lt;a href="http://projects.gnome.org/gedit/"&gt;gedit&lt;/a&gt; is awesome;&amp;nbsp; the flexibility of the tool continues to impress me.&amp;nbsp; One problem I'm frequently faced with is a list of id values from some query, or utility, or e-mail message... and I want to do something with them.&amp;nbsp; So, for example I have:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: black;"&gt;10731&lt;br /&gt;10732&lt;br /&gt;10733&lt;br /&gt;10734&lt;br /&gt;10735&lt;br /&gt;10736&lt;br /&gt;10737&lt;br /&gt;10738&lt;br /&gt;10739&lt;/blockquote&gt;but what I need is those id values as a sequence such as for use in an &lt;a href="http://www.contrib.andrew.cmu.edu/%7Eshadow/sql/sql1992.txt"&gt;SQL&lt;/a&gt; IN expression or to assign to a Python set or list.&amp;nbsp; What I want is:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: black;"&gt;(10731,'10732', '10733', '10734', '10735', '10736', '10737',&lt;br /&gt;'10738', '10739')&lt;/blockquote&gt;Reformatting a few numbers by hand isn't too hard - but what if I have a list of hundreds of id values? The answer, of course, is provided by gedit.&amp;nbsp; Under &lt;b&gt;Tools&lt;/b&gt; -&amp;gt; &lt;b&gt;Manage External Tools&lt;/b&gt; the user can build filters that can be applied to documents and have the results returned to gedit.&amp;nbsp; If I create a new external tool that accepts as input the "&lt;b&gt;Current document&lt;/b&gt;" and as output has "&lt;b&gt;Replace current document&lt;/b&gt;" then &lt;a href="http://projects.gnome.org/gedit/"&gt;gedit&lt;/a&gt; will replace the contents of the current document with the results of the filter [pretty obvious;&amp;nbsp; and if it doesn't work I can always Ctrl-Z].&amp;nbsp; The body of the filter can be any script - a &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; script is perfectly valid. Like this hack:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow;"&gt;&lt;pre&gt;#!/usr/bin/env python&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;iteration = 0&lt;br /&gt;line_length = 0&lt;br /&gt;text = sys.stdin.readline()&lt;br /&gt;while (text !=&amp;nbsp; ''):&lt;br /&gt;&amp;nbsp; text = text.strip()&lt;br /&gt;&amp;nbsp; if (len(text) &amp;gt; 0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (iteration == 0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.stdout.write('(')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.stdout.write(', ') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (line_length &amp;gt; 74):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.stdout.write('\n ')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; line_length = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (len(text) &amp;gt; 0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.stdout.write('\'{0}\''.format(text))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; line_length = line_length + len(text) + 4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iteration = iteration + 1&lt;br /&gt;&amp;nbsp; text = sys.stdin.readline()&lt;br /&gt;sys.stdout.write(')')&amp;nbsp; &lt;br /&gt;sys.stdout.flush()&lt;/pre&gt;&lt;/blockquote&gt;The current document becomes the standard-input for the script and the standard-output of the script will replace the current document.  The above hack reads in a list of lines and returns them as a set enumeration nicely wrapped to 80 characters per line.  External tools are saved under names; for this one I saved it as "IN-Clause-Filter".&lt;br /&gt;Now that I've setup the external tool every time I paste a list of id values into &lt;a href="http://projects.gnome.org/gedit/"&gt;gedit&lt;/a&gt; I can simply select &lt;b&gt;Tools&lt;/b&gt; -&gt; &lt;b&gt;External Tools&lt;/b&gt; -&gt; &lt;b&gt;IN-Clause-Filter&lt;/b&gt; and my list is instantly turned into a set enumeration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8622863697208650237?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8622863697208650237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/using-gedit-to-make-list-of-values-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8622863697208650237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8622863697208650237'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/12/using-gedit-to-make-list-of-values-into.html' title='Using gedit to make a list of values into a set.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1438642215946099761</id><published>2011-11-28T05:15:00.002-05:00</published><updated>2011-11-28T05:15:00.278-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='malware'/><category scheme='http://www.blogger.com/atom/ns#' term='samba'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='clamav'/><title type='text'>Samba-VirusFilter 0.1.3 Released</title><content type='html'>&lt;div class="tr_bq"&gt;&lt;a href="https://github.com/fumiyas/samba-virusfilter"&gt;Samba-VirusFilter&lt;/a&gt; (the heir to samba-vscan) version 0.1.3 was released a few days ago [&lt;a href="https://github.com/fumiyas/samba-virusfilter/downloads"&gt;download&lt;/a&gt;].&amp;nbsp; Samba-VirusFilter supports &lt;a href="http://www.clamav.net/lang/en/"&gt;ClamAV&lt;/a&gt;, F-Secure, and Sophos.&amp;nbsp; A sample &lt;a href="http://www.clamav.net/lang/en/"&gt;ClamAV&lt;/a&gt; configuration snippet for your smb.conf looks like:&lt;/div&gt;&lt;blockquote style="background-color: yellow;"&gt;vfs objects = svf-clamav&lt;br /&gt;svf-clamav:scan on open = yes | no&lt;br /&gt;svf-clamav:scan on close = yes | no&lt;br /&gt;svf-clamav:max file size = &lt;i&gt;(bytes, default 10^8)&lt;/i&gt;&lt;br /&gt;svf-clamav:min file size = &lt;i&gt;(bytes, default 10)&lt;/i&gt;&lt;br /&gt;svf-clamav:infected file action = nothing | quarantine | delete&lt;br /&gt;svf-clamav:quarantine directory&amp;nbsp; = &lt;i&gt;directory&lt;/i&gt;&lt;br /&gt;svf-clamav:quarantine prefix = &lt;i&gt;string&lt;/i&gt;&lt;br /&gt;svf-clamav:infected file command = &lt;i&gt;command&lt;/i&gt;&lt;br /&gt;svf-clamav:scan error command = &lt;i&gt;command&lt;/i&gt;&lt;/blockquote&gt;If you use a quarantine directory don't forget to make sure the &lt;a href="http://www.samba.org/"&gt;Samba&lt;/a&gt; daemon will always have sufficient access to put files in there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1438642215946099761?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1438642215946099761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/samba-virusfilter-013-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1438642215946099761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1438642215946099761'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/samba-virusfilter-013-released.html' title='Samba-VirusFilter 0.1.3 Released'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8167611344898038055</id><published>2011-11-27T09:59:00.002-05:00</published><updated>2011-11-27T10:59:08.075-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samba'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='ldap'/><title type='text'>Overlooked Content From 2011</title><content type='html'>Yes, it is almost 2012.&lt;br /&gt;Looking back for overlooked content I'm compelled to mention the &lt;a href="http://www.daasi.de/ldapcon2011/index.php?site=main"&gt;2011&lt;/a&gt; annual "LDAPCon" conference focused on directory services and LDAP; the organizers/hosts have made available some excellent videos and papers [&lt;a href="http://www.daasi.de/ldapcon2011/index.php?site=program"&gt;index page&lt;/a&gt;]. These are an unrivaled source of information on the current state and future of directory services.&lt;br /&gt;The same is also true of the annual &lt;a href="http://sambaxp.org/"&gt;SambaXP&lt;/a&gt; conference in relation to all things Samba and CIFS [&lt;a href="http://sambaxp.org/index.php?id=68"&gt;2011 content index&lt;/a&gt;].&lt;br /&gt;Podcast content in general tends to be lite and aimless fare;&amp;nbsp; those sources provide some meat for the meal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8167611344898038055?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8167611344898038055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/overlooked-content-from-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8167611344898038055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8167611344898038055'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/overlooked-content-from-2011.html' title='Overlooked Content From 2011'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5146182433876489275</id><published>2011-11-27T09:11:00.000-05:00</published><updated>2011-11-27T09:11:45.637-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>All those SQLite databases...</title><content type='html'>Many current application use the &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt; database for tracking information; this includes &lt;a href="http://f-spot.org/"&gt;F-Spot&lt;/a&gt;, &lt;a href="http://banshee.fm/"&gt;Banshee&lt;/a&gt;, &lt;a href="http://projecthamster.wordpress.com/"&gt;Hamster&lt;/a&gt;, &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt;, and others.&amp;nbsp; Even the &lt;a href="http://6angryapes.com/javascript/webkit-html5-sqlite-client-side-database-sotrage/"&gt;WebKit&lt;/a&gt; component uses &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt; [you might be surprised to discover &lt;span style="color: blue;"&gt;~/.local/share/webkit/databases&lt;/span&gt;].&amp;nbsp; It is wonderfully efficient that there is one common local data storage technique all these applications can use,&amp;nbsp; especially since it is one that is managable using a universally known dialect [SQL]. But there is a dark-side to &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt;.&amp;nbsp; Much like old &lt;a href="http://www.ghservices.com/gregh/clipper/trix0006.htm"&gt;Dbase&lt;/a&gt; databases it needs to be &lt;a href="http://www.sqlite.org/lang_vacuum.html"&gt;vacuumed&lt;/a&gt;.&amp;nbsp; And how reliably are all those applications providing their &lt;i&gt;little&lt;/i&gt; databases with the required affection?&amp;nbsp; Also, do you trust those lazy developers to have dealt with the condition of a corrupted database?&amp;nbsp;&amp;nbsp; If an application hangs, or is slow, or doesn't open... maybe that &lt;i&gt;little&lt;/i&gt; database is corrupted?&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;Aside:&lt;/b&gt; As a system administrator for almost two decades I do not trust developers. They still put error messages in applications like "&lt;a href="http://www.annoyances.org/exec/show/article07-102"&gt;File not found!&lt;/a&gt;".&amp;nbsp;  Argh!&lt;/blockquote&gt;On the other hand &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt; provides a handy means of performing an integrity check on databases - the "&lt;a href="http://sqlite.org/pragma.html#pragma_integrity_check"&gt;PRAGMA integrity_check&lt;/a&gt;" command.&amp;nbsp; I've watched a few of these little databases and discovered that &lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;(a)&lt;/span&gt; they aren't often all that little, and &lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;(b)&lt;/span&gt; manually performing a &lt;a href="http://www.sqlite.org/lang_vacuum.html"&gt;VACUUM&lt;/a&gt; may dramatically reduce their on-disk size.&amp;nbsp; Both these facts indicate that developers are lazy and should not be trusted.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;Note:&lt;/b&gt; in at least one of these cases the application has subsequently been improved. Developers do respond rather quickly when offered a blend of compliments spiced with bug reports.&amp;nbsp; No, I'm not going to name offending applications as that is too easily used as fodder by &lt;a href="http://en.wikipedia.org/wiki/Spiro_Agnew"&gt;nattering nabobs&lt;/a&gt;.&amp;nbsp; And even the laziest Open Source developer is working harder than their proprietary brothers.&lt;/blockquote&gt;In light of this situation my solution is a hack - a &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; script [&lt;a href="http://www.wmmi.net/documents/sqlite-integrity-check"&gt;download&lt;/a&gt;] that crawls around looking for &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt; databases.&amp;nbsp; First the script attempts to open the database in exclusive mode, then it performs an integrity check, and if that succeeds it performs a vacuum operation.&amp;nbsp; Currently it looks for databases in "&lt;span style="color: blue;"&gt;~/.local/share&lt;/span&gt;" [where it will find databases managed by application appropriately following the &lt;a href="http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html"&gt;XDG&lt;/a&gt; specification], "&lt;span style="color: blue;"&gt;~/.cache&lt;/span&gt;", "&lt;span style="color: blue;"&gt;~/.pki&lt;/span&gt;", "&lt;span style="color: blue;"&gt;~/.rcc&lt;/span&gt;", and "&lt;span style="color: blue;"&gt;~/.config&lt;/span&gt;".&lt;br /&gt;Download the script and run it. Worst thing that happens is that it accomplishes nothing.&amp;nbsp; On the other hand it might recover some disk space, improve application performance, or reveal a busted database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5146182433876489275?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5146182433876489275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/all-those-sqlite-databases.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5146182433876489275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5146182433876489275'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/all-those-sqlite-databases.html' title='All those SQLite databases...'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-725747762267610387</id><published>2011-11-25T08:54:00.000-05:00</published><updated>2011-11-25T08:54:55.200-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome-tweak-tool'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome3'/><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>gnome-tweak-tool</title><content type='html'>&lt;a href="http://www.gnome.org/gnome-3/"&gt;GNOME3&lt;/a&gt; simplified many things.&amp;nbsp; In the process some settings and preferences got removed from the primary user interface.&amp;nbsp; A side-effect of that is a fair number of BLOG posts like "&lt;a href="http://www.sysrich.co.uk/?p=18"&gt;Dude where’s my settings?&lt;/a&gt;".&amp;nbsp; Many of these BLOG posts are informative; they explain how to get to the preference value via &lt;a href="http://dconf/"&gt;dconf&lt;/a&gt; either by the command line &lt;a href="http://developer.gnome.org/gio/unstable/gsettings-tool.html"&gt;gsettings&lt;/a&gt; tool or the GUI dconf-editor [which replaces GNOME2's gconf-editor].&amp;nbsp; Both of those are good methods. Knowing how to use &lt;a href="http://developer.gnome.org/gio/unstable/gsettings-tool.html"&gt;gsettings&lt;/a&gt; in case of an &lt;a href="http://failblog.files.wordpress.com/2011/07/epic-fail-photos-train-fail.jpg"&gt;epic-fail&lt;/a&gt; situation is a very useful skill to have. On the other hand - most of the settings discussed in these posts can be easily tweaked using the appropriately named &lt;a href="http://live.gnome.org/GnomeTweakTool"&gt;gnome-tweak-tool&lt;/a&gt;.&amp;nbsp; &lt;a href="http://live.gnome.org/GnomeTweakTool"&gt;gnome-tweak-tool&lt;/a&gt; provides a friendly GUI to a variety of &lt;i&gt;maybe-you-shouldn't-mess-with-this-but-here-we-are&lt;/i&gt; kind of preferences.&amp;nbsp; The &lt;a href="http://live.gnome.org/GnomeTweakTool"&gt;gnome-tweak-tool&lt;/a&gt; package is available in the standard repositories for &lt;a href="http://www.opensuse.org/"&gt;openSUSE&lt;/a&gt; 12.1&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pltcE43RJQY/Ts-bR0XjdGI/AAAAAAAAAEM/Q8eIfxpucPU/s1600/GTT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://3.bp.blogspot.com/-pltcE43RJQY/Ts-bR0XjdGI/AAAAAAAAAEM/Q8eIfxpucPU/s400/GTT.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-725747762267610387?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/725747762267610387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/gnome-tweak-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/725747762267610387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/725747762267610387'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/gnome-tweak-tool.html' title='gnome-tweak-tool'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-pltcE43RJQY/Ts-bR0XjdGI/AAAAAAAAAEM/Q8eIfxpucPU/s72-c/GTT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5112864069792360287</id><published>2011-11-25T06:57:00.000-05:00</published><updated>2011-11-25T06:57:18.079-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zeitgesit'/><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome-activity-journal'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GAJ, Zeitgeist, &amp; openSUSE 12.1</title><content type='html'>In openSUSE 12.1 the &lt;a href="http://live.gnome.org/GnomeActivityJournal"&gt;GNOME Activity Journal&lt;/a&gt; and &lt;a href="http://live.gnome.org/Zeitgeist"&gt;Zeitgeist&lt;/a&gt; data hub are only a package install away -&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: yellow; color: blue;"&gt;zypper in gnome-activity-journal&lt;/span&gt;&lt;/blockquote&gt;Now the &lt;a href="http://live.gnome.org/GnomeActivityJournal"&gt;GNOME Activity Journal&lt;/a&gt; is available;&amp;nbsp; an excellent productivity tool.&amp;nbsp; Hopefully more &lt;a href="http://zeitgeist-project.com/docs/0.7/client.html"&gt;data providers&lt;/a&gt; will appear soon.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--D10sGbIAIQ/Ts-CPWMfL3I/AAAAAAAAAEE/S2l-p4SC2JM/s1600/GAJ.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://3.bp.blogspot.com/--D10sGbIAIQ/Ts-CPWMfL3I/AAAAAAAAAEE/S2l-p4SC2JM/s400/GAJ.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5112864069792360287?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5112864069792360287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/gaj-zeitgeist-opensuse-121.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5112864069792360287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5112864069792360287'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/gaj-zeitgeist-opensuse-121.html' title='GAJ, Zeitgeist, &amp; openSUSE 12.1'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/--D10sGbIAIQ/Ts-CPWMfL3I/AAAAAAAAAEE/S2l-p4SC2JM/s72-c/GAJ.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7355929368717356638</id><published>2011-11-25T06:25:00.000-05:00</published><updated>2011-11-25T06:25:25.456-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libreoffice'/><title type='text'>Ctrl-Alt-Shift-V ... Pasting Happiness</title><content type='html'>If you cut or copy text from an application [especially a web browser] and then paste it into &lt;a href="http://www.libreoffice.org/"&gt;LibreOffice&lt;/a&gt; what you often get is formatted text, or at least some approximation of the text's original formatting.&amp;nbsp; This is awful.&amp;nbsp; When using &lt;a href="http://www.libreoffice.org/"&gt;LibreOffice&lt;/a&gt; appropriately all formatting is managed via the excellent support for &lt;a href="http://help.libreoffice.org/Writer/Styles_and_Formatting"&gt;styles&lt;/a&gt;. All you want is the text - and nothing about the text.&amp;nbsp; I've used the brute force solution in the past of &lt;i&gt;bouncing&lt;/i&gt; my cut-n-paste through &lt;a href="http://projects.gnome.org/gedit/"&gt;gedit&lt;/a&gt;.&amp;nbsp; Until I discovered &lt;a href="http://help.libreoffice.org/Common/Pasting_Contents_in_Special_Formats"&gt;Ctrl-Alt-Shift-V&lt;/a&gt;.&amp;nbsp; Yes, all four keys at once.&amp;nbsp; &lt;a href="http://help.libreoffice.org/Common/Pasting_Contents_in_Special_Formats"&gt;Ctrl-Alt-Shift-V&lt;/a&gt; is un-formatted paste [it pastes nothing but the text].&amp;nbsp; &lt;b&gt;Pasting happiness!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7355929368717356638?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7355929368717356638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/ctrl-alt-shift-v-pasting-happiness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7355929368717356638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7355929368717356638'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/ctrl-alt-shift-v-pasting-happiness.html' title='Ctrl-Alt-Shift-V ... Pasting Happiness'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7285217887927539290</id><published>2011-11-23T06:59:00.000-05:00</published><updated>2011-11-23T06:59:40.587-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qt4'/><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='tortoisehg'/><title type='text'>TortoiseHg &amp; openSUSE 12.1</title><content type='html'>&lt;a href="http://mercurial.selenic.com/wiki/TortoiseHg"&gt;TortoiseHg&lt;/a&gt; is an excellent GUI for working with code from a &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt; [aka Hg] repository.&amp;nbsp; You can just download the source and run "&lt;span style="color: blue;"&gt;./thg&lt;/span&gt;". The previous version of &lt;a href="http://mercurial.selenic.com/wiki/TortoiseHg"&gt;TortoiseHg&lt;/a&gt; used &lt;a href="http://pygtk.org/"&gt;PyGTK&lt;/a&gt; and pretty much &lt;b&gt;just-worked&lt;/b&gt;.&amp;nbsp; Recently they switched to using &lt;a href="http://qt.nokia.com/"&gt;Qt4&lt;/a&gt;.&amp;nbsp; Only once you install &lt;a href="http://qt.nokia.com/"&gt;Qt4&lt;/a&gt; support for &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; the GUI still doesn't run - it fails with an error:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;&lt;span style="font-family: 'Courier New,courier';"&gt;ImportError: No module named Qsci&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;&lt;span style="font-family: 'Courier New,courier';"&gt;What is "&lt;span style="color: blue;"&gt;Qsci&lt;/span&gt;"?&amp;nbsp; "&lt;span style="color: blue;"&gt;Qsci&lt;/span&gt;" is short hand for &lt;/span&gt;&lt;a href="http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/index.html"&gt;Qscintilla&lt;/a&gt; which is a Qt port of the &lt;a href="http://www.scintilla.org/"&gt;Scintilla&lt;/a&gt; editing component.&amp;nbsp; This is provided to &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; as the &lt;span style="color: blue;"&gt;PyQt4.Qsci&lt;/span&gt; module.&amp;nbsp; This module is installed separately from the main &lt;a href="http://qt.nokia.com/"&gt;Qt4&lt;/a&gt; module in a package called "&lt;span style="color: blue;"&gt;python-qscintilla&lt;/span&gt;" [notice a pattern where this feature of &lt;a href="http://qt.nokia.com/"&gt;Qt4&lt;/a&gt; is referred to by at least three names?].&amp;nbsp; Once you've run down this quirky daisy-chain of names it is just:&lt;/div&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;zypper in python-qscintilla&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin: 0px; text-indent: 0px;"&gt;and now &lt;a href="http://tortoisehg.bitbucket.org/"&gt;&lt;span style="color: blue;"&gt;thg&lt;/span&gt;&lt;/a&gt; runs.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7285217887927539290?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7285217887927539290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/tortoisehg-opensuse-121.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7285217887927539290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7285217887927539290'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/tortoisehg-opensuse-121.html' title='TortoiseHg &amp; openSUSE 12.1'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1220126453161914140</id><published>2011-11-01T18:15:00.002-04:00</published><updated>2011-11-01T18:15:00.212-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multimedia'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='codec'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><title type='text'>Converting M4B's to MP3</title><content type='html'>I ended up with some M4B audio files; these are "MPEG v4 system,&lt;a href="http://www.bing.com/search?q=itunes+sucks"&gt; iTunes&lt;/a&gt; AAC-LC" files.&amp;nbsp; In order to reliably manage these files along with every other audio file [all of which are MP3] the simplest solution is just to convert them to MP3.&amp;nbsp; In order to accomplish that I dumped them back out to WAV using &lt;a href="http://www.mplayerhq.hu/design7/news.html"&gt;mplayer&lt;/a&gt; and re-encoded them to MP3 using &lt;a href="http://lame.sourceforge.net/"&gt;lame&lt;/a&gt;.&amp;nbsp; Both &lt;a href="http://lame.sourceforge.net/"&gt;lame&lt;/a&gt; and &lt;a href="http://www.mplayerhq.hu/design7/news.html"&gt;mplayer&lt;/a&gt; are available for &lt;a href="http://www.opensuse.org/en/"&gt;openSUSE&lt;/a&gt; from the &lt;a href="http://packman.links2linux.org/"&gt;PacMan&lt;/a&gt; repositories, so you can easily install them via &lt;a href="http://en.opensuse.org/Zypper"&gt;zypper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow;"&gt;&lt;span style="color: blue;"&gt;mplayer "&lt;/span&gt;&lt;i style="color: #274e13;"&gt;filename&lt;/i&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: #274e13;"&gt;.m4b&lt;/span&gt;" -nojoystick -ao pcm:file=tmp.wav&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;lame -b 128 -q1 tmp.wav tmp.mp3&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;The "&lt;span style="color: blue;"&gt;-nojoystick&lt;/span&gt;" option for &lt;a href="http://www.mplayerhq.hu/design7/news.html"&gt;mplayer&lt;/a&gt; isn't required but it prevents mountains of output about &lt;a href="http://www.mplayerhq.hu/design7/news.html"&gt;mplayer&lt;/a&gt; being unable to read the joystick device [most likely due to the fact that I don't have a joystick].&amp;nbsp; I left the bit-rate for &lt;a href="http://lame.sourceforge.net/"&gt;lame&lt;/a&gt; at 128 since there is no point in re-encoding a file at a higher bit-rate than the originally encoded file - these files are mono-channel human speech not high-fidelity audio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1220126453161914140?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1220126453161914140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/converting-m4bs-to-mp3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1220126453161914140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1220126453161914140'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/converting-m4bs-to-mp3.html' title='Converting M4B&apos;s to MP3'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2046227228573228483</id><published>2011-11-01T05:15:00.001-04:00</published><updated>2011-11-01T05:15:00.359-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cifs'/><category scheme='http://www.blogger.com/atom/ns#' term='malware'/><category scheme='http://www.blogger.com/atom/ns#' term='samba'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><title type='text'>"samba-vscan" Is Dead, Long Live "samba-virusfilter"!</title><content type='html'>Noticed an interesting message on the &lt;a href="https://lists.samba.org/archive/samba-technical/"&gt;Samba-Technical&lt;/a&gt; list today.&amp;nbsp; The &lt;a href="http://www.samba.org/"&gt;Samba&lt;/a&gt; VFS module "samba-vscan" which has long been used to build integrated malware detection into &lt;a href="http://www.samba.org/"&gt;Samba&lt;/a&gt; is no longer supported for the 3.6.x series.&amp;nbsp; &lt;a href="http://www.osstech.co.jp/"&gt;SATOH Fumiyasu&lt;/a&gt; has been patching samba-vfs for 3.3 and up through 3.5; but with 3.6.1 he has created a new module named &lt;a href="https://github.com/fumiyas/samba-virusfilter"&gt;samba-virusfilter&lt;/a&gt;.&amp;nbsp; His message is &lt;a href="https://lists.samba.org/archive/samba-technical/2011-October/080160.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2046227228573228483?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2046227228573228483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/samba-vscan-is-dead-long-live-samba.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2046227228573228483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2046227228573228483'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/11/samba-vscan-is-dead-long-live-samba.html' title='&quot;samba-vscan&quot; Is Dead, Long Live &quot;samba-virusfilter&quot;!'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8028817767348999231</id><published>2011-10-31T13:05:00.000-04:00</published><updated>2011-10-31T13:05:10.961-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='named'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmn'/><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><category scheme='http://www.blogger.com/atom/ns#' term='bnd'/><title type='text'>Where and what is /var/run/named?</title><content type='html'>&lt;blockquote class="tr_bq" style="background-color: yellow;"&gt;# &lt;span style="color: blue;"&gt;service named start&lt;/span&gt;&lt;br /&gt;Starting name server BIND checkproc: Can not stat /var/run/named/named.pid: Too many levels of symbolic links&lt;br /&gt;- Warning: /var/run/named/named.pid exists! start_daemon: Can not stat /var/run/named/named.pid: Too many levels of symbolic links&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; done&lt;/blockquote&gt;&lt;br /&gt;Eh?&amp;nbsp; Somehow I messed up wherever &lt;span style="color: blue;"&gt;/var/run/named&lt;/span&gt; is supposed to be.&amp;nbsp; This happened when changing a root-jail DNS server to a non-jailed server.&amp;nbsp; After toggling the &lt;span style="color: blue;"&gt;NAMED_RUN_CHROOTED&lt;/span&gt; value to "&lt;span style="color: blue;"&gt;no&lt;/span&gt;" in &lt;span style="background-color: white; color: blue;"&gt;/etc/sysconfig/named&lt;/span&gt; starting named complains about this [this named is meant to integrate with Samba4]. Seems strange.&amp;nbsp; Once you try to restart named after this change &lt;span style="color: blue;"&gt;/var/run/named&lt;/span&gt; is automatically created as a directory - but it doesn't work.&amp;nbsp; This fix is to &lt;span style="color: red;"&gt;stop named&lt;/span&gt; and &lt;span style="color: red;"&gt;create the correct symbolic link&lt;/span&gt;:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: yellow; color: blue;"&gt;ln -s /var/lib/named/var/run/named /var/run/named&lt;/blockquote&gt;Not sure how this situation happens; but now the fix/gotcha is here for the search engines to crawl.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8028817767348999231?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8028817767348999231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/where-and-what-is-varrunnamed.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8028817767348999231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8028817767348999231'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/where-and-what-is-varrunnamed.html' title='Where and what is /var/run/named?'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-314243860728750289</id><published>2011-10-31T06:59:00.000-04:00</published><updated>2011-10-31T06:59:37.335-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mkfs'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Reformatting an iPod</title><content type='html'>I have an iPod whose content seems to have gone wonky.&amp;nbsp; Delete's fail, play-lists won't sync, etc... I wanted to start-over.&amp;nbsp; Unfortunately the iPod itself doesn't have any useful "reset" feature.&amp;nbsp; According to the &lt;a href="http://www.bing.com/"&gt;interwebs&lt;/a&gt; you need &lt;a href="http://www.bing.com/search?q=apple+sucks&amp;amp;form=OSDSRC"&gt;Apple's&lt;/a&gt; &lt;a href="http://www.bing.com/search?q=itunes+sucks&amp;amp;form=OSDSRC"&gt;iTunes&lt;/a&gt; application in order to reformat an iPod.&amp;nbsp; Alright, time to find another solution; and the winner is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq" style="font-family: inherit;"&gt;&lt;pre style="margin: 0em;"&gt;&lt;span style="font-size: large;"&gt;mkfs.vfat -F 32 -I -n "&lt;i&gt;iPod Name&lt;/i&gt;" /dev/sdb1&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;A good old-school reformat. After reformatting and resetting [hold down select and play for 15 seconds] the device is back to its original state.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-314243860728750289?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/314243860728750289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/reformatting-ipod.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/314243860728750289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/314243860728750289'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/reformatting-ipod.html' title='Reformatting an iPod'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5730717647185624344</id><published>2011-10-31T06:47:00.000-04:00</published><updated>2011-10-31T06:47:45.648-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rabbitmq'/><category scheme='http://www.blogger.com/atom/ns#' term='amqp'/><category scheme='http://www.blogger.com/atom/ns#' term='pyamqplib'/><title type='text'>Implementing Queue Expiration w/RabbitMQ</title><content type='html'>The latest versions of &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; support a feature where idle queues can be &lt;a href="http://www.rabbitmq.com/extensions.html#queue-leases"&gt;automatically deleted from the server&lt;/a&gt;.&amp;nbsp; For queues used in an RPC or workflow model this can save a lot of grief - as the consumers for these queues typically vanish leaving the queue behind. Over time these unused queues accumulate and consume resources on the server(s). If you are using &lt;a href="http://code.google.com/p/py-amqplib/"&gt;pyamqplib&lt;/a&gt; setting the expiration on a queue is as simple as:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: white; color: blue;"&gt;import amqplib.client_0_8 as amq&lt;/span&gt;&lt;br style="background-color: white; color: blue;" /&gt;&lt;span style="background-color: white; color: blue;"&gt;connection = amq.Connection(host="localhost:5672", userid=*, password=*, virtual_host="/", insist=False)&lt;/span&gt;&lt;br style="background-color: white; color: blue;" /&gt;&lt;span style="background-color: white; color: blue;"&gt;channel = connection.channel()&lt;/span&gt;&lt;br style="background-color: white; color: blue;" /&gt;&lt;span style="background-color: white; color: blue;"&gt;queue = channel.queue_declare(queue="testQueue", durable=True, exclusive=False, auto_delete=False, &lt;span style="background-color: yellow;"&gt;arguments={'x-expires': 9000}&lt;/span&gt;)&lt;/span&gt;&lt;br style="background-color: white; color: blue;" /&gt;&lt;span style="background-color: white; color: blue;"&gt;channel.exchange_declare(exchange='testExchange', type="fanout", durable=False, auto_delete=False)&lt;/span&gt;&lt;br style="background-color: white; color: blue;" /&gt;&lt;span style="background-color: white; color: blue;"&gt;channel.queue_bind(queue="testQueue", exchange='exchange')&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Now if that queue goes unused for 9 seconds it will be dropped by the server [th&lt;span style="background-color: yellow;"&gt;&lt;span style="background-color: white;"&gt;e value is in milliseconds]. So long as the queue has consumers it will persist, but once the last consumer has disconnected and no further operations have occurred - poof, you get your resources back.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5730717647185624344?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5730717647185624344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/implementing-queue-expiration-wrabbitmq.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5730717647185624344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5730717647185624344'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/implementing-queue-expiration-wrabbitmq.html' title='Implementing Queue Expiration w/RabbitMQ'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8922899546255539252</id><published>2011-10-21T06:29:00.000-04:00</published><updated>2011-10-21T06:29:47.836-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='windows2008'/><title type='text'>Changing Terminal Services License Mode</title><content type='html'>You are provisioning a Window 2008R2 server for remote desktop service; you've configured the terminal services license manager in one mode [ &lt;i&gt;device&lt;/i&gt; | &lt;i&gt;user&lt;/i&gt; ].&amp;nbsp; But when you receive the license documentation you discover that the CALs purchased were for the other mode.&amp;nbsp; Then the Windows terminal license server manager tells you to change the mode of the license server.... but there is no obvious way to change the mode [because Windows is user-friendly!].&amp;nbsp; One option is to go old-school - hack the registry!.&lt;br /&gt;&lt;br /&gt;First, stop the license server. Then in &lt;span style="color: blue;"&gt;regedit&lt;/span&gt; change the value of the "&lt;span style="color: blue;"&gt;LicensingMode&lt;/span&gt;" key in the "&lt;span style="color: blue;"&gt;HKEY_LOCAL_MACHINE \ System \CurrentControlSet \ Control \ Terminal Server \ RCM \ LicensingCore&lt;/span&gt;" collection.&amp;nbsp; A value of "&lt;span style="color: blue;"&gt;2&lt;/span&gt;" indicates per device licensing and a value of "&lt;span style="color: blue;"&gt;4&lt;/span&gt;" indicates a value of per user licensing.&amp;nbsp; Then reboot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8922899546255539252?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8922899546255539252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/changing-terminal-services-license-mode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8922899546255539252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8922899546255539252'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/changing-terminal-services-license-mode.html' title='Changing Terminal Services License Mode'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6190170801590566198</id><published>2011-10-13T10:09:00.002-04:00</published><updated>2011-10-13T10:11:51.394-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='bing'/><category scheme='http://www.blogger.com/atom/ns#' term='geolocation'/><category scheme='http://www.blogger.com/atom/ns#' term='suds'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Finding Address Coordinates using Python, SOAP, &amp; the Bing Maps API</title><content type='html'>&lt;a href="http://www.bing.com/maps/"&gt;Bing maps&lt;/a&gt; provides a SOAP API that can be easily accessed via the Python &lt;a href="https://fedorahosted.org/suds/"&gt;suds&lt;/a&gt; module.&amp;nbsp; Using the API it is trivial to retrieve the coordinates of a postal address.&amp;nbsp; The only requirement is to acquire a &lt;a href="https://www.bingmapsportal.com/"&gt;Bing API application key&lt;/a&gt;; this process is free, quick, and simple.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import sys, urllib2, suds&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = 'http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client = suds.client.Client(url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.set_options(port='BasicHttpBinding_IGeocodeService')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = client.factory.create('GeocodeRequest')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; credentials = client.factory.create('ns0:Credentials')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; credentials.ApplicationId = 'YOUR-APPLICATION-KEY'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.Credentials = credentials&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Address&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address = client.factory.create('ns0:Address')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address.AddressLine = "535 Shirley St. NE"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address.AdminDistrict = "Michigan"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address.Locality = "Grand Rapids"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; address.CountryRegion = "United States"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.Address = address&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = client.service.Geocode(request)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except suds.client.WebFault, e:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "ERROR!"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(1)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; locations = response['Results']['GeocodeResult'][0]['Locations']['GeocodeLocation']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for location in locations:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(location)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you need to make the request via an HTTP proxy server expand the line &lt;span style="background-color: yellow; color: black; font-family: Arial,Helvetica,sans-serif;"&gt;client = suds.client.Client(url)&lt;/span&gt; to:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy = urllib2.ProxyHandler({'http': 'http://YOUR-PROXY-SERVER:3128'})\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; transport = suds.transport.http.HttpTransport()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; transport.urlopener = urllib2.build_opener(proxy)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client = suds.client.Client(url, transport=transport)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The results will be Bing API &lt;a href="http://msdn.microsoft.com/en-us/library/cc966778.aspx"&gt;&lt;span style="color: blue;"&gt;GeocodeLocation&lt;/span&gt;&lt;/a&gt; objects that have an &lt;span style="color: blue;"&gt;Longitude&lt;/span&gt; and &lt;span style="color: blue;"&gt;Latitude&lt;/span&gt; properties.&amp;nbsp; Note that you may receive multiple coordinates for an address as there are multiple mechanism for locating an address; the method corresponding to the coordinates is a string in the &lt;span style="color: blue;"&gt;CalculationMethod&lt;/span&gt; property of the &lt;span style="color: blue;"&gt;GeocodeLocation&lt;/span&gt; objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6190170801590566198?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6190170801590566198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/requesting-address-coordinates-with.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6190170801590566198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6190170801590566198'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/10/requesting-address-coordinates-with.html' title='Finding Address Coordinates using Python, SOAP, &amp; the Bing Maps API'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-3594985886227773516</id><published>2011-08-04T07:33:00.000-04:00</published><updated>2011-08-04T07:33:47.169-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network-administration'/><category scheme='http://www.blogger.com/atom/ns#' term='syslog'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='noise'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='data-retention'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>Suppressing SNMP Connection Messages</title><content type='html'>You have, of course, done the responsible sys-admin thing and setup an NMS (be it &lt;a href="http://www.zenoss.com/"&gt;ZenOSS&lt;/a&gt;, &lt;a href="http://www.opennms.org/"&gt;OpenNMS&lt;/a&gt;, &lt;a href="http://nagios.org/"&gt;Nagios&lt;/a&gt;, &lt;a href="http://freshmeat.net/search?q=nms&amp;amp;submit=Search"&gt;whatever&lt;/a&gt;...).&amp;nbsp; Then there is the concommitant action of configuring SNMP services on all the relevant hosts.&amp;nbsp; All is good.&amp;nbsp; But running SNMP on several distributions churns out the log messages;&amp;nbsp; when you go to the logs to research a problem you have to filter out and sort through thousands upon thousands of pointless messages like:&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;Aug&amp;nbsp; 1 16:08:38 flask-yellow snmpd[1976]: Connection from UDP: [192.168.1.38]:52021 &lt;br /&gt;Aug&amp;nbsp; 1 16:08:38 flask-yellow last message repeated 24 times&lt;/blockquote&gt;Argh.&amp;nbsp; Detail logging is good, but pointless noise is not.&amp;nbsp; The solution isn't very well documented but you can bring this to a stop.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1.)&lt;/b&gt; Make sure you have net-snmp 5.3.2.2 or later.&amp;nbsp; This should not be a problem as even RHEL5/CentOS5 provide this version via update.&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ rpm -q net-snmp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; net-snmp-5.3.2.2-9.el5_5.1&lt;/blockquote&gt;&lt;b&gt;Step 2.)&lt;/b&gt; Edit&lt;span style="color: blue;"&gt; /etc/sysconfig/snmpd.options&lt;/span&gt; or your system's equivalent making sure you do &lt;b&gt;not&lt;/b&gt; pass the "&lt;span style="color: blue;"&gt;-a&lt;/span&gt;" option to the SNMP daemon.&amp;nbsp; The "&lt;span style="color: blue;"&gt;-a&lt;/span&gt;" option enables the logging of the source IP addresses of all incoming requests.&amp;nbsp; If you want to know about these kind of events iptables and ulog are more reliable and efficient methods for capturing that information.&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid"&lt;/blockquote&gt;&lt;b&gt;Step 3.)&lt;/b&gt; Edit the&lt;span style="color: blue;"&gt; /etc/snmpd/snmpd.conf&lt;/span&gt; verifying you have the &lt;span style="color: blue;"&gt;dontLogTCPWrappersConnects&lt;/span&gt; directive set to &lt;span style="color: blue;"&gt;1&lt;/span&gt; (true).&amp;nbsp; Add this directive to the configuration file if it is not specified.&lt;br /&gt;&lt;b&gt;Step 4.)&lt;/b&gt; Restart the SNMP service.&lt;br /&gt;&lt;br /&gt;Now when you go to look into the log files it is again possible to hear the breeze, the singing of the birds, and the distant growling of that guy from Kazakstan who is trying to crack your SSH daemon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3594985886227773516?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3594985886227773516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/08/suppressing-snmp-connection-messages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3594985886227773516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3594985886227773516'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/08/suppressing-snmp-connection-messages.html' title='Suppressing SNMP Connection Messages'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-120134580578408528</id><published>2011-05-17T19:00:00.000-04:00</published><updated>2011-05-17T19:00:32.505-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='password'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='freenode'/><title type='text'>Changing Your FreeNode Password</title><content type='html'>There is no shortage of documentation for common &lt;a href="http://www.irc.org/"&gt;IRC&lt;/a&gt; operations like registering your nick and managing channels.  But I had quite the time figuring out the syntax for changing my password; turns out it's obvious:&lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #cccccc; color: black;"&gt;/ns set password &lt;i&gt;new_password&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;There is no password confirmation - so make sure you type it correctly.&lt;br /&gt;&lt;br /&gt;On a related note, for anyone new to &lt;a href="http://www.irc.org/"&gt;IRC&lt;/a&gt;, it is possible to bind multiple nicks to your &lt;a href="http://freenode.net/"&gt;FreeNode&lt;/a&gt; account.  Just switch to the nick you want to bind and then issue the "group" command. &lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #ead1dc; color: black;"&gt;/nick &lt;i&gt;alternate_nick&lt;/i&gt;&lt;/div&gt;&lt;div style="background-color: #ead1dc; color: black;"&gt;/msg nickserv group&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;You can now authenticate as this alternate nick using the same password as that of your master nick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-120134580578408528?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/120134580578408528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/05/changing-your-freenode-password.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/120134580578408528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/120134580578408528'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/05/changing-your-freenode-password.html' title='Changing Your FreeNode Password'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2418219386160639411</id><published>2011-05-17T07:33:00.010-04:00</published><updated>2011-05-17T18:43:15.373-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome3'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>A Fortnight With GNOME3</title><content type='html'>A fortnight with GNOME3&lt;br /&gt;&lt;br /&gt;I'm a skeptic of "revolutionary" change.  Most [all?] revolutionary changes result in epic-fail; everyone who has been in IT for more than a decade knows this.  And there have been no shortage of &lt;a href="http://itmanagement.earthweb.com/osrc/article.php/3905641/How-will-GNOME-30-be-Received.htm"&gt;predictions&lt;/a&gt; that GNOME3 will face this same fate.  KDE endured this storm recently with version 4.  Anyone unfortunate enough to be on the openSUSE user lists remembers the swarm of incessant nattering nabobs that was kicked up when the distro switched from KDE3 to KDE4.  But change seems to be in the wind: KDE with &lt;a href="http://www.kde.org/announcements/4.0/"&gt;version 4&lt;/a&gt;, Canonical deciding to hoe a proprietary row with &lt;a href="https://lwn.net/Articles/387781/"&gt;Unity&lt;/a&gt;, and GNOME developers finally launching &lt;a href="http://www.gnome3.org/"&gt;GNOME3&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;I've been to several GNOME3 talks at &lt;a href="http://www.ohiolinux.org/"&gt;Ohio LINUX&lt;/a&gt; given by GNOME team members; I've seen it demonstrated and I understood, at least vaguely, the ideological premise.  As a hard-core groupware guy the idea of focusing on the actual workflow of the user was like a marketing pitch designed with people like me as the target audience.  But ideology is a dangerous master; ideologues usually end up skidding face-first across the rough ground of reality.  Take away the maximize and minimize buttons? Remove, or even refactor, the task bar? Get rid of the system / notification / whatever-junk tray?  Do that and the hue and cry will be so loud you'll never get a chance to explain your ideology [as though anyone but you cared in the first place].&lt;br /&gt;&lt;br /&gt;But now it seems that hue and cry will fall on deaf ears; there isn't much of a refuge. Canonical, KDE, and GNOME  - everyone is moving.  So it is time to move.  I installed GNOME3.  I bit-the-bullet and used it.&lt;br /&gt;&lt;br /&gt;Now a fortnight later... I like it.  It is better.  Performance is improved and common operations are smoother.  Doing things like navigating applications, which was before a combination of launchers, menus, and third-party components like &lt;a href="http://do.davebsd.com/"&gt;GNOME-Do&lt;/a&gt;, is significantly more intuitive.  I should say: they are more intuitive once you get over the habituation of how you were doing it before.  I can see the designer's intent.  With GNOME2 my desktop usage was efficient but I'd made it that way; my desktop was different than every other GNOME2 desktop [and conversely their desktops were different from mine].  Installing a modern LINUX distribution like &lt;a href="http://news.opensuse.org/2011/03/10/opensuse-11-4/"&gt;openSUSE 11.4&lt;/a&gt; gives me 99.44% of the applications I need; but I still have to go about making the desktop configuration efficient for me with launchers, etc...  No more with GNOME3.  GNOME3 provides the functionality of GNOME-Do and other GNOME2 third-party enhancements and drops the cruft I was always, unknowingly, fighting against.&lt;br /&gt;&lt;br /&gt;Yes, some changes seem a bit arbitrary, like removal of the maximize and minimize buttons [you can turn them back on BTW, using the very nice &lt;a href="https://live.gnome.org/GnomeTweakTool"&gt;GNOME Tweak Tool&lt;/a&gt;]. But how often do I really minimize anything anymore?  Something close to never.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[UPDATE#1:&lt;/b&gt; I should have included a link to sloshy's very helpful post &lt;a href="https://piecesoflint.wordpress.com/2011/04/06/how-to-tweak-gnome-3-to-your-needs/"&gt;"How To Tweak GNOME 3 To Your Needs"&lt;/a&gt;.  So I've now rectified that error.  Please note that I don't actually tweak GNOME3 much or install the various GNOME Shell extensions which are available.  I recommend you really give GNOME3 vanilla an honest try. His post &lt;a href="http://piecesoflint.wordpress.com/2011/04/05/10-things-i-love-about-gnome-3/"&gt;"10 Things I Love About GNOME 3"&lt;/a&gt; is also an interesting read - and helps explain some of the GNOME3 ideology. I should also point out that there are at least two ways to maximize a window in vanilla GNOME3 so the removal of maximize button seems reasonable.  Minimization in GNOME3, lacking a task bar, is awkward - so removal of the minimize button in order to discourage the behavior seems reasonable as well. As I said originally: I never minimize anyway.&lt;b&gt;]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yes, the task bar is gone.  This I was certain I would notice.  But after a few days I didn't.  The much improved Alt-Tab (application switch) and Alt-` (window switch) is far more productive than the task bar [which required use of the mouse]. Do I need a list to remind me of which applications are running? No.&lt;br /&gt;&lt;br /&gt;Marking an application as a favorite, creating the GNOME3 equivalent of a launcher, is intuitive.  This is a big improvement over trying to find an application in the menus and then  awkwardly dragging it to some empty space on the toolbar.  In GNOME3 it is also possible to drag an application icon into a specific workspace to start it on that workspace - which is nothing short of elegant.&lt;br /&gt;&lt;br /&gt;There are also long needed improvements. GNOME has always had excellent screen-capture capability.  GNOME3 now provides integrated screencast capture.  The need for third-party tools like GNOME-Do for launching and the tracker applet for searching have been eliminated.  It is all built in, as it should be.&lt;br /&gt;&lt;br /&gt;So after my fortnight I look at overwhelmingly &lt;a href="http://itmanagement.earthweb.com/osrc/article.php/3905641/How-will-GNOME-30-be-Received.htm"&gt;negative articles&lt;/a&gt; and I wonder... what desktop environment are they talking about?  Because I don't see their criticisms in GNOME3.  Perhaps they are booting it up and just test-driving it for a few hours?  That would certainly be frustrating.  But quotes like "No matter how you look at GNOME Shell ... you are going to do a lot of clicking" is just incorrect.  I do far less "clicking" in GNOME3.  By the end of that article I don't recognize the DE he is talking about; it certainly isn't GNOME3.  &lt;br /&gt;&lt;br /&gt;None of this is to say that there aren't valid criticisms of GNOME3.   &lt;br /&gt;&lt;br /&gt;Ideologically the emphasis on making a one-size-fits-all DE is misguided.  Talking about one DE for both my large-screen i7 laptop and a small low-power mobile device does not make sense.  Comparing some facebook/gmail jockey's usage of a tablet to someone doing real work is nonsensical.  But I have confidence that ideology will be tempered by the reality of these very different use-cases.  GNOME Shell seems flexible enough to accommidate both; thus being the same while being different.&lt;br /&gt;&lt;br /&gt;Technically, there are some dot-zero kind of warts.  The network manager interface isn't nearly as robust or as feature complete as the excellent interface provided in GNOME2; the absence of VPN support is particularly painful.  Not all applications currently support &lt;a href="http://developer.gnome.org/integration-guide/stable/startup-notification.html.en"&gt;startup-notification&lt;/a&gt; so dragging a launcher to a specific workspace doesn't always work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[UPDATE#2:&lt;/b&gt;Our web developer pointed out that VPN support is now available in the the openSUSE 11.4 GNOME3 Network Manager. Sure enough - it works. The only option I don't see is how to enable proxyarp for a PPTP connection. That is one of the biggest negatives taken care of; now I can't think of a compelling reason not to recommend GNOME3.&lt;b&gt;]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Maybe GNOME3, most specifically because of its weak Network Manager, isn't ready for your desktop quite yet.  But surf on over to the excellent &lt;a href="http://www.gnome3.org/"&gt;GNOME3 website&lt;/a&gt; and take a look.  Go into GNOME3 with an Open mind and I think you'll discover that you like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2418219386160639411?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2418219386160639411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/05/fortnight-with-gnome3.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2418219386160639411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2418219386160639411'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/05/fortnight-with-gnome3.html' title='A Fortnight With GNOME3'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8582715801837639879</id><published>2011-05-17T06:08:00.001-04:00</published><updated>2011-05-17T06:10:01.270-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network-administration'/><category scheme='http://www.blogger.com/atom/ns#' term='cisco-ios'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Automated Backup of IOS Router Configuration</title><content type='html'>Who hasn't had the experience of remoting to a router and making a configuration change... and not saving that change.  Inevitably that is the weekend that facility will experience a power outage long enough to deplete their UPS.   And then you get that dreaded text message from NetOps that a facility is down.  &lt;b style="color: red;"&gt;Argh!&lt;/b&gt;  Fortunately Cisco IOS 12.x and later supports a cron like service known as "&lt;span style="color: blue;"&gt;kron&lt;/span&gt;". One of the handiest uses for kron is to configure automatic backup  of the router's configuration to a TFTP server.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;kron occurrence backup at 0:00 Thu recurring&lt;br /&gt; policy-list backup&lt;br /&gt;!&lt;br /&gt;kron policy-list backup&lt;br /&gt; cli write&lt;br /&gt; cli show running-config | redirect tftp://192.168.1.38/brtgate.config&lt;br /&gt;!&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;This creates a batch of commands named "backup" [where in typical ISO fashion everything is referred to as a "policy"] that will be executed every Thursday morning.  This batch commits the running configuration to flash memory ["&lt;span style="color: blue;"&gt;cli write&lt;/span&gt;"] and copies the running configuration to the specified TFTP server ["&lt;span style="color: blue;"&gt;cli show running-config | redirect tftp://192.168.1.38/brtgate.config&lt;/span&gt;"].  The rather odd looking use of "redirect" is because the IOS "copy" command is interactive and interactive commands cannot be run via "kron".&lt;br /&gt;&lt;br /&gt;Remember that the file on the TFTP server has to exist, even if zero sized, and be world writable; otherwise the redirect will fail with a permission denied error.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8582715801837639879?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8582715801837639879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/05/automated-backup-of-ios-router.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8582715801837639879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8582715801837639879'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/05/automated-backup-of-ios-router.html' title='Automated Backup of IOS Router Configuration'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8087731764473506586</id><published>2011-04-22T07:48:00.001-04:00</published><updated>2011-08-04T07:43:56.303-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pylzma'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='compression'/><title type='text'>Compression &amp; Decompress Of A Stream</title><content type='html'>So far in Python I had not found a good method / module for performing compression and decompression of data as streams;&amp;nbsp; most tools required files to be compressed which has some obvious limitations.&amp;nbsp; But then I saw a mention of &lt;a href="http://www.joachim-bauch.de/projects/pylzma/"&gt;pyLZMA&lt;/a&gt; roll by. It supports compression and decompression of streams using the &lt;a href="http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm"&gt;Lempel–Ziv–Markov chain algorithm&lt;/a&gt;. The license of the module is LGPL-2.1; not &lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT&lt;/a&gt;, but at least it is "Lesser" GPL'd.&amp;nbsp; I've taken it for a spin and it seems to successfully compress and decompress all the data I've thrown at it (remember to always checksum your data).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import pylzma, hashlib&lt;br /&gt;&lt;br /&gt;# Calculate the SHA checksum for our input file&lt;br /&gt;i = open('Brighton.jpg', 'rb')&lt;br /&gt;h1 = hashlib.sha1()&lt;br /&gt;while True:&lt;br /&gt;    tmp = i.read(1024)&lt;br /&gt;    if not tmp: break&lt;br /&gt;    h1.update(tmp)&lt;br /&gt;h1 = h1.hexdigest()&lt;br /&gt;print 'Input SHA Checksum: {0}'.format(h1)&lt;br /&gt;    &lt;br /&gt;# Compress the input file (as a stream) to a file (as a stream)&lt;br /&gt;o = open('compressed.lzma', 'wb')&lt;br /&gt;i.seek(0)&lt;br /&gt;s = pylzma.compressfile(i)&lt;br /&gt;while True:&lt;br /&gt;    tmp = s.read(1)&lt;br /&gt;    if not tmp: break&lt;br /&gt;    o.write(tmp)&lt;br /&gt;o.close()&lt;br /&gt;i.close()&lt;br /&gt;&lt;br /&gt;# Decomrpess the file (as a stream) to a file (as a stream)&lt;br /&gt;i = open('compressed.lzma', 'rb')&lt;br /&gt;o = open('decompressed.raw', 'wb')&lt;br /&gt;s = pylzma.decompressobj()&lt;br /&gt;while True:&lt;br /&gt;    tmp = i.read(1)&lt;br /&gt;    if not tmp: break&lt;br /&gt;    o.write(s.decompress(tmp))&lt;br /&gt;o.close()&lt;br /&gt;i.close()&lt;br /&gt;&lt;br /&gt;# Check the decompressed file&lt;br /&gt;i = open('decompressed.raw', 'rb')&lt;br /&gt;h2 = hashlib.sha1()&lt;br /&gt;while True:&lt;br /&gt;    tmp = i.read(1024)&lt;br /&gt;    if not tmp: break&lt;br /&gt;    h2.update(tmp)&lt;br /&gt;h2 = h2.hexdigest()&lt;br /&gt;print 'Result SHA Checksum: {0}'.format(h2)&lt;br /&gt;if (h1 == h2): print 'OK!'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course a JPEG file doesn't compress much, but that makes it an even better test case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8087731764473506586?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8087731764473506586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/04/compression-decompress-of-stream.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8087731764473506586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8087731764473506586'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/04/compression-decompress-of-stream.html' title='Compression &amp; Decompress Of A Stream'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7984655858734679969</id><published>2011-04-20T18:15:00.001-04:00</published><updated>2011-08-04T07:43:27.572-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='disk-io'/><category scheme='http://www.blogger.com/atom/ns#' term='block_dump'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><title type='text'>block_dump logging</title><content type='html'>There are lots of tools for studying the systems use of CPU and memory, but I/O is generally harder to track down.&amp;nbsp; A useful trick is available via the block dump.&amp;nbsp; Setting the value to "1" turns on block access logging to the kernel ring-buffer [aka dmesg] and a value of "0" turns it back on.&amp;nbsp; This means it can be turned on by a simple:&lt;br /&gt;&lt;blockquote&gt;&lt;b style="color: blue;"&gt;&lt;span style="background-color: yellow;"&gt;echo "1" &amp;gt; /proc/sys/vm/block_dump&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;This logs the accesses to the block storage as:&lt;br /&gt;&lt;div style="background-color: #9fc5e8; font-family: Arial,Helvetica,sans-serif;"&gt;&lt;/div&gt;&lt;blockquote style="background-color: #9fc5e8; font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: x-small;"&gt;[ 2032.934178] postmaster(11528): READ block 5058592 on dm-3 (16 sectors)&lt;br /&gt;[ 2032.934200] postmaster(11528): READ block 5058624 on dm-3 (32 sectors)&lt;br /&gt;[ 2032.934240] postmaster(11528): READ block 3172800 on dm-3 (16 sectors)&lt;br /&gt;[ 2032.945328] banshee-1(11267): dirtied inode 1051864 (banshee.db-journal) on dm-0&lt;br /&gt;[ 2032.945336] banshee-1(11267): dirtied inode 1051864 (banshee.db-journal) on dm-0&lt;br /&gt;[ 2033.042671] python(11518): READ block 9017928 on dm-2 (32 sectors)&lt;br /&gt;[ 2033.055771] python(11518): dirtied inode 267260 (expatbuilder.pyc) on dm-2&lt;br /&gt;[ 2033.055808] python(11518): READ block 9017960 on dm-2 (40 sectors)&lt;br /&gt;[ 2033.412972] nautilus(11078): dirtied inode 410492 (dav:host=127.0.0.1,port=8080,ssl=false) on dm-0&lt;br /&gt;[ 2033.413001] nautilus(11078): READ block 50855560 on dm-0 (40 sectors)&lt;br /&gt;[ 2033.431011] nautilus(11078): dirtied inode 410596 (dav:host=127.0.0.1,port=8080,ssl=false-ab9de673.log) on dm-0&lt;br /&gt;[ 2033.431044] nautilus(11078): READ block 50855736 on dm-0 (64 sectors)&lt;br /&gt;[ 2034.221831] jbd2/dm-2-8(386): WRITE block 21261800 on dm-2 (8 sectors)&lt;br /&gt;[ 2034.221887] jbd2/dm-2-8(386): WRITE block 21261808 on dm-2 (8 sectors)&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;Handy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7984655858734679969?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7984655858734679969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/04/blockdump-logging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7984655858734679969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7984655858734679969'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/04/blockdump-logging.html' title='block_dump logging'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8568609409033442646</id><published>2011-03-17T06:34:00.001-04:00</published><updated>2011-03-17T06:34:38.882-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lpr'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='lpd'/><title type='text'>Printing Via LPR</title><content type='html'>If you have a Python app, or almost any kind of app, the accepted manner for printing is to use some kind of subprocess to invoke some command-line utility to submit the print job.&amp;nbsp; Of course this requires that the underlying subsystems are aware of printers [and thus run a printer subsystem].&amp;nbsp; It also assumes the name of the command-line utility, the permissions are adequate to execute it, and all manner of other things.&amp;nbsp; To put it simply: this is terrible!&amp;nbsp; Why does my web server, workflow server, etc... need to run a print service?&amp;nbsp; Why can't my environment just support submitting a job to an actual print server?&amp;nbsp; Good question!&amp;nbsp; To answer this &lt;a href="http://sourceforge.net/projects/coils/"&gt;OpenGroupware Coils&lt;/a&gt; now has a simple implementation of the &lt;a href="http://www.ietf.org/rfc/rfc1179.txt"&gt;LPR/LPD protocol&lt;/a&gt;.&amp;nbsp; This code is under the MIT/X11 license so you are free to copy-and-paste it into your own application.&amp;nbsp; Sending a job to the server is as simple as:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;f = open('Draft.ps', 'rb')&lt;br /&gt;pr = LPR('crew.mormail.com', user='adam')&lt;br /&gt;lpr.connect()&lt;br /&gt;lpr.send_stream('cisps', 'test job', f, job_name='my awesome job')&lt;br /&gt;lpr.close()&lt;br /&gt;f.close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This sends the contents of the file "Draft.ps" to the printer "cisps" on the LPD server "crew.mormail.com" with user name "adam", job name "my awesome job" and job file name "test job".&lt;br /&gt;&lt;br /&gt;The code for the LPR class can be found &lt;a href="http://coils.hg.sourceforge.net/hgweb/coils/coils/file/82f498e91ff5/src/coils/core/api/printing/lpr.py"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8568609409033442646?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8568609409033442646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2011/03/printing-via-lpr.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8568609409033442646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8568609409033442646'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2011/03/printing-via-lpr.html' title='Printing Via LPR'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6903379265592363747</id><published>2010-12-08T13:51:00.001-05:00</published><updated>2010-12-08T13:58:11.417-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ntp'/><category scheme='http://www.blogger.com/atom/ns#' term='samba4'/><title type='text'>Configuration of NTP for Samba4</title><content type='html'>In an Active Directory domain, which is a Kerberos domain, time-synchronization is critical.&amp;nbsp; If a workstation or servers clock drifts to much from the clock of the KDC neither users or services will be able to participate in the domain.&amp;nbsp; But Active Directory clients [such as Windows 7] require an &lt;a href="http://msdn.microsoft.com/en-us/library/cc246877%28v=PROT.13%29.aspx"&gt;MS-SNTP&lt;/a&gt; server that cryptographically signs the response.&amp;nbsp; This means that the NTP server shipped with almost all current distributions cannot provide time services to these devices - support for this interoperability was added in NTP 4.2.6 (see NTP &lt;a href="https://support.ntp.org/bugs/show_bug.cgi?id=1028"&gt;Bug#1028&lt;/a&gt;).&amp;nbsp; Appropriately versioned NTP packages are available for openSUSE 11.3 from &lt;a href="http://download.opensuse.org/repositories/home:/namtrac/openSUSE_11.3/"&gt;namtrac's repositor&lt;/a&gt;y and will be included in openSUSE 11.4 (see openSUSE &lt;a href="https://bugzilla.novell.com/show_bug.cgi?id=657194"&gt;Bug#657194&lt;/a&gt;)..&lt;br /&gt;With a good version of NTP the required NTP configuration is:&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;ntpsigndsocket /opt/ad/samba4/var/run/ntp_signd/&lt;br /&gt;restrict default mssntp&lt;/blockquote&gt;Samba4 will create a socket which NTP can use to have its responses signed - the location of this socket is what is indicated by the NTP directive "&lt;span style="color: blue;"&gt;ntpsigndsocket&lt;/span&gt;".&amp;nbsp; Note that this is a &lt;b&gt;directory path&lt;/b&gt; to where NTP will expect to find a domain socket named "&lt;span style="color: blue;"&gt;socket&lt;/span&gt;" (not intuitive!).&amp;nbsp; It is Samba which creates and listens to this socket; NTP uses the socket as a consumer and only opens the socket when it needs signing services.&amp;nbsp; The default location where Samba will initially create this socket is controlled via the "&lt;span style="color: blue;"&gt;ntp signd socket directory&lt;/span&gt;" directive in Samba's "&lt;span style="color: blue;"&gt;smb.conf&lt;/span&gt;".&amp;nbsp; In most cases this won't be set explictely.&amp;nbsp; You can verify the default value using the Samba "&lt;span style="color: blue;"&gt;testparams&lt;/span&gt;" command with the "&lt;span style="color: blue;"&gt;--verbose&lt;/span&gt;" option which will list both defined directives and the default values of undefined directives [including "&lt;span style="color: blue;"&gt;ntp signd socket directory&lt;/span&gt;"].&lt;br /&gt;Running the NTP daemon as "&lt;span style="color: blue;"&gt;strace ntpd -n&lt;/span&gt;" will keep ntpd in the foreground and allow you to see the files and sockets that it opens and closes.&amp;nbsp; Once properly configured issue the "&lt;span style="color: blue;"&gt;w32tm /resync /rediscover&lt;/span&gt;" option on a Windows 7 AD member and you should receive the response:&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;Sending resync command to local computer&lt;br /&gt;The command completed successfully.&lt;/blockquote&gt;On the server you will see (in the strace output) and exchange between NTP and Samba4 via the signing socket.&amp;nbsp; It will look something like:&lt;br /&gt;&lt;blockquote style="background-color: yellow;"&gt;&lt;span style="color: blue;"&gt;recvmsg(21, {msg_name(-1734344)={...},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;msg_iov(17832102453714092032)=0x14ffe5894c, msg_controllen=120259084288,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;msg_control=0x848, msg_flags=MSG_DONTROUTE|MSG_PROXY}, 0) = 68&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;recvmsg(21, 0xffe5891c, 0)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = -1 EAGAIN (Resource&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;temporarily unavailable)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;clock_gettime(CLOCK_REALTIME, {1291827449, 637483079}) = 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;socket(PF_FILE, SOCK_STREAM, 0)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;connect(4, {sa_family=AF_FILE,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;path="/opt/ad/samba4/var/run/ntp_signd//socket"}, 110) = 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;write(4, "\0\0\0@", 4)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;write(4, "\0\0\0\0\0\0\0\0\1\0\0\0P\4\0\0\34\v\21\360\0\0\0\0\0\0002\337&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;\177\177\1\0"..., 64) = 64&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;read(4, "\0\0\0P", 4)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;read(4, "\0\0\0\0\0\0\0\3\0\0\1\0\34\v\21\360\0\0\0\0\0\0002\337\177\177&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;\1\0\320\2527c"..., 80) = 80&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;sendto(21, "\34\v\21\360\0\0\0\0\0\0002\337\177\177\1\0\320\2527c&amp;gt;\360&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;\220\303\320\2527\201\3478 \330"..., 68, 0, {sa_family=AF_INET,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;sin_port=htons(123), sin_addr=inet_addr("10.66.77.102")}, 16) = 68&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;close(4)&lt;/span&gt;&lt;/blockquote&gt;If that doesn't happen verify that both Samba4 and NTP have access to the socket; this may include permissions issues as well as SELinux / AppArmour policies.&amp;nbsp; Once it works just run NTP normally - you have working secure time synchronization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6903379265592363747?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6903379265592363747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/12/configuration-of-ntp-for-samba4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6903379265592363747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6903379265592363747'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/12/configuration-of-ntp-for-samba4.html' title='Configuration of NTP for Samba4'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8302114809845126336</id><published>2010-12-08T09:15:00.002-05:00</published><updated>2010-12-08T09:15:43.125-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Manually Adding an ACL To An Object</title><content type='html'>In OpenGroupware the ACLs applied to an object are stored in the "&lt;span style="background-color: white; color: blue;"&gt;object_acl&lt;/span&gt;" table.&amp;nbsp; If, for example, I want to add the list, view, read, write, and administer privileges for the team 11,530 for object 1,6829,810 the correct SQL to execute is:&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;INSERT INTO object_acl &lt;br /&gt;&amp;nbsp; (object_acl_id, sort_key, action, object_id, auth_id, permissions)&lt;br /&gt;VALUES (nextval('key_generator'), 0, 'allowed', 16829810, 11530, 'lvrwa')&lt;/blockquote&gt;The important points are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use the "&lt;span style="color: blue;"&gt;key_generator&lt;/span&gt;" sequence to assign the "&lt;span style="color: blue;"&gt;object_acl_id&lt;/span&gt;" value.&amp;nbsp; This is the object id of the ACL itself;&amp;nbsp; all object ids are assigned from the key_generator sequence.&lt;/li&gt;&lt;li&gt;The value of "&lt;span style="color: blue;"&gt;sort_key&lt;/span&gt;" is always 0.&amp;nbsp; This value isn't actually used for anything.&lt;/li&gt;&lt;li&gt;The value of "&lt;span style="background-color: white; color: blue;"&gt;action&lt;/span&gt;" must be either "&lt;span style="color: blue;"&gt;allowed&lt;/span&gt;" or "&lt;span style="color: blue;"&gt;denied&lt;/span&gt;".&amp;nbsp; In most cases "&lt;span style="color: blue;"&gt;allowed&lt;/span&gt;" is what you want in order to grant access.&lt;/li&gt;&lt;li&gt;"&lt;span style="color: blue;"&gt;object_id&lt;/span&gt;" is the object id of the object to which the ACL is applied in contrast to "&lt;span style="color: blue;"&gt;auth_id&lt;/span&gt;" is the context to which the privileges, specified in "&lt;span style="color: blue;"&gt;permissions&lt;/span&gt;", are either granted [if "&lt;span style="color: blue;"&gt;action&lt;/span&gt;" is "&lt;span style="color: blue;"&gt;allowed&lt;/span&gt;"] or revoked [if "&lt;span style="color: blue;"&gt;action&lt;/span&gt;" is "&lt;span style="color: blue;"&gt;denied&lt;/span&gt;"].&amp;nbsp; The value of "&lt;span style="color: blue;"&gt;auth_id&lt;/span&gt;" should be the object id of an account or a team.&lt;/li&gt;&lt;li&gt;The permissions string is always lower case.&amp;nbsp; Permission flags are documented in &lt;a href="http://sourceforge.net/projects/coils/files/WMOGAG-Coils.pdf/download"&gt;WMOGAG&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;The ACLs in "&lt;span style="color: blue;"&gt;object_acl&lt;/span&gt;" are the primary access control mechanism for all entities excepting Projects and Appointments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8302114809845126336?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8302114809845126336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/12/manually-adding-acl-to-object.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8302114809845126336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8302114809845126336'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/12/manually-adding-acl-to-object.html' title='Manually Adding an ACL To An Object'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6325488524039065354</id><published>2010-11-30T14:55:00.000-05:00</published><updated>2010-11-30T14:55:41.118-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ldif'/><category scheme='http://www.blogger.com/atom/ns#' term='samba4'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><title type='text'>BOM Squad</title><content type='html'>So you have a lovely LDIF file of Active Directory schema that you want to import using the ldbmodify tool provided with Samba4... but when you attempt the import it fails with the error:&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;Error: First line of ldif must be a dn not '﻿dn'&lt;br /&gt;Modified 0 records with 0 failures&lt;/blockquote&gt;Eh? &lt;b style="color: red;"&gt;@&amp;amp;^$*&amp;amp;@&amp;nbsp; &amp;amp;@^&amp;amp;*@ ^@&amp;amp;*^@&amp;amp;*&lt;/b&gt;&lt;b&gt;&lt;span style="background-color: white; color: red;"&gt; It does start with a dn: attribute!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Once you cool down you look at the file using od, just in case, and you see:&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;0000000&amp;nbsp;&amp;nbsp; o&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp; ?&amp;nbsp;&amp;nbsp; d&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp; :&amp;nbsp; sp&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; H&amp;nbsp;&amp;nbsp; o&amp;nbsp;&amp;nbsp; r&amp;nbsp;&amp;nbsp; d&amp;nbsp;&amp;nbsp; e&amp;nbsp;&amp;nbsp; -&lt;/blockquote&gt;You've been bitten by the BOM! But even opening the file in vi you can't see the BOM because every tool knows about the BOM and deals with it - with the exception of anything LDIF related.&lt;br /&gt;The trick is to break out dusty old sed and remove the BOM -&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;sed -e '1s/^\xef\xbb\xbf//' horde-person.ldf&amp;nbsp; &amp;gt; nobom.ldf&lt;/blockquote&gt;And double checking it with od again:&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;0000000&amp;nbsp;&amp;nbsp; d&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp; :&amp;nbsp; sp&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp; =&amp;nbsp;&amp;nbsp; H&amp;nbsp;&amp;nbsp; o&amp;nbsp;&amp;nbsp; r&amp;nbsp;&amp;nbsp; d&amp;nbsp;&amp;nbsp; e&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; A&amp;nbsp;&amp;nbsp; g&amp;nbsp;&amp;nbsp; o&lt;/blockquote&gt;The file now actually starts with a dn attribute!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6325488524039065354?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6325488524039065354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/bom-squad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6325488524039065354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6325488524039065354'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/bom-squad.html' title='BOM Squad'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1709275041867235631</id><published>2010-11-26T11:19:00.000-05:00</published><updated>2010-11-26T11:19:26.488-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='phpldapadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='samba4'/><title type='text'>Samba4 &amp; PHPLDAPAdmin</title><content type='html'>Samba4 includes a &lt;a href="http://sourceforge.net/projects/phpldapadmin/"&gt;PHP LDAP admin&lt;/a&gt; configuration sample. Unfortunately it doesn't match up to the current version of &lt;a href="http://sourceforge.net/projects/phpldapadmin/"&gt;PHP LDAP Admin&lt;/a&gt;. The configuration you want to put into &lt;b&gt;config/config.php&lt;/b&gt; is:&lt;br /&gt;&lt;blockquote style="background-color: #999999;"&gt;$servers-&amp;gt;newServer('ldap_pla');&lt;br /&gt;$servers-&amp;gt;setValue('server','name','Samba4 AD Server');&lt;br /&gt;$servers-&amp;gt;setValue('server','host','ldapi://%2Fopt%2Fad%2Fsamba4%2Fprivate%2Fldapi');&lt;br /&gt;$servers-&amp;gt;setValue('login','auth_type','session');&lt;br /&gt;$servers-&amp;gt;setValue('login','attr','dn');&lt;/blockquote&gt;&lt;br /&gt;Then you should get an PHP LDAP Admin login screen for your shiny Samba4 AD DSA. For the AD uninitiated the DN of the Administrator's account is "&lt;b&gt;CN=Administrator,CN=Users,DC=ad,DC=mormail,DC=com&lt;/b&gt;" (for example, if you AD domain is "ad.mormail.com").&amp;nbsp; Using that DN and the domain administrator's password you should be able to login.&lt;br /&gt;Another trick is to put that LDAPI LDAP URI into the &lt;b&gt;/etc/openldap/ldap.conf&lt;/b&gt;&amp;nbsp; file so you can use the OpenLDAP LDAP CLI utilities [ldapsearch, ldapadd, ldapmodify, etc...] provided by your distribution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1709275041867235631?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1709275041867235631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/samba4-phpldapadmin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1709275041867235631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1709275041867235631'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/samba4-phpldapadmin.html' title='Samba4 &amp; PHPLDAPAdmin'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7433654325644723194</id><published>2010-11-26T09:50:00.003-05:00</published><updated>2010-11-26T10:44:24.915-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Python Exceptions and "auto" Instantiation</title><content type='html'>Interesting thread on the python-list as to what happens regarding raising exceptions.  The low-down:&lt;b&gt; If you "raise &lt;i&gt;ExceptionClass" &lt;/i&gt;and instance of that &lt;i&gt;ExceptionClass&lt;/i&gt; is always created.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;blockquote style="background-color: blue; color: yellow;"&gt;try: raise KeyError&lt;br /&gt;except KeyError: pass&lt;/blockquote&gt;&lt;br /&gt;From the documentation:&lt;br /&gt;&lt;blockquote style="background-color: #444444; color: white;"&gt;raise evaluates the first expression as the exception object. It must be either a subclass or an instance of BaseException. If it is a class, the exception instance will be obtained when needed by instantiating the class with no arguments.&lt;/blockquote&gt;&lt;br /&gt;Some exception classes require arguments so the &lt;i&gt;naked&lt;/i&gt; raise will fail with a TypeError.&lt;br /&gt;&lt;div style="background-color: blue; color: yellow;"&gt;&amp;nbsp;raise UnicodeDecodeError&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;&amp;nbsp; File "&lt;stdin&gt;", line 1, in &lt;module&gt;&lt;br /&gt;TypeError: function takes exactly 5 arguments (0 given)&lt;/module&gt;&lt;/stdin&gt;&lt;/div&gt;&lt;br /&gt;Seems to me it is clearer to just do the raise with instance syntax:&lt;br /&gt;&lt;blockquote style="background-color: yellow; color: blue;"&gt;try:&lt;br /&gt;&amp;nbsp; raise KeyError()&lt;br /&gt;except KeyError as e:&lt;br /&gt;&amp;nbsp; pass&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7433654325644723194?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7433654325644723194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/python-exceptions-and-auto.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7433654325644723194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7433654325644723194'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/python-exceptions-and-auto.html' title='Python Exceptions and &quot;auto&quot; Instantiation'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1492805264310482779</id><published>2010-11-05T07:09:00.000-04:00</published><updated>2010-11-05T07:09:04.446-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlalchemy'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware coils'/><title type='text'>SQLAlchemy &amp; Upcoming Birthdays</title><content type='html'>&lt;a href="http://www.opengroupware.us/"&gt;OpenGroupware Coils&lt;/a&gt; uses &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;&amp;nbsp; as it's ORM. One of the desired features was a Logic command that efficiently returns contacts with upcoming birthdays.&amp;nbsp; In raw SQL this query would be very simple to write - but how to do it in SQLAlchemy? The answer: "sql.expression.extract" which will create an expression column equivalent to &lt;a href="http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT"&gt;EXTRACT&lt;/a&gt;. With EXTRACT it is possible to compare to the year-of-day represented by a date.&amp;nbsp; The Python code looks like:&lt;br /&gt;&lt;pre&gt;db = self._ctx.db_session()&lt;br /&gt;# Get the current day-of-year&lt;br /&gt;doy = datetime.today().timetuple().tm_yday&lt;br /&gt;# Deal with year wrap-around&lt;br /&gt;floor = doy - 2&lt;br /&gt;if (floor &lt; 1): floor +=365&lt;br /&gt;ceiling = doy + 14&lt;br /&gt;if (ceiling &gt; 365): ceiling -= 365&lt;br /&gt;# Create a field that is the SQL expression DOY(Contact.birth_date)&lt;br /&gt;orm_doy = sql.expression.extract('doy', Contact.birth_date)&lt;br /&gt;# Create the query&lt;br /&gt;query = db.query(Contact).filter(and_(sql.expression.between(orm_doy, floor, ceiling),&lt;br /&gt;                                      Contact.birth_date != None,&lt;br /&gt;                                      Contact.is_account == self.accounts,&lt;br /&gt;                                      Contact.status != 'archived'))&lt;br /&gt;&lt;/pre&gt;In this example "self.accounts" is an attribute with a value of 0 or 1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1492805264310482779?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1492805264310482779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/sqlalchemy-upcoming-birthdays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1492805264310482779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1492805264310482779'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/11/sqlalchemy-upcoming-birthdays.html' title='SQLAlchemy &amp; Upcoming Birthdays'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6976833686286658758</id><published>2010-09-16T07:34:00.000-04:00</published><updated>2010-09-16T07:34:57.514-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ohiolinux'/><title type='text'>Ohio LinuxFest 2010</title><content type='html'>Last weekend (Sept. 10th - 11th) was Ohio LinuxFest 2010 - and it was the biggest one yet.&amp;nbsp; The growth each year of this conference is impressive;&amp;nbsp; both in attendees and vendors.&amp;nbsp; While the website is persistently void of detailed information[1] this is a great conference for users of Open Source software and I recommend everyone attend if at all possible.&amp;nbsp; While once a Saturday only conference it seems to have expanded, without much fanfare, to include Friday.&amp;nbsp; This year there was a free all-day training session by &lt;a href="http://www.zenoss.com/"&gt;Zenoss&lt;/a&gt; on Friday that I would have desperately loved to attend but was announced too late to make that possible.&amp;nbsp; Next year I hope to be there for the Friday sessions.&amp;nbsp; We (I and a sys-admin from Kalamazoo) did make if for the pre-party however - which is also something not-to-miss;&amp;nbsp; it is a great opportunity to hobnob with other users, including some well-known luminaries.&amp;nbsp; The nearly unlimited drink-tickets makes that even more entertaining.&lt;br /&gt;&lt;br /&gt;Saturday's conference track began with &lt;a href="http://stormyscorner.com/"&gt;Stormy Peters'&lt;/a&gt; excellent keynote on "Who is stealing your desktop?" about the dangers of cloud computing and the, almost stealth, proprietary services that so many users have come to rely on.&amp;nbsp; It raises the question if Open Source "won" only to then give up and accept yet another hegemony of corporations.&amp;nbsp; This same sentiment was echoed in Phil Robb's [of HP] talk "Irrelevance of the desktop".&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Then it was on to regular part of the conference.&amp;nbsp; This is where I have one serious gripe about OLF: the topic selection.&amp;nbsp; It seems so "LINUX Journal".&amp;nbsp; They aren't "bad" topics, but it seems a lot of sessions are spent on promotional, evangelistic, or quite esoteric fare.&amp;nbsp; I'm generally opposed to almost all forms of "evangelism" so I'll admit I'm biased - but talking about promoting Open Source or how Open Source is better or the history of Open Source at an Open Source conference... doesn't this seem like preaching-to-the-choir and self-congratulation?&amp;nbsp; The very first year I went to OLF I learned about what was new with PostgreSQL [from a PostgreSQL developer!], about Apache mod_rewrite, about SMTP grey listing, etc... really solid detailed stuff.&amp;nbsp; I'd sit down and the presenter would dive right in.&amp;nbsp; I still have the notes from that conference and I still use all that information in my daily job.&amp;nbsp; That is lacking in recent OLF years where I come away with only a couple of actually useful bits of information.&amp;nbsp; I still go because it is simply fun and the &lt;i&gt;feel&lt;/i&gt; you get for the direction of certain projects and vendors is valuable in its own way.&lt;br /&gt;&lt;br /&gt;Probably the best presentation was David Nalley's (&lt;a href="http://identi.ca/ke4qqq"&gt;ke4qqq&lt;/a&gt;) talk on &lt;a href="http://www.nsa.gov/research/selinux/index.shtml"&gt;SELinux&lt;/a&gt;.&amp;nbsp; SE has always seemed like a black box - a black box to promptly be disabled!&amp;nbsp; Only a few sentences into his talk and David had knocked the sides of that box.&amp;nbsp; Straight-to-the-point and beautiful.&amp;nbsp; Over time I will now proceed to re-enable SELinux at least on my DMZ hosts.&amp;nbsp; There was some overlap between this an &lt;a href="http://www.layereddefense.com/"&gt;Deral Heiland's&lt;/a&gt; "And Now They Own You" - which could also have been named: "PEOPLE!&amp;nbsp; FIREWALL EGRESS TOO!".&lt;br /&gt;&lt;br /&gt;Oh, and Asterisk 1.8 will support IPv6!&amp;nbsp; Another side-effect of OLF is to install a deep sense of Asterisk envy in those saddled with lousy / proprietary phone systems.&amp;nbsp; CalDAV integration with the PBX... really... why didn't someone thing of that feature before?&amp;nbsp; How simply spectacular.&amp;nbsp; Oh, wait,&amp;nbsp; I have Nortel phone systems... @*(&amp;amp;$&amp;amp;*(@*(&amp;amp; &amp;amp;*(@^$&amp;amp;*@^* @&amp;amp;^@$@!&lt;br /&gt;&lt;br /&gt;[1] Even now the schedule page lists the "Pre-Party" details "TBD" (to-be determined).&amp;nbsp; Fortunately a quick Twitter search discovered where it was.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6976833686286658758?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6976833686286658758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/09/ohio-linuxfest-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6976833686286658758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6976833686286658758'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/09/ohio-linuxfest-2010.html' title='Ohio LinuxFest 2010'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2206512829422019869</id><published>2010-09-16T06:17:00.001-04:00</published><updated>2010-09-16T06:19:10.348-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xfs'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>XFS &amp; Inodes</title><content type='html'>There was an interesting thread on the &lt;a href="http://lists.opensuse.org/opensuse/"&gt;opensuse list&lt;/a&gt; this week;&amp;nbsp; and regular readers will note how rare an event that is [even if you filter out the KDE-users-who-hate-KDE and the IPv6-is-irrelevant-malcontents].&amp;nbsp; It had to do with the &lt;a href="http://oss.sgi.com/projects/xfs/"&gt;XFS filesystem&lt;/a&gt; and inodes.&amp;nbsp; At least it was interesting to me as I recall facing the exact same problem several years ago.&amp;nbsp; While, unlike traditional UNIX filesystems, XFS doesn't suffer from the boring old issue of "inode exhaustion" it does have inode limits - based on a percentage of the filesystem size.&lt;br /&gt;&lt;pre&gt;&lt;span style="color: blue;"&gt;linux-yu4c:~ # xfs_info /mnt&lt;br /&gt;meta-data=/dev/sdb1              isize=256    agcount=4, agsize=15262188 blks&lt;br /&gt;         =                       sectsz=512   attr=2&lt;br /&gt;data     =                       bsize=4096   blocks=61048752, imaxpct=25&lt;br /&gt;         =                       sunit=0      swidth=0 blks&lt;br /&gt;naming   =version 2              bsize=4096   ascii-ci=0&lt;br /&gt;log      =internal               bsize=4096   blocks=29808, version=2&lt;br /&gt;         =                       sectsz=512   sunit=0 blks, lazy-count=0&lt;br /&gt;realtime =none                   extsz=4096   blocks=0, rtextents=0&lt;/span&gt;&lt;/pre&gt;The key is that "&lt;span style="color: blue;"&gt;imaxpct&lt;/span&gt;" value.  In this example inode's are limited to 25% of the filesystems capacity.  That is a lot of inodes!  But some tools and distributions may default that percentage to some much lower value - like 5% or 10% (for what reason I don't know).&amp;nbsp; This value can be determined at filesystem creation time using the "&lt;span style="color: blue;"&gt;-i maxpct=&lt;i&gt;nn&lt;/i&gt;&lt;/span&gt;" option or adjusted later using the &lt;span style="color: blue;"&gt;xfs_growfs&lt;/span&gt; command's "&lt;span style="color: blue;"&gt;-m &lt;i&gt;nn&lt;/i&gt;&lt;/span&gt;" command.&amp;nbsp; So if you have an XFS filesystem with available capacity that is telling you it is full: check your "&lt;span style="color: blue;"&gt;imaxpct&lt;/span&gt;" value&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2206512829422019869?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2206512829422019869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/09/xfs-inodes.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2206512829422019869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2206512829422019869'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/09/xfs-inodes.html' title='XFS &amp; Inodes'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-3834077883049090435</id><published>2010-07-26T06:36:00.000-04:00</published><updated>2010-07-26T06:36:19.843-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogspot'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Bootstrapping "opengoupware.us"</title><content type='html'>Thanks to the addition of the "pages" feature in Blogspot I've finally created a site at &lt;a href="http://www.opengroupware.us/"&gt;opengroupware.us&lt;/a&gt;,  The OpenGroupware [Legacy] project website (I won't even bother to link to it) has been worthless for some time, and the information about the constellation of projects beyond legacy is very scattered. &lt;a href="http://www.opengroupware.us/"&gt; opengroupware.us&lt;/a&gt; is an attempt to at least create an index of that information as well as resurrect some of the good content from the abyss that is the docs plone.&amp;nbsp; If you want to submit content to &lt;a href="http://opengroupware.us/"&gt;opengroupware.us&lt;/a&gt; or want to help edit / maintain content just let me know any I'll add your Blogspot account to the site permissions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3834077883049090435?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3834077883049090435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/07/bootstrapping-opengoupwareus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3834077883049090435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3834077883049090435'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/07/bootstrapping-opengoupwareus.html' title='Bootstrapping &quot;opengoupware.us&quot;'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-9110194077971460275</id><published>2010-07-16T07:28:00.000-04:00</published><updated>2010-07-16T07:28:30.795-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>XSLT Transform to TXT, with LXML</title><content type='html'>Maybe this should be obvious, but it wasn't to me.  I've got an XML document and an XSLT stylesheet.  But that stylesheet just produces text, not XML;  it is essentially a template for an e-mail [with some iterations, so something more complex than &lt;a href="http://sourceforge.net/apps/trac/coils/wiki/Workflow-Engine"&gt;OIE&lt;/a&gt;'s very convenient &lt;a href="http://sourceforge.net/apps/trac/coils/wiki/rowTemplateAction"&gt;rowTemplateAction&lt;/a&gt; can handle].  So I was extending the &lt;a href="http://sourceforge.net/apps/trac/coils/wiki/transformAction"&gt;transformAction&lt;/a&gt; for performing XSLT transforms that produce other than XML... but the documentation is a bit thin and every example is XML results.  The trick is pretty simple, just&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;pre&gt;unicode(result)&lt;/pre&gt;&lt;/div&gt;and make sure [of course] that you have&lt;br /&gt;&lt;div style="text-align: center;"&gt;&amp;lt;xsl:output method="txt" encoding="utf-8" omit-xml-declaration="yes"/&amp;gt; &lt;/div&gt;&lt;pre&gt;&lt;xsl:output encoding="utf-8" method="txt" omit-xml-declaration="yes"&gt;&lt;/xsl:output&gt;&lt;/pre&gt;declared in the template.  So it should be as simple as: &lt;br /&gt;&lt;pre&gt;def do_action(self):&lt;br /&gt;        source = etree.parse(self._rfile)&lt;br /&gt;        xslt = etree.fromstring(self._xslt)&lt;br /&gt;        transform = etree.XSLT(xslt)&lt;br /&gt;        result = transform(source)&lt;br /&gt;        self._wfile.write(unicode(result))&lt;br /&gt;&lt;/pre&gt;in order to transform to just about anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-9110194077971460275?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/9110194077971460275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/07/xslt-transform-to-txt-with-lxml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/9110194077971460275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/9110194077971460275'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/07/xslt-transform-to-txt-with-lxml.html' title='XSLT Transform to TXT, with LXML'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4447129671312746784</id><published>2010-07-08T07:35:00.001-04:00</published><updated>2010-07-08T07:36:02.514-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware coils evolution workflow'/><title type='text'>Coils: Features merged into "default"</title><content type='html'>This morning the following features were merged into OpenGroupware Coils "default" branch, and will be available in the next release.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;The scheduler service no longer depends on the ticktock heartbeat.&amp;nbsp; It checks the run queue in its work method.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;Format&lt;/span&gt;(s) now support logging of rejected records to a buffer.&amp;nbsp; This feature is available via a new parameter on the&lt;span style="color: blue;"&gt; readAction&lt;/span&gt;: "&lt;span style="color: blue;"&gt;rejectionsLabel&lt;/span&gt;".&amp;nbsp; This is documented in the &lt;a href="https://sourceforge.net/apps/trac/coils/wiki/readAction"&gt;readAction's&lt;/a&gt; wiki page.&lt;/li&gt;&lt;li&gt;&amp;nbsp;The above motivated me to abstract how ActionCommand goes about creating [output] messages.&amp;nbsp; It is now simple for an action to create additional messages [beyond it's 'default' output message] by just calling the &lt;span style="color: blue;"&gt;store_in_message(label, wfile,&lt;/span&gt; &lt;span style="color: blue;"&gt;mimetype='application/octet-stream')&lt;/span&gt; method.&lt;/li&gt;&lt;li&gt;New CLI tools: "&lt;span style="color: red;"&gt;coils-list-schedule&lt;/span&gt;" and "&lt;span style="color: red;"&gt;coils-unschedule-process&lt;/span&gt;" that let the administrator view and modify the workflow scheduler from the command line.&amp;nbsp; Yes, we still need a "&lt;span style="color: red;"&gt;coils-schedule-process&lt;/span&gt;".&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;getopt isn't the greatest command line option parser,&amp;nbsp; would be great if someone would look into swapping that out with something better.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt; The above motivated me to add an &lt;span style="color: blue;"&gt;initialize_tool(name, argv, arguments=['',[]])&lt;/span&gt; function to &lt;span style="color: blue;"&gt;coils.core.utility&lt;/span&gt;.&amp;nbsp; This provides a simple way for a tool [vs. a service] to bootstrap itself onto the OpenGroupware Coils service bus so that it can receive callbacks, etc... Return value is an &lt;span style="color: blue;"&gt;AdministrativeContext&lt;/span&gt; (with a registered &lt;span style="color: blue;"&gt;Broker&lt;/span&gt; for IPC) and dictionary of unconsumed command line parameters. &lt;span style="color: blue;"&gt;initialize_tool&lt;/span&gt; automatically consumes the &lt;span style="color: blue;"&gt;--store=&lt;/span&gt;,&lt;span style="color: blue;"&gt; --add-bundle=&lt;/span&gt;, and &lt;span style="color: blue;"&gt;--ban-bundle&lt;/span&gt; parameters in order to initialize the Coils environment.&lt;/li&gt;&lt;/ul&gt;In the last week or so there has been significant work on tidying things up, and the &lt;a href="https://sourceforge.net/apps/trac/coils/wiki/ProvisioningCentOS5"&gt;deployment instructions&lt;/a&gt; on the wiki have been updated as well.&amp;nbsp; Getting a working OpenGroupware Coils instance should now be very straight-forward.&amp;nbsp;&amp;nbsp; Big work ahead is the move to WSGI which is underway in the NetComm branch (which needs to be remerged with default, btw).&amp;nbsp; And with the impending release of &lt;a href="http://www.opensuse.org/en/"&gt;openSUSE 11.3&lt;/a&gt;, and its inclusion of &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt; 1.30.x,&amp;nbsp; the &lt;a href="http://www.groupdav.org/"&gt;GroupDAV&lt;/a&gt; address book support can be completely tested and polished.&amp;nbsp; Evolution 1.30.x contains several enhancements to make it's WebDAV address book support fully compatible with GroupDAV.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4447129671312746784?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4447129671312746784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/07/coils-features-merged-into-default.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4447129671312746784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4447129671312746784'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/07/coils-features-merged-into-default.html' title='Coils: Features merged into &quot;default&quot;'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2941694936087601755</id><published>2010-05-24T08:36:00.001-04:00</published><updated>2010-05-24T08:37:20.590-04:00</updated><title type='text'>Keeping an OIE Route After Completion</title><content type='html'>Once an &lt;a href="http://sourceforge.net/apps/trac/coils/wiki/Workflow-Engine"&gt;OpenGroupware Integration Engine&lt;/a&gt; route has successfully completed it is automatically garbage collected.&amp;nbsp; This prevents the system from filling up with messages and version information.&amp;nbsp; But if an external application, like &lt;a href="http://www.whitemiceconsulting.com/2010/01/python-curses-in-action-even-on-aix.html"&gt;ogo-curses-putter&lt;/a&gt;, wants to retrieve the output of the route... it's gone!&amp;nbsp; To facilitate this use-case the garbage collection can be suppressed per-route by setting the {&lt;span style="color: blue;"&gt;http://www.opengroupware.us/oie}preserveAfterCompletion&lt;/span&gt; property of the route entity with a value of "YES".&amp;nbsp; If this property value exists the processes derived from that route will not be garbage collected.&amp;nbsp; The simplest way to set the property is to retrieve the route via "&lt;span style="color: blue;"&gt;route::get&lt;/span&gt;" and use your context's &lt;a href="http://sourceforge.net/apps/trac/coils/wiki/PropertyManager"&gt;property manager&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from coils.core import *&lt;br /&gt;ctx = AdministrativeContext()&lt;br /&gt;r = ctx.run_command('route::get', name='MTAStockOrder_TEST')&lt;br /&gt;ctx.property_manager.set_property(r, 'http://www.opengroupware.us/oie', 'preserveAfterCompletion', 'YES')&lt;br /&gt;ctx.commit()&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;The above will set the value of {&lt;span style="color: blue;"&gt;http://www.opengroupware.us/oie}preserveAfterCompletion&lt;/span&gt; to "YES" for the route named "MTAStockOrder_TEST".  The property manager will update the value of the property if such a property already exists, or it will create a new property with the specified value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2941694936087601755?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2941694936087601755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/05/keeping-oie-route-after-completion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2941694936087601755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2941694936087601755'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/05/keeping-oie-route-after-completion.html' title='Keeping an OIE Route After Completion'/><author><name>Whitemice Consulting</name><uri>http://www.blogger.com/profile/00677981044303924618</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-22719251.post-6345342371458345722</id><published>2010-04-25T14:16:00.000-04:00</published><updated>2010-04-25T14:16:55.161-04:00</updated><title type='text'>Performing PROPFIND from Python</title><content type='html'>Surprising, when I went looking for examples of performing PROPFIND requests from Python I found very little information.  For testing &lt;a href="http://sourceforge.net/apps/trac/coils/"&gt;OpenGroupware Coil's&lt;/a&gt; WebDAV presentation I needed a simple way to perform the PROPFIND required to list the entities in a collection and then request each entity. With a bit of scratching through the thin documentation I was able to come up with the following:&lt;br /&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;import httplib, urllib2, base64, sys&lt;/li&gt;&lt;li&gt;from lxml import etree&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;PROPFIND = u'''&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;propfind xmlns="DAV:"&amp;gt;&lt;/li&gt;&lt;li&gt;  &amp;lt;prop&amp;gt;&lt;/li&gt;&lt;li&gt;    &amp;lt;getetag/&amp;gt;&lt;/li&gt;&lt;li&gt;  &amp;lt;/prop&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/propfind&amp;gt;'''&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;SERVER_HOST = '127.0.0.1'&lt;/li&gt;&lt;li&gt;SERVER_PORT = 8080&lt;/li&gt;&lt;li&gt;SERVER_PATH = '/dav/Contacts'&lt;/li&gt;&lt;li&gt;CLIENT_AGENT = 'Whitemice rules/so very true'&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;auth_string = 'Basic {0}'.format(base64.encodestring('adam:fred123')[:-1])&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;urllib2.install_opener(urllib2.build_opener(urllib2.HTTPHandler()))&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;connection = httplib.HTTPConnection(SERVER_HOST, SERVER_PORT)&lt;/li&gt;&lt;li&gt;connection.putrequest('PROPFIND', SERVER_PATH)&lt;/li&gt;&lt;li&gt;connection.putheader('Authorization', auth_string)&lt;/li&gt;&lt;li&gt;connection.putheader('User-Agent', CLIENT_AGENT)&lt;/li&gt;&lt;li&gt;connection.putheader('Depth', 1)&lt;/li&gt;&lt;li&gt;connection.putheader('Content-Length', str(len(PROPFIND)))&lt;/li&gt;&lt;li&gt;connection.endheaders()&lt;/li&gt;&lt;li&gt;connection.send(PROPFIND)&lt;/li&gt;&lt;li&gt;response = connection.getresponse()&lt;/li&gt;&lt;li&gt;if response.status == 207:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;data = response.read()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;connection.close()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;response = None&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;namespace_prefix_map = { 'D' : 'DAV:' }&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;document = etree.fromstring(data)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;for path in document.xpath('/D:multistatus/D:response/D:href/text()', &lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;namespaces=namespace_prefix_map):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (path != SERVER_PATH):&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection = httplib.HTTPConnection('127.0.0.1', 8080)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.putrequest('GET', path)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.putheader('Authorization', auth_string)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.putheader('User-Agent', CLIENT_AGENT)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.endheaders()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response = connection.getresponse()&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if response.status != 200:&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print 'Error retrieving {0}'.format(path)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(1)&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;br /&gt;This will make the PROPFIND for all the items in the collection, requesting the getetag property, and then from the response perform an HTTP GET for every item.  Even better would be if it requested isCollection and knew better than to perform GETs on collections.&amp;nbsp; I hope this simple example will be of use to someone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6345342371458345722?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6345342371458345722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/04/performing-propfind-from-python.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6345342371458345722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6345342371458345722'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/04/performing-propfind-from-python.html' title='Performing PROPFIND from Python'/><author><name>Whitemice Consulting</name><uri>http://www.blogger.com/profile/00677981044303924618</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-22719251.post-3338406622010303875</id><published>2010-03-17T07:04:00.000-04:00</published><updated>2010-03-17T07:04:20.181-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coils'/><category scheme='http://www.blogger.com/atom/ns#' term='bpml'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>OIE Progress, and lots of it.</title><content type='html'>The workflow engine [OIE] in the&lt;a href="http://sourceforge.net/apps/trac/coils/"&gt; OpenGroupware Coils&lt;/a&gt; project has reached a point a general usefulness.&amp;nbsp; OIE is accessible via WebDAV for creating, browsing, and starting flows.&amp;nbsp; The engine compiles BPML 1.0 markup to an internal format (adding additional markup-notations, such as XPDL,&amp;nbsp; shouldn't be much harder than writing a SaX parser to produce the internal format).&amp;nbsp; The &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; flow control structure is implemented;&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt;, &lt;span style="color: blue;"&gt;until&lt;/span&gt;, and &lt;span style="color: blue;"&gt;while&lt;/span&gt; are simply stubs at this point.&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt; is actually compiled but can't be executed yet.&amp;nbsp; Message scope is handled correctly.&amp;nbsp; Even with just linear execution and &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; a great many business processes can be modelled, especially ETL type flows.&lt;br /&gt;&lt;br /&gt;The actions implemented so far are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;read&lt;/span&gt; - Translate a message using a format; fixed record length and XLS formats have been implemented.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;select&lt;/span&gt; - SELECT from a defined RDBMS.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;write&lt;/span&gt; - Write a StandardXML message out using a specified format.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;assign&lt;/span&gt; - XPath select a value or assign a static value to a message.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;getEntity&lt;/span&gt; - Retrieve an entity from the groupware database.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;xpath&lt;/span&gt; - Create a new message from an XPath query.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;ldapSearch&lt;/span&gt; - Search an LDAP DSA, results are in DSMLv1.0.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;regularExpressionFind&lt;/span&gt; - Perform regexp matches.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;readJSON&lt;/span&gt; - Translate JSON data into XML.&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;sendMail&lt;/span&gt; - Send a message via an SMTP server, including support for attachments.&lt;/li&gt;&lt;/ul&gt;All commands support label substitution in appropriate parameters.&lt;br /&gt;&lt;br /&gt;As of yesterday there is also an &lt;span style="color: blue;"&gt;insert&lt;/span&gt; action for inserting data into a RDMS table;&amp;nbsp; this action hasn't yet been as heavily tested as the others,&amp;nbsp; but it completes the tool set required for simple ETL flows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3338406622010303875?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3338406622010303875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/03/oie-progress-and-lots-of-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3338406622010303875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3338406622010303875'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/03/oie-progress-and-lots-of-it.html' title='OIE Progress, and lots of it.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-698407663464661918</id><published>2010-03-17T06:31:00.000-04:00</published><updated>2010-03-17T06:31:40.176-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><category scheme='http://www.blogger.com/atom/ns#' term='nautilus'/><title type='text'>Disabling GNOME Automount</title><content type='html'>When you connect a mass storage device to a computer running the GNOME desktop environment it automatically mounts the device in&lt;span style="background-color: white; color: blue;"&gt; /media&lt;/span&gt; and places a short-cut to the device on your desktop.&amp;nbsp; This is an excellent default behavior;&amp;nbsp; but if you are working with various devices sometimes it can get in the way.&amp;nbsp; To correctly disable this feature simply execute:&lt;br /&gt;&lt;blockquote&gt;&lt;div style="color: blue; text-align: center;"&gt;gconftool-2 --type bool --set /apps/nautilus/preferences/media_automount false&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="text-align: left;"&gt;The devices will still appear in &lt;span style="color: blue;"&gt;computer:///&lt;/span&gt; (in nautilus) where you can right click on them to select the mount action if and when you want them to be mounted.&amp;nbsp; If and when you want to re-enable to auto-mounting feature execute: &lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: blue;"&gt;gconftool-2 --type bool --set /apps/nautilus/preferences/media_automount true&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-698407663464661918?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/698407663464661918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/03/disabling-gnome-automount.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/698407663464661918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/698407663464661918'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/03/disabling-gnome-automount.html' title='Disabling GNOME Automount'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8309401304722866630</id><published>2010-02-10T17:51:00.000-05:00</published><updated>2010-02-10T17:51:59.158-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coils'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlalchemy'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Passing a column set to an SQLalchemy query</title><content type='html'>In implementing the List method of the &lt;a href="http://sourceforge.net/apps/trac/coils/wiki/EntityAccessManager"&gt;EntityAccessManager&lt;/a&gt; provided by the Contacts bundle in &lt;a href="http://sourceforge.net/apps/trac/coils/"&gt;OpenGroupware Coils&lt;/a&gt; it seemed like it would be very efficient to allow the consumer to request what set of attributes it needed;&amp;nbsp; for instance, if a WebDAV client's PROPFIND request didn't ask for a given property, why request the corresponding attribute in the query?&amp;nbsp; Especially since the result set for PROPFIND queries are frequently very large [on the order of 20,000 records or so].&amp;nbsp; But how to pass a set of attributes as a parameter?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;def List(ctx, attributes):&lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp; db = query(attributes).filter(....)&lt;br /&gt;&amp;nbsp; return db.all &lt;/blockquote&gt;&lt;br /&gt;does &lt;b&gt;not&lt;/b&gt; work;&amp;nbsp; where attributes is a list, or a set of more than one attribute. Some fiddling around and I discover that the following works:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;def List(ctx, *attributes):&lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp; db = query(*attributes).filter(...)&lt;br /&gt;&amp;nbsp; return db.all()&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;ctx = AssumedContext(10100)&lt;br /&gt;a = BundleManager.get_access_manager('Contact', ctx)&lt;br /&gt;a.List(ctx, (Contact.object_id, Contact.version))&lt;/blockquote&gt;&lt;br /&gt;That single asterisk is the trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8309401304722866630?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8309401304722866630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/02/passing-column-set-to-sqlalchemy-query.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8309401304722866630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8309401304722866630'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/02/passing-column-set-to-sqlalchemy-query.html' title='Passing a column set to an SQLalchemy query'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4650483387375694141</id><published>2010-02-10T07:24:00.000-05:00</published><updated>2010-02-10T07:24:59.114-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cn=config'/><category scheme='http://www.blogger.com/atom/ns#' term='openldap'/><category scheme='http://www.blogger.com/atom/ns#' term='dynlist'/><title type='text'>Configuring OpenLDAP's dynlist in cn=config</title><content type='html'>&lt;b&gt;Step#1&lt;/b&gt;: Make sure the dynlist module is loaded on the server.&amp;nbsp; What modules are loaded are typically controlled by the "&lt;span style="color: blue;"&gt;cn=modules{0}, cn=config&lt;/span&gt;" object.&amp;nbsp; If your server doesn't have a modules object it probably isn't loading any dynamic modules.&amp;nbsp; Create an LDIF file and import it.&amp;nbsp; Our "&lt;span style="color: blue;"&gt;cn=modules{0}, cn=config&lt;/span&gt;" looks like:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;dn: cn=modules{0}, cn=config&lt;br /&gt;olcModuleLoad: {0}accesslog.la&lt;br /&gt;olcModuleLoad: {1}auditlog.la&lt;br /&gt;olcModuleLoad: {2}constraint.la&lt;br /&gt;olcModuleLoad: {3}dynlist.la&lt;br /&gt;olcModuleLoad: {4}memberof.la&lt;br /&gt;olcModuleLoad: {5}ppolicy.la&lt;br /&gt;olcModuleLoad: {6}refint.la&lt;br /&gt;olcModuleLoad: {7}seqmod.la&lt;br /&gt;olcModuleLoad: {8}syncprov.la&lt;br /&gt;olcModuleLoad: {9}sssvlv.la&lt;br /&gt;olcModuleLoad: {10}translucent.la&lt;br /&gt;olcModuleLoad: {11}unique.la&lt;br /&gt;olcModuleLoad: {12}back_monitor.la&lt;br /&gt;olcModulePath: /usr/lib/openldap2.4&lt;br /&gt;objectClass: olcModuleList&lt;br /&gt;cn: modules{0}&lt;/blockquote&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;NOTE:&lt;/b&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;Double check that the "&lt;span style="color: blue;"&gt;olcModulePath&lt;/span&gt;" is the absolute path to the directory containing the OpenLDAP modules.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step#2:&lt;/b&gt; Check that your schema has the &lt;span style="color: blue;"&gt;groupOfURLs&lt;/span&gt; objectclass defined.&amp;nbsp; &lt;span style="color: red;"&gt;If you attempt to configure the dynlist module without that schema available you still crash slapd.&amp;nbsp;&lt;/span&gt; To define the dynamicGroup schema (if it is missing) you can import the following LDIF into your &lt;span style="color: blue;"&gt;cn=config&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;dn: cn=dynamicGroup, cn=schema, cn=config&lt;br /&gt;olcObjectClasses: {0}( 2.16.840.1.113730.2.33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NAME 'groupOfURLs'&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUP top STRUCTURAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MUST cn&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAY ( memberURL $ businessCat&lt;br /&gt;&amp;nbsp;egory $ description $ o $ ou $&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owner $ seeAlso ) )&lt;br /&gt;olcAttributeTypes: {0}( 2.16.840.1.113730.1.198&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NAME 'memberURL'&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DESC 'Identifies an URL associated with each member of a group. Any type&lt;br /&gt;&amp;nbsp; of labeled URL can be used.'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUP labeledURI )&lt;br /&gt;objectClass: olcSchemaConfig&lt;br /&gt;cn: dynamicGroup&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Step#3:&lt;/b&gt; Create an &lt;span style="color: blue;"&gt;olcOverlayConfig&lt;/span&gt; object in the scope of your Dit database.&amp;nbsp; For example, our Dit is the 1st HDB database on the server so the appropriate object is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;dn: olcOverlay=dynlist,olcDatabase={1}hdb,cn=config&lt;br /&gt;objectClass: olcOverlayConfig&lt;br /&gt;objectClass: olcDynamicList&lt;br /&gt;olcOverlay: dynlist&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Step#4:&lt;/b&gt; Now you are ready to actually use the dynlist module.&amp;nbsp; A common use-case is to create dynamic mail alias objects;&amp;nbsp; with dynlist you don't need to maintain mail aliases, they will automatically contain everyone who matches the relevent criteria.&amp;nbsp; Provided you use the traditional &lt;span style="color: blue;"&gt;nisMailAlias&lt;/span&gt; objectclass in order to define mail aliases adding the attribute -&lt;br /&gt;&lt;blockquote&gt;olcDlAttrSet: {0}nisMailAlias labeledURI rfc822mailmember:mail&lt;/blockquote&gt;&amp;nbsp;- to "&lt;span style="color: blue;"&gt;olcOverlay=dynlist,olcDatabase={1}hdb,cn=config&lt;/span&gt;" will enable dynamic mail aliases.&amp;nbsp; Specifically any &lt;span style="color: blue;"&gt;nisMailAlias&lt;/span&gt; containing a &lt;span style="color: blue;"&gt;labeledURI&lt;/span&gt; attribute will be expanded by the query specified in that attribute.&amp;nbsp; The results of that query will be rewritten by the optional &lt;span style="color: red;"&gt;rfc822mailmember:mail&lt;/span&gt; clause which will rename the &lt;span style="color: blue;"&gt;mail&lt;/span&gt; attributes resulting from the query into the &lt;span style="color: blue;"&gt;rfc822mailmember&lt;/span&gt; attribute required by consumers of the &lt;span style="color: blue;"&gt;nisMailAlias&lt;/span&gt; objects.&amp;nbsp; So rather than populating the mail alias object with &lt;span style="color: blue;"&gt;rfc822mailmember&lt;/span&gt; attributes manually, you extend the object with the auxilliary &lt;span style="color: blue;"&gt;labeledURIObject&lt;/span&gt; objectclass and define the query in the &lt;span style="color: blue;"&gt;labeledURI&lt;/span&gt; attribute.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;dn: cn=gr_parts, ou=ListAliases, ou=Aliases, ou=Mail, ou=SubSystems, o=Morrison Industries,c=US&lt;br /&gt;mail: gr_parts@morrison-ind.com&lt;br /&gt;labeledURI: ldap:///ou=People,ou=Entities,ou=SAM,o=Morrison Industries,c=US?mail?one?(&amp;amp;(morrisonactiveuser=Y)(objectclass=morrisonuser)(departmentNumber=*P*)(morrisonbranch=GRD))&lt;br /&gt;objectClass: nisMailAlias&lt;br /&gt;objectClass: top&lt;br /&gt;objectClass: labeledURIObject&lt;br /&gt;cn: gr_parts&lt;/blockquote&gt;&lt;br /&gt;The object will immediately populate with &lt;span style="color: blue;"&gt;rfc822mailmember&lt;/span&gt; attributes derived from the &lt;span style="color: blue;"&gt;mail&lt;/span&gt; attribute of those objects matching the specified filter: "&lt;span style="color: blue;"&gt;(&amp;amp;(morrisonactiveuser=Y)(objectclass=morrisonuser)(departmentNumber=*P*)(morrisonbranch=GRD))&lt;/span&gt;".&amp;nbsp; The third parameter, "&lt;span style="color: blue;"&gt;one&lt;/span&gt;", of the URI is the scope of the query so only objects immediately subordinate to "&lt;span style="color: blue;"&gt;ou=People,ou=Entities,ou=SAM,o=Morrison Industries,c=US&lt;/span&gt;" are candidates for the filter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4650483387375694141?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4650483387375694141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/02/configuring-openldaps-dynlist-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4650483387375694141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4650483387375694141'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/02/configuring-openldaps-dynlist-in.html' title='Configuring OpenLDAP&apos;s dynlist in cn=config'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6708197120558198109</id><published>2010-01-21T13:43:00.000-05:00</published><updated>2010-01-21T13:43:29.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='social-networking'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Twython Presentation Uploaded.</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_iKb8pYRqFaA/S1ifE65KuqI/AAAAAAAAABs/73GdEIRSvnA/s1600-h/Screenshot.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_iKb8pYRqFaA/S1ifE65KuqI/AAAAAAAAABs/73GdEIRSvnA/s200/Screenshot.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;My presentation on &lt;a href="http://github.com/ryanmcgrath/twython"&gt;Twython&lt;/a&gt; (a Python Twitter API provider) and integrating Twitter services into OpenGroupware Coils has been &lt;a href="http://grpug.googlegroups.com/web/Twython.pdf?gda=icFjMj4AAAA2HZEQ9wLgSXKQNbgr2obJqnNdAgAPg6GlLxTqiiXMGIs4NJB-uv_IeTSNzJdp13vjsKXVs-X7bdXZc5buSfmx&amp;amp;gsc=knQO1wsAAAAqWAcJLU7BLZAO_f9D9HdQ"&gt;uploaded to the GRPUG forum.&lt;/a&gt;.&amp;nbsp; This covers the basics of using &lt;a href="http://github.com/ryanmcgrath/twython"&gt;Twython&lt;/a&gt; such as authentication, tweeting, retrieving time lines, searching, etc...&amp;nbsp;&amp;nbsp;&lt;br /&gt;Because Twitter rate limits connections [as well they should] if you are going to provide Twitter access to a large numbers of users, potentially NAT'd behind a single IP, it is recommended that you create some type of middle-ware to proxy and cache your Twitter access - the Twitter support in OpenGroupware Coils is one example of how to do that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6708197120558198109?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6708197120558198109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/01/twython-presentation-uploaded.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6708197120558198109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6708197120558198109'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/01/twython-presentation-uploaded.html' title='Twython Presentation Uploaded.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_iKb8pYRqFaA/S1ifE65KuqI/AAAAAAAAABs/73GdEIRSvnA/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8316488493172498467</id><published>2010-01-21T08:14:00.005-05:00</published><updated>2010-01-21T08:39:53.518-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='curses'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='aix'/><title type='text'>Python Curses In Action, even on AIX.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iKb8pYRqFaA/S1hYEN_4_gI/AAAAAAAAABk/a_hygl3X7KY/s1600-h/Screenshot-3.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 201px;" src="http://3.bp.blogspot.com/_iKb8pYRqFaA/S1hYEN_4_gI/AAAAAAAAABk/a_hygl3X7KY/s320/Screenshot-3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5429186180295491074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;So, what if you have an old COBOL application that you want to integrate with some web services or a website?  You'd need a "green-screen" application that can take that COBOL applications temporary output file, send it up to the web service, wait for a response, replace the temporary file, and then return control to the COBOL application (or whatever "green screen" application comes next).  It sounds simpler than it is in practice: what if the web service takes awhile to complete [or has human involvement on the other end?!] or the web service isn't available right at the moment you try to send your request?  For a real production environment your "green screen" application would need to deal with all of those things.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iKb8pYRqFaA/S1hUjk-ugAI/AAAAAAAAABU/hnSD_SikiX0/s1600-h/Screenshot-4.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 201px;" src="http://3.bp.blogspot.com/_iKb8pYRqFaA/S1hUjk-ugAI/AAAAAAAAABU/hnSD_SikiX0/s320/Screenshot-4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5429182320994058242" /&gt;&lt;/a&gt;  And you need that "green screen" application to work on both LINUX and AIX!&lt;/p&gt;  &lt;br /&gt;&lt;p&gt;Fortunately &lt;a href="http://pware.hvcc.edu/"&gt;pware&lt;/a&gt; provides &lt;a href"http://www.python.org"&gt;Python 2.6&lt;/a&gt; for AIX, including curses!  The &lt;a href="http://www.opengroup.org/onlinepubs/007908799/xcurses/intovix.html"&gt;curses&lt;/a&gt; library and respective Python module provide a surprisingly easy way to create professional looking TUI (Text User Interface) applications like the solution required in our example.  This particular application takes them temporary file and submits it via a &lt;a href="http://www.webdav.org"&gt;WebDAV&lt;/a&gt; PUT operation to the workflow engine provided by &lt;a href="https://sourceforge.net/apps/trac/coils/"&gt;OpenGroupware Coils&lt;/a&gt;.  The route in the workflow engine reformats the dreadful output of the COBOL application into the required format (using the &lt;a href="https://sourceforge.net/apps/trac/coils/wiki/Workflow-Format"&gt;format&lt;/a&gt; support in route Read and Write operations).  The client detects the route is complete by watching the URL specified in the header of the initial PUT, and then downloads the required data.  If anything goes wrong along the way the client can retry, or provide the user the option to abort.  All along the way the client provides detailed feedback to the user and a familiar dialog-box and prompt interface when feedback is required.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8316488493172498467?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8316488493172498467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2010/01/python-curses-in-action-even-on-aix.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8316488493172498467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8316488493172498467'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2010/01/python-curses-in-action-even-on-aix.html' title='Python Curses In Action, even on AIX.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_iKb8pYRqFaA/S1hYEN_4_gI/AAAAAAAAABk/a_hygl3X7KY/s72-c/Screenshot-3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5867817182983661322</id><published>2009-10-11T16:56:00.003-04:00</published><updated>2009-10-11T17:12:42.723-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodevelop'/><category scheme='http://www.blogger.com/atom/ns#' term='xaml'/><title type='text'>XAML designer for Monodevelop?</title><content type='html'>If I could pick one single thing to add to my development toolchain it would be a &lt;a href="http://msdn.microsoft.com/en-us/library/ms752059.aspx"&gt;XAML&lt;/a&gt; designer.  These days I do 90% of my development in the excellent &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; IDE (that last 10%, maintaining the OpenGroupware.org Objective-C code base, I do in &lt;a href="http://projects.gnome.org/gedit/"&gt;gedit&lt;/a&gt;)  Now that &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; supports &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; I can do all my work on &lt;a href="http://sourceforge.net/projects/coils/"&gt;OpenGroupware Coils&lt;/a&gt; there as well.  But I just can't imagine developing web applications using the tricycle: HTML, CSS, Javascript.  Every web development presentation I see leaves me with a single distinct impression: "What a hack!"  Web development is simply too cumbersome and tedious.  The future of the web is clearly web services (REST, SOAP, XMPP, and XML-RPC) combined with web &lt;span style="font-style:italic;"&gt;backed&lt;/span&gt; applications using Silverlight/&lt;a href="http://www.mono-project.com/Moonlight"&gt;Moonlight&lt;/a&gt; and Flash.  My money is on Silverlight/&lt;a href="http://www.mono-project.com/Moonlight"&gt;Moonlight&lt;/a&gt; being the eventual winner.   And today when I brought up &lt;a href="http://www.go-mono.com/monologue/"&gt;Monologue&lt;/a&gt; I see: "&lt;a href="http://dufoli.wordpress.com/2009/10/10/xaml-designer-for-monodevelop/"&gt;xaml designer for monodevelop"&lt;/a&gt;.   It isn't complete, maybe not even usable yet, but it certainly is encouraging; maybe someday I'll be able to return to web application development, and riding a 10-speed rather than a rusty old tricycle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5867817182983661322?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5867817182983661322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/10/xaml-designer-for-monodevelop.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5867817182983661322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5867817182983661322'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/10/xaml-designer-for-monodevelop.html' title='XAML designer for Monodevelop?'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2584022097507705738</id><published>2009-10-04T20:46:00.002-04:00</published><updated>2009-10-04T20:58:15.697-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fastmail'/><category scheme='http://www.blogger.com/atom/ns#' term='slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='cyrus-imapd'/><title type='text'>Wow, Slashdot covers some real FOSS!</title><content type='html'>It seems like it has been ages since this last happened - but Slashdot has a blurb about a real FOSS Story: &lt;a href="http://tech.slashdot.org/story/09/10/03/2131247/Interview-With-Jeremy-Howard-of-FastMailfm"&gt;Interview With Jeremy Howard of FastMail.fm&lt;/a&gt;.  FastMail both runs and develops services based on Cyrus IMAP.  &lt;a href="http://cyrusimap.web.cmu.edu/"&gt;Cyrus IMAP&lt;/a&gt; is Open Source, has an amazing depth of features, stunning performance, and is extremely standards compliant.  It is very refreshing to see some attention given to a real Open Source solution that has been serving user for a decade.  This in contrast to a not-open not-standards-compliant solution whose name you can probably guess - with whom Slashdotters appear to be utterly smitten [well beyond the point of clear thinking, but this is (a) Slashdot and (b) a normal side-effect of being smitten by something.]  I'm a big fan of Cyrus IMAPd which has been very feature-rich and stable since at least 1999:  you get delayed expunge, full text indexing, service-side filtering (SIEVE), shared folders, partitioning, replication, modification sequences, message expiration, and more.  Other IMAP/POP servers are still trying to bolt these features onto themselves.  If you aren't using Cyrus IMAPd I recommend you take a look,  I honestly don't know why anyone would choose anything else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2584022097507705738?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2584022097507705738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/10/wow-slashdot-covers-some-real-foss.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2584022097507705738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2584022097507705738'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/10/wow-slashdot-covers-some-real-foss.html' title='Wow, Slashdot covers some real FOSS!'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-299534723875040002</id><published>2009-09-13T09:22:00.001-04:00</published><updated>2009-09-13T09:24:50.943-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='olf2009'/><title type='text'>Ohio LinuxFest 2009 registration deadline is looming..</title><content type='html'>&lt;a href="http://www.ohiolinux.org"&gt;Ohio Linux Fest 2009&lt;/a&gt;&lt;br /&gt;Free and Open Source Software Conference and Expo&lt;br /&gt;Columbus, Ohio  :  September 25-27, 2009&lt;br /&gt;&lt;br /&gt;Registration Deadline: &lt;span style="font-weight:bold;"&gt;September 18, 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Ohio LinuxFest 2009 registration deadline is September 18, 2009. If you have not registered yet, please hurry over to &lt;a href="http://www.ohiolinux.org"&gt;http://www.ohiolinux.org&lt;/a&gt; and register today.&lt;br /&gt;&lt;br /&gt;Join us for the seventh annual Ohio LinuxFest conference to celebrate 40 years of Unix. We have an exciting line up of talks and this year the conference extends from Friday to Sunday.&lt;br /&gt;&lt;br /&gt;Friday, September 25, features professional training courses (Professional package registration required) and a course for Linux beginners which includes a refurbished computer, with Linux pre- installed for you (Quick Start package required). A series of conference talks and other sessions will be held on Friday as well.&lt;br /&gt;&lt;br /&gt;Saturday, September 26, features the expo and four conference tracks. We have a great line up of speakers; Doug McIlroy, Shawn Powers, Dr. Peter Salus, and many more.&lt;br /&gt;&lt;br /&gt;Two certification examinations will be held on Sunday the 27th. Linux Professional Institute will host an LPI certification exam, and the BSD Certification Group will offer the BSDA certification exam for Ohio LinuxFest attendees.&lt;br /&gt;&lt;br /&gt;Four registration packages are available for the Ohio LinuxFest this year.&lt;br /&gt;&lt;br /&gt;The Enthusiast Package is available at no cost for students, enthusiasts, and those that want to come to the event to find out more about Free and Open Source software.&lt;br /&gt;&lt;br /&gt;The Supporter Package is available again at a low cost of $65.00 to support the event. As a  measure of appreciation, the supporter package includes lunch on Saturday and a commemorative Ohio LinuxFest tee-shirt.&lt;br /&gt;&lt;br /&gt;The Quick Start Package is available for $250.00, which in addition to access to the events on Saturday, includes a full day of Linux Basics training on Friday and a refurbished Linux computer to take home.&lt;br /&gt;&lt;br /&gt;The Professional Package is available for $350.00, which in addition to Saturday's activities, also includes access to the one day OLFU tutorials on Friday.&lt;br /&gt;&lt;br /&gt;The Ohio LinuxFest welcomes people from all 50 states and international participants. We have had participants from Canada, England, Argentina, Brazil, and Australia in years past. Note that the Ohio LinuxFest is a 501c3 non-profit, volunteer organization. All proceeds are used for conference costs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-299534723875040002?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/299534723875040002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/ohio-linuxfest-2009-registration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/299534723875040002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/299534723875040002'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/ohio-linuxfest-2009-registration.html' title='Ohio LinuxFest 2009 registration deadline is looming..'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8727289365454291318</id><published>2009-09-11T08:23:00.002-04:00</published><updated>2009-09-11T10:19:38.787-04:00</updated><title type='text'>New OGo Help Desk Feature</title><content type='html'>Enhancement &lt;a href="http://bugzilla.opengroupware.org/bugzilla/show_bug.cgi?id=2027"&gt;Bug#2027&lt;/a&gt; "&lt;span style="font-style: italic;"&gt;Allow help desk users to create tasks on behalf of users&lt;/span&gt;" has been resolved as of r2274.  This update requires a database schema change -&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;ALTER TABLE job  ADD COLUMN owner_id INT;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;UPDATE job SET owner_id = creator_id;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The database scripts &lt;a href="http://svn.opengroupware.org/OpenGroupware.org/trunk/Database/PostgreSQL/pg-build-schema.psql"&gt;pg-build-schema.psql&lt;/a&gt; and &lt;a href="http://svn.opengroupware.org/OpenGroupware.org/trunk/Database/PostgreSQL/pg-update-1.x-to-5.5.psql"&gt;pg-update-1.x-to-5.5.psql&lt;/a&gt; have been updated.  NOTE: Be careful not to run this part of &lt;a href="http://svn.opengroupware.org/OpenGroupware.org/trunk/Database/PostgreSQL/pg-update-1.x-to-5.5.psql"&gt;pg-update-1.x-to-5.5.psql&lt;/a&gt; more than once or you risk modifying actual data in your database if you use the &lt;span style="color: rgb(51, 0, 153);"&gt;OGoHelpDeskRoleName&lt;/span&gt; default.&lt;br /&gt;&lt;br /&gt;This feature allows a member of the team whose named is defined in the &lt;span style="color: rgb(51, 0, 153);"&gt;OGoHelpDeskRoleName&lt;/span&gt; default to create tasks with an owner other than themselves.  Delegated and archived task lists now display tasks based on owner rather than creator.  By default the owner is the creator so this has no effect on normal task behaviour.  Currently the help desk feature, setting of the owner to another user, is only available via the &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; API.  The modifications to the &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; API are documented on the &lt;a href="http://code.google.com/p/zogi/wiki/Task"&gt;Task&lt;/a&gt; entity.&lt;br /&gt;&lt;br /&gt;If your help desk team name contains spaces be sure to use proper quoting - &lt;span style="color: rgb(51, 0, 153);"&gt;Defaults write NSGlobalDomain OGoHelpDeskRoleName '"all intranet"'&lt;/span&gt; - or you may not get the results you expect.  Obviously if you set &lt;span style="color: rgb(51, 0, 153);"&gt;OGoHelpDeskRoleName&lt;/span&gt; to "&lt;span style="color: rgb(51, 0, 153);"&gt;all intranet&lt;/span&gt;" all users will be able to create tasks on behalf of other users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8727289365454291318?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8727289365454291318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/new-ogo-help-desk-feature.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8727289365454291318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8727289365454291318'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/new-ogo-help-desk-feature.html' title='New OGo Help Desk Feature'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6375936958048638997</id><published>2009-09-08T09:13:00.002-04:00</published><updated>2009-09-08T09:23:18.991-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zidestore'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Let The Season Of Patching Begin.</title><content type='html'>It is that time of year again: later sunrises, earlier sunsets, and more hacking.  I've commited my first patch for the coming season of gloom - cache removal as &lt;a href="http://mail.opengroupware.org/pipermail/developer/2009-April/003763.html"&gt;previously discussed&lt;/a&gt; back in the days-getting-longer part of the year. [Note: Pipermail archives strip attachments, but you can find the patch on the &lt;a href="http://www.nabble.com/Re%3A-memory-leak-in-zidestore-1.5-p23548149.html"&gt;Nabble&lt;/a&gt; archives].  This makes trunk r2270 bumping libZSBackend.so to version 5.5.94.  As far as I've been able to determine these caches are just legacy goo that servered no purpose and inflated memory use - but if you think you see any fallout from this change please report it.&lt;br /&gt;&lt;br /&gt;As for pending ZideStore work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Need to fix ctags for a &lt;a href="http://mail.opengroupware.org/pipermail/developer/2009-June/003848.html"&gt;PROPFIND with a depth greater than zero.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;  Test &lt;a href="http://mail.opengroupware.org/pipermail/xmlrpc/2009-August/000846.html"&gt;Tobias' patch&lt;/a&gt; concerning &lt;a href="http://code.google.com/p/zogi/issues/detail?id=33"&gt;recurring appointments that jump daylight savings boundaries&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Change &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; fault codes to make them more useful;  the idea is to use similar HTTP error codes where appropriate.&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/zogi/issues/detail?id=37"&gt;Use 409 error on conflicting putObject.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/zogi/issues/detail?id=38"&gt;Use 403 for unauthorized putObject/deleteObject requests.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/zogi/issues/detail?id=39"&gt;Use 304 for generic putObject failure.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Check out efficiency of authentication in &lt;a href="http://svn.opengroupware.org/cgi-bin/viewvc.cgi/OGo/trunk/Logic/LSFoundation/OGoContextManager.m?view=markup%3EOGoContentManager"&gt;OGoContextManager&lt;/a&gt; which I believe may also contain a useless cache.  Also I occasionally see logging that makes is appear as if a request was authenticated twice.&lt;/li&gt;&lt;li&gt;  Find out why large collections of vCards fail to load when using Novell's excellent &lt;a href="http://www.novell.com/products/desktop/features/evolution.html"&gt;Evolution&lt;/a&gt; PIM.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Comments, criticisms, and &lt;span style="font-weight:bold;"&gt;patches&lt;/span&gt; welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6375936958048638997?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6375936958048638997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/let-season-of-patching-begin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6375936958048638997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6375936958048638997'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/let-season-of-patching-begin.html' title='Let The Season Of Patching Begin.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8952465025049971027</id><published>2009-09-01T07:50:00.003-04:00</published><updated>2009-09-01T08:02:24.082-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>GtkBuilder &amp; IronPython</title><content type='html'>Apparently &lt;a href="http://library.gnome.org/devel/gtk/stable/GtkBuilder.html"&gt;GtkBuilder&lt;/a&gt; is now working with &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; according to an &lt;a href="http://mindtrove.info/gtkbuilderglade-on-ironpython/"&gt;article&lt;/a&gt; over on &lt;a href="http://mindtrove.info/"&gt;Mindtrove&lt;/a&gt;.  What is &lt;a href="http://library.gnome.org/devel/gtk/stable/GtkBuilder.html"&gt;GtkBuilder&lt;/a&gt;?  It is a replacement for the aging libglade library, see the article &lt;a href="http://blogs.gnome.org/johan/2007/06/15/gtkbuilder-has-landed/"&gt;"GtkBuilder has landed"&lt;/a&gt; for a good explanation.  &lt;a href="http://library.gnome.org/devel/gtk/stable/GtkBuilder.html"&gt;GtkBuilder&lt;/a&gt; support for &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; means you can now develop .NET Gtk# applications in Python in a RAD fashion.  Current versions of &lt;a href="http://glade.gnome.org/"&gt;Glade&lt;/a&gt; support the new GtkBuilder library.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8952465025049971027?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8952465025049971027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/gtkbuilder-ironpython.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8952465025049971027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8952465025049971027'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/gtkbuilder-ironpython.html' title='GtkBuilder &amp; IronPython'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-3339337558332137688</id><published>2009-09-01T06:57:00.004-04:00</published><updated>2009-09-01T08:02:56.605-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consonance'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Consonance 0.0.9p</title><content type='html'>I've uploaded &lt;a href="http://code.google.com/p/consonance/"&gt;Consonance&lt;/a&gt; 0.0.9pre to the downloads site on Google Code.  And announced it on &lt;a href="http://freshmeat.net/projects/consonance"&gt;Freshmeat&lt;/a&gt;.  This version uses the shiny new &lt;a href="http://msdn.microsoft.com/en-us/library/bb308959.aspx"&gt;LINQ&lt;/a&gt; backend. Contact and Enterprise operations, including the Contact CRUD window, should be stable.  That was the focus of 0.0.9.  Hopefully I can get 0.0.10 out the door by this weekend:  the goal for 0.0.10 is to re-enable the main task lists and stabilize the Task window.  I've already got the task lists loading and as an extra re-enabled the busy-pulser on the main window.  Patches welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3339337558332137688?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3339337558332137688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/consonance-009p.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3339337558332137688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3339337558332137688'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/consonance-009p.html' title='Consonance 0.0.9p'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2007655345756165595</id><published>2009-09-01T06:42:00.003-04:00</published><updated>2009-09-01T06:55:35.890-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Best of...</title><content type='html'>Apparently it is "Best of" season over at &lt;a href="http://www.infoworld.com/"&gt;InfoWorld&lt;/a&gt;.  I'd be interested in what they think is the best but their lists are basically unnavigable - I hope they didn't use any of the &lt;a href="http://www.infoworld.com/d/open-source/best-open-source-developer-tools-726?source=rss_open_source"&gt;Best open source developer tools&lt;/a&gt; to design that catastrophe of a presentation.  It is way too much work to see their results, but if you have patience and the minimum 25" display necessary to watch the content among the sea of adds:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoworld.com/d/open-source/best-open-source-software-awards-2009-628?%20source=rss_open_source"&gt;Best of Open Source Software Awards 2009&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.infoworld.com/d/open-source/best-open-source-enterprise-software-740?source=rss_open_source"&gt;Best of open source enterprise software&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.infoworld.com/d/open-source/best-open-source-developer-tools-726?source=rss_open_source"&gt;Best open source developer tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.infoworld.com/d/open-source/best-open-source-networking-software-767?source=rss_open_source"&gt;Best open source networking software&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.infoworld.com/d/open-source/best-open-source-platforms-and-middleware-758?source=rss_open_source"&gt;Best open source platforms and middleware&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;At the recent BarcampGR 2009 someone asked why I would choose to develop applications on LINUX?  The answer is pretty simple: GNOME is an excellent desktop.  My question:  Why would someone choose to use something else, especially a platform as spartan as Microsoft Windows?  Out-of-the-box a GNOME desktop provides an full-suite of top-notch applications:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Manage your music and media with &lt;a href="http://banshee-project.org/"&gt;Banshee&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; Manage your photos with &lt;a href="http://f-spot.org/Main_Page"&gt;F-Spot&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; Keep notes, and have a Wiki for free, with &lt;a href="http://projects.gnome.org/tomboy/"&gt;Tomboy&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;For e-mail, calendaring, contact management, and all that use &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt;.  Except no substitutes here, certainly not that miserable runt of a mail client from the Mozilla project.  No Open Source mail client, and no proprietary one, can rival &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt;.  &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt; supports CalDAV, &lt;a href="http://www.groupdav.org"&gt;GroupDAV&lt;/a&gt;, Groupwise, and even Exchange.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.openoffice.org/"&gt;Open Office&lt;/a&gt;.  What more needs to be said? Open Office rises to the challenge.&lt;/li&gt;&lt;li&gt;&lt;a href="http://beagle-project.org/Main_Page"&gt;Beagle&lt;/a&gt; will index all your data allowing you to do comprehensive searches.  Once you start using this feature being without it feels like such a waste of time.&lt;/li&gt;&lt;li&gt;This one may seem a bit esoteric, but you know the truth:  you should be more diligent about encryting important files and signing e-mails, etc... But it is such a pain.  I admit I was pretty lacadazical about such things.  But with &lt;a href="http://projects.gnome.org/seahorse/"&gt;Seahorse&lt;/a&gt; installed it becomes more natural.  Now I can encrypt and decrypt files in &lt;a href="http://projects.gnome.org/nautilus/"&gt;Nautilus&lt;/a&gt; with a right-click as well as decrypt and encrypt on-the-fly in &lt;a href="http://projects.gnome.org/gedit/"&gt;gedit&lt;/a&gt;.  &lt;a href="http://projects.gnome.org/seahorse/"&gt;Seahorse&lt;/a&gt; also provide a very nice UI for managing all those @&amp;amp;^$&amp;amp;@@) keys.  You can even remove password entries that you have stored in the &lt;a href="http://live.gnome.org/GnomeKeyring"&gt;GNOME keyring&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;So, seriously, why use something else?  All the day-to-day needs are covered with high quality applications.  And we haven't even talked about the awesome development tools like &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2007655345756165595?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2007655345756165595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/best-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2007655345756165595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2007655345756165595'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/09/best-of.html' title='Best of...'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-365425265385463010</id><published>2009-08-14T08:38:00.003-04:00</published><updated>2009-08-14T08:45:59.565-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commentary'/><title type='text'>If you don't make mistakes, you're doing it wrong.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iKb8pYRqFaA/SoVa_1mTV8I/AAAAAAAAAAU/hCGXGJ47mAw/s1600-h/motivator2459909.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_iKb8pYRqFaA/SoVa_1mTV8I/AAAAAAAAAAU/hCGXGJ47mAw/s320/motivator2459909.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5369798183475173314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This certainly applies to Computer Science and even general hackerdom.  Maybe this is a good response to list trolls who attack Java, Mono / .NET, virtualization, etc... at the slightest provocation.  Because presenting them with facts and performance numbers doesn't seem to matter.  But they probably wouldn't get the joke anyway.  Oh, well.&lt;br /&gt;&lt;br /&gt;As for making mistakes, just look at some of my code!  I must be doing it very right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-365425265385463010?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/365425265385463010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/if-you-dont-make-mistakes-youre-doing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/365425265385463010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/365425265385463010'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/if-you-dont-make-mistakes-youre-doing.html' title='If you don&apos;t make mistakes, you&apos;re doing it wrong.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_iKb8pYRqFaA/SoVa_1mTV8I/AAAAAAAAAAU/hCGXGJ47mAw/s72-c/motivator2459909.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2235907213096190899</id><published>2009-08-11T14:13:00.002-04:00</published><updated>2009-08-11T14:19:40.923-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodevelop'/><category scheme='http://www.blogger.com/atom/ns#' term='hg'/><title type='text'>Hg ignore for MonoDevelop Gtk# Projects</title><content type='html'>When using Hg (&lt;a href="http://mercurial.selenic.com/wiki/"&gt;Mercurial&lt;/a&gt;) to do version control for &lt;a href="http://www.mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt; applications developed using &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; you'll want to create an &lt;span style="font-weight:bold;"&gt;.hgignore&lt;/span&gt; file in the root of your repository with the following contents:&lt;br /&gt;&lt;blockquote&gt;syntax: glob&lt;br /&gt;*/gtk-gui/*.cs&lt;br /&gt;bin/Debug/*&lt;br /&gt;*.userprefs&lt;br /&gt;*.usertasks&lt;br /&gt;*.pidb&lt;/blockquote&gt;&lt;br /&gt;This will make sure &lt;a href="http://mercurial.selenic.com/wiki/"&gt;Hg&lt;/a&gt; ignores all the meta-data and temporary files created by &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; and its built in &lt;a href="http://www.mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt; GUI designer.  Otherwise these files change constantly and either always appear as modified or, if commited, clog up the revision history.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2235907213096190899?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2235907213096190899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/hg-ignore-for-monodevelop-gtk-projects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2235907213096190899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2235907213096190899'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/hg-ignore-for-monodevelop-gtk-projects.html' title='Hg ignore for MonoDevelop Gtk# Projects'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5664729475890405935</id><published>2009-08-10T15:35:00.002-04:00</published><updated>2009-08-10T15:41:45.305-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consonance'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Consonance now on Hg</title><content type='html'>I have switched the &lt;a href="http://code.google.com/p/consonance/"&gt;Consonance&lt;/a&gt; project on Google Code from subversion to &lt;a href="http://mercurial.selenic.com/wiki/"&gt;Mercurial&lt;/a&gt;.  After using Sourceforge's Hg support for &lt;a href="http://sourceforge.net/apps/trac/coils/"&gt;OpenGroupware COILS&lt;/a&gt; and then hacking on &lt;a href="http://code.google.com/p/consonance/"&gt;Consonance&lt;/a&gt; with little to no Internet access... subversion just had to go.  To clone the &lt;a href="http://code.google.com/p/consonance/"&gt;Consonance&lt;/a&gt; repository just do a:&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; color: rgb(0, 0, 153); font-family: arial;"&gt;hg clone https://consonance.googlecode.com/hg/ consonance  &lt;br /&gt;&lt;/div&gt;&lt;/http:&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5664729475890405935?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5664729475890405935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/consonance-now-on-hg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5664729475890405935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5664729475890405935'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/consonance-now-on-hg.html' title='Consonance now on Hg'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7302320165715319800</id><published>2009-08-10T07:58:00.002-04:00</published><updated>2009-08-10T08:06:11.052-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consonance'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Consonance Progress, at last.</title><content type='html'>While on vacation I had to time to address some unresolved issues left over from the last revamp of the OpenGroupware .NET client assembly and Gtk# application [&lt;a href="http://code.google.com/p/consonance/"&gt;Consonance&lt;/a&gt;].  For the client  searching now works again - that was a stupid bug where the callback was never set.  Also fixed up numerous bugs in the Gtk# client so Contacts can be updated including company values, addresses, and telephone numbers.  After five years of off-and-on hacking I think Whitemice.ZOGI.Backend is now stable and seems to perform very well. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Operations from the work queue now time out, so if a callback is lost the work queue doesn't hang.&lt;/li&gt;&lt;li&gt;Responses to background priority requests are delayed until there is no higher priority work;  previously responses to RPC calls where all processed at the same priority regardless of the priority of the original request.&lt;/li&gt;&lt;li&gt;ContactDetailForm is now an IStorableEntityForm.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7302320165715319800?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7302320165715319800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/consonance-progress-at-last.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7302320165715319800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7302320165715319800'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/08/consonance-progress-at-last.html' title='Consonance Progress, at last.'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5178493625066176575</id><published>2009-07-29T16:28:00.004-04:00</published><updated>2009-07-29T16:49:52.190-04:00</updated><title type='text'>User Friendly</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iKb8pYRqFaA/SnCxMDjXC6I/AAAAAAAAAAM/W7R59n86TjU/s1600-h/Screenshot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 223px;" src="http://2.bp.blogspot.com/_iKb8pYRqFaA/SnCxMDjXC6I/AAAAAAAAAAM/W7R59n86TjU/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5363981976868424610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Because Microsoft Windows is user friendly and cares about you - it is blocking itself.  Has Microsoft had an epiphany?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5178493625066176575?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5178493625066176575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/user-friendly.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5178493625066176575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5178493625066176575'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/user-friendly.html' title='User Friendly'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_iKb8pYRqFaA/SnCxMDjXC6I/AAAAAAAAAAM/W7R59n86TjU/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6670129546850004222</id><published>2009-07-26T17:14:00.003-04:00</published><updated>2009-07-26T17:29:04.804-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coils'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Service BASIC HTTP Authentication with Python</title><content type='html'>While building the core parts of &lt;a href="http://sourceforge.net/apps/trac/coils/"&gt;OpenGroupware COILS&lt;/a&gt; I noticed there don't appear to be any example of providing HTTP's BASIC authentication scheme anywhere on the interweb.  Or any other authentication schemes for that matter.  To remedy that here is a rough outline, including the example code, of how it is implemented in &lt;a href="http://sourceforge.net/apps/trac/coils/"&gt;COILS&lt;/a&gt;. First spin up an HTTP server:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;import BaseHTTPServer&lt;br /&gt;&lt;br /&gt;class HTTPServer(BaseHTTPServer.HTTPServer):&lt;br /&gt;pass&lt;br /&gt;&lt;br /&gt;from coils.net.handler   import HTTPRequestHandler&lt;br /&gt;from coils.net.server    import HTTPServer&lt;br /&gt;....&lt;br /&gt;HTTP_HOST = 'localhost'&lt;br /&gt;HTTP_PORT = 8080&lt;br /&gt;httpd = HTTPServer((HTTP_HOST, HTTP_PORT), HTTPRequestHandler)&lt;br /&gt;httpd.serve_forever()&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Your app will almost certainly provide a custom &lt;a href="http://docs.python.org/library/basehttpserver.html"&gt;HTTPRequestHandler&lt;/a&gt; to delegate the requests to whatever logic your application provides.  In the BaseHTTPRequestHandler a &lt;span style="color: rgb(204, 0, 0);"&gt;GET&lt;/span&gt; request is handed to &lt;span style="font-style: italic;"&gt;do_GET&lt;/span&gt;, a &lt;span style="color: rgb(204, 0, 0);"&gt;POST&lt;/span&gt; request to &lt;span style="font-style: italic;"&gt;do_POST&lt;/span&gt;, etc...  In our case the object that handles the request will decide what to do based on the request type so we channel all requests to our generic &lt;span style="font-style: italic;"&gt;process_request&lt;/span&gt; method.  &lt;span style="font-style: italic;"&gt;process_request&lt;/span&gt; looks up the object targeted by the request via &lt;span style="font-style: italic;"&gt;marshall_handler()&lt;/span&gt; [not shown] and then calls that objects &lt;span style="font-style: italic;"&gt;do_request&lt;/span&gt; method.  The important part for authentication is to catch the exception raised by the object handling the request if that object thinks the request is not authenticated and requires authentication.  In this case that is the COILS' &lt;span style="font-style: italic;"&gt;AuthenticationException&lt;/span&gt;; your application has to provide something equivalent.  In order to make the client try again with authentication you need to send a "&lt;span style="color: rgb(204, 0, 0);"&gt;WWW-Authenticate&lt;/span&gt;" header telling the client to use basic authentication and what realm to use.  See &lt;a href="http://tools.ietf.org/html/rfc2617"&gt;RFC2617&lt;/a&gt; for details on Basic authentication in general&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):&lt;br /&gt;&lt;br /&gt;def process_request(self):&lt;br /&gt;  """Respond to a request"""&lt;br /&gt;  try:&lt;br /&gt;    """ find the object mapped to the specified request&lt;br /&gt;        The marshall_handler() is a COILS specific things so it isn't&lt;br /&gt;        shown in this example. """&lt;br /&gt;    handler = self.marshall_handler()&lt;br /&gt;    handler.do_request(self)&lt;br /&gt;  except AuthenticationException, err:&lt;br /&gt;    """ An AuthenticationException has an error code of 401&lt;br /&gt;        We need to add an authentication header so the client will know&lt;br /&gt;        to respond the the failure with the appropriate credentials&lt;br /&gt;        TODO: Provide a digest realm once digest authentication is supported&lt;br /&gt;    """&lt;br /&gt;    self.send_response(err.error_code())&lt;br /&gt;    self.send_header('WWW-Authenticate', 'Basic realm="OpenGroupware COILS"')&lt;br /&gt;    self.end_headers()&lt;br /&gt;    self.wfile.write('Authentication failure')&lt;br /&gt;  except CoilsException, err:&lt;br /&gt;    # An Coils Exception has an error code of 500&lt;br /&gt;    self.send_response(err.error_code(), err.error_text())&lt;br /&gt;    self.end_headers()&lt;br /&gt;  except Exception, err:&lt;br /&gt;    # Yikes, something generic web very wrong&lt;br /&gt;    self.send_response(500, err)&lt;br /&gt;    self.end_headers()&lt;br /&gt;&lt;br /&gt;def do_GET(self):&lt;br /&gt;  """Respond to a GET request."""&lt;br /&gt;  self.process_request()&lt;br /&gt;&lt;br /&gt;def do_POST(self):&lt;br /&gt;  """Respond to a POST request"""&lt;br /&gt;  self.process_request()&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;In order to actually process the authentication request COILS uses an &lt;span style="font-style: italic;"&gt;Authenticator&lt;/span&gt; object.  Our &lt;span style="font-style: italic;"&gt;DBAuthenticator&lt;/span&gt; object provides basic authentication against accounts with passwords stored directly in the database [verses accounts from LDAP or trusting an external authorization mechanism such as Kerberos].  Explanation for the steps to process a Basic authentication operation have been added to the code example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;from base64 import b64decode&lt;br /&gt;from crypt  import crypt&lt;br /&gt;class DBAuthenticator(Authenticator):&lt;br /&gt;&lt;br /&gt;def _authenticate(self, context, request):&lt;br /&gt;  Authenticator._authenticate(self, context, request)&lt;br /&gt;  authorization = request.headers.get('authorization')&lt;br /&gt;  if (authorization == None):&lt;br /&gt;    raise AuthenticationException('Authentication Required')&lt;br /&gt;  (kind, data) = authorization.split(' ')&lt;br /&gt;  if (kind == 'Basic'):&lt;br /&gt;    # Authentication method is  "Basic"&lt;br /&gt;    (username, _, password) = b64decode(data).partition(':')&lt;br /&gt;    """ This method provided by the parent class goes to the ORM and&lt;br /&gt;        retrieves the account object for the specified username. It&lt;br /&gt;        will throw an authentication exception if no such username is&lt;br /&gt;        found (user entered it wrong?) or a generic Coils Exception if&lt;br /&gt;        multiple objects match the username (that doesn't make sense) -&lt;br /&gt;        either will stop the authentication process, but the authentication&lt;br /&gt;        exception should reprompt the client to try again. """&lt;br /&gt;    account = Authenticator._getLogin(self, username)&lt;br /&gt;    secret = account.password&lt;br /&gt;    if (secret == crypt(password, secret[:2])):&lt;br /&gt;      # Password matches, user is authenticated&lt;br /&gt;      self.loginId = account.objectId&lt;br /&gt;      self.login   = account.login&lt;br /&gt;    else:&lt;br /&gt;      # Password does not match, authentication failes&lt;br /&gt;      raise AuthenticationException('Incorrect username or password')&lt;br /&gt;  else:&lt;br /&gt;    # Authorization header indicated an authentication type other than BASIC&lt;br /&gt;    CoilsException('Unsupported HTTP Authenticated Mech')&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;See, that easy easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6670129546850004222?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6670129546850004222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/service-basic-http-authentication-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6670129546850004222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6670129546850004222'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/service-basic-http-authentication-with.html' title='Service BASIC HTTP Authentication with Python'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-3343625765113264971</id><published>2009-07-23T12:53:00.003-04:00</published><updated>2009-07-23T13:05:53.424-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='loonies foss'/><title type='text'>"Oh, Boy!" &amp; "Ditto"</title><content type='html'>So it finally happened, what was in my opinion inevitable, Microsoft made a code contribution to the LINUX kernel.  And, whew, when that happened you immediately knew the crazies were going to start coming out of the woodwork like orcs in the mines of Moria after you innocently dropped that stone down the well.  &lt;a href="http://www.infoworld.com/d/windows/linux-slips-microsofts-warm-deadly-embrace-969?source=fssr"&gt;Here they are!&lt;/a&gt;.  What a bunch of loons.  Fortunately the &lt;b&gt;real&lt;/b&gt; Open Source community has those ready with a quick &lt;a href="http://opensourcetogo.blogspot.com/2009/07/real-floss-community-and-faux-floss.html"&gt;rebuff&lt;/a&gt;;  I agree completely with &lt;a href="http://opensourcetogo.blogspot.com/"&gt;David Schlesinger&lt;/a&gt; on both the interpretation of what is happening and what the response should be:&lt;br /&gt;&lt;blockquote&gt;"I say enough is enough. We should put our collective feet down as far as strident demands from complete non-participants in the community go. We should say "no" to Faux FLOSS Fundamentalism..." [&lt;a href="http://opensourcetogo.blogspot.com/2009/07/real-floss-community-and-faux-floss.html"&gt;link&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;Contribute or go home!  My pacifism previously expressed in &lt;a href="http://whitemiceconsulting.blogspot.com/2009/06/tired-old-arguements.html"&gt;Tired Old Arguements&lt;/a&gt; was misguided.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3343625765113264971?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3343625765113264971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/oh-boy-ditto.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3343625765113264971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3343625765113264971'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/oh-boy-ditto.html' title='&quot;Oh, Boy!&quot; &amp; &quot;Ditto&quot;'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6605220871384758028</id><published>2009-07-08T19:46:00.003-04:00</published><updated>2009-07-22T19:58:23.080-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grlug'/><category scheme='http://www.blogger.com/atom/ns#' term='zidestore'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>GRLUG OpenGroupware Presentation</title><content type='html'>Last night I presented on &lt;a href="http://www.opengroupware.org"&gt;OpenGroupware&lt;/a&gt; to the &lt;a href="http://www.grlug.org/"&gt;Grand Rapids LINUX User's Group&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mosg.googlegroups.com/web/OpenGroupware-GRLUG20090708B.pdf?gda=2EFYR1IAAABw6HckmRln_4yUX8BzAUFLSDtGsgtyrRbWpWcvRcmWKlmQfOBL4A7J2cBqJ_qMNcVATLiLpz3vIPoI9C_Yk1h2VeLt2muIgCMmECKmxvZ2j4IeqPHHCwbz-gobneSjMyE"&gt;Presentation File&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6605220871384758028?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6605220871384758028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/last-night-i-presented-on-opengroupware.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6605220871384758028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6605220871384758028'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/last-night-i-presented-on-opengroupware.html' title='GRLUG OpenGroupware Presentation'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1083475280033836682</id><published>2009-07-08T06:37:00.003-04:00</published><updated>2009-07-22T19:45:19.553-04:00</updated><title type='text'>Multiple Interfaces On Windows</title><content type='html'>A &lt;a href="http://i-nz.net/2009/07/08/multiple-network-connections-at-the-same-time-on-windows/"&gt;great post&lt;/a&gt; over on &lt;a href="http://friendfeed.com/ivanzlatev"&gt;Ivan Zlatev's&lt;/a&gt; BLOG on how to get a working configuration of multiple network interfaces on a Microsoft Windows workstation.  There probably isn't anyone who has been forced to use that runt of an OS and not been frustrated by how it handles network connections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1083475280033836682?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1083475280033836682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/multiple-interface-on-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1083475280033836682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1083475280033836682'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/multiple-interface-on-windows.html' title='Multiple Interfaces On Windows'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8409717514658183991</id><published>2009-07-08T06:29:00.004-04:00</published><updated>2009-07-22T19:49:37.721-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Database Changes to OpenGroupware v5.5</title><content type='html'>&lt;p&gt;For those building from trunk, or currently pulling packages from OBS, there is a new table required as of r2256.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;CREATE TABLE ctags (&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;  entity VARCHAR NOT NULL,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;  ctag  INTEGER NOT NULL DEFAULT 0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;INSERT INTO ctags (entity) VALUES ('Person');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;INSERT INTO ctags (entity) VALUES ('Enterprise');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;INSERT INTO ctags (entity) VALUES ('Date');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;INSERT INTO ctags (entity) VALUES ('Job');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt;INSERT INTO ctags (entity) VALUES ('Team');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is part of adding ctag support to OGo (specifically ZideStore). ctags allow a client to *very* quickly detect if the contents of a collection have changed;  such as the&lt;span style="color: rgb(51, 0, 153);font-family:arial;" &gt; /public/Contacts&lt;/span&gt; folder.  Thus avoiding doing a PROPFIND on the entire folder to determine if a re-sync is needing.  ctag support is not complete or working yet,  but without this table a server post-r2256 will fails some operations with a database error.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The subversion repository contains an &lt;a href="http://svn.opengroupware.org/OpenGroupware.org/trunk/Database/PostgreSQL/pg-update-1.x-to-5.5.psql"&gt;update script&lt;/a&gt; for migrating a v5.4 database to v5.5.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8409717514658183991?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8409717514658183991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/database-changes-to-opengroupware-v55.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8409717514658183991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8409717514658183991'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/database-changes-to-opengroupware-v55.html' title='Database Changes to OpenGroupware v5.5'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-699735948365535423</id><published>2009-07-06T19:13:00.001-04:00</published><updated>2009-07-22T19:50:02.602-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Announcing OpenGroupware COILS</title><content type='html'>I've create a new project on the shiny new SourceForge: &lt;a href="https://sourceforge.net/apps/trac/coils/"&gt;OpenGroupware COILS&lt;/a&gt;.  This is "a re-implementation of the groupware functionality provided by OpenGroupware.org. COILS is parallel installable and is entirely compatible with the Objective-C version 5.5 of OpenGroupware.org".  COILS is developed in &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; for reasons explained on the Wiki.  If you'd like to participate in the development of COILS please join the COILS &lt;a href="https://lists.sourceforge.net/lists/listinfo/coils-devel"&gt;mail list&lt;/a&gt;.  I also hang out on the &lt;a href="irc://irc.freenode.net/ogo"&gt;OGo IRC channel&lt;/a&gt; on &lt;a href="http://freenode.net/"&gt;FreeNode&lt;/a&gt;.  And no, this does not mean I am going to stop working on the Objective-C OGo.  But I believe there is a need for a refreshing of the OGo platform (BTW, there is also &lt;a href="http://code.google.com/p/ogoj/"&gt;OGo/J&lt;/a&gt;) and there are some ideas I want to explore that really can't be done [easily] in the existing OGo/ObjC codebase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-699735948365535423?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/699735948365535423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/announcing-opengroupware-coils.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/699735948365535423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/699735948365535423'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/07/announcing-opengroupware-coils.html' title='Announcing OpenGroupware COILS'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6638793534786164067</id><published>2009-06-29T19:26:00.002-04:00</published><updated>2009-07-22T19:50:40.045-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='grpug'/><title type='text'>Python XML-RPC Presentation</title><content type='html'>Presented on using &lt;a href="http://www.xmlrpc.com/"&gt;XML-RPC&lt;/a&gt; with &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; to the &lt;a href="http://groups.google.com/group/grpug"&gt;Grand Rapids Python Users Group (GRPUG)&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://grpug.googlegroups.com/web/XmlRpc-And-Python.pdf?gda=ww3GQUgAAAA2HZEQ9wLgSXKQNbgr2obJxHudE3EhyWD1djS_mLqndvOb0tXunHooau9GCsESYWWmwwmmjY8lLEkm5GsdcWpfGjVgdwNi-BwrUzBGT2hOzg"&gt;Presentation File&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While it is admittedly a runt of an RPC solution I've found XML-RPC to be very useful and have used it extensively in both my work on &lt;a href="http://www.opengroupware.org"&gt;OpenGroupware&lt;/a&gt; and other projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6638793534786164067?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6638793534786164067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/06/python-xml-rpc-presentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6638793534786164067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6638793534786164067'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/06/python-xml-rpc-presentation.html' title='Python XML-RPC Presentation'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2993090192781306823</id><published>2009-06-16T15:08:00.003-04:00</published><updated>2009-06-16T15:22:17.044-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='squid syslog logging data-retention'/><title type='text'>Logging *USEFUL* Web Access To PostgreSQL</title><content type='html'>It is pretty easy to configure syslog to log system messages to a PostgreSQL database; and that sure beats flat files.  With some GRANT/REVOKE goodness this setup can be made quite secure - only allowing the message import process to insert messages and denying the ability to everyone else to modify the contents of the database.  But all that data is still pretty ugly to deal with as the messages are just long strings; so some method is needed to break down that "data" into "information".  I had the specific need to do this with SQUID weblogs.  I already had syslog logging to a PostgreSQL database so the first step was just to have SQUID use syslog to log access.  That is easily accomplished like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;cache_access_log syslog:LOG_LOCAL4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After a restart SQUID messages show up in the LOCAL4 facility (table: &lt;span style="font-family: arial;"&gt;facility_local4&lt;/span&gt;) with the priority of "info".  Then I created a table to hold the parsed messages:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;CREATE TABLE proxy_audit (&lt;br /&gt; timestamp TIMESTAMP,&lt;br /&gt; elapsed   INT,&lt;br /&gt; source    VARCHAR(40),&lt;br /&gt; status    VARCHAR(15),&lt;br /&gt; size      INT,&lt;br /&gt; method    VARCHAR(15),&lt;br /&gt; url       VARCHAR(128),&lt;br /&gt; domain    VARCHAR(60),&lt;br /&gt; identity  VARCHAR(25),&lt;br /&gt; mimetype  VARCHAR(45));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Last a trigger on the LOCAL4 log parses incoming messages into this table:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;CREATE OR REPLACE FUNCTION p_proxy_audit() RETURNS trigger AS '&lt;br /&gt;BEGIN&lt;br /&gt; IF (new.hostname = ''hod-a'' AND new.priority = ''info'') THEN&lt;br /&gt;   INSERT INTO proxy_audit (timestamp, elapsed, source, status, size,&lt;br /&gt;                            method, url, domain, identity, mimetype)&lt;br /&gt;   VALUES(''epoch''::TIMESTAMP + (split_part(split_part(new.message, '' '', 1), ''.'', 1)::INT) * ''1 second''::INTERVAL,&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 1)::INT,&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 2),&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 3)::VARCHAR(15),&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 4)::INT,&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 5)::VARCHAR(15),&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 6)::VARCHAR(128),&lt;br /&gt;      split_part(split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 6), ''/'', 3)::VARCHAR(60),&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 7)::VARCHAR(25),&lt;br /&gt;      split_part(TRIM(substring(new.message, strpos(new.message, '' ''))), '' '', 9));&lt;br /&gt; END IF;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;  RETURN new;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;' LANGUAGE plpgsql;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;CREATE TRIGGER t_proxy_audit AFTER INSERT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;     ON facility_local4 FOR EACH  ROW &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;     EXECUTE PROCEDURE p_proxy_audit()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once you get allot of data in your table, which happens quickly, you'll probably discover you need an index.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;CREATE INDEX proxy_audit_i1 ON proxy_audit(identity, timestamp);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now looking at a user's web usage is straight-forward.  Finally.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2993090192781306823?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2993090192781306823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/06/logging-useful-web-access-to-postgresql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2993090192781306823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2993090192781306823'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/06/logging-useful-web-access-to-postgresql.html' title='Logging *USEFUL* Web Access To PostgreSQL'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6692843660188191457</id><published>2009-06-15T08:23:00.002-04:00</published><updated>2009-06-15T08:36:28.083-04:00</updated><title type='text'>Tired Old Arguements</title><content type='html'>After a rather peaceful period it seems the anti-Mono patent-paranoia machine is ramping up again; I've seen numerous posts and references to oh-so-evil Mono in the last week.  For the intelligent life forms out there I present two BLOG posts which knock these kind of trolls out of the water (assuming they can be bothered to read):&lt;br /&gt;* &lt;a href="http://www2.apebox.org/wordpress/rants/124/"&gt;Here we go again – why Mono doesn’t suck&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.jprl.com/Blog/archive/development/mono/2009/Jan-19.html"&gt;How To Defend Against Software Patent FUD&lt;/a&gt;&lt;br /&gt;And this one is good too although more general than the other two:&lt;br /&gt;* &lt;a href="http://jeffreystedfast.blogspot.com/2008/02/lots-of-gnomemono-fud-lately.html"&gt;Lots of GNOME/Mono FUD Lately&lt;/a&gt;&lt;br /&gt;But I do wonder if the old advice "&lt;span style="font-style:italic;"&gt;Never argue with a fool, onlookers may not be able to tell the difference&lt;/span&gt;" is the most appropriate response to these guys.  Just keep on coding and let them rant;  code and working solution speak for themselves.&lt;br /&gt;&lt;br /&gt;BTW, on a personal note,  the &lt;a href="http://www.sylvaninn.com/"&gt;Sylvann Inn&lt;/a&gt; is a very nice and affordable place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6692843660188191457?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6692843660188191457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/06/tired-old-arguements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6692843660188191457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6692843660188191457'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/06/tired-old-arguements.html' title='Tired Old Arguements'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6461492697233431484</id><published>2009-04-12T08:33:00.003-04:00</published><updated>2009-04-12T08:40:11.037-04:00</updated><title type='text'>OBS Packages Updated</title><content type='html'>OpenGroupware packages &lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/"&gt;on the OBS&lt;/a&gt; have been updated to r2207.  This revision provides improved GroupDAV version 1 compatibility and adds GroupDAV version 2 support. The upside of those improvements is that the new &lt;a href="http://www.zideone.com"&gt;ZideOne Outlook plugin&lt;/a&gt; should work well with this revision (or later) of OpenGroupware.   Numerous enhancements and bug fixes in Logic and &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; are also included.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;NOTE:&lt;/span&gt;  The GroupDAV version 2 specification has not been published yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6461492697233431484?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6461492697233431484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/04/obs-packages-updated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6461492697233431484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6461492697233431484'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/04/obs-packages-updated.html' title='OBS Packages Updated'/><author><name>Whitemice Consulting</name><uri>http://www.blogger.com/profile/00677981044303924618</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-22719251.post-83871247795452239</id><published>2009-03-12T11:48:00.004-04:00</published><updated>2009-03-12T11:53:19.495-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Bug#394</title><content type='html'>OpenGroupware revision 2181 closes Bug#394.  It is now possible to set  a default to determine the default storage backend for new projects.  (Wow, with GNUstep based stuff one ends up using the term "default" so often in different ways....)&lt;br /&gt;&lt;br /&gt;To select database as your default project storage backend:&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Defaults write NSGlobalDomain OGoDefaultProjectStorageBackend Database&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To select the filesystem as your default project storage backend:&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Defaults write NSGlobalDomain OGoDefaultProjectStorageBackend FileSystem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most people I assume will want "Database".  Remember that default values are &lt;span style="font-weight: bold;"&gt;CASE SENSITIVE&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;If you (at least on r2181) attempt to create a project without selecting FileSystem/Database you'll get a popup warning: "&lt;span style="color: rgb(102, 0, 204);"&gt;Please specify your &lt;/span&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;project storage!&lt;/span&gt;"  If the default is set then the preferred storage backend is preselected (and can be changed).&lt;br /&gt;&lt;br /&gt;Aside: If you use FileSystem projects make sure you have the &lt;span style="font-weight: bold;"&gt;SkyFSPath&lt;/span&gt; default set and that the referred to directory has the correct permissions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-83871247795452239?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/83871247795452239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/03/bug394.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/83871247795452239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/83871247795452239'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/03/bug394.html' title='Bug#394'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2490085430219252963</id><published>2009-03-04T20:22:00.006-05:00</published><updated>2009-03-05T07:31:32.870-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='fedora'/><category scheme='http://www.blogger.com/atom/ns#' term='obs'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Packages Complete</title><content type='html'>&lt;span style="font-size:100%;"&gt;OpenGroupware packages have been completely built on the build service for CentOS5, Fedora 9, openSUSE 10.3, RHEL 5, and SLES10.  The Fedora 10 and openSUSE 11.x packages needs some additional work.&lt;br /&gt;&lt;br /&gt;Repositories at&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/CentOS_5/"&gt;CentOS 5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/Fedora_9/"&gt;Fedora 9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/Fedora_10/"&gt;Fedora 10&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/openSUSE_10.3/"&gt;openSUSE 10.3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/openSUSE_11.0/"&gt;openSUSE 11.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/openSUSE_11.1"&gt;openSUSE 11.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/RHEL_5/"&gt;RHEL 5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/SLE_10/"&gt;SLES 10&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;Initial testing on CentOS 5 seems pretty positive, after a:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;$ yum install ogo-meta ogo-database-setup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Only glaring bug is that ogo-database-setup doesn't actually populate the database schema so that still needs to be done by hand:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;$ cat pg-build-schema.psql | psql -h localhost -U OGo OGo&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;Then restarting the services gives you [as far as I can tell so far] a fully working OGo install.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;P.S.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Make sure your getting the most current packages from the repository.  mod_ngobjweb in particular should be dated March 4th;  with the previous version the web resources (icons, etc...) for the WebUI won't be found at the configured path.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2490085430219252963?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2490085430219252963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/03/packages-complete.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2490085430219252963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2490085430219252963'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/03/packages-complete.html' title='Packages Complete'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-3665660463271970131</id><published>2009-02-24T15:47:00.004-05:00</published><updated>2009-02-24T15:51:59.333-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>Setting the TimeZone in VMware's VIMA Appliance</title><content type='html'>After importing the VIMA appliance the time zone is Pacific time.  When going to change the time zone you'll discover that they include neither redhat-config-date or timeconfig.  So one has to go about it old-school:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[vi-admin@vima ~]$ date&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Tue Feb 24 12:37:01 PST 2009&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[vi-admin@vima ~]$ sudo rm /etc/localtime&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[vi-admin@vima ~]$ sudo ln -s /usr/share/zoneinfo/America/Detroit /etc/localtime&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[vi-admin@vima ~]$ date&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Tue Feb 24 15:40:59 EST 2009&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3665660463271970131?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3665660463271970131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/02/setting-timezone-in-vmwares-vima.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3665660463271970131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3665660463271970131'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/02/setting-timezone-in-vmwares-vima.html' title='Setting the TimeZone in VMware&apos;s VIMA Appliance'/><author><name>Whitemice Consulting</name><uri>http://www.blogger.com/profile/00677981044303924618</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-22719251.post-7813472965751838173</id><published>2009-01-04T12:15:00.001-05:00</published><updated>2009-01-04T12:17:44.031-05:00</updated><title type='text'>"What Carriers Aren’t Eager to Tell You About Texting"</title><content type='html'>Excellent &lt;a href="http://www.nytimes.com/2008/12/28/business/28digi.html"&gt;New York times article&lt;/a&gt; about cell carriers and the &lt;span style="font-style: italic;"&gt;true&lt;/span&gt; cost of text messenging.  As usual with telecom: the customer is getting robbed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7813472965751838173?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7813472965751838173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/what-carriers-arent-eager-to-tell-you.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7813472965751838173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7813472965751838173'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/what-carriers-arent-eager-to-tell-you.html' title='&quot;What Carriers Aren’t Eager to Tell You About Texting&quot;'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5827665963288504558</id><published>2009-01-04T11:46:00.003-05:00</published><updated>2009-01-04T16:13:49.186-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensuse'/><category scheme='http://www.blogger.com/atom/ns#' term='osc'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Almost there</title><content type='html'>The ogo-meta package now &lt;span style="font-style: italic;"&gt;almost&lt;/span&gt; installs on CentOS5 except that we don't have the ogo-environment or the ngobjweb packages.   OpenSUSE 11.0 and 11.1 have some problems building anything beyond ogo-gnustep_make;  OpenSUSE 10.3 builds up to the same point as CentOS5.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ &lt;span style="color: rgb(51, 0, 153);"&gt;yum install ogo-meta&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;---&gt; Package ogo-meta.i386 0:1.1-6.7 set to be updated&lt;br /&gt;--&gt; Processing Dependency: mod_ngobjweb for package: ogo-meta&lt;br /&gt;--&gt; Processing Dependency: ogo-environment for package: ogo-meta&lt;br /&gt;---&gt; Package postgresql.i386 0:8.1.11-1.el5_1.1 set to be updated&lt;br /&gt;---&gt; Package postgresql-libs.i386 0:8.1.11-1.el5_1.1 set to be updated&lt;br /&gt;--&gt; Finished Dependency Resolution&lt;br /&gt;Error: Missing Dependency: ogo-environment is needed by package ogo-meta&lt;br /&gt;Error: Missing Dependency: mod_ngobjweb is needed by package ogo-meta&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/22719251-5827665963288504558?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5827665963288504558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/almost-there.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5827665963288504558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5827665963288504558'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/almost-there.html' title='Almost there'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2155089504798233028</id><published>2009-01-02T11:22:00.001-05:00</published><updated>2009-07-23T13:43:25.390-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><title type='text'>From 72 to 56</title><content type='html'>A default minimal install of CentOS5 leaves you with a fairly busy box.  If you just login on the console you'll find about 72 running processes.  This includes what I consider to be some pretty oddball stuff like "rpcgssd" and "rpcidmapd".  How many sites actually make use of these services?  A simple run through of:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;chkconfig irqbalance off&lt;br /&gt;chkconfig isdn off&lt;br /&gt;chkconfig portmap off&lt;br /&gt;chkconfig rpcgssd off&lt;br /&gt;chkconfig rpcidmapd off&lt;br /&gt;chkconfig sendmail off&lt;br /&gt;chkconfig yum-updatesd off&lt;br /&gt;chkconfig cups off&lt;br /&gt;chkconfig gpm off&lt;br /&gt;chkconfig mdmonitor off&lt;br /&gt;chkconfig nfslock off&lt;br /&gt;chkconfig smartd off&lt;br /&gt;chkconfig autofs off&lt;br /&gt;chkconfig bluetooth off&lt;br /&gt;chkconfig acpid off&lt;br /&gt;chkconfig pcscd off&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt; - leaves one with 56 processes after boot and allot less open ports.  Some of these make sense (like acpid) but I'm running in a VM so I don't want those either.  Would be nice if the default state of CentOS5 was a little cleaner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2155089504798233028?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2155089504798233028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/from-72-to-56-default-minimal-install.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2155089504798233028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2155089504798233028'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/from-72-to-56-default-minimal-install.html' title='From 72 to 56'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4006039641796393399</id><published>2009-01-01T20:50:00.002-05:00</published><updated>2009-07-23T13:44:19.496-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osc'/><category scheme='http://www.blogger.com/atom/ns#' term='ngobjweb'/><category scheme='http://www.blogger.com/atom/ns#' term='sope'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>OpenGroupware Package Repositories</title><content type='html'>Currently working on getting OpenGroupware (and related GNUStep-make, SOPE, &amp;amp; ngobjweb) packages built of the Novell Build Service.  Repositories at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/CentOS_5/"&gt;CentOS 5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/Fedora_9/"&gt;Fedora 9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/openSUSE_10.3/"&gt;openSUSE 10.3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/openSUSE_11.0/"&gt;openSUSE 11.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/openSUSE_11.1"&gt;openSUSE 11.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/RHEL_5/"&gt;RHEL 5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.opensuse.org/repositories/server://OpenGroupware/SLE_10/"&gt;SLES 10&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Not everything working yet, but getting there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4006039641796393399?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4006039641796393399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/opengroupware-package-repositories.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4006039641796393399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4006039641796393399'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/opengroupware-package-repositories.html' title='OpenGroupware Package Repositories'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1562841024362989913</id><published>2008-10-22T17:43:00.001-04:00</published><updated>2009-07-23T13:44:36.869-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thunderbird'/><category scheme='http://www.blogger.com/atom/ns#' term='groupdav'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>GroupDAV TB 0.90pre16</title><content type='html'>Version 0.90pre16 of the &lt;a href="http://www.inverse.ca/contributions/sogo_connector.html"&gt; SOGo GroupDAV connector for Thunderbird&lt;/a&gt; is now available.  This version has been tested against our OGo test instance and has successfully synchronized a folder of 19,161 vCards.  Updates also seem to work although that is not yet as well tested.  Please report any feedback to the &lt;a href="http://mail.opengroupware.org/mailman/listinfo/groupdav/"&gt;GroupDAV maillist&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1562841024362989913?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1562841024362989913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/version-0.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1562841024362989913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1562841024362989913'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/version-0.html' title='GroupDAV TB 0.90pre16'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8102103018633128518</id><published>2008-09-21T17:56:00.001-04:00</published><updated>2009-07-23T13:44:52.476-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>OpenGroupware r2150 &amp; RSS Feeds</title><content type='html'>As of r2150 OpenGroupware now supports the following RSS 2.0 feeds:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;projectActions - Reports actions on tasks assigned to projects of which the user is a member either directly or via team membership.&lt;/li&gt;&lt;ul style="color: rgb(51, 0, 153);"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;http://opengroupware.mormail.com/zidestore/so/${USER}/Tasks/delegated-actions-rss&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;toDoActions - Reports actions on tasks of which the user is an executor either directly or via team membership.&lt;/li&gt;&lt;ul style="color: rgb(51, 0, 153);"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;http://opengroupware.mormail.com/zidestore/so/${USER}/Tasks/project-actions-rss&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;delegatedActions - Reports actions on tasks created by the user.&lt;/li&gt;&lt;ul style="color: rgb(51, 0, 153);"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;http://opengroupware.mormail.com/zidestore/so/${USER}/Tasks/todo-actions-rss&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;By default the 150 most recent task actions are included in the feed; this value can be adjusted by including a "limit" value in the URL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8102103018633128518?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8102103018633128518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/opengroupware-r2150-rss-feeds-as-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8102103018633128518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8102103018633128518'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/opengroupware-r2150-rss-feeds-as-of.html' title='OpenGroupware r2150 &amp; RSS Feeds'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4738704374207465738</id><published>2008-06-13T18:30:00.001-04:00</published><updated>2009-07-23T13:45:06.823-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='evolution'/><category scheme='http://www.blogger.com/atom/ns#' term='openoffice'/><title type='text'>.NET, OpenOffice, &amp; Evolution</title><content type='html'>Over on &lt;a href="http://tirania.org/"&gt;tirania.org&lt;/a&gt; is a article on &lt;a href="http://tirania.org/blog/archive/2008/Jun-12.html"&gt;OpenOffice-based applications with Mono and MonoDevelop&lt;/a&gt;:&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;A couple of years ago, Michael Meeks and the OpenOffice community ported the bridge to work with Mono which allows developers to create OpenOffice based solutions using any of the Mono programming languages (C#, Boo, IronPython, IronRuby, F#, VB, Nemerle and so on).&lt;br /&gt;&lt;/cite&gt;&lt;cite&gt;&lt;br /&gt;But even if the engine existed, it was not properly installed in the system and getting a C#-based OpenOffice solution required lots of Unix skills, the kind of skills that would likely be in short supply by those that interested in OpenOffice automation. We fixed this in this last development cycle, so now a Novell OpenOffice installation will have everything you need.&lt;br /&gt;&lt;/cite&gt;&lt;cite&gt;&lt;br /&gt;Michael Hutchinson, one of our MonoDevelop hackers has put together the missing pieces to simplify the process. He has created the solution templates necessary to create these solutions, and packaged them as a Mono.Addin for exiting MonoDevelop users.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;Despite some issues with the exposed API (described in the article) this is pretty exciting stuff.  In conjunction with the possibility of &lt;a href="http://psankar.blogspot.com/2007/10/write-evolution-plugins-using-mono-c.html"&gt;writing Evolution plugins using Mono&lt;/a&gt; we are closer to having a fully-managed desktop environment with an integrated [or integratable] suite of first-class tools.  I'm very much looking forward to the next release of &lt;a href="http://www.monodevelop.com/Main_Page"&gt;MonoDevelop&lt;/a&gt; and hoping some of this stuff gets included.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4738704374207465738?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4738704374207465738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/06/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4738704374207465738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4738704374207465738'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/06/blog-post.html' title='.NET, OpenOffice, &amp; Evolution'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7632640783833861949</id><published>2008-06-07T18:04:00.001-04:00</published><updated>2009-07-23T13:45:17.808-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>Widgets Widgets Widgets</title><content type='html'>It has been an exciting couple of weeks for the usually quite, and overlooked, world of Gtk# developers.  First there was an excellent &lt;a href="http://www.codeproject.com/KB/static/customgtkcontrol.aspx"&gt;article on CodeProject&lt;/a&gt; about developing custom controls.  This was the first in-depth Gtk# article I've seen on &lt;a href="http://www.codeproject.com/"&gt;CodeProject&lt;/a&gt;.  Then there was the &lt;a href="http://lists.ximian.com/pipermail/gtk-sharp-list/2008-May/008695.html"&gt;release of Holly widgets&lt;/a&gt;.  &lt;a href="http://code.google.com/p/holly-gtk-widgets/"&gt;Holly widgets&lt;/a&gt; is a set of very attractive reusable Gtk# widgets that should make developing Gtk# applications more convenient.  We are especially excited about the &lt;a href="http://code.google.com/p/holly-gtk-widgets/wiki/HDateEditor"&gt;HDateEditor&lt;/a&gt; widget;  finally we have a good date &amp;amp; time picker!    Following up that was a new &lt;a href="http://brad.getcoded.net/blog/entry.php?e=2061018484"&gt;release of Medsphere.Widgets&lt;/a&gt;. &lt;a href="http://www.medsphere.org/projects/widgets"&gt;Medsphere.Widgets&lt;/a&gt; now contains a very nice &lt;a href="http://www.medsphere.org/projects/widgets/wiki/Graph"&gt;2D graph&lt;/a&gt;.  As icing on the cake is the long overdue support for &lt;a href="http://mkestner.blogspot.com/2008/06/gobject-property-registration.html"&gt;GObject property registration&lt;/a&gt;.  Wow,  when it rains it pours.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7632640783833861949?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7632640783833861949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/06/widgets-widgets-widgets-it-has-been.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7632640783833861949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7632640783833861949'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/06/widgets-widgets-widgets-it-has-been.html' title='Widgets Widgets Widgets'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5891028347174616796</id><published>2008-03-29T18:05:00.001-04:00</published><updated>2009-07-23T13:45:27.490-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>LinuxWorld Interview</title><content type='html'>LinuxWorld &lt;a href="http://www.linuxworld.com/news/2008/032808-opengroupware.html"&gt;interviewed me&lt;/a&gt; recently concerning &lt;a href="http://www.opengroupware.org/"&gt;OpenGroupware.org&lt;/a&gt;.  The &lt;a href="http://www.linuxworld.com/news/2008/032808-opengroupware.html"&gt;interview&lt;/a&gt; is part of their "Spotlight on Open Source in business" series.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5891028347174616796?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5891028347174616796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/linuxworld-interview-linuxworld.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5891028347174616796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5891028347174616796'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/linuxworld-interview-linuxworld.html' title='LinuxWorld Interview'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4094683690427133202</id><published>2008-03-27T18:32:00.001-04:00</published><updated>2009-07-23T13:45:46.194-04:00</updated><title type='text'>One moment as a gas bag...</title><content type='html'>Regular visitors will know that I post strictly concerning technological issues;  I've got little use for, or desire to be, a pundit of any kind at all.  I have a firm belief in &lt;strong&gt;experts&lt;/strong&gt; and on the great debates of our time I've got little or nothing original to add - not that I'd expect anyone to listen even if I did (Why would you?  Who am I?).  But I just couldn't resist posting a link to &lt;a href="http://tirania.org/blog/archive/2008/Mar-26.html"&gt;OOXML, looking forward&lt;/a&gt;.  It is concerning Open Source, etc... so it isn't far off the mark of the usual content here,  but it is more "big picture" then I usually indulge.  Basically the gist of it is here:&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;But most importantly, it is a time for all of those strong advocates of open standards to stop talking, and start walking. I look forward for all that energy that went into discussing the pros and cons of OOXML to join an open source project and start contributing code, documentation, support, create support forums, file good bug reports and help us make free and open source software better.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;The world as a whole could do with less talk.  I suppose this applies to almost every conceivable realm from priests and politicians all the way down to the lowly coder.  But it is the one thing I can think of that simply can't be said often enough: less talk, more do.&lt;br /&gt;&lt;br /&gt;Ok, thank you for that minute, I now yield the podium to the next gas bag.&lt;br /&gt;&lt;br /&gt;Footnote: Specifically, an &lt;strong&gt;expert&lt;/strong&gt; is someone whose spent a decade plus dedicated to the study of something,  someone who has made some topic their &lt;strong&gt;life&lt;/strong&gt;.   They are the kind of people smug freshman like to roll their eyes about.  But, in my opinion, it is those all those boring [and focused] and forgotten people who have given us the myriad blessings of technology and the sacred gift of the most unlikely thing of all - civilization.  Thank you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4094683690427133202?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4094683690427133202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/regular-visitors-will-know-that-i-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4094683690427133202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4094683690427133202'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/regular-visitors-will-know-that-i-post.html' title='One moment as a gas bag...'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8601114406531977181</id><published>2008-03-05T18:37:00.002-05:00</published><updated>2009-07-23T13:47:39.759-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='zogi'/><title type='text'>getAuditEntries added to zOGI r2095</title><content type='html'>The &lt;a href="http://code.google.com/p/zogi/wiki/getAuditEntries"&gt;getAuditEntries&lt;/a&gt; method was added to the &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; API as of r920, and added to the ZideStore trunk in r2095.  &lt;a href="http://code.google.com/p/zogi/wiki/getAuditEntries"&gt;getAuditEntries&lt;/a&gt; provides the ability to retrieve the audit entries from the server's database that have occurred since a specified entry.  Using this feature a service can page through server changes and synchronize some repository;  this allows functionality equivalent to that provided by &lt;a href="http://docs.opengroupware.org/Members/whitemice/OGoMojo/MOGIMon-HOWTO/view"&gt;MOGIMon&lt;/a&gt; but without a back-door database connection.  Since audit records are serialized with integer ids in the OpenGroupware database this acts very much like the &lt;strong&gt;uSNChanged&lt;/strong&gt; attribute provided by Microsoft Active Directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8601114406531977181?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8601114406531977181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/getauditentries-added-to-zogi-r2095-r91.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8601114406531977181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8601114406531977181'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/getauditentries-added-to-zogi-r2095-r91.html' title='getAuditEntries added to zOGI r2095'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2244488747110987325</id><published>2008-03-03T18:34:00.002-05:00</published><updated>2009-09-22T11:07:05.283-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funambol'/><category scheme='http://www.blogger.com/atom/ns#' term='groupdav'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>List for Funambol GroupDAV connector</title><content type='html'>A list has been created specifically for the Funambol GroupDAV connector.  You can subscribe &lt;a href="http://comalies.citadel.org:2000/listsub"&gt;here&lt;/a&gt;.  Be at bit patient as the site in questions is a little slow.  It isn't clear if archives of this new list are available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2244488747110987325?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2244488747110987325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/list-for-funambol-groupdav-connector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2244488747110987325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2244488747110987325'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/03/list-for-funambol-groupdav-connector.html' title='List for Funambol GroupDAV connector'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-5972163367163399694</id><published>2008-02-28T18:36:00.001-05:00</published><updated>2009-09-22T11:06:12.012-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netgear'/><title type='text'>NetGear GS716T</title><content type='html'>I've recently worked with a pair of NetGear GS716T switches and want to warn everyone off from buying these switches.  While the price is pretty low and performance is very good, the feature-set is entirely bogus.  NetGear advertises these as "smart" switches with VLAN, SNMP, etc... Only all these features are useless as the web interface to configure the switch simply doesn't work and no command line interface (via either telnet or SSH) is provided.  If you attempt to configure the switch from FireFox you will be constantly prompted for the password, and you can't actually get past that to make any configuration changes.  On the other hand, if you use IE6 you can sign in to the switch but the interface is extremely unstable.  On one switch I was unable to even set an IP address, upon clicking "Apply" it would close the browser and revert to using the address it acquired via DHCP.  On the other switch it took the IP address but attempting to configure port based VLANs resulted in erratic behavior ranging from hanging, to displaying raw HTML, to renaming all the other VLANs and removing all the ports assigned to other VLANs.  The administrative interface of the NetGear GS716T is simply unacceptable;  NetGear has clearly not performed even a minimum of quality-control or testing on the GS716T.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-5972163367163399694?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/5972163367163399694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/netgear-gs716t-ive-recently-worked-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5972163367163399694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/5972163367163399694'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/netgear-gs716t-ive-recently-worked-with.html' title='NetGear GS716T'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4471454528100333754</id><published>2008-02-19T18:39:00.001-05:00</published><updated>2009-09-22T11:04:44.828-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>OpenGroupware &amp; PostgreSQL 8.3</title><content type='html'>&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; 8.3 not longer performs automatic casting of INT to TEXT when INTs are compared to character types.   This change is documented in the &lt;a href="http://www.postgresql.org/docs/8.3/static/release-8-3.html"&gt;release notes&lt;/a&gt;.  This change causes a database exception to occur in OpenGroupare's ACL processing.  The specific error is:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ERROR:  IN types character varying and integer cannot be matched&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ACL queries like the following cause the exception because they contain a condition that compares string value to an array of integers: &lt;code&gt;auth_id IN ( 9981, 9991,...&lt;/code&gt; where &lt;code&gt;auth_id&lt;/code&gt; is a &lt;code&gt;VARCHAR(255)&lt;/code&gt; value.&lt;br /&gt;&lt;br /&gt;A full ACL query might look like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SELECT DISTINCT B.company_id  FROM person AS B WHERE (( ( B.firstname ILIKE '%%yser%%' ) OR ( B.name ILIKE '%%yser%%' ) ))  AND (( B.owner_id = 10100 ) OR ( ( B.is_private = 0 OR B.is_private IS NULL ) AND (  ( 0 = ( SELECT COUNT(*) FROM object_acl WHERE object_id = B.company_id ) OR 0 &lt; ( SELECT COUNT(*) FROM object_acl WHERE object_id = B.company_id AND action = 'allowed' AND permissions LIKE '%r%' AND ( auth_id = 10100 OR auth_id IN ( 9981, 9991, 10003, 11530, 55000, 77210, 142730, 142780, 142850, 393280, 423400, 445160, 949410, 949540, 955770, 970730, 970990, 1096320, 9153790, 9153880, 9154000, 10597021, 10735169 ) ) ) )  ) )) AND (B.is_template_user IS NULL OR B.is_template_user = 0) AND (B.db_status &lt;&gt; 'archived') LIMIT 50&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The solution to this problem is to modify the schema of the &lt;code&gt;object_acl&lt;/code&gt; table so that the values are integer types;  this is possible since the &lt;code&gt;auth_id&lt;/code&gt; and &lt;code&gt;object_id&lt;/code&gt; only store object ids, which are integers, regardless of the fact that the field type was &lt;code&gt;VARCHAR(255)&lt;/code&gt;.  Originally it was thought that some other values might be used in ACL processing, such as LDAP DNs, but only support for object ids exists and will exist in the forseable future.&lt;br /&gt;&lt;br /&gt;The table can be modified using &lt;code&gt;ALTER TABLE&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ALTER TABLE object_acl ALTER COLUMN object_id TYPE INT USING  object_id::int;&lt;br /&gt;ALTER TABLE object_acl ALTER COLUMN auth_id   TYPE INT USING  auth_id::int;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This change will be included as the official schema in OGo 5.4.  With this change OpenGroupware should work without any issues in conjunction with &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; 8.3.  The thread discussing this issue is &lt;a href="http://mail.opengroupware.org/pipermail/developer/2008-February/003434.html"&gt;available in the archive&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4471454528100333754?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4471454528100333754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/opengroupware-postgresql-8.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4471454528100333754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4471454528100333754'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2009/01/opengroupware-postgresql-8.html' title='OpenGroupware &amp; PostgreSQL 8.3'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-277501663286905102</id><published>2008-02-10T18:41:00.001-05:00</published><updated>2009-09-22T11:06:41.443-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cyrus'/><title type='text'>Cyrus IMAP and the Ampersand</title><content type='html'>An &lt;a href="http://lists.andrew.cmu.edu/pipermail/info-cyrus/2008-February/028336.html"&gt;interesting thread&lt;/a&gt; has occurred on the Cyrus IMAPd mailing list regarding the lowly ampersand.  Apparently in the encoding used by IMAP (a &lt;a href="http://lists.andrew.cmu.edu/pipermail/info-cyrus/2008-February/028342.html"&gt;"modified UTF-7 encoding"&lt;/a&gt;) the ampersand ("&amp;amp;") requires escaping.  So it works fine to have subfolders whose name contains an ampersand as IMAP clients, of course, use the appropriate IMAP encoding.  But if your username (internally the name of your INBOX) contains an ampersand you can run into trouble.  this is because when the existence of the INBOX is checked the authentication request isn't necessarily encoded in the same way.  So if you use an IMAP server user names should be kept in conformance with the IMAP encoding, or more simply, stick with the GOODCHARS defined in Cyrus' &lt;a href="https://bugzilla.andrew.cmu.edu/cgi-bin/cvsweb.cgi/src/cyrus/imap/mboxname.c?rev=1.37.2.2;content-type=text%2Fplain"&gt;mboxname.c&lt;/a&gt;&lt;!--break--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-277501663286905102?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/277501663286905102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/cyrus-imap-and-ampersand-interesting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/277501663286905102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/277501663286905102'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/cyrus-imap-and-ampersand-interesting.html' title='Cyrus IMAP and the Ampersand'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2415106249634475724</id><published>2008-02-09T18:43:00.001-05:00</published><updated>2009-09-22T11:07:28.861-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sope'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Improvement to SOPE's PostgreSQL Adaptor</title><content type='html'>Do you have lots of errors like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Feb 17 20:39:28 ogo-zidestore-1.5 [14569]: ERROR(+[NSCalendarDate(PostgreSQL72Values) valueFromCString:length:postgreSQLType:attribute:adaptorChannel:]): unexpected string '2007-03-13 15:38:41.420456+00' for date type 'DATE', returning now (expected format: '2001-07-26 14:00:00+02')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;in your ZideStore error log?  This is because the time &amp;amp; date parser in &lt;a href="http://sope.opengroupware.org/"&gt;SOPE&lt;/a&gt;'s &lt;a href="http://www.postgresql.org/"&gt;PostreSQL&lt;/a&gt; adaptor didn't understand the milliseconds portion of the value.  As of &lt;a href="http://sope.opengroupware.org/"&gt;SOPE&lt;/a&gt; r1601 this should be corrected.    &lt;a href="http://sope.opengroupware.org/"&gt;SOPE&lt;/a&gt; now just ignores the millisecond value.   See the &lt;a href="http://svn.opengroupware.org/viewcvs/trunk/sope-gdl1/PostgreSQL/NSCalendarDate%2BPGVal.m?root=SOPE&amp;amp;rev=1601&amp;amp;r1=999&amp;amp;r2=1601"&gt;diff&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2415106249634475724?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2415106249634475724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/improvement-to-sopes-postgresql-adaptor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2415106249634475724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2415106249634475724'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/improvement-to-sopes-postgresql-adaptor.html' title='Improvement to SOPE&apos;s PostgreSQL Adaptor'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-3768564503608329301</id><published>2008-02-06T18:44:00.001-05:00</published><updated>2009-09-22T11:07:59.146-04:00</updated><title type='text'>LINQ Provider for db4o</title><content type='html'>&lt;a href="http://evain.net/blog/"&gt;Jb Evain&lt;/a&gt; has created &lt;a href="http://evain.net/blog/articles/2008/02/06/an-elegant-linq-to-db4o-provider-and-a-few-linq-tricks"&gt;LINQ provider for db4o&lt;/a&gt;.  This could be potentially great for &lt;a href="http://developer.db4o.com/"&gt;db4o&lt;/a&gt; developers as LINQ is [finally] an answer to the infernal "foreach...if".  It is also a great example of the power of &lt;a href="http://www.interact-sw.co.uk/iangblog/2005/09/26/extensionmethods"&gt;extension methods&lt;/a&gt;.  These days it seems like every time I wish C# could do X, then an article about how X is already available magically appears on &lt;a href="http://www.go-mono.com/monologue/"&gt;monologue&lt;/a&gt;.&lt;!--break--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-3768564503608329301?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/3768564503608329301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/linq-provider-for-db4o-jb-evain-has.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3768564503608329301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/3768564503608329301'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/02/linq-provider-for-db4o-jb-evain-has.html' title='LINQ Provider for db4o'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-8109349219008873950</id><published>2008-01-14T20:27:00.002-05:00</published><updated>2009-09-22T11:08:26.307-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xmpp'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>SASL Failure with jabber-net</title><content type='html'>When using the &lt;a href="http://code.google.com/p/jabber-net/"&gt;jabber-net&lt;/a&gt; assembly a SASL failure doesn't invoke &lt;code&gt;OnAuthError&lt;/code&gt; as one would intuitively expect;  SASL failures invoke the generic &lt;code&gt;OnError&lt;/code&gt; method with a &lt;code&gt;jabber.connection.sasl.SASLException&lt;/code&gt;.  Just an interesting bit of trivia to avoid a potential gotcha.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-8109349219008873950?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/8109349219008873950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2008/01/sasl-failure-with-jabber-net-when-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8109349219008873950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/8109349219008873950'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2008/01/sasl-failure-with-jabber-net-when-using.html' title='SASL Failure with jabber-net'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-4280794264610767376</id><published>2007-12-31T20:28:00.001-05:00</published><updated>2009-09-22T11:05:41.325-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>Consonance Gets A Calendar UI (r470)</title><content type='html'>&lt;a href="http://code.google.com/p/zogi/"&gt;Consonance&lt;/a&gt; now has a calendar UI for the scheduler tab of the main window.  This is a significant milestone;  up until now that feature has been very conspicuously absent.  I had hoped to be be able to port some code from some other projects but ended up writing the entire widget from scratch.  &lt;a href="http://code.google.com/p/zogi/"&gt;Consonance&lt;/a&gt; displayed a calendar event for the first time on 2007-12-30 at 16:33 (GMT).  A screenshot is &lt;a href="http://docs.google.com/Doc?id=ddv5htgd_21f5q6gwcx"&gt;here&lt;/a&gt; and also attached to this post.  This code is included as of r470.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-4280794264610767376?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/4280794264610767376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2007/12/consonance-gets-calendar-ui-r470.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4280794264610767376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/4280794264610767376'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2007/12/consonance-gets-calendar-ui-r470.html' title='Consonance Gets A Calendar UI (r470)'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-2767287486369068678</id><published>2007-12-26T20:30:00.001-05:00</published><updated>2009-09-22T11:09:13.438-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><title type='text'>OGo Getting Caffinated</title><content type='html'>There has been discussion on the &lt;a href="http://www.opengroupware.org"&gt;OpenGroupware&lt;/a&gt; lists about the work Helge has been doing lately in regards to Java and &lt;a href="http://www.opengroupware.org"&gt;OpenGroupware&lt;/a&gt;.  The relevant threads are &lt;a href="http://mail.opengroupware.org/pipermail/discuss/2007-December/001202.html"&gt;here&lt;/a&gt; , &lt;a href="http://mail.opengroupware.org/pipermail/discuss/2007-December/001201.html"&gt;here&lt;/a&gt;, and the message that started it all is &lt;a href="http://mail.opengroupware.org/pipermail/documentation/2007-December/000286.html"&gt;here&lt;/a&gt;.&lt;!--break--&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Note:&lt;/strong&gt;Some of the messages don't thread in the archive correctly, so it might be worthwhile to just look at the archive for December, 2007 @ &lt;a href="http://mail.opengroupware.org/pipermail/discuss/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The distilled information is, roughly:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Helge does most of his programming these days in Java;  what he calls the "new stuff".  He doesn't see himself doing allot of work on the Objective-C code base in the future.  However the SOPE code base is also used by other projects and no one expects that to become unmaintained.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A substantial portion of the Logic and Document API modules of OGo have already been re-written in Java for some of Helge's own work.  He intends to release that code in Q1/Q2 of 2008.  And he expects to port much more or the remaining Logic functionality in the future.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The ported code is 1:1 compatible with the Objective-C Logic and Document API,  therefore the two code bases can co-exist and operate on the same database concurrently.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Currently the development is done with &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; and the components are hosted in &lt;a href="http://www.mortbay.org/"&gt;Jetty&lt;/a&gt; although some of the pieces have been used in a &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; environment as well.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Java code actually ends up being faster than the Objective-C code, mostly because it is a ground-up rewrite and one assumes sheds allot of cruft that the older code base has accumulated over the years.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;This opens up &lt;strong&gt;lots&lt;/strong&gt; of opportunities to support additional databases and graft in allot of functionality made available by other Java assemblies.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The key messages is &lt;a href="http://mail.opengroupware.org/pipermail/discuss/2007-December/001202.html"&gt;here&lt;/a&gt;:&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;---snip---&lt;br /&gt;I dislike talking about thing being done before they are actually &lt;br /&gt;done, but at least I am shifting most OGo developments to JOPE/Java.&lt;br /&gt;...&lt;br /&gt;What this implies should be discussed on discuss, just wanted to raise &lt;br /&gt;the point that the existing codebase might be become important for &lt;br /&gt;starters in the future ;-)&lt;br /&gt;---snap---&lt;br /&gt;Anyways. Feel free to ask any questions ;-)&lt;br /&gt;The current situation is that I have rewritten a big part of OGo Logic/&lt;br /&gt;DocAPI in Java in 2007. I have a few custom play-stuff apps running on &lt;br /&gt;top of that (eg a HighRise like UI) and I'm currently doing a midsize &lt;br /&gt;project which uses that.&lt;br /&gt;Most likely I'm going to commit the code to a public repository &lt;br /&gt;beginning of next year. Its much more performant than LSLogic (not &lt;br /&gt;because its Java, but because its designed from scratch ;-) and also &lt;br /&gt;has some neat enhancements.&lt;br /&gt;There is no real UI yet, but something which resembles the "old" OGo &lt;br /&gt;should be pretty easy to do.&lt;br /&gt;[Note: my work so far attempts to be fully compatible with ObjC OGo, &lt;br /&gt;ie database schema and doc storage]&lt;br /&gt;It could be the basis for something like OGo 6.0 ;-)&lt;br /&gt;Hence, most likely I won't put a lot of effort into the Objective-C &lt;br /&gt;parts besides maintenance until JOPE replicas work.&lt;br /&gt;One of the biggest issues I have with ObjC is that the Apple version &lt;br /&gt;and the GNU ones are bound to diverge (eg Apple with GC and ObjC 2.0 &lt;br /&gt;features ...), and that gnustep-base goals do not match my &lt;br /&gt;requirements on API stability and OS integration (and lF is a dead end &lt;br /&gt;anyways).&lt;br /&gt;I'm not perfectly happy with all this but I think for 'developers' &lt;br /&gt;things will get much easier. Machines are fast enough for Java now and &lt;br /&gt;Java itself is now GPL, removing that dependency.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;Personally I think this is a very positive development.  I am &lt;strong&gt;not&lt;/strong&gt; a real fan of Java, and I generally think the Java environment is simply a mess.  But it works, has lots of support, and good solutions can be created in Java.  And it does open up a new horizon of possibilities for &lt;a href="http://www.opengroupware.org"&gt;OpenGroupware&lt;/a&gt;.  The reliance on an odd environment like Objective-C has, in my opinion, been probably the single largest impediment to OpenGroupware's wild success.  Hopefully,  Helge will get around to releasing that code sooner rather than later.&lt;br /&gt;&lt;br /&gt;Now I just have to get Jetty to actually work on an openSUSE box...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-2767287486369068678?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/2767287486369068678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2007/12/ogo-getting-caffinated-there-has-been.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2767287486369068678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/2767287486369068678'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2007/12/ogo-getting-caffinated-there-has-been.html' title='OGo Getting Caffinated'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-6334080504932052921</id><published>2007-08-21T20:31:00.001-04:00</published><updated>2009-09-22T11:09:32.182-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengroupware'/><category scheme='http://www.blogger.com/atom/ns#' term='zogi'/><title type='text'>zOGI Now In ZideStore</title><content type='html'>The main branch of &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; is now included in Zidestore (as of r1995).  So if you use nightly builds the next time you update you should automatically have the &lt;a href="http://code.google.com/p/zogi/"&gt;zOGI&lt;/a&gt; protocol bundle - no installation required.  The &lt;a href="http://code.google.com/p/zogi/"&gt;Google Code repository&lt;/a&gt; will now be used as the experimental branch;  those wanting a stable zOGI should use the one included in ZideStore.  For now the documentation remains on the &lt;a href="http://code.google.com/p/zogi/wiki/Root"&gt;Google Code Wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-6334080504932052921?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/6334080504932052921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2007/08/zogi-now-in-zidestore-main-branch-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6334080504932052921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/6334080504932052921'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2007/08/zogi-now-in-zidestore-main-branch-of.html' title='zOGI Now In ZideStore'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7745673305594371142</id><published>2007-07-11T20:33:00.001-04:00</published><updated>2009-09-22T11:09:58.373-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groupdav'/><title type='text'>GroupDAV Syncronization For Mac OS/X</title><content type='html'>&lt;a href="http://bionicmessage.net/"&gt;BionicMessage&lt;/a&gt; has &lt;a href="http://mail.opengroupware.org/pipermail/groupdav/2007-July/000581.html"&gt;released&lt;/a&gt; a &lt;a href="http://www.groupdav.org"&gt;GroupDAV&lt;/a&gt; connector for Mac OS/X.  Read the &lt;a href="http://mail.opengroupware.org/pipermail/groupdav/2007-July/000581.html"&gt;release&lt;/a&gt; announcement for more information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7745673305594371142?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7745673305594371142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2007/07/groupdav-syncronization-for-mac-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7745673305594371142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7745673305594371142'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2007/07/groupdav-syncronization-for-mac-osx.html' title='GroupDAV Syncronization For Mac OS/X'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-1998136046006238622</id><published>2007-05-18T20:34:00.001-04:00</published><updated>2009-09-22T11:10:25.012-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='horde'/><category scheme='http://www.blogger.com/atom/ns#' term='groupdav'/><title type='text'>Horde project leader mentions GroupDAV</title><content type='html'>Jan Schneider mentions support for WebDAV, CalDAV, and &lt;a href="http://www.groupdav.org"&gt;GroupDAV&lt;/a&gt; in her blog, &lt;a href="http://janschneider.de/news/5/304"&gt;here&lt;/a&gt;.  &lt;a href="http://www.groupdav.org"&gt;GroupDAV&lt;/a&gt; support in Horde adds thousands, if nor more, compatible servers to the world.  Also interesting is the mention of &lt;a href="http://www.horde.org/dimp/"&gt;DIMP&lt;/a&gt; an AJAX-ified version of IMP.  Great news for the &lt;a href="http://www.horde.org/"&gt;Horde&lt;/a&gt; and &lt;a href="http://www.groupdav.org"&gt;GroupDAV&lt;/a&gt; projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-1998136046006238622?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/1998136046006238622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2007/05/horde-project-leader-mentions-groupdav.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1998136046006238622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/1998136046006238622'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2007/05/horde-project-leader-mentions-groupdav.html' title='Horde project leader mentions GroupDAV'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22719251.post-7381895418643489996</id><published>2007-05-14T20:35:00.001-04:00</published><updated>2009-09-22T11:10:49.036-04:00</updated><title type='text'>Shortcuts for crontab</title><content type='html'>An interesting BLOG post over &lt;a href="http://blog.lxpages.com/2007/05/10/neat-crontab-tricks/"&gt;here&lt;/a&gt;.  Nothing really dramatic,  but some useful and apparently undocumented shortcuts supported in ISC crontab: @reboot, @yearly, @annually, @monthly, @weekly, @dialy, @midnight, and @hourly.  It seems odd that I can google these shortcuts and find them in archived manual pages, but the manual pages on my local machines don't mention these shortcuts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22719251-7381895418643489996?l=www.whitemiceconsulting.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.whitemiceconsulting.com/feeds/7381895418643489996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.whitemiceconsulting.com/2007/05/shortcuts-for-crontab-interesting-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7381895418643489996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22719251/posts/default/7381895418643489996'/><link rel='alternate' type='text/html' href='http://www.whitemiceconsulting.com/2007/05/shortcuts-for-crontab-interesting-blog.html' title='Shortcuts for crontab'/><author><name>whitemice</name><uri>http://www.blogger.com/profile/01699706645615484869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_iKb8pYRqFaA/TFHFSRZEblI/AAAAAAAAAC0/JzXvqY4tpr0/S220/1001.jpeg'/></author><thr:total>0</thr:total></entry></feed>
