<?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-3001344775859950798</id><updated>2012-02-16T00:14:47.608-08:00</updated><title type='text'>title</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-143598182911930208</id><published>2011-12-04T00:42:00.000-08:00</published><updated>2011-12-04T00:42:17.741-08:00</updated><title type='text'>pictures</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;Contact list&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/y3wlp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://i.imgur.com/y3wlp.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Settings&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/1o9km.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://i.imgur.com/1o9km.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Login&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/uMZMX.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://i.imgur.com/uMZMX.jpg" width="320" /&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/3001344775859950798-143598182911930208?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/143598182911930208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/12/pictures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/143598182911930208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/143598182911930208'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/12/pictures.html' title='pictures'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-3137801417128376752</id><published>2011-09-11T19:30:00.000-07:00</published><updated>2011-09-11T19:30:04.497-07:00</updated><title type='text'>Projects. Lots.</title><content type='html'>Over the past couple weeks I finished projects. Eeze mounting. Pulseaudio integration. Other things that I don't remember doing.&lt;br /&gt;&lt;br /&gt;One thing that I did, mainly over the last couple days, is get some time to work on everyone's favorite XMPP client. Add/remove contacts is implemented, status icons are in, there's toolbars, and everything just looks much nicer overall. Also I finally fixed the big shutdown crash (fingers crossed).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UtY7gxq0-GY/Tm1ulHcK36I/AAAAAAAAAAw/YUVWKFaq8nM/s1600/ss.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-UtY7gxq0-GY/Tm1ulHcK36I/AAAAAAAAAAw/YUVWKFaq8nM/s320/ss.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://i.imgur.com/ttY0u.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-3137801417128376752?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/3137801417128376752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/09/projects-lots.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/3137801417128376752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/3137801417128376752'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/09/projects-lots.html' title='Projects. Lots.'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UtY7gxq0-GY/Tm1ulHcK36I/AAAAAAAAAAw/YUVWKFaq8nM/s72-c/ss.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-731835666287441382</id><published>2011-08-26T01:14:00.000-07:00</published><updated>2011-08-26T01:14:44.145-07:00</updated><title type='text'>Quick Update</title><content type='html'>I keep putting off the giant advanced Azy tutorial entry that I've been writing off and on for the past few months, mainly because I hate how code looks on a blog. It'll be up sometime, but probably not today. Or tomorrow.&lt;br /&gt;&lt;br /&gt;Shotgun has gotten a lot of updates and features over the past few weeks. Crashes only occur "sometimes" now, and copying links is possible with right clicking. There's probably other things of import, but it seems to be fairly usable overall. I know there are people out there who have already switched from Pidgin, which is pretty neat for a small hobby project. With some luck, I will get more time to continue work on it soon.&lt;br /&gt;&lt;br /&gt;Esskyuehl now compiles with recent versions of MySQL. Hooray!&lt;br /&gt;&lt;br /&gt;I have spent the past week working on small bits and tests related to eeze mounting in EFM. All in all, I would say that I have accomplished a net of zero improvements. The main issue is the whackamole-like style of the bugs and my own inability to reproduce them regularly. Frequently, mounts will occur with no issues. Other times nothing will happen. Sometimes I get a crash. I'm getting closer, but the project is very demoralizing since there are no milestones.&lt;br /&gt;&lt;br /&gt;Pulseaudio integration is still untouched since my last headaches in July. Once I sit down with it and take some painkillers I can probably bang it out in a few more days of awfulness, though no doubt Lennart has left me plenty more "features" which will hamstring my efforts.&lt;br /&gt;&lt;br /&gt;Another project that I will probably use as a "relaxing" item is libarchive integration of lrzip. I have been reviewing the required API, and it seems fairly sane - what a delightful surprise! The downside is that I will likely use the command version of the API instead of directly integrating using liblrzip, meaning that my work there will continue to be unused. The upside is that libarchive will be able to build lrzip support without needing to check for a valid lrzip installation.&lt;br /&gt;&lt;br /&gt;In closing, fuck everything about cnp in ELM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-731835666287441382?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/731835666287441382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/08/quick-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/731835666287441382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/731835666287441382'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/08/quick-update.html' title='Quick Update'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-8120469431607100874</id><published>2011-08-13T01:45:00.000-07:00</published><updated>2011-08-13T01:45:14.026-07:00</updated><title type='text'>liblrzip is go</title><content type='html'>Another day, another project done. Liblrzip is the latest, a full API for the excellent &lt;a href="https://github.com/ckolivas/lrzip"&gt;LRZIP&lt;/a&gt; for which I wrote a build system way back in March. Straight to the code, here's a VERY simple example of a decompression app using the library:&lt;br /&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;assert.h&gt;&lt;br /&gt;#include &lt;liblrzip.h&gt;&lt;br /&gt;&lt;br /&gt;static const char *suffix_me(const char *file)&lt;br /&gt;{&lt;br /&gt;const char *p;&lt;br /&gt;static char buf[4096];&lt;br /&gt;&lt;br /&gt;p = strrchr(file, '.');&lt;br /&gt;if (p &amp;amp;&amp;amp; (strlen(p + 1) &amp;lt; 4))&lt;br /&gt;strncat(buf, file, p - file);&lt;br /&gt;else&lt;br /&gt;strcat(buf, file);&lt;br /&gt;return &amp;amp;buf[0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;Lrzip *lr;&lt;br /&gt;if ((argc != 2) &amp;amp;&amp;amp; (argc != 3)) {&lt;br /&gt;fprintf(stderr, "Usage: %s file [outfile]\n", argv[0]);&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;lr = lrzip_new(LRZIP_MODE_DECOMPRESS);&lt;br /&gt;assert(lr);&lt;br /&gt;lrzip_config_env(lr);&lt;br /&gt;assert(lrzip_filename_add(lr, argv[1]));&lt;br /&gt;if (argc == 2)&lt;br /&gt;lrzip_outfilename_set(lr, suffix_me(argv[1]));&lt;br /&gt;else&lt;br /&gt;lrzip_outfilename_set(lr, argv[2]);&lt;br /&gt;assert(lrzip_run(lr));&lt;br /&gt;return 0;&lt;br /&gt;}&lt;/liblrzip.h&gt;&lt;/assert.h&gt;&lt;/string.h&gt;&lt;/stdio.h&gt;&lt;/stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;Yes, I &lt;b&gt;am&lt;/b&gt; too lazy to figure out the CSS to preserve whitespaces for indentation.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-8120469431607100874?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/8120469431607100874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/08/liblrzip-is-go.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/8120469431607100874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/8120469431607100874'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/08/liblrzip-is-go.html' title='liblrzip is go'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-6426642949170328235</id><published>2011-08-01T05:21:00.000-07:00</published><updated>2011-08-01T05:23:37.874-07:00</updated><title type='text'>XMPP: The infinite messaging protocol</title><content type='html'>It has been a while since my last post, and I have been extremely busy. There are no shortage of projects to waste time on, and today I'll be talking about one of them. Since a screenshot is best, let's start off with one:&lt;br /&gt;&lt;img src="http://i.imgur.com/07Fkr.jpg" alt="" title="Hosted by imgur.com" /&gt;&lt;br /&gt;This is a chat client that has been co-developed by Iván Briano (Sachiel) and me over the past month or so. It is still in the very early stages of work in terms of its UI, but it is very usable.&lt;br /&gt;Above you can see a screenshot of the client's contact list window and an empty chat window. The open menu is an early implementation of the status menu, and it allows the user to set the status of the account. The other component of the status menu is the status entry, which allows the user to set status messages; it can be seen at the bottom of the contacts list window.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i.imgur.com/NOBNw.jpg" alt="" title="Hosted by imgur.com" /&gt;&lt;br /&gt;This is another feature in development which uses a very unfinished Elementary widget called "gengrid." This widget allows a developer to autogenerate a grid view of objects. This view is toggled from a menu, and can be switched to at any time. As I mentioned, this widget is not very polished, and so it does not look as good as the list view :)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i.imgur.com/4eEli.jpg" alt="" title="Hosted by imgur.com" /&gt;&lt;br /&gt;Here we see a shot of the chat window, where I am in a deep conversation with Leif Middelshulte (T_UNIX). Since XMPP allows its clients to connect multiple "resources" (devices) to the same account, this client allows for users to determine exactly which resource, or all of them, will receive messages. By default, it will abide by the priority value set by other users' clients, but if I click on this radio button in the menu, Leif will suddenly be receiving a lot of SMS on his phone!&lt;br /&gt;&lt;br /&gt;One of the biggest strengths of the EFL is its integration with media. This next shot showcases what is, IMO, the best feature that this client offers:&lt;br /&gt;&lt;img src="http://i.imgur.com/CekFA.jpg" alt="" title="Hosted by imgur.com" /&gt;&lt;br /&gt;Any time an image is linked in conversation, its URL is automatically parsed. This URL is then downloaded and cached to be made available as a tooltip on mouseover of the address, as seen above. Any images downloaded using this mechanism are automatically saved to disk using their SHA1 hash, preventing them from being downloaded again in the future and saving bandwidth. We hope to provide similar effects for other types of media as well!&lt;br /&gt;&lt;br /&gt;One might ask what libraries I have used to power this client. The following is a list of all components involved:&lt;br /&gt;&lt;b&gt;Non-EFL technologies&lt;/b&gt;&lt;br /&gt;&lt;li&gt;The insanely fast &lt;a href="http://pugixml.org/"&gt;PugiXML&lt;/a&gt; parser. I use this in all of my projects involving XML because of its amazing speed, concise API, and very friendly+helpful author :)&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/libb64"&gt;LibB64&lt;/a&gt;. If it uses base64 encoding, you'd better be using this or you're just wasting memory and CPU cycles.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EFL&lt;/b&gt;&lt;br /&gt;&lt;li&gt;ECORE: The networking API here makes connecting to XMPP servers a snap, and it also handles the STARTTLS mechanism of the protocol with ease.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Elementary: The EFL widget toolkit. Despite being under heavy development and containing lots of potentially unwanted "features," ELM still packs a punch and gives the developer a lot of freedom and control over how an app looks, feels, and acts.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This client is not yet available in the public E svn repository, but it is LGPL licensed and will be moved there once it is ready for public use. Keep your eyes peeled!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-6426642949170328235?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/6426642949170328235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/08/xmpp-infinite-messaging-protocol.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/6426642949170328235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/6426642949170328235'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/08/xmpp-infinite-messaging-protocol.html' title='XMPP: The infinite messaging protocol'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-9038509959398251096</id><published>2011-06-19T21:17:00.001-07:00</published><updated>2011-06-19T21:17:58.157-07:00</updated><title type='text'>blogging is hard</title><content type='html'>I haven't forgotten about this. Must...blog...more...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-9038509959398251096?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/9038509959398251096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/06/blogging-is-hard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/9038509959398251096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/9038509959398251096'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/06/blogging-is-hard.html' title='blogging is hard'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-2839431380095184060</id><published>2011-04-14T20:27:00.000-07:00</published><updated>2011-04-14T20:27:24.999-07:00</updated><title type='text'>Azy has competition?</title><content type='html'>I was recently informed that &lt;a href="http://docs.enlightenment.org/auto/azy/"&gt;Azy&lt;/a&gt; has competition as a web service framework in C. The initial announcement for the other project seems to be &lt;a href="http://thechangelog.com/post/4608227295/raphters-a-web-framework-for-c"&gt;here&lt;/a&gt; and the source on github&amp;nbsp;&lt;a href="https://github.com/DanielWaterworth/Raphters"&gt;here&lt;/a&gt;. For those too lazy to click, it's called "Raphters" and stands for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;Resources include things served up to clients like a database or API.&lt;/li&gt;&lt;li&gt;Actions provide ways to interact with a Resource.&lt;/li&gt;&lt;li&gt;Processors transform data.&lt;/li&gt;&lt;li&gt;Handlers provide the entry point for a request.&lt;/li&gt;&lt;li&gt;Templates render data.&lt;/li&gt;&lt;/ul&gt;Upon examination, it seems that RAPHT is a library which allows you to take small bits of pseudo-code and turn them into regex handlers for http requests. If a match is found for a request, it gets passed off to a handler which creates linked lists of both headers and response text which eventually get printfed to stdout and are then picked up by fastcgi for all the socket and network handling.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In a word, "neat." Assuming you have fcgi running, your web services get scaled down to a series of macros with corresponding add() calls for each one. This reduces planning/coding time considerably and allows you to easily implement a simple web/rpc server.&lt;br /&gt;There do seem to be a number of features still missing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No general callbacks for client connect/disconnect&lt;/li&gt;&lt;li&gt;No way to set HTTP response codes other than 200&lt;/li&gt;&lt;li&gt;Inability to support binary data transmission&lt;/li&gt;&lt;/ul&gt;Additionally, RAPHT requires synchronous execution around the fcgi loop, preventing use with any kind of main loop to handle events/jobs. As it uses CGI, it must spawn processes to handle requests even if the number of such processes is greatly reduced through the use of fcgi.&lt;br /&gt;Perhaps the biggest downfall of RAPHT is its naive O(n) regex matching system. For each type of method (GET, POST, etc), it tries to regex match against every single service of that type. This means that every URL has its own regex and every RPC method has its own regex. For a server with very few services that is not a problem, but it is definitely not scalable.&lt;br /&gt;&lt;br /&gt;Azy has none of these shortcomings, but the biggest benefit that it has over RAPHT (imo) is the ability to simultaneously generate client bindings (in C) for all of your server web services. This means that for zero additional effort, you get conversion functions for the structs that you use and functions to send those structs to your server, allowing you to save considerable time implementing a client.&lt;br /&gt;&lt;br /&gt;I don't really have a closing to this, so instead I will post this picture:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/y7Hm9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://i.imgur.com/y7Hm9.jpg" width="255" /&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/3001344775859950798-2839431380095184060?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/2839431380095184060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/04/azy-has-competition.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/2839431380095184060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/2839431380095184060'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/04/azy-has-competition.html' title='Azy has competition?'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-3540041666537451623</id><published>2011-03-31T13:01:00.000-07:00</published><updated>2011-03-31T13:01:55.524-07:00</updated><title type='text'>Recursion</title><content type='html'>I have a natural tendency to write libraries which provide unusual functionality. Libraries that I write always start out simple. I want to do X, so I write function Y.&lt;br /&gt;&lt;br /&gt;Inevitably, this turns out to not be enough for whatever I am working on. I need function X to check for condition C, and IF(C), run X again. When working with event/state-based programming as I do, this quickly becomes a huge issue. If the inner loop free()s data still being used on the outer loop, at best I can hope for something simple going wrong, an IF(FREED_POINTER) evaluating as true or the like. At worse, crash. At absolute worst, extremely complex crash that takes hours to successfully debug and fix. Other problems appear as well, such as failures in maintenance of scheduled tasks and losing track of objects allocated in the inner loop.&lt;br /&gt;&lt;br /&gt;This has recently become more relevant in my work to convert Zentific's backend daemons from using threaded and synchronous design with &lt;a href="http://library.gnome.org/devel/glib/unstable/"&gt;Glib&lt;/a&gt; and tons of mutexes to an asynchronous one using EFL. Both of the libraries which I use, &lt;a href="http://docs.enlightenment.org/auto/azy/"&gt;Azy&lt;/a&gt; and &lt;a href="http://docs.enlightenment.org/auto/esskyuehl"&gt;Esskyuehl&lt;/a&gt; (esql), run recursively.&lt;br /&gt;&lt;br /&gt;Azy uses recursivity to implement state-based rpc method calls which can be dynamically "rewound" to simulate a synchronous environment. However, in the course of the rewind action, Azy initially was unable to track the correct state of objects used in both inner and outer loops, and users were incorrectly allowed to manipulate objects which had either been freed or should not have existed to begin with. This is fixed now with the addition of more aggressive type checking and blocking free()s from the inner loop, but it has reminded me of the recursive main loops previously added to &lt;a href="http://docs.enlightenment.org/auto/ecore/index.html"&gt;ecore&lt;/a&gt; for webkit compatibility. More on this in another entry.&lt;br /&gt;&lt;br /&gt;Esskyuehl had other issues. In order to function properly, it maintains a list of queries for each database connection, sending the queries in order after the previous one has completed. Normally, only a very small amount of recursing is done: a query completes, the connection object updates its query list, and if there are more queries it runs the connection function again from within the completion function.&lt;br /&gt;With a connection pool, this becomes trickier. When a query returns, the connection object updates its lists, then checks the rest of the pool to see if any connections need to have their queries rebalanced to other objects for optimal query speed. Thus, the completed query will rebalance the pool, sending any rebalanced queries on other connection objects and then sending queries for itself.&lt;br /&gt;The problem here arises when a connection does not update its query accounting properly. A stale accounting list here will lead to a permanently occupied pool connection, or, if things get really out of control, callbacks/events used with the wrong query data. I have fixed more than one bug which resulted from such an error.&lt;br /&gt;&lt;br /&gt;The common thing that I have noticed here is that most of the issues I have run into are the result of lack of recursion "glue", or an api to manage such things. This begs the question, is it possible to write an api for recursion?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-3540041666537451623?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/3540041666537451623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/03/recursion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/3540041666537451623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/3540041666537451623'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/03/recursion.html' title='Recursion'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3001344775859950798.post-7397414036561952288</id><published>2011-03-26T16:20:00.000-07:00</published><updated>2011-03-26T16:20:35.573-07:00</updated><title type='text'>Intro</title><content type='html'>Hi.&lt;br /&gt;&lt;br /&gt;I'm discomfitor aka Mike Blumenkrantz. I currently work for &lt;a href="http://www.zentific.com/"&gt;Zentific&lt;/a&gt;. I do development on &lt;a href="http://www.enlightenment.org/"&gt;Enlightenment&lt;/a&gt; and frequently break &lt;a href="http://ck.kolivas.org/apps/lrzip/README"&gt;lrzip&lt;/a&gt;. This is my blog for talking about code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3001344775859950798-7397414036561952288?l=discomfitor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discomfitor.blogspot.com/feeds/7397414036561952288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://discomfitor.blogspot.com/2011/03/intro.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/7397414036561952288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3001344775859950798/posts/default/7397414036561952288'/><link rel='alternate' type='text/html' href='http://discomfitor.blogspot.com/2011/03/intro.html' title='Intro'/><author><name>discomfitor</name><uri>http://www.blogger.com/profile/11633492652339458351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-r4VzPO2Rw5Q/TY5y4cwHPBI/AAAAAAAAAAM/6W5S485Tppg/s220/enchant.jpg'/></author><thr:total>0</thr:total></entry></feed>
