<?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-4444443087869710238</id><updated>2011-09-26T16:17:46.461-04:00</updated><category term='setup'/><category term='plans'/><category term='liberty'/><category term='tools'/><category term='version control systems'/><category term='patch queues'/><category term='MiniDBMS'/><category term='key reassignment'/><category term='programming'/><category term='steroids'/><category term='pidgin'/><category term='goals'/><category term='proposal'/><category term='Gaim'/><category term='libgnt'/><category term='finch'/><category term='API'/><category term='D'/><category term='logo'/><category term='c'/><category term='object oriented programming'/><category term='monotone'/><category term='GSoC'/><category term='Western Union'/><category term='sound'/><category term='hannah'/><category term='gcc'/><category term='payment'/><category term='vim'/><category term='mercurial'/><category term='google summer of code'/><category term='drugs'/><category term='gaim-text'/><category term='compiler'/><title type='text'>Ordered Chaos of Efficiency</title><subtitle type='html'>From coding to project ideas to politics, this blog strives to insight thought and discussion</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.aluink.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4444443087869710238.post-284577694240186800</id><published>2011-09-26T16:15:00.002-04:00</published><updated>2011-09-26T16:17:46.468-04:00</updated><title type='text'>The Accidental Hack</title><content type='html'>Today I came across an issue that after walking around in several circles has shown to have a very simple solution.  Maybe another instance of Occam's razor.&lt;br /&gt;&lt;br /&gt;A little background information is needed.  When a member uses their insurance and a claim is submitted, a process picks this up and sends out an email with a link to view this information.  The URL is member agnostic and simply places the date of the claim.  For instance www.example.com/foo?date=1/1/2010.  When the user navigates to the URL, they are prompted to login.  Upon successful login, any claims for the date on the URL are listed.&lt;br /&gt;&lt;br /&gt;So, we get a help desk ticket stating that a member, Martha Smith, got such an email.  When she clicked on the email, she logged in with msmith and saw claim information for John Smith.  An obvious security and privacy issue was clear.  So the hunt began.  We store email information in two locations.  We looked up John Smith's and Martha Smith's information and email settings all checked out.  It was noted that msmith is John's username and not Martha's.&lt;br /&gt;&lt;br /&gt;After some talking to people, the real story became clear.  You see, John's email address was mary@domain.com.  So, msmith doesn't stand for Martha Smith, but Mary Smith.  So it would seem as though Martha forgot her username and guessed msmith.  After a few tries, the account was locked.  She went through the process of unlocking the account and successfully guessed the security question.  This enabled her to reset the password and login.  When she finally logged in, she saw John's claim information, not because of any technical issue, but simply because she logged in as him.&lt;br /&gt;&lt;br /&gt;This whole story reminds me of this &lt;a href="http://www.schneier.com/essay-081.html"&gt;essay&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-284577694240186800?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/284577694240186800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=284577694240186800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/284577694240186800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/284577694240186800'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2011/09/today-i-came-across-issue-that-after.html' title='The Accidental Hack'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-1824790542035219067</id><published>2011-08-10T10:30:00.004-04:00</published><updated>2011-08-10T10:39:51.348-04:00</updated><title type='text'>PAF Hell</title><content type='html'>Here is the story of one PAF as it made its way through our processes. The names have been changed to protect the innocent. ;-)&lt;br /&gt;&lt;br /&gt;NOTE: None of the applications moving are in ClearCase. Project management documents had to be moved into ClearCase mid-project because a Facets Extension change had to be made.&lt;br /&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;br /&gt;12/17/2009 – Sent PAF out for approval to Brent Smith, Jim Peterson, Mary Pearson, Brad Jules, QA, and Jami Robertson&lt;br /&gt;12/18/2009 – Received PAF approvals from all except Brad Jules and QA.&lt;br /&gt;12/18/2009 – QA informed me that they could not see the PAF in ClearCase.&lt;br /&gt;12/21/2009 – Checked PAF into ClearCase. Sent email to QA also stating that all required approvals are now in as well.&lt;br /&gt;12/21/2009 – Received approval from QA.&lt;br /&gt;12/21/2009 – Sent email to CM requesting baseline of PAF.&lt;br /&gt;12/21/2009 – Made arrangements with Web Architects for deployment on Tuesday 12/22 thinking baseline and other CM processes would still be completed 12/22.&lt;br /&gt;12/22/2009 – Received rejection email from CM stating that PAF was not checked in using WorkRequest BCBST00020702 under the Unified Change Management Tab.&lt;br /&gt;12/22/2009 – Re-assigned WorkRequest BCBST00020702 to me and checked out the PAF and checked it back in. Attached to WorkRequest. Sent back to CM for baseline.&lt;br /&gt;12/22/2009 – Received rejection email from CM stating that two documents (Brad Jules’ approval and QA approval) were not in the WorkRequest attachments.&lt;br /&gt;12/22/2009 – Added QA approval to attachments on WorkRequest. Sent baseline request back to CM stating that Len is not in the “minimum required approvals” list in the PAF.&lt;br /&gt;12/23/2009 – Received phone call from CM explaining that all names listed in the PAF must approve even if they are not in the minimum required box.&lt;br /&gt;12/28/2009 – Received Brad Jules’ approval. Tried several times to add to ClearCase and got errors. Unable to add document. Emailed issue to Rational ClearCase mailbox.&lt;br /&gt;12/28/2009 – Received email from Rational ClearCase / Steve Mail stating that the error is caused by ClearCase’s limit of 1024 bytes for the Windows PATH variable and I would need to contact the help desk to fix shorten path variable.&lt;br /&gt;12/28/2009 – Shortened my own path variable since I am admin on my machine. Reassigned the WorkRequest to me, copied the approval document to ClearCase, checked it in, attached it to the WorkRequest in ClearQuest, reassigned to CM, sent email stating my ClearCase problem had been resolved and requested baseline.&lt;br /&gt;12/29/2009 – Received rejection email from CM stating that they needed new approvals from PM, DM, Req., and Mary Pearson as their approval timestamps were prior to the current PAF timestamp in ClearCase. I do not know how the PAF timestamp changed, it may have happened when I had to check out and back in under WorkRequest BCBST00020702 on 12/22.&lt;br /&gt;12/29/2009 – Changed the date range on the PAF since date had already passed, reassigned WorkRequest BCBST00020702 back to me, checked in PAF. Sent out new approval request email to all parties.&lt;br /&gt;12/29/2009 – Received all approvals except Mary Pearson who was out of the office.&lt;br /&gt;12/29/2009 – Sent email to QA requesting permission to proceed with Jim Peterson’s approval since Mary reports to Jim. Received ok from QA.&lt;br /&gt;12/29/2009 – Checked new approvals in to ClearCase, attached documents to WorkRequest, reassigned WorkRequest to CM. Sent email to CM requesting baseline.&lt;br /&gt;12/30/2009 – PAF baselined.&lt;br /&gt;12/31/2009 - Received CAR (Corrective Action Required for not following procedure).&lt;br /&gt;12/31/2009 - Picked up job application from Taco Bell. ;-)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-1824790542035219067?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/1824790542035219067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=1824790542035219067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1824790542035219067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1824790542035219067'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2011/08/here-is-story-of-one-paf-as-it-made-its.html' title='PAF Hell'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-7264113337925987005</id><published>2010-09-22T11:26:00.004-04:00</published><updated>2010-09-29T15:20:34.358-04:00</updated><title type='text'>Security Test</title><content type='html'>Qm9iIFNseWRlbGwsIDQyIHlvLCAwOTktODctOTM4MiwgZGlhYmV0ZXMNCkZyYW5rIE1hcnNoLCAy&lt;br /&gt;MiB5bywgMDkxLTg3LTkzODIsIHR1cnJldHMNClBldGVyIFNtaXRoLCAxMiB5bywgMDkyLTg3LTkz&lt;br /&gt;ODIsIHNtb2tpbmcNCk1hcnRoYSBKb25lcywgNTQgeW8sIDA5My04Ny05MzgyLCBoeXBlcnRlbnNp&lt;br /&gt;b24NCk1hcnkgUGV0ZXJzb24sIDYxIHlvLCAwOTQtODctOTM4Miwgb2Jlc2l0eQ0KUGF0cmljayBB&lt;br /&gt;bmRlcnNvbiwgMjMgeW8sIDA5NS04Ny05MzgyLCBjYW5jZXINCkp1bGkgQXJtYXMsIDQ1IHlvLCAw&lt;br /&gt;OTYtODctOTM4MiwgZGlhYmV0ZXMNCkpvc2VwaCBCYXRlcywgNDkgeW8sIDA5Ny04Ny05MzgyLCBk&lt;br /&gt;aWFiZXRlcw==&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-7264113337925987005?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/7264113337925987005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=7264113337925987005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7264113337925987005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7264113337925987005'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2010/09/security-test.html' title='Security Test'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-8977772226406105114</id><published>2010-07-07T10:22:00.011-04:00</published><updated>2010-07-07T13:46:17.745-04:00</updated><title type='text'>MS Outlook Send and File Popup Removal</title><content type='html'>Recently my company decided to install the Send and File addin for Outlook.  The idea is to have a File plan for your emails and sort them into an array of folders with different purposes.  This is great for project managers and people of the like, but it's mainly a pain in my ass as a developer.&lt;br /&gt;&lt;br /&gt;The UI change for me was a new popup window everytime I sent an email asking me if I wanted to file this email.  If I clicked yes, it would give me a folder selection prompt where it would place the sent email.  If I clicked No, it would file it in Sent Items as it's always done.  The window defaulted to No, so I could just do my usual CTRL-&amp;gt;&amp;lt;ENTER&amp;gt; and follow it by another &amp;lt;ENTER&amp;gt; or a &amp;LT;SPACE&amp;gt;.  So it wasn't a real pain to work around, but the idea of another damn window really pissed me off.  So after searching all over for someone else with my gripe, finally a coworker showed me this solution.&lt;br /&gt;&lt;br /&gt;Using the registry editor (Run -&gt; regedit), change/set the following key value.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Outlook&lt;br /&gt;    \Addins\Send_and_File.Connect\LoadBehavior =&gt; 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I hope others find this useful.&lt;/space&gt;&lt;/enter&gt;&lt;/enter&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-8977772226406105114?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/8977772226406105114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=8977772226406105114' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8977772226406105114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8977772226406105114'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2010/07/ms-outlook-send-and-file-popup-removal.html' title='MS Outlook Send and File Popup Removal'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-4051106500189763960</id><published>2009-12-18T15:17:00.001-05:00</published><updated>2009-12-18T15:20:06.213-05:00</updated><title type='text'>GVoice Tools</title><content type='html'>Created a simple script in python to send text messages using the &lt;a href="http://sphinxdoc.github.com/pygooglevoice/index.html"&gt;pygooglevoice&lt;/a&gt; api..  There was a few ideas I thought of implementing, but decided this was sufficient.  Ideas included things like a contact list file or actually pulling contacts from GVoice.  I'm thinking of writing a similar script that starts a call.  You can find it in a GitHub repository &lt;a href="http://github.com/aluink/GVoice-Tools"&gt;here&lt;/a&gt;.  Comments and ideas are always welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-4051106500189763960?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/4051106500189763960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=4051106500189763960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/4051106500189763960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/4051106500189763960'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2009/12/gvoice-tools.html' title='GVoice Tools'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-5454165555285417862</id><published>2009-03-31T23:24:00.005-04:00</published><updated>2009-04-01T11:30:47.220-04:00</updated><title type='text'>Senior Exit Exams</title><content type='html'>So the friendly rivalry between the CS and CSA students at my university is quite hilarious at times.  I'm currently taking the senior class all seniors are required to take in our school of computing.  It just so happens that we've naturally segregated each other to where the CS students are sitting on one side and the CSA students on the other.  I think this is due to the fact that we are generally better friends with each other from our respective majors from having taken a lot of classes together and less because we don't like each other.&lt;br /&gt;&lt;br /&gt;So yesterday our professor is telling us about our exit exams we're required to take before we graduate.  He first shifts his gaze to our, CS, side of the class and starts telling us what our test is.  It's going to be the Computer Science major field test, which is a national standardized test...blah blah blah.  I'd heard about it before so I wasn't paying attention.  Instead I was scheming.&lt;br /&gt;&lt;br /&gt;I saw that in a few seconds he was about to start talking about the CSA exam and though this was a great opportunity to make a great stab.  So I thought for a moment and it clicked.  I had the greatest joke ever!&lt;br /&gt;&lt;br /&gt;So he's done talking to us and shifts his gaze over to the other side.  He starts out with "And for the CSA exam...".  Then he places a pause at the perfect time.  So not wasting a moment I jump in with "Yeah, you can pick up your coloring books in the office!!"  Not that this was funny enough, but the guy behind me was planning the exact same thing with "A review of kindergarten".&lt;br /&gt;&lt;br /&gt;This might not seem as funny written in a blog post, but having been there, I was crying and the class was laughing pretty hard for a few minutes.  Both sides thought it funny, that's the great part, the CSA guys take it pretty well.  They've just decided it's generally hopeless, and take it like men.  I'm so proud of them ;)&lt;br /&gt;&lt;br /&gt;EDIT: I guess they were kinda ticked after all.  Oh well, sniff sniff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-5454165555285417862?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/5454165555285417862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=5454165555285417862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5454165555285417862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5454165555285417862'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2009/03/senior-exit-exams.html' title='Senior Exit Exams'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-8772128176743180184</id><published>2009-03-03T14:48:00.003-05:00</published><updated>2009-03-03T15:16:31.654-05:00</updated><title type='text'>Dream Monads</title><content type='html'>So I was sleeping the other night and had one of these weird dreaming/coding experiences.  Then a thought came to my mind, either while sleeping or while awake.  Is dreaming a Monad?  Then I got to thinking some more, and I think I've concluded that yes it is.  &lt;br /&gt;&lt;br /&gt;It maps objects and operations from life into this new context of a dream.  The structure of a dream is nearly isomorphic to life except for those special flying powers you get from time to time.  So structure is preserved.  Thus, I think it fair to call it a functor.&lt;br /&gt;&lt;br /&gt;Since it allows you to lift objects from life into this context it has unit.  And since a dream in a dream is really just a dream also, we have join.  So being a functor with unit and join, we can conclude it's a Monad.&lt;br /&gt;&lt;br /&gt;Now, deciding it's a Monad, what other properties of Monads can we infer onto dreams that we haven't though of before?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-8772128176743180184?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/8772128176743180184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=8772128176743180184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8772128176743180184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8772128176743180184'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2009/03/dream-monads.html' title='Dream Monads'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-1703835049636600940</id><published>2009-02-10T00:23:00.003-05:00</published><updated>2009-02-10T00:26:21.664-05:00</updated><title type='text'>Nested Where's</title><content type='html'>I've been discussing with someone how I thought this type of code required a nested where.  This code compiled and ran fine for me.  I guess it's ok!&lt;br /&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;foo = foldl step 0&lt;br /&gt;  where&lt;br /&gt;    step = f&lt;br /&gt;    f acc x = acc + x&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-1703835049636600940?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/1703835049636600940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=1703835049636600940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1703835049636600940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1703835049636600940'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2009/02/nested-wheres.html' title='Nested Where&apos;s'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-3424960451992763452</id><published>2008-07-07T13:00:00.002-04:00</published><updated>2008-07-07T13:06:28.772-04:00</updated><title type='text'>Drug Doubts: Final</title><content type='html'>Well, I was about to start writing something my first day, but there wasn't much to comment on.  I didn't feel much different.  I didn't notice a change much.  My poison ivy was kinda getting better, but it really took a few days to get better.  The question was then, "Well, are the drugs helping, or is the ivy getting better?"  After being off the drugs for about 5 days now, I get random itching from time to time still.  For the most part I'd say it's all gone.&lt;br /&gt;&lt;br /&gt;On side note, I have a friend who's on oxycotton and percocet.  Those might be more fun to try!  Just kidding.  Addictions to those types of drugs is not something I'm really interested in.  Though it would make for an interesting blog series.  I'll leave that for someone else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-3424960451992763452?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/3424960451992763452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=3424960451992763452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3424960451992763452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3424960451992763452'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/07/drug-doubts-final.html' title='Drug Doubts: Final'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-8766775868688398338</id><published>2008-06-27T21:28:00.003-04:00</published><updated>2008-06-28T01:59:57.585-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drugs'/><category scheme='http://www.blogger.com/atom/ns#' term='steroids'/><title type='text'>Drug Doubts: Day 0</title><content type='html'>Over the years I have never overcome my doubt in the power of drugs.  Though, my brief encounter with THC has been an exception.  Nontheless, for years I've had headaches and despite my attempts to change my diet, sleep patterns, and an array of other lifestyle patterns, the only thing that has ever done anything for them has been Excedrine.  Despite this, I still have my doubts and think that it's just a placebo effect.  My headache goes away because I &lt;i&gt;think&lt;/i&gt; the medicine is helping me.  So I've decided to journal my soon use of steroids and their effects on me.&lt;br /&gt;&lt;br /&gt;A week or so ago I had an unfortunate encounter with poison ivy which has left me riddled with &lt;a href="http://www.google.com/search?q=pruritus"&gt;pruritus&lt;/a&gt;.  So today I got a prescription for methylprednisolone, which is a 6 day steriod pack.  We'll see what that does for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-8766775868688398338?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/8766775868688398338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=8766775868688398338' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8766775868688398338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8766775868688398338'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/06/drug-doubts-day-0.html' title='Drug Doubts: Day 0'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-57064978531655161</id><published>2008-02-19T11:53:00.002-05:00</published><updated>2008-02-19T12:16:58.670-05:00</updated><title type='text'>Free Speech and Civil Liberty</title><content type='html'>&lt;a href="http://online.wsj.com/article/SB120303586375870157.html"&gt;Free Speech and Radical Islam&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure if I totally agree with what she said.  I am a full supporter of free speech.  But two things come to mind.&lt;br /&gt;&lt;br /&gt;First off, we, at least here in Canada and the US, teach our children to be careful of our words cause they might be very hurtful.  I remember my mother always telling me that the tongue is a very powerful tool that can be used for good or evil.  How does that translate to the geopolitical world?  Do we have to start thinking of being careful what we say because it might offend people?  My personal belief is that we should not restrict people from saying what they want to say.  People should be aware of what they say and feel safe to say it, but should be conscious of the way it might affect other people.  In NO WAY should the government start to regulate what people can and cannot say.  This I surely agree with.&lt;br /&gt;&lt;br /&gt;Secondly, at the end she says this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We need a global movement to fight blasphemy and other insult laws, and the European Union should lead the way by removing them. Europe should make it clear that democracies will protect their citizens if they say something that triggers threats and intimidation.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I really don't agree with that.  Countries should be sovereign.  I don't like the UN and how it has the power to tell countries what to do.  I think there is a fine line between helping a country in need and dictating the laws of a country.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-57064978531655161?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/57064978531655161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=57064978531655161' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/57064978531655161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/57064978531655161'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/02/free-speech-and-civil-liberty.html' title='Free Speech and Civil Liberty'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4444443087869710238.post-4003462363912224655</id><published>2008-02-18T21:59:00.001-05:00</published><updated>2008-02-18T21:59:49.007-05:00</updated><title type='text'>w00tness</title><content type='html'>&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/s9GBf8y0lY0&amp;rel=1&amp;border=0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/s9GBf8y0lY0&amp;rel=1&amp;border=0" type="application/x-shockwave-flash" wmode="transparent"width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-4003462363912224655?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/4003462363912224655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=4003462363912224655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/4003462363912224655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/4003462363912224655'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/02/w00tness.html' title='w00tness'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-6372268244758368704</id><published>2008-02-18T13:05:00.004-05:00</published><updated>2008-02-18T13:15:40.625-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>GCC Non-Bugs</title><content type='html'>Some have been encouraging me to write my compiler to output &lt;a href="http://www.cminusminus.org/"&gt;C--&lt;/a&gt; code.  It's a cool idea and would probably like to do it at some point.  But right now, since it's not in much use yet, I've decided to stick with Java Classes.  Though, this talk has led to thinking about implementing it in GCC and/or helping them do it.  So I started reading through the GCC website, looking at all kinds of stuff.  Along the way I found &lt;a href="http://gcc.gnu.org/bugs.html#nonbugs"&gt;this&lt;/a&gt;.  It's a pretty good read, pretty short and might offers some good insights in good programming practices in a few of the languages GCC compiles.  Let me know what you think.  This could be a good discussion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-6372268244758368704?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/6372268244758368704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=6372268244758368704' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/6372268244758368704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/6372268244758368704'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/02/gcc-non-bugs.html' title='GCC Non-Bugs'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-2097130113493462263</id><published>2008-02-18T11:35:00.006-05:00</published><updated>2008-02-18T22:06:35.292-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='liberty'/><title type='text'>Liberty</title><content type='html'>&lt;a href="http://xs2.lhi.is/~oskar05/ronpaul.wmv"&gt;Here&lt;/a&gt; is a wonderful video about liberty.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-2097130113493462263?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/2097130113493462263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=2097130113493462263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2097130113493462263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2097130113493462263'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/02/liberty.html' title='Liberty'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-3079598704674004916</id><published>2008-02-18T00:01:00.004-05:00</published><updated>2008-02-18T00:16:40.850-05:00</updated><title type='text'>Classfile</title><content type='html'>So I've been playing around with developing a module to work with Java class files.  &lt;a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html"&gt;Here&lt;/a&gt; is the specifications for the file format.  If you check out my &lt;a href="http://hg.aluink.net/compiler/file/tip/classfile"&gt;current&lt;/a&gt; files you can see that it's coming along.  I'm mainly fighting with the problem of how much calculated data to store in my structure and how much to leave to the methods to generate when it's needed.  This is sort of of a battle of lazy vs. immediate evaluation...but not quite.&lt;br /&gt;&lt;br /&gt;For instance...A lot of the objects in the structure have length, and index fields into the other parts of the structure.  Well, the structure is held together with pointers and lists in memory.  The only time those indexes are useful, is when they are converted to binary for the file output.  Holding these indexes in memory would add quite a bit of complexity, requiring an update to all affected pieces when another pieces is added, removed of modified.  I guess a lot of these decisions will come out later when I start writing the method that writes the structure out to file.  Does anyone have experience writing these types of files?  I'd be interested in knowing what others have experienced.&lt;br /&gt;&lt;br /&gt;Once I am far enough along with this thing, I'll have to start working on understanding the instruction set.  This is where I expect the real fun to begin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-3079598704674004916?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/3079598704674004916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=3079598704674004916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3079598704674004916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3079598704674004916'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/02/classfile.html' title='Classfile'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-6587590449046238436</id><published>2008-02-15T18:17:00.006-05:00</published><updated>2008-02-18T13:15:00.175-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><title type='text'>Finally Here</title><content type='html'>When I first got to &lt;a href="http://www.southern.edu"&gt;Southern&lt;/a&gt; I had my heart set on taking &lt;a href="http://cs.southern.edu/halterman/Courses/Spring2008/415/index.html"&gt;Compiler Construction&lt;/a&gt;.  So I set out on a mission to go full boar taking as many CS classes as possible to do all I can to make sure I've got the classes I need, and the knowledge I need to be prepared to take it when it gets offered again.  So this semester, my opportunity showed up.&lt;br /&gt;&lt;br /&gt;We had to do lots of work last semester to get it offered.  We don't have a large department, so we had an option of having AI or Computer Construction offered this semester.  At first, it seemed as though AI was going to be offered, but I was going to do everything I could do to swing the vote the other way.  So a fellow classmate and I started campaigning for it.  We spoke to as many students as possible to get the vote up.  All we needed were 6 students for the class, and it would be enough to swing it.  Well, we got our six.  After a month of class, only 6 remain...well, there are still 6, but one guy only comes to class like every two weeks....I doubt he'll last much longer.&lt;br /&gt;&lt;br /&gt;So far we've had got two pieces built.  You can monitor my progress &lt;a href="http://hg.aluink.net/compiler/"&gt;here&lt;/a&gt;.  The goal of the class is to compile Decaf, a subset of Java to MIPS.  But MIPS isn't very useful, so I thought of compiling to some type of intermediate language.  The two options that come to mind are the .NET IL and Java bytecode.  I decided I was interested in doing it in Java bytecode.  So my prof told me to go get Inside the Java VM at the library.  After reading it for a few hours, I realized that a Java class file isn't that complicated to understand.  So last weekend I wrote a data structure to store the contents of a Java class file (class.[ch]).  Next, I have to implement a few more methods to work with it.  Then I need to figure out how the instruction set works.  My prof tells me it's a stack based language, so I'll have to check that out some more.  I've never worked with one of those before.  Should be fun.&lt;br /&gt;&lt;br /&gt;In any case, we've got a symbol table and a lexer build already for class.  My symbol table, I cheated and just wrote a glib GHashTable wrapper.  So that ran fast and reliably.  Some are still working on theirs.  My lexer on the other hand...that was a pain.  Lex is annoying, and quite unpredictable from time to time.  Take for instance the following lines from the Rules section of my lex file.&lt;br /&gt;&lt;br /&gt;&lt;pre class=wiki&gt;...&lt;br /&gt;&lt;many other rules here&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;. {BEGIN ERROR1;unput(*yylext);}&lt;br /&gt;&lt;ERROR1&gt;.{NOTOPS}* {BEGIN INITIAL;&lt;error handle code here&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you want to completely understand what is going on, I suggest you find a lex tutorial, but the basic gist is simple.  The first line is in the &lt;INITIAL&gt; state.  If it matchs a character that has been unmatched by all the other regexes from above, then one character is matched, we go into the &lt;ERROR1&gt; state and put the character matched back in the buffer.  THen the second line will match any single character followed by as many non-operator/whitespace characters to follow.  the following is a sample matching&lt;br /&gt;&lt;br /&gt;&lt;pre class=wiki&gt;ie: bob?julie;&lt;br /&gt;&lt;br /&gt;bob identifier&lt;br /&gt;?julie error&lt;br /&gt;SCOLON&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;THe use of states would seems to imply that the order of thsoe rules doesn't matter, hence why we use states, but if I switched those two rules, it wouldn't work properly.  I think it's because the first line doesn't explicitly state the &lt;INITIAL&gt; state, it assumes it...who knows.  My lex and yacc book told me that if no state is specified, the INITIAL state is assumed.  Who knows.  I hate programming by coincidence, but for now, I think I have to deal with it.  Cause I don't have time to figure this out.&lt;br /&gt;&lt;br /&gt;Anyhow, I hope to be able to post here from time to time to give updates on my progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-6587590449046238436?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/6587590449046238436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=6587590449046238436' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/6587590449046238436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/6587590449046238436'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2008/02/finally-here.html' title='Finally Here'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-1991860761952282639</id><published>2007-06-19T11:53:00.002-04:00</published><updated>2009-03-10T23:09:45.649-04:00</updated><title type='text'>Public Key</title><content type='html'>You can find my key on the public servers.  I specifically post it to hkp://keys.gnupg.net.&lt;br /&gt;&lt;br /&gt;pub   4096R/77292AC1 2009-02-23 Eric Polino (aluink) &lt;aluink@gmail.com&gt;&lt;br /&gt;      Key fingerprint = E516 191C 79D1 C904 CF5C  B45A E9D3 1121 7729 2AC1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-1991860761952282639?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/1991860761952282639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=1991860761952282639' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1991860761952282639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1991860761952282639'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/public-key.html' title='Public Key'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-2544694217608050158</id><published>2007-06-15T10:13:00.000-04:00</published><updated>2007-06-19T11:47:28.627-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><title type='text'>Sound</title><content type='html'>Finch now has &lt;em&gt;sound&lt;/em&gt;.  It took me only a couple hours to get it in too!  Before you do thinking I'm some big genius for doing it so fast, just wait a minute.  Sound works pretty much the same way as Pidgin sound works, or at least it should since I copied that code over.  I know, I know copying code is one of the seven deadly since of coding.  Let me talk about that for a bit.&lt;br /&gt;&lt;br /&gt;As it stands, sound is directly in Finch.  This isn't the optimal solution since many folk don't want sound in their console application.  This is because remoting into a box and having sound go off can be rather unsettling for the parties in the same room as the serving machine.  So as it stands the sound is directly in Finch, but will most likely be moved later to either a &lt;em&gt;plugin&lt;/em&gt; or something to make it an optional feature.  One could argue that all a user has to do is disable sound when they are remoting in, but that can get dicey and an unneeded extra the user has to worry about.  This would diverge from the simple model which Pidgin tries to achieve.  So a plugin sounds likely.&lt;br /&gt;&lt;br /&gt;We are discussing options for how to deal with this on the mailing list right now.  I'll provide an update later when a decision is reached.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-2544694217608050158?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/2544694217608050158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=2544694217608050158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2544694217608050158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2544694217608050158'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/sound.html' title='Sound'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-3639236955785107956</id><published>2007-06-12T23:01:00.000-04:00</published><updated>2007-06-12T23:18:45.289-04:00</updated><title type='text'>New Projects</title><content type='html'>&lt;p&gt;Sorry for having been quiet in the last few days.  I've been busy here at home and haven't been working as hard as I was last week.  The well here at home is having some issues, so we haven't had water the last two days and won't have any tomorrow.  In any case, here are some bits of information on a few things I've been doing and a little info on what is to come.&lt;/p&gt;&lt;p&gt;The other &lt;em&gt;developers&lt;/em&gt; have put a lot of work into building workspaces.  I haven't had time to look at it yet, but I'm assuming that it's like having multiple desktops in a &lt;em&gt;graphical environment&lt;/em&gt;.  So they did lots of work on that and had merged all their work into the upcoming release branch.  So I propagated those changes into my &lt;em&gt;branch&lt;/em&gt;.  That was a lot of work since there were many conflicts to resolve.  Thanks to the help of &lt;a href="http://meld.sourceforge.net/"&gt;meld&lt;/a&gt;, it wasn't too bad.  The default conflict resolution tool is &lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt; and I'm glad I didn't use that.  I might figure it out sometime later because I'm a Vim addict, but for now, I'm glad I had a nice graphical tool to do it with.&lt;/p&gt;&lt;p&gt;I have also received permission to create a few &lt;em&gt;sub-branches&lt;/em&gt; to my branch.  See I don't have commit access to the entire MTN tree.  I'm only allowed to commit to my branch, im.pidgin.soc.2007.finchfeat.  So I asked if I could create three sub-branches, .sound, .logging, and .bindings, so that I can work on the other parts of my project separate from eachother.  In the end I will merge those changes together of course, but in the mean time if I get one working, those change can be pulled into another branch to be incorporated into a &lt;em&gt;release&lt;/em&gt; without having to worry about the changes in the other projects affecting anything.  When I start doing the little things I was hoping to do, I will either create another sub-branch for that or just do it in .finchfeat directly.  I'll cross that bridge when I get to it.&lt;/p&gt;&lt;p&gt;So there is a little update on some work.  I hope to start working on .sound in the next few days.  I've already begun to do some research and think I know where I'm going with it.  Having a good foundation on how things works already is allowing me to work faster now.  A great feeling!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-3639236955785107956?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/3639236955785107956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=3639236955785107956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3639236955785107956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3639236955785107956'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/new-projects.html' title='New Projects'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-7885483791275714058</id><published>2007-06-08T10:34:00.000-04:00</published><updated>2007-06-11T18:06:03.956-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libgnt'/><category scheme='http://www.blogger.com/atom/ns#' term='object oriented programming'/><title type='text'>Object Orientation in C</title><content type='html'>If you ask a common programmer to list a few languages that are &lt;em&gt;object oriented&lt;/em&gt; they will most likely list ones like, &lt;em&gt;Java&lt;/em&gt;, &lt;em&gt;SmallTalk&lt;/em&gt;, &lt;em&gt;C++&lt;/em&gt;, &lt;em&gt;Ruby&lt;/em&gt;, and so forth.  You won't hear people say that C is an OO language, because it isn't.  This doesn't mean it doesn't have the capability of doing it though.  Working with libgnt, the console based &lt;em&gt;graphical library&lt;/em&gt; Finch uses, I am using a lot of OO design built in &lt;em&gt;C&lt;/em&gt;.  I'd like to give just a short intro to how it all works because I think it's rather neat.&lt;br /&gt;&lt;br /&gt;Classes are defined with structs.  Thus all the member variables are simply put into a struct and methods that operate on a class are function pointers in a struct.  Because C doesn't have a native concept of OO, if a class were declared with both member variables and member functions defined in the same struct, a waste of memory would ensue.  Every time an instance of a class would be created, those pointers would be created again.  So a separation of static members and instance members much be created.  This can be done in many ways, but a common convention and the one used by libgnt is to create another struct called ${CLASSNAME}Class.  This struct would contain all the function pointers for the given class, and would also hold any static variables.&lt;br /&gt;&lt;br /&gt;The following is a simple example of a circle class that stores some basic circle information and a few methods that operate on circles.&lt;!-- google_ad_section_start(weight=ignore) --&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;/*circle.h*/&lt;br /&gt;&lt;br /&gt;#ifndef __circle_h__&lt;br /&gt;#define __circle_h__&lt;br /&gt;&lt;br /&gt;typedef struct _Circle Circle;&lt;br /&gt;typedef struct _CircleClass CircleClass;&lt;br /&gt;&lt;br /&gt;struct _Circle {&lt;br /&gt; float radius;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;struct _CircleClass {&lt;br /&gt; float pi;&lt;br /&gt; void (*draw) (Circle * c);&lt;br /&gt; float (*get_circumference) (Circle * c);&lt;br /&gt;&lt;br /&gt; void (*set_radius) (Circle *c,float r);&lt;br /&gt; float (*get_radius) (Circle *c);&lt;br /&gt;&lt;br /&gt; Circle * (*new) (float r, int c);&lt;br /&gt; void (*destroy) (Circle *);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;CircleClass * get_circle_class();&lt;br /&gt;&lt;br /&gt;#endif&lt;/pre&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;#include "circle.h"&lt;br /&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;static void circle_draw(Circle * c){&lt;br /&gt;  /* Do the drawing here */&lt;br /&gt;  printf("Drawing a circle with radius %f\n",c-&gt;radius);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static float circle_get_circumference(Circle * c){&lt;br /&gt;  return get_circle_class()-&gt;pi * c-&gt;radius * 2.00;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void circle_set_radius(Circle *c, float r){&lt;br /&gt;  c-&gt;radius = r;&lt;br /&gt;}&lt;br /&gt;static float circle_get_radius(Circle *c){&lt;br /&gt;  return c-&gt;radius;&lt;br /&gt;}&lt;br /&gt;static Circle * circle_new(float r, int color){&lt;br /&gt;  Circle *c = (Circle *)malloc(sizeof(Circle));&lt;br /&gt;  c-&gt;radius = r;&lt;br /&gt;  return c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void circle_destroy(Circle *c){&lt;br /&gt;  if(c){&lt;br /&gt;    free(c);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/********************&lt;br /&gt;* Exported Methods *&lt;br /&gt;********************/&lt;br /&gt;&lt;br /&gt;CircleClass * get_circle_class(){&lt;br /&gt;  static CircleClass * klass = NULL;&lt;br /&gt;&lt;br /&gt;  if(klass == NULL){&lt;br /&gt;    klass = (CircleClass *)malloc(sizeof(CircleClass));&lt;br /&gt;    klass-&gt;draw = circle_draw;&lt;br /&gt;    klass-&gt;get_circumference = circle_get_circumference;&lt;br /&gt;    klass-&gt;get_radius = circle_get_radius;&lt;br /&gt;    klass-&gt;set_radius = circle_set_radius;&lt;br /&gt;    klass-&gt;new = circle_new;&lt;br /&gt;    klass-&gt;destroy = circle_destroy;&lt;br /&gt;&lt;br /&gt;    klass-&gt;pi = 3.14;&lt;br /&gt;  }&lt;br /&gt;  return klass;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;/*client.c*/&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include "circle.h"&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;&lt;/stdio.h&gt;&lt;br /&gt;CircleClass * klass= get_circle_class();&lt;br /&gt;  Circle * c = klass&lt;stdio.h&gt;-&gt;new(2.45,6);&lt;br /&gt;&lt;br /&gt;  float circum = klass-&gt;get_circumference(c);&lt;br /&gt;  float radius = klass-&gt;get_radius(c);&lt;br /&gt;&lt;br /&gt;  printf("Circle Data\n\tCircumference: %f\n\tRadius: %f\n",circum,radius);&lt;br /&gt;&lt;br /&gt;  klass&lt;stdio.h&gt;-&gt;draw(c);&lt;br /&gt;&lt;br /&gt;  klass&lt;stdio.h&gt;-&gt;destroy(c);&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!-- google_ad_section_end --&gt;Object orientation wouldn't be worth much without some &lt;em&gt;inheritance&lt;/em&gt;.  So let's see how that's done.  It's actually very simple.  The first member of the struct is the parent struct.  So if you cast an object to it's parent-type, you have a pointer to it's first member, and parent class instance.  Isn't that just neat!  The following shows how to add a Shape parent class to Circle.&lt;br /&gt;&lt;!-- google_ad_section_start(weight=ignore) --&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;/*shape.h*/&lt;br /&gt;&lt;br /&gt;#ifndef __shape_h__&lt;br /&gt;#define __shape_h__&lt;br /&gt;&lt;br /&gt;typedef struct _Shape Shape;&lt;br /&gt;typedef struct _ShapeClass ShapeClass;&lt;br /&gt;&lt;br /&gt;struct _Shape {&lt;br /&gt;  int color;&lt;br /&gt;  int border;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;struct _ShapeClass {&lt;br /&gt;  void (*set_color) (Shape *c, int color);&lt;br /&gt;  int (*get_color) (Shape *c);&lt;br /&gt;&lt;br /&gt;  void (*set_border) (Shape *c, int border);&lt;br /&gt;  int (*get_border) (Shape *c);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void * shape_class_init(ShapeClass *sc);&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;/*shape.c*/&lt;br /&gt;&lt;br /&gt;#include "shape.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static void shape_get_border(Shape *s){&lt;br /&gt;  return r-&gt;border;&lt;br /&gt;}&lt;br /&gt;static void shape_set_border(Shape *s, int border){&lt;br /&gt;  s-&gt;border = border;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void shape_set_color(Shape *s, int color){&lt;br /&gt;  s-&gt;color = color;&lt;br /&gt;}&lt;br /&gt;static int shape_get_color(Shape *s){&lt;br /&gt;  return s-&gt;color;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/********************&lt;br /&gt;* Exported Methods *&lt;br /&gt;********************/&lt;br /&gt;&lt;br /&gt;void * shape_class_init(ShapeClass *sc ){&lt;br /&gt;  ShapeClass *sc = ShapeClass *)malloc(sizeof(ShapeClass));&lt;br /&gt;&lt;br /&gt;  sc-&gt;get_color = shape_get_color;&lt;br /&gt;  sc-&gt;set_color = shape_set_color;&lt;br /&gt;&lt;br /&gt;  sc-&gt;set_border = shape_set_border;&lt;br /&gt;  c-&gt;get_border = shape_get_border;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;And a few changes to the first few files.&lt;br /&gt;&lt;pre class="wiki"&gt;/*circle.h*/&lt;br /&gt;&lt;br /&gt;#include "shape.h"&lt;br /&gt;&lt;br /&gt;struct _Circle{&lt;br /&gt;  Shape parent;&lt;br /&gt;  /* other members */&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;struct _CircleClass {&lt;br /&gt;  ShapeClass parent;&lt;br /&gt;  /* other members */&lt;br /&gt;  Circle * (*new) (float r, int color, int border);&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;/*circle.c*/&lt;br /&gt;static Circle * circle_new(float r, int color, int border){&lt;br /&gt;  Circle *c = (Circle *)malloc(sizeof(Circle));&lt;br /&gt;  Shape *s = (Shape *)c;&lt;br /&gt;  c-&gt;radius = r;&lt;br /&gt;  s-&gt;color = color;&lt;br /&gt;  s-&gt;border = border;&lt;br /&gt;  return c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CircleClass * get_circle_class(){&lt;br /&gt;  static CircleClass * klass = NULL;&lt;br /&gt;  ShapeClass *sc;&lt;br /&gt;&lt;br /&gt;  if(klass == NULL){&lt;br /&gt;    klass = (CircleClass *)malloc(sizeof(CircleClass));&lt;br /&gt;    klass-&gt;draw = circle_draw;&lt;br /&gt;    klass-&gt;get_circumference = circle_get_circumference;&lt;br /&gt;    klass-&gt;get_radius = circle_get_radius;&lt;br /&gt;    klass-&gt;set_radius = circle_set_radius;&lt;br /&gt;    klass-&gt;new = circle_new;&lt;br /&gt;    klass-&gt;destroy = circle_destroy;&lt;br /&gt;&lt;br /&gt;    sc = (ShapeClass*)klass;&lt;br /&gt;    /* override anything here */&lt;br /&gt;    klass-&gt;pi = 3.14;&lt;br /&gt;  }&lt;br /&gt;  return klass;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!-- google_ad_section_end --&gt;So there you can see how things are inherited.  A simple cast gets you the parent object.  There should only be one instance of CircleClass and it should contain a unique instance of ShapeClass that will be shared among all circles.&lt;br /&gt;&lt;br /&gt;This demonstration was very rough and dirty and probably has a few problems since I wrote it up pretty fast  and had a baby to deal with while I was piecing it all together, but I'm sure the basic concept makes sense.  With the help of &lt;a href="http://developer.gnome.org/doc/API/2.2/glib/index.html"&gt;GLib&lt;/a&gt; and its object instantiation framework this design works a lot better.  GLib gives you abstract classes, interfaces and much more, but things are still all in C.&lt;br /&gt;&lt;br /&gt;This probably isn't the recommended way of doing OO, but the point is that C can do it.  Hope this was informative and it has encourages you to dig a little deeper.  If this is case, I recommend you read this &lt;a href="http://www.planetpdf.com/codecuts/pdfs/ooc.pdf"&gt;paper&lt;/a&gt; on OO in C.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-7885483791275714058?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/7885483791275714058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=7885483791275714058' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7885483791275714058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7885483791275714058'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/object-orientation-in-c.html' title='Object Orientation in C'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4444443087869710238.post-1599058670118019871</id><published>2007-06-06T09:41:00.000-04:00</published><updated>2007-06-07T14:42:32.886-04:00</updated><title type='text'>Key Reassignment Done</title><content type='html'>After many hours of research and coding I finally got the key reassignment capabilities in. Though it turned out to be a simpler task than I had expected, it still had its own series of bumps and surprises along the way.&lt;br /&gt;&lt;br /&gt;The first and obvious bump was for me to become familiar enough with how things work to be able to utilize and modify the current code to make it do what I want it to do. But like I said above, this was one of the simpler things in the end. The association of keys to actions is setup like this. Every GntWidget is a GntBindable. GntBindable is associated with GntBindableClass. GntBindableClass contains three &lt;em&gt;hash tables&lt;/em&gt;. The first we won't bother talking about here, but the other two are of interest to us.&lt;br /&gt;&lt;br /&gt;The first table contains (name,Action) key/value pairs. The names are strings like "gained-focus", "window-moved", "key-pressed", etc. The Actions are the the &lt;em&gt;functions&lt;/em&gt; performed. The second table contains (key,ActionParam). The keys are simply strings that represent &lt;em&gt;keystrokes&lt;/em&gt; entered by the user. Then the ActionParam contain an action and parameters that are passed to that action.&lt;br /&gt;&lt;br /&gt;So now when a key is pressed, the associated ActionParam is looked up from the related hash table and it is executed, simple as that. Sure there are some tricky things to happen along the way as far as what gets to execute the action, the &lt;em&gt;window manager&lt;/em&gt;, a window, or a &lt;em&gt;widget&lt;/em&gt; inside that window, but that's beyond the scope of this post. Maybe someday when I have nothing to write about, I'll post some more information on that.&lt;br /&gt;&lt;br /&gt;Now that you have a basic understanding of how actions are performed based on keystrokes, I can tell you how assigning new key combinations to actions is done. When the user types alt-/ or alt-\ for widget or window manager reassignments, respectively, a list of available actions are displayed. From there a user scrolls to the desired action and hits &lt;enter&gt;. The needed information is given to a new window. This information being, ActionName, original key combination, and the GntBindable being modified; keep in mind that the window manager is a GntBindable also. From there we can get the GntBindableClass. The user then types in a new keystroke and selects the Bind button.&lt;br /&gt;&lt;br /&gt;To replace a key assignment, two reassignments need to be done. First we reassign the old keystrokes to activate a NULL action. The reassignment function treats this as a delete action and deletes the (oldKeys, ActionParam) entry in the table. Then a second call to the same function is made with the new key combination. From the name, an Action is retrieved from the (name,Action) hash table. An ActionParam is created by associating this action with the parameters passed in. At this point, no actions make use of parameters, so this process will have to be modified slightly later to pass along needed parameters. Then it simply puts an entry in the (key, ActionParam) table with the new keys and the new ActionParam.&lt;br /&gt;&lt;br /&gt;Sure one could argue that a function that takes two key combinations could change the key from the old to the new combinations. But since this is done very seldom, there isn't much of a need for this function. Maybe someday, it will be added.&lt;br /&gt;&lt;br /&gt;So there you have it, this is how key reassignment is done. Feel free to ask some questions if certain parts are unclear. I will give some updates in a while, since this process still has some refining to do, such as some windows have special keystrokes they handle.&lt;br /&gt;&lt;/enter&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-1599058670118019871?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/1599058670118019871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=1599058670118019871' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1599058670118019871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/1599058670118019871'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/key-reassignment-done.html' title='Key Reassignment Done'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-5568040934937002571</id><published>2007-06-05T12:45:00.000-04:00</published><updated>2007-06-05T13:33:48.150-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='payment'/><category scheme='http://www.blogger.com/atom/ns#' term='Western Union'/><title type='text'>Payment #1</title><content type='html'>This year Google has decided to pay us via Western Union (WU).  I guess last year they were sending checks and doing wire transfers.  They were having issues with a lot of the wire transfers and in some countries the checks would take weeks to clear.  So they spent a lot of time this year looking for a better solution.  This solution was to pay most of us with WU and to setup wire transfers for the rest of the student where WU wasn't a viable option for their country.  So, needless to say, being in the US I am one of the students getting paid with WU.&lt;br /&gt;&lt;br /&gt;The fun all started when I went to get my payment the first time.   It was Monday evening.  I went down to the local WU agent at the Rite Aid.  So I had all the information and identification I needed with me.  I had a bad feeling things were going to go sour when I told them I was there to receive.  They asked me how much, so I told them $500.  They immediately had this look like they weren't sure they had enough, but they checked things out and had enough.  So now they tried to run it through and it wanted a phone number.  I told them I didn't need one, but she persisted that she couldn't run it without.  Somewhat annoyed I told her I'd go home and write to get a number.  Well, I didn't need a number; she even tried it without after I left and it worked.  I'll refrain from calling her names, but that really ticked me off that she did that.  So when I came back the next day to tell her that I didn't have the number and to try it without, she then told me that I didn't need it.  So I had wasted a whole day, remember I don't have a car, so I have to wait for Holly to come home with the car to run down there.  So any delays in the evening and I have to wait another whole day.&lt;br /&gt;&lt;br /&gt;Moving on to the second hurdle, my information was entered wrong by the sender. Yes, Google is capable of making mistakes.  They had entered my city as Newport, Nebraska instead of Newport, New Hampshire.  WU wouldn't let the payment go through cause I was in the wrong district.  When I wrote Google about it, it took 6 hrs to get a reply...they learned quickly what didn't work.  I guess there were a lot of mistakes on the first batch.  All the sender had to do was call WU and have my address changed.  For some reason I was told my payment would be ready on Friday.  Not sure if that was because they would send my updated information along with the second batch or what, but that was the case.  So I had to wait till Friday to get it.&lt;br /&gt;&lt;br /&gt;Come Friday I went back to Rite Aid to try again.  This was my 5th trip there, I was about done with any type of screwing around.  This time I couldn't get paid cause they didn't have $500 to give me, mistake #2 by Rite Aid.  WU pays by check, you can cash that check wherever you want.  I didn't know that at the time.  So I agreed and left.  It was already late and I didn't want to head out to  the next town to go to the other WU agent out there.  So I had to wait till Sunday now.&lt;br /&gt;&lt;br /&gt;Finally on Sunday, I went to the other town, found the other agent, and got paid.  This was when I found out it was just a check and I could have gotten paid on Friday.  I was happy enough to get cash in my hands that I wasn't able to be upset.  But looking back on it now, I'm just ticked at the fact that Rite Aid wasted 3 days for me.  The first time they wasted a day cause I could have tried it then to find out that my address was wrong.  The second time they wasted two days, cause I could have gotten paid on Friday, but instead had to wait till Sunday.  I HATE HAVING MY TIME WASTED!!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://picasaweb.google.com/aluink/FinchBlog/photo#5072623152635357202"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px;" src="http://lh3.google.com/image/aluink/RmWT4aRAqBI/AAAAAAAAABM/jUA3nUWzFD0/WU%20receipt.jpg?imgmax=800" alt="" border="0" /&gt;&lt;/a&gt;So there you have it, my story of how I got my first pay from Google Summer of Code.  You can find proof with this receipt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-5568040934937002571?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/5568040934937002571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=5568040934937002571' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5568040934937002571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5568040934937002571'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/payment-1.html' title='Payment #1'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-2918451672436165554</id><published>2007-06-04T11:37:00.000-04:00</published><updated>2007-06-04T12:07:06.046-04:00</updated><title type='text'>Label Issues</title><content type='html'>I spent a good deal of time yesterday trying to figure out why a simple piece of &lt;em&gt;code&lt;/em&gt; wouldn't work.  I was working on the key binding stuff again.  The way I want it to work is for the rebinding window to display the key combination caught to the user.  When the window is first drawn it displays a label that contains 'KEY:""' (the single quote are for the reader and the double quotes actually appear in the label).  Then when the user types in a combination it should update to 'KEY:"&lt;span style="font-weight:bold;"&gt;comb&lt;/span&gt;"', where &lt;span style="font-weight:bold;"&gt;comb&lt;/span&gt; is a human readable representation of the key combination entered by the user.  Well, it's a pretty easy setup, you have a key_pressed listener that gets the label as an argument.  A quick lookup to convert the keys received to a nicer format.  Then a quick update to the label text and it should work nicely.&lt;br /&gt;&lt;br /&gt;After several hours of staring at the code, quite a bit of research into the underlying code.  I simply couldn't figure out why the label wouldn't update.  I tried printing the keys out to stderr but something weird was happening there too.  When I printed out the &lt;em&gt;ASCII&lt;/em&gt; values one at a time, they came out nicely, as I would expect.  But when I tried printing them out as a string, it printed blank.  Well, come to find out, the problems with fprintf and label updating weren't related, they just happened to yield the same result.  When we tried a quick test by executing printf("%s\n","\033" "a"), the equivalent to Alt-a, only a newline would print.  So it was just a nuance of printf behavior.  The issue with the label was different.&lt;br /&gt;&lt;br /&gt;I spoke with my mentor for about an hour about this issue and finally he decided to pull the code and have a look for himself.  He was taking too long, so at about 0030 I went to bed.  He wrote back at 0200 saying he figured out what was wrong.  It seems that when gnt_label_draw() was being called, it would first set an INVISIBLE flag, but failed to unset it before returning.  It was a quick fix that required a lot of digging.  So he fixed it and pushed it upstream.  This morning I did a pull and merged his changes into mine and it worked.&lt;br /&gt;&lt;br /&gt;Now we have issues with the label not redrawing nicely.  But at least it's redrawing now.  So I get to continue hacking away at this project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-2918451672436165554?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/2918451672436165554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=2918451672436165554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2918451672436165554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2918451672436165554'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/label-issues.html' title='Label Issues'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-4230065691215282632</id><published>2007-06-01T14:09:00.000-04:00</published><updated>2007-06-08T10:31:48.416-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='key reassignment'/><title type='text'>Key Reassignment</title><content type='html'>&lt;p&gt;So the first part of my project this summer is to work into Finch the ability to (re)bind &lt;em&gt;keys&lt;/em&gt; to &lt;em&gt;actions&lt;/em&gt;.   So far I haven't done much productive work because I'm still learning how the &lt;em&gt;API&lt;/em&gt; works.  As it stands now, I have built a window that flows from a window listing the actions available to the current &lt;em&gt;widget&lt;/em&gt; and the key bindings associated with those actions.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;When I started working, the window listing the key assignments and their associated actions was already created.  The user was able to hit a key combination (Alt-/) and it would come up showing a listing for the widget currently in focus.  The user was able to scroll up and down the list, but it was merely informational.  I took this and added the ability to hit &lt;enter&gt; on a given keystroke/actions pair. Pressing &lt;enter&gt; &lt;enter&gt; on a pair triggers the creation of a new window that prompts the user to type in a new key combination to be bound to the action.  It's a pretty simple concept, one that most who have dealt with modifying shortcuts for a &lt;em&gt;window manager&lt;/em&gt; have seen before.&lt;/enter&gt;&lt;/enter&gt;&lt;/enter&gt;&lt;/p&gt;&lt;p&gt;The hard part I'm still trying to figure out is how to gather all the needed information I'll need when the rebinding call occurs.  I need the following information: key combination, the class object for the widget, &lt;em&gt;callback&lt;/em&gt; function for the action, name for the action, and an optional list of &lt;em&gt;parameters&lt;/em&gt; to pass to the callback function.  The key combination is trivial, I grab it from the user and store it.  The class of the widget I can get from the parent window that listed all the keystroke/action pairs.  The callback function is tricky, I haven't figured out how to do that yet.  The name of the action I can get from the keystroke/action listing window.  The parameters I really don't know what to do here.  I'm not even sure if any of the actions take parameters at this point.  I get the feeling this is just a feature that is available but not being used yet.  So I'll have to talk to &lt;a href="http://developer.pidgin.im/wiki/sadrul"&gt;Sadrul&lt;/a&gt;, my mentor.&lt;/p&gt;&lt;p&gt;So as can be seen, all the information I need for the reassignment is available at the start of this process.  My only task is to gather it, grab a new key combination from the user and call a register_action method.  Depending on how things are implemented, I might have to check to see if another action is bound to that key combination to prevent double assignments.  This is another thing I'll have to talk to my mentor about.&lt;/p&gt;&lt;p&gt;I can't wait to get to a point where I can commit my code and have the other developers tell me what is good and what needs to change.  I am often stressed about not knowing whether a way of doing something is bad and/or not liked by the &lt;a href="http://developer.pidgin.im/"&gt;Pidgin&lt;/a&gt; &lt;em&gt;development&lt;/em&gt; team.  On the other hand this is causing me to really think about how I do things.  So that in the end, if they don't like something I did, I can at least have something to stand on and defend my method.  This could possibly even bring a new concept to the team, thus offer change and benefit.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-4230065691215282632?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/4230065691215282632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=4230065691215282632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/4230065691215282632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/4230065691215282632'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/06/key-rebinding.html' title='Key Reassignment'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-3965421213312388357</id><published>2007-05-31T08:04:00.000-04:00</published><updated>2007-06-08T17:29:12.178-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='version control systems'/><category scheme='http://www.blogger.com/atom/ns#' term='patch queues'/><category scheme='http://www.blogger.com/atom/ns#' term='monotone'/><category scheme='http://www.blogger.com/atom/ns#' term='key reassignment'/><title type='text'>Micro Merging</title><content type='html'>&lt;p&gt;At first I thought to keep my &lt;em&gt;code&lt;/em&gt; under both &lt;a href="http://www.selenic.com/mercurial/"&gt;Mercurial&lt;/a&gt;, for &lt;a href="http://hgbook.red-bean.com/hgbookch12.html"&gt;MQ&lt;/a&gt;, and &lt;a href="http://www.monotone.ca/"&gt;Monotone&lt;/a&gt;(MTN), because Pidgin is kept under MTN.  But after a bit of work, I've found that it's really annoying.  So, as much as I like MQ and think it's a fantastic idea, maintaining code under two DVCS's is too much work for what I want to get out of it.  I won't be able to use patch queues until I either get &lt;a href="http://pidgin.im/"&gt;Pidgin&lt;/a&gt; to convert to a &lt;a href="http://en.wikipedia.org/wiki/Revision_control#Distributed_revision_control"&gt;DVCS&lt;/a&gt; that uses patch queues, or when MTN gets them incorporated.&lt;/p&gt;&lt;p&gt;So I am having to find alternate means of doing some of the things I could do with &lt;em&gt;patch queues&lt;/em&gt;.  So yesterday when I was working on incorporating the ability for Finch to reassign keys, I found that it required additional functionality before this could work.  So I had a problem.  I couldn't just make those changes then, because they would be incorporated into the same &lt;em&gt;patch&lt;/em&gt; of adding reassignment capability, because that would create a messy/non-discrete patch.  I also couldn't revert my code back to the previous revision, because that would lose all the changes I had already made.  So I was caught.  After a bit of thinking it became clear that the solution was simple, due to the power provided by the decentralized nature of MTN.  The answer was a micro branch.&lt;/p&gt;&lt;p&gt;I won't bother going into too much detail because MTN micro branching is described well on the &lt;a href="http://developer.pidgin.im/wiki/UsingPidginMonotone#micro-branches"&gt;wiki&lt;/a&gt;.  So I had my original revision (OR) that existed before I started any of my work, and I had a new revision that I was working on, we'll call it the reassign revision (RR).  But I found that I had to write some code to temporarily ignore keystrokes at the window manager level and had to write code to do that before my RR could work.  So I had to write an ignore keys revision (IR).  So as it stood my DAG looked like this.&lt;br /&gt;&lt;/p&gt;&lt;pre class="wiki"&gt; ... OR --&gt; RR&lt;/pre&gt;&lt;p&gt;But for my RR to work properly I had to put in a &lt;em&gt;revision&lt;/em&gt; between OR and RR.  That's not possible due to the nature of VCS's.  So I decided to apply the changes to start IR with OR as its parent.  Thus my graph would look like this now.&lt;/p&gt;&lt;pre class="wiki"&gt;          ,--RR&lt;br /&gt;      /&lt;br /&gt;... OR&lt;br /&gt;      \&lt;br /&gt;       `--IR&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Now IR doesn't happen after RR, which was the primary goal of this exercise.  So all I have to do is make sure both IR and RR work well on their own and I can merge the &lt;em&gt;branches&lt;/em&gt; when I'm done creating a new revision of both the changes called ignore keys and reassign revision (IRR), creating a &lt;a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph"&gt;DAG&lt;/a&gt; that looks like this.&lt;/p&gt;&lt;pre class="wiki"&gt;          ,--RR--,&lt;br /&gt;      /        \&lt;br /&gt;... OR            IRR&lt;br /&gt;      \        /&lt;br /&gt;       `--IR--'&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This same idea can be used quite nicely for bug fixes.  The process is called &lt;a href="http://venge.net/mtn-wiki/DaggyFixes"&gt;daggy fixing&lt;/a&gt;.  I find this method to be very nice and provides for a cleaner and more readable &lt;em&gt;graph&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-3965421213312388357?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/3965421213312388357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=3965421213312388357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3965421213312388357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3965421213312388357'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/micro-merging.html' title='Micro Merging'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-5973450650860032346</id><published>2007-05-25T09:10:00.000-04:00</published><updated>2007-05-25T12:53:23.582-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version control systems'/><category scheme='http://www.blogger.com/atom/ns#' term='patch queues'/><title type='text'>Patch Queues</title><content type='html'>&lt;p&gt;The idea of Version Control Systems is awesome.  A Decentralized Version Control System is an even greater idea for a distributed working environment such as the, and most, project I'm working on now.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Also a great idea is the idea of &lt;a href="http://en.wikipedia.org/wiki/Diff"&gt;diff&lt;/a&gt; patches.  To be able to take an original file and compare it to a modified version and get a representation of the changes is great for programming.  Taking this idea a step further you get &lt;em&gt;patch queues&lt;/em&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The idea of a patch queue is rather simple.  Before you start working, you initialize a &lt;em&gt;queue&lt;/em&gt; that will store a series of patches to be applied to a file or group of files.  You then create a &lt;em&gt;patch&lt;/em&gt;.  Then you proceed as normal and work.  At any point you can update the patch to reflect the changes that have been made since the start of the patch.  So far so good right?  Now comes the awesome part.  After having updated a patch to reflect the &lt;em&gt;changes&lt;/em&gt;, you can then start a new patch and push it on top of the first patch.  This patch will reflect a series of other changes.  After having updated this patch you can now do one of the following.  You can either push a new patch on the queue or you can pop the new patch off the queue to modify the first patch.  When you are satisfied with the changes you've made to the first patch you can then push the second patch back on top and continue working on it!  Genius, pure genius!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A good friend of mine, you know who you are buddy, brought this concept to my attention minutes after I was accepted into GSoC saying, "You are going to need this.".  I hadn't bothered to make it much available because one of the Pidgin developers told me that the project was too simple and we didn't need that kind of functionality.  Well, after a bit of work I found that I didn't agree.  It wasn't two days after I had started working on my first set of changes that I was looking for the ability to push multiple patches onto a queue as I worked.  It's not that my work was very complicated, in fact the bit of work I was doing was only like 10 lines of new code.  It was that midway in my work I wanted to go make a small change to a function somewhere else and I didn't want to confuse my current &lt;em&gt;changeset&lt;/em&gt;.  By being able to push a new patch, make those changes, and then come back to the first patch, it would have made it simple.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now if this idea of patches queues doesn't blow you out of the water, how about I tell you that &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; has built into their system the ability to tie in both patch queues and a DVCS?   Think of it, for as long as VCS's go back, once you commit a change, they are there forever, you can't take them back.  Some allow you to disapprove changes, but this can get rather dicey.  With the idea of patch queues into a DVCS, patches are treated as changesets.  The only difference is that you can move up and down the graph with the use of a patch queue and modify a changeset after it was "committed".  &lt;em&gt;Mercurial&lt;/em&gt; has called them &lt;em&gt;&lt;a href="http://hgbook.red-bean.com/hgbookch12.html#x16-26500012"&gt;Mercurial Queues&lt;/a&gt;&lt;/em&gt; (MQ).  I know rather little about project development, but I can see the beauty of this system.  I encourage others to use it and lavish in its power.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-5973450650860032346?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/5973450650860032346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=5973450650860032346' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5973450650860032346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5973450650860032346'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/patch-queues.html' title='Patch Queues'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-6693390907331071089</id><published>2007-05-22T08:39:00.000-04:00</published><updated>2007-05-25T12:56:25.731-04:00</updated><title type='text'>Finally Some Code</title><content type='html'>&lt;p&gt;Well after a lot of code reading and discussions in IRC I think I've gotten to a decent understanding of how Finch works and can start to code now.  So before I get going on stuff I wanted to do something that wasn't too intensive but could get my feet wet.  So I decided to scratch an itch and work around how Alt- doesn't send a meta for some &lt;em&gt;terminals&lt;/em&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A little explanation is due here.  When you type Alt-c two outcomes can result.  If alt sends a meta character it sends an &lt;em&gt;escape sequence&lt;/em&gt;.  If it doesn't it sends something rather difference, but reversible.  As an ESC sequence it sends {'\033', 'c', 0}.  Then when it doesn't send an ESC sequence it sends {-'c', 0}.  These are series of characters, so '\033' is the &lt;em&gt;octal&lt;/em&gt; 33 &lt;em&gt;ASCII&lt;/em&gt; character, decimal 27, ESC and 0 is the null &lt;em&gt;character&lt;/em&gt; denoting the end of string in C.  So the code to check and convert is as follows.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;font color="yellow"&gt;if&lt;/font&gt;(*k &amp;lt; &lt;font color="pink"&gt;0&lt;/font&gt;){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*(k + &lt;font color="pink"&gt;1&lt;/font&gt;) = &lt;font color="pink"&gt;128&lt;/font&gt; - *k;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*k = &lt;font color="pink"&gt;27&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*(k + &lt;font color="pink"&gt;2&lt;/font&gt;) = &lt;font color="pink"&gt;0&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rd++;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;The variable &lt;b&gt;k&lt;/b&gt; is the sequence of characters sent from the terminal and &lt;b&gt;rd&lt;/b&gt; is the number of characters received.  I put this code very near to the beginning of key_pressed processing so that the rest of the code can still work based on the values being sent as escape sequences.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then came time to commit this code to the repository.  I've worked with &lt;a href="http://en.wikipedia.org/wiki/Revision_control#Distributed_revision_control"&gt;&lt;em&gt;decentralized version control systems&lt;/em&gt;&lt;/a&gt;(&lt;em&gt;DVCS&lt;/em&gt;) before.  Well, I've only used &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt;, but it rocks.  One quick note about it and I'll return to it later in another post.  But I really like how Mercurial builds the concept of &lt;em&gt;patch queues&lt;/em&gt; into it's client.  An idea not born in &lt;em&gt;Mercurial&lt;/em&gt;, but very powerful.  More on that later.  The basic idea of a DVCS is that instead of working with a central &lt;em&gt;repository&lt;/em&gt; and &lt;em&gt;committing&lt;/em&gt; to it all the time.  You pull the entire codebase and revision DAG to your local machine and this becomes your working copy.  From there you can work, commit locally and do all that a regular VCS does.  But when you decide to, you can push your changes upstream and they are merged in with the central repository.  Or, if you don't have commit privileges, you can notify a &lt;em&gt;developer&lt;/em&gt; who does and they can verify your work and pull your changes upstream.  The beauty about this is that a revision &lt;a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph"&gt;DAG&lt;/a&gt; can have many heads now and they can be merged in whenever you want.&lt;/p&gt;&lt;br /&gt;So I had done my work locally and has committed them and was now ready to push my changes upstream.  I have commit privileges to my very own &lt;a href="http://developer.pidgin.im/viewmtn/branch/changes/im.pidgin.soc.2007.finchfeat"&gt;branch&lt;/a&gt;, isn't that just nice!  So I ran my push command and in a few short moments, they were up.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then some fun came along shortly there after.  A developer let me know of a few things I had done that weren't, the best lets say.  For starters I had left some &lt;em&gt;debugging&lt;/em&gt; code behind that I might have used later.  I figured it wasn't a big deal because this was my own branch and I'd clean it up later when it would be merged back into the main &lt;em&gt;branch&lt;/em&gt;, but I can see his point.  If I make this into a habit of leaving stuff behind, when it comes time to merge back into central, I won't be able to remember all the stuff I have behind.  So keep it clean to save work later.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Secondly, Pidgin develops under the &lt;em&gt;C89&lt;/em&gt; standard.  I had put in a few comments that were C99.  I was completely clueless as to what that was supposed to mean.  So I did a bit of research and talked to a few guys in IRC and learned that C had a standard developed in 1989, called the C89 standard.  Then in 1999, they created the C99 &lt;em&gt;standard&lt;/em&gt;.  To be fully compatible with new and old &lt;em&gt;compilers&lt;/em&gt; we are implementing the C89 standard.  So // comments aren't allowed.  There are a few other things too.  For instance you have to declare all your variables at the top of the method or namespace.  You can't declare them wherever like in Java.  I think this is a good practice in general and have always done that, so this isn't a big issue for me.  In any case, I've ordered the famous &lt;a href="http://www.amazon.com/gp/product/0131103628/002-7398788-7043269"&gt;K&amp;R&lt;/a&gt; book that teaches C89.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So when all that was fixed I had committed my first bit of code.  It was a nice feeling.  Now I'm working on some more and hope to have it committed today.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-6693390907331071089?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/6693390907331071089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=6693390907331071089' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/6693390907331071089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/6693390907331071089'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/finally-some-code.html' title='Finally Some Code'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-2995649937838053301</id><published>2007-05-15T12:21:00.000-04:00</published><updated>2007-05-15T13:07:29.160-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='finch'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='pidgin'/><title type='text'>...more tools...</title><content type='html'>Tools, tools and more tools...I've been hacking around Finch code all morning trying to understand &lt;em&gt;key bindings&lt;/em&gt;.  It's slow going, but I'm getting there.  Though I haven't learned much to  talk about in regards to Finch and its library libgnt, I have learned a lot of useful things that I will continue to use and encourage others to use.&lt;br /&gt;&lt;br /&gt;GLib is a powerful library that I wish I had learned a long time ago.  For &lt;em&gt;documentation&lt;/em&gt; on the functions it has available check this &lt;a href="http://developer.gnome.org/doc/API/glib/"&gt;site&lt;/a&gt; out.  For years I've been writing code and using &lt;em&gt;functions&lt;/em&gt; like the ones available here, but I always wrote my own.  What a relief to find a &lt;em&gt;library&lt;/em&gt; that has all this in it.&lt;br /&gt;&lt;br /&gt;My favorite so far is the &lt;em&gt;logging&lt;/em&gt; features it has.  By calling g_log(), g_print(), or a few others that have different logging levels, it can log all sorts of stuff for you.  The cool part is that you can define a method to handle the printing.  If you call g_log with different logging levels it will alter where it prints, either to stdout or stderr.&lt;br /&gt;&lt;br /&gt;It has many string utility functions.  Many are in string.h, but a bunch aren't and I've had to write a few of them in the past.  It's nice to have them all here.&lt;br /&gt;&lt;br /&gt;It's very easy to use.  All you have to do is include glib.h and when you &lt;em&gt;compile&lt;/em&gt; you pass it pkg-config.  So, "gcc `pkg-config --cflags --libs glib2.0` test.c test" and it works.&lt;br /&gt;&lt;br /&gt;So this has been very useful, for future use and because Pidgin is filled with glib use.&lt;br /&gt;&lt;br /&gt;Another useful thing I've learned is the use of &lt;em&gt;ctags&lt;/em&gt;.  Now I've used ctags a few times before.  But with the help of my mentor and a few docs I stepped it up a bit.  For those of who aren't too familiar with ctags here's a short run through getting things setup.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Run "ctags -R" at the top of your source tree&lt;br /&gt;&lt;li&gt;Open my favorite &lt;em&gt;text editor&lt;/em&gt;, &lt;em&gt;&lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt;&lt;/em&gt;, at the root of your source&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;That's it for getting setup.  Now you have the capability to bounce from function call to function with a simple keystroke.  Put your cursor over a function call and type CTRL-].  It will take you to the definition of the function.  You can do this with variable and custom data types also.  Vim stores the jumps you've made in a stack.  To pop the last jump off the stack and return to where you were looking type CTRL-t.  And voila, you've come back.  This has made browsing code , and following it more importantly, a breeze.&lt;br /&gt;&lt;br /&gt;The last thing I'd like to mention today is &lt;em&gt;syntax highlighting&lt;/em&gt;.  I've heard some complain about editors that apply syntax highlighting and say that it makes it more confusing for them to read and understand the code.  Well, more power to them for not using this feature.  I like it, I find it useful for reading code and I shall continue to love using it.  But what I found today was a &lt;a href="http://www.cs.cmu.edu/~maverick/VimColorSchemeTest/"&gt;site&lt;/a&gt; that has a list of custom color schemes for a few languages.  I'll focus on the &lt;a href="http://www.cs.cmu.edu/~maverick/VimColorSchemeTest/index-c.html"&gt;link&lt;/a&gt; to the C schemes.  I looked at a bunch of them, I found that I like the asmanian2 &lt;em&gt;theme&lt;/em&gt;.  Though, I don't like how it bolds a lot of things.  So I'm still working on getting the bold out.  :help colorscheme and :help hightlight-args has been a good help in modifying the theme.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-2995649937838053301?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/2995649937838053301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=2995649937838053301' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2995649937838053301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2995649937838053301'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/more-tools.html' title='...more tools...'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4444443087869710238.post-5896751105251269550</id><published>2007-05-11T09:04:00.000-04:00</published><updated>2007-05-11T10:03:22.799-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='goals'/><category scheme='http://www.blogger.com/atom/ns#' term='plans'/><title type='text'>Getting Ready</title><content type='html'>Well now that I've moved in.  I've started to get going with my project.  I've outlined a few things I want to get done before I can really start &lt;em&gt;programming&lt;/em&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strike&gt;Scheduled Milestones&lt;/strike&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Understand Pidgin&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Details of Implementation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Discuss details with Other Developers&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Detailed Goals&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Final Approval of Plans&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Go&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Scheduled &lt;em&gt;Milestones&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;I went ahead and scoped out my deliverables and decided how long I think it should take me to accomplish each of them.  Then I scheduled them into my summer.  By clicking on the link to my Google &lt;em&gt;calendar&lt;/em&gt; you can see what I've got there so far.  It's very simple for now, but as I continue working I will add more details to it as I go.&lt;/p&gt;&lt;strong&gt;Understand&lt;/strong&gt;&lt;strong&gt; Pidgin&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;This is going to be a tough undertaking.  Pidgin is a reasonably large &lt;em&gt;application&lt;/em&gt;. I found a &lt;a href="http://pidgin.im/%7Eelb/images/pidgin-arch.png"&gt;link&lt;/a&gt; to a diagram that outlines how Pidgin works.  One of my current problems is knowing when to build something as a plugin and when not to.  When I spoke with the other developers in IRC, they weren't able to give me a defined line that defined the difference between a &lt;em&gt;plugin&lt;/em&gt; and non-plugin feature.  I guess I'll have to learn that as I go, or it will become a feature by feature decision, which seems to be the most likely answer at this point.&lt;br /&gt;&lt;br /&gt;On the other hand, I was able to get a better picture of how things work as I we spoke yesterday.  The idea seems somewhat simple when you think about it for a while.  The core manages all the internals that don't require external &lt;em&gt;libraries&lt;/em&gt;.  The core is made up of pure C &lt;em&gt;functions&lt;/em&gt;.  It connects to a group of prplInfo structs that give it the ability to communicate over multiple &lt;em&gt;protocols&lt;/em&gt;.  It is connected to a &lt;em&gt;user interface&lt;/em&gt;(UI).  Pidgin is a UI that uses GTK+ and Finch uses libgnt.  Both the core and the UI can be added to by the use of plugins.&lt;br /&gt;&lt;br /&gt;So now I think I have a decent understanding of the general system.  I need to get working on understanding the inner workings of its &lt;em&gt;components&lt;/em&gt;.&lt;/p&gt;&lt;strong&gt;Details of Implementation&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Once I have a good understanding of Pidgin, I will begin working on planning out the details of how I will implement my goals for Finch.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Discuss Details with Other &lt;em&gt;Developers&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Then after I've planned out the details of how I plan to achieve my goals, I'll discuss it with my mentor and the other developers.  From here I hope to iron out things that wouldn't work, or find better ways of reaching my &lt;em&gt;milestones&lt;/em&gt;.&lt;/p&gt;&lt;strong&gt;Detailed &lt;em&gt;Goals&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Once all that is planned and ready to go.  I'll break down my implementation into discrete goals.  I'll take those goals and put them into my calendar.  This will allow me to focus on small goals at a time.  Furthermore, it will give me the ability to gauge how I'm doing, if I'm on schedule or running behind.&lt;/p&gt;&lt;strong&gt;Final Approval of &lt;em&gt;Plans&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Just before I actually start working on things, I'll get a final &lt;em&gt;approval&lt;/em&gt; of my &lt;em&gt;plans&lt;/em&gt; and how I've laid out my &lt;em&gt;timeline.&lt;/em&gt;&lt;/p&gt;&lt;strong&gt;Go&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;With all things ready, I shall set out to change the world...at least the world as it related to Finch.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-5896751105251269550?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/5896751105251269550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=5896751105251269550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5896751105251269550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/5896751105251269550'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/getting-ready.html' title='Getting Ready'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-2981283014978693781</id><published>2007-05-09T09:24:00.001-04:00</published><updated>2007-06-05T13:37:18.071-04:00</updated><title type='text'>Moved In</title><content type='html'>&lt;a href="http://picasaweb.google.com/aluink/FinchBlog/photo#5072633769794512962"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://lh3.google.com/image/aluink/RmWdiaRAqEI/AAAAAAAAABc/tAKVuovUtns/s144/DSCN0799.JPG" alt="office, desk, computer" /&gt;&lt;/a&gt;Well I've made the move from &lt;em&gt;Tennessee&lt;/em&gt; to &lt;em&gt;New Hampshire&lt;/em&gt; where I'll be for the rest of the summer.  I had to rearrange a storage room, but in the end it's become quite the little &lt;em&gt;office&lt;/em&gt; I've created for myself.  On the left here you can see what it looks like just outside the entrance.  The house itself is very old, built back in 1836.  The room itself is located on the other side of the garage.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/aluink/FinchBlog/photo#5072633774089480274"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;"  src="http://lh4.google.com/image/aluink/RmWdiqRAqFI/AAAAAAAAABk/f_dRpduHBcU/s144/DSCN0808.JPG" alt="office, desk, computer, programmer" /&gt;&lt;/a&gt;Next is my workstation. It's still not fully setup, I want to get some of the junk out of the way and put something more useful there.  I'm thinking of either putting some useful books I'll be needing or maybe stocking up those shelves with some good junk food.  Right now, I've only got some &lt;em&gt;Cheez-It&lt;/em&gt;'s and some &lt;em&gt;Ramen&lt;/em&gt;.  I've had my &lt;a href="http://www.logitech.com/" alt="Logitech,sound systems,music,surround sound,audio"&gt;Logitech&lt;/a&gt; 5.1 sound system for a few years now and it's dying.  My left channel is hurting, the front only comes in sometimes and the back is also somewhat shaky.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/aUuXKuSrsz0"&gt;  &lt;embed src="http://www.youtube.com/v/aUuXKuSrsz0" type="application/x-shockwave-flash" alt="office,desk" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;Here's a little walk-through of the place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-2981283014978693781?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/2981283014978693781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=2981283014978693781' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2981283014978693781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/2981283014978693781'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/moved-in.html' title='Moved In'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-3785023872731100855</id><published>2007-05-01T16:55:00.000-04:00</published><updated>2007-05-01T17:09:40.193-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='finch'/><category scheme='http://www.blogger.com/atom/ns#' term='setup'/><category scheme='http://www.blogger.com/atom/ns#' term='hannah'/><title type='text'>All Set</title><content type='html'>I have one final left, but it's not much to worry about at this point.  So I've been working on getting all my paperwork setup for CPT and taxes.  All that is done now, projects are in, I've got my stuff packed.  I leave for NH in a few days.  So today I relax cause it's my birthday so I'll be hanging with friends tonight.&lt;br /&gt;&lt;br /&gt;So this is how I plan to set things up this summer.  I am going to be staying in NH with a friend.  But, since I'll only be there for the summer and he doesn't have Internet, I will be working at my ex-girlfriends place.  Without going into too much details, she is also the mother of my daughter, so I'll be taking this opportunity to spend as much time with her, my daughter Hannah, as I can this summer.  She's 5 months old, my daughter, on Friday.&lt;br /&gt;&lt;br /&gt;So they have an extra room on the other side of their garage where I can set up my desk and run a network cable to and use their DSL.  It should be cool, my own little office to work on Finch.  I'll also set it up to be able to remote into my box from the outside.  Since they aren't serving anything from their network, I'll be able to use standard ports again.  That'll be awesome.  I've been in a dorm this year where they limit outgoing ports to 90-99.  So SSH has been 95 and HTTP has been 96, really annoying when trying to relay the link to my gallery.  They always forget the ":96".  So anyhow, I'll have my own little office, should be fun.&lt;br /&gt;&lt;br /&gt;I am also thinking of using this summer and the free schedule it allows me to have to do polyphasic sleep cycles.  More on this when I get going on that.  But it should prove to be an interesting experiment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-3785023872731100855?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/3785023872731100855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=3785023872731100855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3785023872731100855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3785023872731100855'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/05/all-set.html' title='All Set'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-7363103759618822359</id><published>2007-04-28T01:38:00.000-04:00</published><updated>2007-04-28T01:43:50.321-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MiniDBMS'/><title type='text'>DBMS Complete</title><content type='html'>The title isn't a completely accurate statement, but close enough.  I worked on it for three days, hammered out about 2000 lines of code, so at the end, I didn't test it as much as I should have, and the documentation for it isn't as complete as I want it to be.  I might revisit it on Sunday to complete it.  That would require me to run a few more test on the operations and to finish up the javadocs.  I submitted it by the due date, but the prof said that if we happen to submit an update to it before he grades it, he'll consider the most recent version.  So he's rather sport about that.  I'm kind of ashamed at the fact that it's not to my full potential, so that in itself will most likely drive me to fix it up.  So when I do that, I'll post a link to a jar file or something for those who are interested in it.  The javadocs are already available &lt;a href="http://www.aluink.net:96/MiniDBMS/"&gt;here&lt;/a&gt;, though incomplete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-7363103759618822359?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/7363103759618822359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=7363103759618822359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7363103759618822359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7363103759618822359'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/04/dbms-complete.html' title='DBMS Complete'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-3392264391655284748</id><published>2007-04-26T01:36:00.000-04:00</published><updated>2007-04-28T01:38:48.547-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MiniDBMS'/><category scheme='http://www.blogger.com/atom/ns#' term='D'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='logo'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>Finishing Up School</title><content type='html'>I haven't done much of anything regarding GSoC in the past few weeks since I have been focusing my attention of getting final projects done for a few of my classes.  So fear not, I am not leaving you out in the dark as to my progress with Finch.&lt;br /&gt;&lt;br /&gt;I am though working on getting a logo for myself.  Using Inkscape, a friend of mine was able to come up with the logo at the top of this blog.  I'm not sure if I like it yet, well see.&lt;br /&gt;&lt;br /&gt;I have been in contact with my mentor a little, but nothing to talk about.  On the other hand, I just finished my research paper for my Organization of Programming Languages class.  I researched the programming language D.  I don't think I talked about enough of it, but after 10 pages, I got kinda tired of adding more to it.  So if you are interested in knowing more about D, their &lt;a href="http://www.digitalmars.com/d/"&gt;website&lt;/a&gt; should provide quite a bit of stuff to munch on.  If you are interested in reading my paper you can find it &lt;a href="http://www/aluink.net:96/%7Ealuink/dproject/dProject.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tomorrow I hope to complete my MiniDBMS engine that implements a few relational algebra operations.  Fun times!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-3392264391655284748?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/3392264391655284748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=3392264391655284748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3392264391655284748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/3392264391655284748'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/04/finishing-up-school.html' title='Finishing Up School'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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-4444443087869710238.post-7792078862838608079</id><published>2007-04-13T15:16:00.000-04:00</published><updated>2007-04-13T15:19:52.428-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Proposal</title><content type='html'>I have been a Pidgin user for several years now and have loved it, but I always wished it could be brought into the console. As a Linux user/programmer I live in the console and since I have everything in screen sessions, I rarely leave it. So with the advent of Finch I was in heaven. However, I'm wishing more of Pidgin's features were available in Finch. Over the course of the summer, I hope to become part of the team and bring some of my wishes to reality.&lt;br /&gt;&lt;br /&gt;=======&lt;br /&gt;Overview&lt;br /&gt;&lt;br /&gt;A prioritized list of deliverables is as follows:&lt;br /&gt;&lt;br /&gt;1. Shortcut Keys Overhaul&lt;br /&gt;2. Sound&lt;br /&gt;3. Logging Improvements&lt;br /&gt;4. Buddy List Options&lt;br /&gt;5. Documentation of my changes&lt;br /&gt;6. Crashing bug fixes (if time permits)&lt;br /&gt;&lt;br /&gt;========&lt;br /&gt;Shortcut Keys Overhaul&lt;br /&gt;&lt;br /&gt;The shortcut keys need some serious work. I have yet to be able to use it without running into issues about it not catching keystrokes. I will build an independent interface that will be be made accessible via a command line option. This interface will prompt the user for the basic keystrokes to survive through the application. A tentative list of these basic keystrokes is:&lt;br /&gt;&lt;br /&gt;Up&lt;br /&gt;Down&lt;br /&gt;Left&lt;br /&gt;Right&lt;br /&gt;Basic Alt commands&lt;br /&gt;CTRL-o&lt;br /&gt;ESC&lt;br /&gt;Tab&lt;br /&gt;&lt;br /&gt;The key mappings would be stored in a file to be loaded by Finch upon initialization.&lt;br /&gt;&lt;br /&gt;To continue on this idea of shortcut keys, I want to add the option to add your own shortcut keys on the fly. Through an interface inside of Finch , a user will have the option to bind keystrokes to a set of predefined actions. A list of actions will be available through a combo box. There will be a list of custom shortcuts already configured, and the option to edit those will be made available.&lt;br /&gt;&lt;br /&gt;I will modify how Finch interprets keystrokes in order to be able to detect both 8-bit meta and ESC sequences. This will provide an abstraction to the user in the configuration file. For example, if a user sets the configuration file to bind the keystrokes C-M-a to an action, the program will be able to determine whether C-M-a was hit regardless of how they are being sent from the terminal.&lt;br /&gt;&lt;br /&gt;**OPTIONAL IF TIME ALLOWS**&lt;br /&gt;I will also build into Finch the ability to detect when a user is unable to send commands. I'm still unsure exactly how this will be implemented. As of now, I'm thinking of either having it detect when a user has started the program, but hasn't been able to send any valid commands for a predefined amount of time. Another possibility is when a user has sent a series of invalid commands from the start of the execution, it will detect issues. Upon having detected an issue with commands, it will pop up a window that uses basic commands to catch the aforementioned list of basic keystrokes. Research will be done to determine the best way to implement this idea.&lt;br /&gt;&lt;br /&gt;====&lt;br /&gt;Sound&lt;br /&gt;&lt;br /&gt;I frequently run Finch inside a screen session in the background, and it is very frustrating when I miss someone who tried to talk to me. Since it's not a GUI and doesn't have the ability to pop up a notification, the best way to resolve this problem is with the use of sound. I will add the ability to customize sounds for different events, similar to many existing IM programs. I will also make sounds customizable on a per-buddy basis similar to how you can program custom ring tones for different people in your cellphone.&lt;br /&gt;&lt;br /&gt;=====&lt;br /&gt;Logging&lt;br /&gt;&lt;br /&gt;The logging features are another feature I will improve. I will build on the same basic ideas found in Pidgin's logging tools. Though there are a few ideas I want to add.&lt;br /&gt;&lt;br /&gt;I will add the option to search through all conversations instead of just searching them one by one, or even searching them over a range of dates. There will also be the option to search from a list of logs from different users. From there we can add an array of search capabilities to better search the logs.&lt;br /&gt;&lt;br /&gt;===============&lt;br /&gt;Basic Buddy List Options&lt;br /&gt;&lt;br /&gt;There are a few options to the buddy list that I think are missing. I will add the ability to hide/show empty groups and to hide/show buddy details.&lt;br /&gt;&lt;br /&gt;===========&lt;br /&gt;Documentation&lt;br /&gt;&lt;br /&gt;Every good project is always backed up with good documentation. Firstly I will provide user documentation on how to use the features I have implemented. I will provide them in both man format and HTML format. If time allows, I will do some research in possibly putting the docs into LaTeX format, and thus offering centralized documentation that can be exported into multiple formats, ie: man page, HTML, pdf, etc.&lt;br /&gt;&lt;br /&gt;==============&lt;br /&gt;Crashing Bug Fixes&lt;br /&gt;&lt;br /&gt;A few current features of Finch cause it to crash. For instance, chatting with jabber over GoogleTalk has cause some strange crashes. I have found that sometimes, simply quitting the application causes it to crash. Though the desired result is still achieved, it would be better for it to quit cleanly than to segfault. Due to the inability to predict the amount of time required in researching these bugs and then fixing them, I have chosen to append this project to my plans with an "As time Allows" clause. If I am able to complete my other goals to my satisfaction and more importantly the satisfaction of my mentors, I shall then take on fixing the aforementioned bugs and some others.&lt;br /&gt;&lt;br /&gt;=======&lt;br /&gt;ABOUT ME&lt;br /&gt;&lt;br /&gt;My name is Eric Polino and am currently attending Southern Adventist University. Though this is only my second year, I am a junior. I am double majoring in Computer Science and Mathematics. Being self-motivated and having spent a few years teaching myself how to program with the help of a few friends, I was able to challenge several courses at the beginning of my freshman year. This allowed me to take advanced classes from the start. I was also named "Standout Freshman" by the School of Computing.&lt;br /&gt;&lt;br /&gt;Last year, I was selected, along with two other students, to represent my school at a regional programming contest where we placed 3rd out of 18 teams. I also participated in a recent Programmer of the Month where I placed 8th in their LOAPS contest. http://dinsights.com/POTM/LOAPS/finals.php&lt;br /&gt;&lt;br /&gt;Almost since the beginning of my programming career I have worked on large projects. My main project has been my suicide chess AI. I have also had experience working on large professional software projects. See my resume for more details on my work history. http://www.aluink.net:96/Resume.doc I have also used ncurses for various little projects along the way.&lt;br /&gt;&lt;br /&gt;Being a Linux user/programmer I practically live in the console and have everything in screen. Thus having a console-based instant messaging application is music to my ears. Being familiar with Pidgin, Finch is a dream come true. Thus working on Finch personally will allow me to bring my own dream to reality. If I could watch movies and look at pictures in the console, I don't think I'd have much need for a gui. Sure, I like and enjoy pretty icons and nice Guifications, but I also believe that console applications are very powerful.&lt;br /&gt;&lt;br /&gt;I am a firm believer that you must be committed to do what it takes to have what you want. When I decide to get something done, I'll do what it takes to make sure it gets done and it gets done well. Given the opportunity, I will live by this motto as I work with Finch this summer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-7792078862838608079?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/7792078862838608079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=7792078862838608079' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7792078862838608079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/7792078862838608079'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/04/proposal.html' title='Proposal'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4444443087869710238.post-8097995337339981891</id><published>2007-04-13T02:31:00.000-04:00</published><updated>2007-04-13T13:06:40.242-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='finch'/><category scheme='http://www.blogger.com/atom/ns#' term='Gaim'/><category scheme='http://www.blogger.com/atom/ns#' term='pidgin'/><category scheme='http://www.blogger.com/atom/ns#' term='google summer of code'/><category scheme='http://www.blogger.com/atom/ns#' term='gaim-text'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>Google Summer of Code Begins</title><content type='html'>&lt;span&gt;I am going to be posting here over the summer as I work with Google Summer of Code. Those of you not familiar with &lt;a target="_new" href="http://code.google.com/soc/"&gt;GSoC&lt;/a&gt; can check it out on their own.  I submitted a proposal to work for Finch.  Finch is a console based instant messaging client.  It's part of the project called Pidgin, formerly known as Gaim.  My accepted proposal can be read &lt;a href="http://code.google.com/soc/gaim/appinfo.html?csaid=E7C2C9E3398E6C50"&gt;&lt;span style="text-decoration: underline;"&gt;here&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So it's been rather exciting so far.  I spent a week or two working on my proposal.  With the help of some good friends of mine: Doug, Daniel, Andrew and Holly, it became what it became.  When I was done with it, I was confident that I couldn't have done a better job with the time I had.   So when I heard that there were 88 applicants to the Pidgin project and only 10 were going to be accepted, I was scared.  But I went back and read my proposal and became confident that I couldn't have written it better, so in the event of it not being selected, I knew it wasn't from lack of effort.&lt;br /&gt;&lt;br /&gt;So the accepted applicant list date was originally 4/9 but it was  moved to 4/11.  And Google was working as fast as they could and were able to finally release the list at 0230 UTC on 4/12.&lt;br /&gt;&lt;br /&gt;It was a crazy day.  I logged into irc.slashnet.org#summer-discuss about mid-day and started talking with a bunch of other applicants who, like me, were awaiting the release.  By the end of the day, I wasn't saying much and just reading, they were going nuts.  I was/am very new to IRC channels and some of the culture was just hilarious to me.  Some guys were slapping each other with trout, that was just rotfl material.  They were talking about all kinds of none-sense, finding the stupidest things to kill time.&lt;br /&gt;&lt;br /&gt;Then there was the mailing list.  It was a mailing list used by Google to communicate and receive information from the mentors/organizations/students.  Some students started to spam it.  Playing word games and such.  Some mentors and Google officials were getting upset.  It was both sad and funny to watch.  So in the end I ended up passing time watching the mayhem ensue.&lt;br /&gt;&lt;br /&gt;About 20 mins before the final results came out, all applications were labeled as 'Not selected'.  My heart fell, I thought it was over.  But just as I was about to leave, I saw a message in my inbox from the mailing list saying that it's not official and the results aren't out, all applications are labeled as so.  So that made me feel better, but I was still shooken up.  Then at about 0230 UTC, I refreshed the tab in Firefox with the page listing my application and it's status and it changed to "Application Accepted".  I let out the loudest yell I've ever put out in the computer lab.  No worries for those who aren't aware of this computer lab.  It's the Advanced Lab for computing majors at my University.  There were only three other people in there, and I knew them all personally.  They all knew what was going on.  In any case, I was/am the computing club president and am known for being off the wall from time to time, so it was fine.  Anyhow, I was just flipping out.  I ran out of the lab, called up two of my budding who were waiting for news and just couldn't contain myself.&lt;br /&gt;&lt;br /&gt;My evening then proceeded to go hang out with a good friend celebrating by drinking sparkling grape juice and watching a good flick "Life is Beautiful", italian movie, amazing story.&lt;br /&gt;&lt;br /&gt;Today, I was just getting my repo setup with monotone. Tonight, with the help of my mentor, I managed to compile it properly.  There were some strange issues with the setup that I needed help with.  So now, I'm lining up to start on stuff.  It'll be slow going till I get up north.  I'm at school for a while, and I've got some large projects I'm working on that are keeping my time busy.  I'll still be getting started slowly.&lt;br /&gt;&lt;br /&gt;Till next time...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4444443087869710238-8097995337339981891?l=blog.aluink.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aluink.net/feeds/8097995337339981891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4444443087869710238&amp;postID=8097995337339981891' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8097995337339981891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4444443087869710238/posts/default/8097995337339981891'/><link rel='alternate' type='text/html' href='http://blog.aluink.net/2007/04/google-summer-of-code-begins.html' title='Google Summer of Code Begins'/><author><name>Aluink</name><uri>http://www.blogger.com/profile/15816344654209826602</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>7</thr:total></entry></feed>
