<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>An abstract thinker, and the devil’s advocate.  Oh yes, and I also do webby stuff.</description><title>KevinGH</title><generator>Tumblr (3.0; @kevingh)</generator><link>http://kevingh.com/</link><item><title>I micro-raged when I saw the first three characters of the...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lya3nw9Q6C1r559h8o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I micro-raged when I saw the first three characters of the bill’s serial number.&lt;/p&gt;</description><link>http://kevingh.com/post/16380740826</link><guid>http://kevingh.com/post/16380740826</guid><pubDate>Mon, 23 Jan 2012 20:19:08 -0500</pubDate></item><item><title>PHP Logging, Exception Handling, and Event Management</title><description>&lt;p&gt;Last year I wanted to use the newly released &lt;a href="http://symfony.com/"&gt;Symfony&lt;/a&gt; framework to create my own web applications.  As I perused through its source code and documentation, I noticed that there were a lot of concepts that I could learn and use in my own software.  I decided to scrap all of my existing work and start clean using my new found knowledge.  The result of that work are a few libraries I have developed, and some more I will be releasing later.&lt;/p&gt;

&lt;p&gt;All of the libraries I have released are unit tested and have both usage and API documentation available as part of their repositories.  I would be more than grateful for bug reports and suggestions for improvement.&lt;/p&gt;

&lt;h2&gt;Log&lt;/h2&gt;

&lt;p&gt;The &lt;a href="http://github.com/codealchemy/Log"&gt;Log&lt;/a&gt; library, also named as the “CODEAlchemy Log component”, is a customizable log management library.  I drew a whole lot of inspiration from &lt;a href="http://github.com/seldaek/monolog"&gt;Monolog&lt;/a&gt;, the logging library used by Symfony, and took it a little further.&lt;/p&gt;

&lt;p&gt;The library is divided into four small parts:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Entry&lt;/li&gt;
&lt;li&gt;Processor&lt;/li&gt;
&lt;li&gt;Store&lt;/li&gt;
&lt;li&gt;Manager&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Note that I will describe the default functionality the logging library will provide.  You are not limited to these defaults!  You can use the bundled interfaces to create your own classes to expand on what the library can already do.&lt;/p&gt;

&lt;h3&gt;Entry&lt;/h3&gt;

&lt;p&gt;Log entries are instances of an &lt;code&gt;EntryInterface&lt;/code&gt; class.  Instances of this class not only contain the actual log message, but a whole lot of other potentially useful information.  Some of which include: severity, origin of the message (file path, line number, class name, method), as well as the date and time of when it was created.  Instances of &lt;code&gt;EntryInterface&lt;/code&gt; classes also support additional custom attributes in case even more information needs to be added (see Processor below).&lt;/p&gt;

&lt;h3&gt;Processor&lt;/h3&gt;

&lt;p&gt;Log entry processors are instances of an &lt;code&gt;ProcessorInterface&lt;/code&gt; class.  These classes make use of a log entry’s ability to accept additional information through attributes.  The included processors allow you to add information such as current memory usage, current peak memory usage, and web information such as request URI, request method, and the client’s IP address.&lt;/p&gt;

&lt;h3&gt;Store&lt;/h3&gt;

&lt;p&gt;Log entry stores are instances of an &lt;code&gt;StoreInterface&lt;/code&gt; class.  These classes are responsible for actually writing the log entry somewhere.  The included store classes allow you to use any output stream, as well as a file.&lt;/p&gt;

&lt;h3&gt;Manager&lt;/h3&gt;

&lt;p&gt;Log entry managers are instances of an &lt;code&gt;ManagerInterface&lt;/code&gt; class.  Managers bring everything together so that you do not have to manually call all processor and stores on every log entry you wish to use.  You simply add the processors and stores you want to use, and you just add log entries to the manager.  The manager will take care of running the log entry through all of the registered processors, and then finally writing the log entry to all of the registered stores.&lt;/p&gt;

&lt;h2&gt;Exception&lt;/h2&gt;

&lt;p&gt;The &lt;a href="http://github.com/codealchemy/Exception"&gt;Exception&lt;/a&gt; library, also named as the “CODEAlchemy Exception component”, is a customizable exception handling library.  I created this library because I noticed a consistent pattern in the way I used errors and exceptions, and did not want to re-invent the wheel for each new web application I wrote.&lt;/p&gt;

&lt;p&gt;The library is divided into three small parts:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Renderer&lt;/li&gt;
&lt;li&gt;Log&lt;/li&gt;
&lt;li&gt;Handler&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Renderer&lt;/h3&gt;

&lt;p&gt;Exception renderers are instances of an &lt;code&gt;RendererInterface&lt;/code&gt; class.  Renderers do as their name implies: render exceptions.  The included rendering classes allow you to choose between rendering for CLIs or in HTML.&lt;/p&gt;

&lt;h3&gt;Log&lt;/h3&gt;

&lt;p&gt;Exception logs are instances of an &lt;code&gt;LogInterface&lt;/code&gt; class.  Logs also do as their name implies: logging exceptions.  The included log classes allow you to either log the exceptions using &lt;code&gt;error_log()&lt;/code&gt; or the Log library I described earlier.&lt;/p&gt;

&lt;h3&gt;Handler&lt;/h3&gt;

&lt;p&gt;The exception handler is the class that brings it all together and actually receives the exceptions from PHP.  You may only use one renderer and one log with the handler.  Only one renderer may be used because it just does not make sense to use more than one.  Only one log is used for keeping this simpler in the handler, but the log class itself may write to more than one log (see the Log library above).&lt;/p&gt;

&lt;p&gt;The handler also provides a method to convert errors into exceptions.  This makes for more stricter error reporting and will also provide error messages the same benefits that exceptions receive when this library is used.  It’s not required that you use this method, but if you are serious about writing good code, it is a very useful thing to have.&lt;/p&gt;

&lt;p&gt;The handler also takes care of not sacrificing stability over the features the library provides.  If an exception is thrown by either the log or renderer, it attempts to recover and fall back to more reliable means of error logging and rendering.  However, because errors cannot be caught, I suggest that you convert errors into exceptions so that those can be recovered from as well.&lt;/p&gt;

&lt;h2&gt;Event&lt;/h2&gt;

&lt;p&gt;The &lt;a href="http://github.com/codealchemy/Event"&gt;Event&lt;/a&gt; library, also named as the “CODEAlchemy Event component”, is my implementation of the observer pattern.  The added twist is that the library supports logging and the sharing of relevant data.&lt;/p&gt;

&lt;p&gt;The library is divided into three parts:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Subject&lt;/li&gt;
&lt;li&gt;Observer&lt;/li&gt;
&lt;li&gt;Dispatcher&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Subject&lt;/h3&gt;

&lt;p&gt;Event subjects are instances of an &lt;code&gt;SubjectInterface&lt;/code&gt; class.  The subjects manage observers and notifies them when an update is available.  The subject also doubles as a contain for shared data.  The data can be accessed by using the subject instance as an array.  A log may also be attached in order to log when an update is started, which observers are called and in what order, as well as the update process’s status.&lt;/p&gt;

&lt;h3&gt;Observer&lt;/h3&gt;

&lt;p&gt;Event observers are instances of an &lt;code&gt;ObserverInterface&lt;/code&gt; class.  The observers are on the receiving end of an update.  They also receive the instance of the subject so that shared data can be retrieved and/or manipulated.  An observer is where you would do all the work you planned on doing for a specific event.&lt;/p&gt;

&lt;h3&gt;Dispatcher&lt;/h3&gt;

&lt;p&gt;Event dispatchers are instances of an &lt;code&gt;DispatcherInterface&lt;/code&gt; class.  Dispatchers manage a collection of subjects and will event trigger the update process for the specified subjects.  A log can also be attached in order to log when subjects are attached, detached, and updated.&lt;/p&gt;</description><link>http://kevingh.com/post/15416955510</link><guid>http://kevingh.com/post/15416955510</guid><pubDate>Fri, 06 Jan 2012 17:31:09 -0500</pubDate><category>projects</category></item><item><title>SOPA Is Censorship</title><description>&lt;p&gt;For the past 7+ years, I have had zero problems with GoDaddy.  I did not care about their marketing campaigns or the comments made about GoDaddy.  Business is business and GoDaddy was and is good at what they do.  With the recent improvement they have made to their user interface, this makes this even harder.&lt;/p&gt;

&lt;p&gt;Like many others, I have and am in the process of moving my last domains from GoDaddy.  Their stance on SOPA is pretty clear cut.  &lt;a href="http://donttreadonmike.com/2011/12/24/godaddy-not-only-helped-write-sopa-they-are-also-exempt-from-it-scumbags/"&gt;They apparently helped co-author the bill&lt;/a&gt;, and &lt;a href="http://idealab.talkingpointsmemo.com/2011/12/sopa-hearing-will-never-end.php"&gt;are specifically exempt&lt;/a&gt; from its ill effects.&lt;/p&gt;

&lt;p&gt;It is also pretty frightening that politicians are ignoring &lt;a href="http://techcrunch.com/2011/12/22/over-40-internet-companies-have-come-out-publicly-against-sopa/"&gt;professional advice from many important service providers&lt;/a&gt;.  What is even more terrifying is that they completely ignore the obvious consequences of the bill, &lt;a href="http://www.savetheinternet.com/blog/11/11/02/why-justin-bieber-so-hackin-mad"&gt;which is censorship&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is very naïve to think that they either do not know or will not abuse the power the SOPA bill will provide.  It does not take a smart man to know this fact.  Every bill in the name of protecting anything has always been abused.  Just take a look at the United State’s history of passing those bills, The “Patriot” Act chief among them.&lt;/p&gt;</description><link>http://kevingh.com/post/14871150018</link><guid>http://kevingh.com/post/14871150018</guid><pubDate>Tue, 27 Dec 2011 13:32:49 -0500</pubDate><category>technology</category><category>politics</category></item><item><title>Apache 2, PHP-FPM, mod_fastcgi</title><description>&lt;a href="http://zeldor.biz/2011/03/apache2-and-php5-fpm-combination/"&gt;Apache 2, PHP-FPM, mod_fastcgi&lt;/a&gt;: &lt;p&gt;Took me a while to figure out how to get this thing to work.&lt;/p&gt;

&lt;p&gt;I ended up realizing that the default configuration for mod_php redirect all PHP processing to the module instead of FastCGI.&lt;/p&gt;</description><link>http://kevingh.com/post/14585222394</link><guid>http://kevingh.com/post/14585222394</guid><pubDate>Wed, 21 Dec 2011 18:17:02 -0500</pubDate><category>technology</category></item><item><title>DocHub.io: CSS, HTML Documentation in a Clean, Searchable Site</title><description>&lt;a href="http://www.webmonkey.com/2011/12/dochub-io-css-html-documentation-in-a-clean-searchable-site/"&gt;DocHub.io: CSS, HTML Documentation in a Clean, Searchable Site&lt;/a&gt;</description><link>http://kevingh.com/post/13877944203</link><guid>http://kevingh.com/post/13877944203</guid><pubDate>Wed, 07 Dec 2011 12:25:37 -0500</pubDate><category>technology</category></item><item><title>Fix PHPUnit Not Doing Anything</title><description>&lt;p&gt;Are you trying to run PHPUnit, but it just exits without doing anything?  Hopefully, I think I may have an answer for you.&lt;/p&gt;

&lt;p&gt;For me, a vanilla installation of PHP with PHPUnit will do nothing if one of your scripts cannot be parsed by PHP.  You would never know this because the default INI configuration for PHP hides those errors.  To know for sure, you should check the exit status after running PHPUnit.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kherrera@dev:~/git/myProject$ phpunit
kherrera@dev:~/git/myProject$ echo $?
254
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The exit status may be different from yours, but it cannot be zero if it’s the problem I think it is.  To fix this, you need to change the &lt;code&gt;display_errors&lt;/code&gt; and &lt;code&gt;error_reporting&lt;/code&gt; INI settings for your CLI PHP installation.  Your settings should look something like this, just make sure you don’t do this on a production machine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;display_errors = stderr
error_reporting = E_ALL
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now when you run PHPUnit, you should see something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;kherrera@dev:~/git/myProject$ phpunit
PHP Fatal error:  Call to undefined function badTaco() in /home/kherrera/badtaco.php on line 3
PHP Stack trace:
PHP   1. {main}() /home/kherrera/badtaco.php:0

Fatal error: Call to undefined function badTaco() in /home/kherrera/badtaco.php on line 3

Call Stack:
    0.0001     317568   1. {main}() /home/kherrera/badtaco.php:0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The output will be different for you, but at least you now know why PHPUnit isn’t running.  Once you fix the bugs causing the error(s), you should be able to run PHPUnit without a problem.&lt;/p&gt;</description><link>http://kevingh.com/post/13605107853</link><guid>http://kevingh.com/post/13605107853</guid><pubDate>Thu, 01 Dec 2011 17:24:38 -0500</pubDate><category>PHP</category><category>coding</category></item><item><title>Setting Up Eclipse 3.7 with Marketplace and PDT</title><description>&lt;p&gt;I have been having issues getting Eclipse 3.7 with PDT to work with the Marketplace client.  I wanted to install it so I could install the Lion fullscreen plugin, but the instructions should work on any other OS.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://eclipse.org/downloads/packages/eclipse-classic-371/indigosr1"&gt;Download&lt;/a&gt; and install Eclipse 3.7 Classic&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Help&lt;/strong&gt; &gt; &lt;strong&gt;Install New Software&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Work with&lt;/strong&gt;, select &lt;strong&gt;Indigo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the filter box, type &lt;strong&gt;Marketplace&lt;/strong&gt; and install the Marketplace client&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Help&lt;/strong&gt; &gt; &lt;strong&gt;Eclipse Marketplace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Find&lt;/strong&gt;, type &lt;strong&gt;Lion&lt;/strong&gt; and install the Lion fullscreen plugin&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Help&lt;/strong&gt; &gt; &lt;em&gt;Install New Software&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Work with&lt;/strong&gt;, select &lt;strong&gt;Indigo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the filter box, type &lt;strong&gt;PHP&lt;/strong&gt; and install &lt;strong&gt;PHP Development Toolkit&lt;/strong&gt; under &lt;strong&gt;General Purpose Tools&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You’re done.&lt;/p&gt;</description><link>http://kevingh.com/post/13557649442</link><guid>http://kevingh.com/post/13557649442</guid><pubDate>Wed, 30 Nov 2011 16:04:28 -0500</pubDate><category>technology</category></item><item><title>Thanksgiving</title><description>&lt;p&gt;I am grateful for everything I own, all the people in my life, and opportunities I am presented with.&lt;/p&gt;

&lt;p&gt;The people in my life give me the opportunity to experience and own new and exciting things.&lt;/p&gt;</description><link>http://kevingh.com/post/13267195815</link><guid>http://kevingh.com/post/13267195815</guid><pubDate>Thu, 24 Nov 2011 15:57:30 -0500</pubDate></item><item><title>staff:

Yesterday we did a historic thing.  We generated 87,834...</title><description>&lt;img src="http://29.media.tumblr.com/tumblr_lutg5pAQgC1qz8q0ho1_500.png"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://26.media.tumblr.com/tumblr_lutg5pAQgC1qz8q0ho2_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_lutg5pAQgC1qz8q0ho3_500.png"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;&lt;a href="http://staff.tumblr.com/post/12930076128/a-historic-thing" class="tumblr_blog"&gt;staff&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Yesterday we did a historic thing.  We generated 87,834 phone calls to U.S. Representatives in a &lt;a href="http://politechbot.com/docs/sopa.google.facebook.twitter.letter.111511.pdf"&gt;concerted&lt;/a&gt; &lt;a href="http://americancensorship.org/"&gt;effort&lt;/a&gt; to &lt;a href="http://www.tumblr.com/protect-the-net"&gt;protect the Internet&lt;/a&gt;.  Extraordinary.  There’s no doubt that we’ve been heard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So just to keep you updated:&lt;/strong&gt; The well-intentioned, but immensely flawed “&lt;a href="http://judiciary.house.gov/hearings/pdf/112%20HR%203261.pdf"&gt;Stop Online Piracy Act&lt;/a&gt;” is still in the House Judiciary Committee. The hearing was yesterday and now members will debate and bring amendments to the bill.  The Committee will reconvene in a few weeks — the date has yet to be scheduled. Nothing has been brought to a final vote. Everything is still very much in play. We’ll keep you posted on what’s going on and what you can do to help. But for now, we want to &lt;strong&gt;&lt;em&gt;thank you.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One encouraging thing we heard yesterday:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don’t believe this bill has any chance on the House floor. I think it’s way too extreme, it infringes on too many areas that our leadership will know is simply too dangerous to do in its current form.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— Representative &lt;a href="http://thehill.com/blogs/hillicon-valley/technology/194091-issa-google-used-as-pinata-by-congress"&gt;Darrell Issa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We also want to express our tremendous gratitude to our friends at &lt;a href="http://www.mobilecommons.com/"&gt;Mobile Commons&lt;/a&gt; who, on 30 minutes notice, hooked us up with their amazing platform (and provided their expertise) to automatically connect callers with their Representatives.&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://kevingh.com/post/13117157227</link><guid>http://kevingh.com/post/13117157227</guid><pubDate>Mon, 21 Nov 2011 13:12:17 -0500</pubDate><category>politics</category></item><item><title>Change of Pace</title><description>&lt;p&gt;I just had one of those life epiphanies you get as you grow up and learn more about yourself.&lt;/p&gt;

&lt;p&gt;For years I have always programmed for myself, my clients, and my job.  When I was younger this wasn’t a problem since my energy levels grew unchecked.  Now that I’m older, things are not as simple anymore.  Just last week I learned that if I work on personal software projects during my work breaks or when I get home, I become less efficient at it.  It’s like running all day every day, and using your breaks to run some more.&lt;/p&gt;

&lt;p&gt;To say the least, this really sucks!  I love programming, the deep thought and focus that goes with it, and the sense of accomplishment I derive from completing projects.  I won’t be stopping anytime soon, but I will be slowing down considerably.  I’ll be programming on weekends, if I have time, instead of during the work week.  I guess I’ll do more creative things like write music.&lt;/p&gt;

&lt;p&gt;It feels like I just wrote that I’ll only play games on weekends.&lt;/p&gt;</description><link>http://kevingh.com/post/13117113952</link><guid>http://kevingh.com/post/13117113952</guid><pubDate>Mon, 21 Nov 2011 13:10:56 -0500</pubDate><category>personal</category></item><item><title>Protect The Internet</title><description>&lt;a href="http://www.tumblr.com/protect-the-net"&gt;Protect The Internet&lt;/a&gt;</description><link>http://kevingh.com/post/12887805887</link><guid>http://kevingh.com/post/12887805887</guid><pubDate>Wed, 16 Nov 2011 13:40:38 -0500</pubDate><category>politics</category></item><item><title>Budgeting RAM on MediaTemple's (ve) Product</title><description>&lt;p&gt;If you take a look at my portfolio right now, you will notice that it’s pretty barren.&lt;/p&gt;

&lt;p&gt;I decided to switch from &lt;a href="http://wordpress.com/"&gt;WordPress.com&lt;/a&gt; to &lt;a href="http://mediatemple.net/"&gt;MediaTemple (mt)&lt;/a&gt; because of the lack of control I had over my own website.  Having experience using WordPress on multiple private hosts, I had trouble stomaching being nickel-and-dimed to death.  That, and advertisements on a portfolio did not look very professional to me.&lt;/p&gt;

&lt;p&gt;Originally, I used MediaTemple’s &lt;a href="http://mediatemple.net/webhosting/gs/"&gt;(gs)&lt;/a&gt; product.  I was not very happy with the performance, and I figured I could save $20 a month by moving to free solutions (like WordPress.com).  After having experimented with that for a few months, I decided to jump ship and switch back to (mt).  However, this time I decided to try their new &lt;a href="http://mediatemple.net/webhosting/ve/"&gt;(ve)&lt;/a&gt; product.&lt;/p&gt;

&lt;p&gt;I love everything about (ve), except for the amount of memory available.  I am paying $30 for 512GB of RAM, which is all I can afford at the moment.  This isn’t a knock on MediaTemple, since this is about on par for the price.  First attempt at setting up my website was a success, until I tried running &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; using &lt;a href="http://unicorn.bogomips.org/"&gt;Unicorn&lt;/a&gt;.  That chewed through so much RAM, I had to convince myself it wasn’t worth running.&lt;/p&gt;

&lt;p&gt;I also had to fine tune Nginx, MySQL, and PHP FPM to run fewer workers in order to compensate for the low availability of RAM.  So if you decide to get a virtual private server, make sure you can afford at least 1GB of RAM.  The higher quantity of traffic you get, the more RAM you’ll need to have server daemon workers running in standby.  Otherwise you’ll have clients getting dropped or waiting in long queues.&lt;/p&gt;</description><link>http://kevingh.com/post/12843002250</link><guid>http://kevingh.com/post/12843002250</guid><pubDate>Tue, 15 Nov 2011 13:47:03 -0500</pubDate><category>technology</category></item><item><title>CODEAlchemy Log Library</title><description>&lt;p&gt;In my quest to find a modern, object oriented, PHP logging library, I found precious few.  Because of the respect I have for &lt;a href="http://symfony.com/"&gt;Symfony&lt;/a&gt; and &lt;a href="http://sensiolabs.com/"&gt;Sensio Labs&lt;/a&gt;, I decided to take a look at the &lt;a href="https://github.com/Seldaek/monolog"&gt;Monolog&lt;/a&gt; library that was bundled with it.  I must give props to &lt;a href="http://nelm.io/jordi"&gt;Jordi&lt;/a&gt;, I can see why it was decided to be include it with Symfony.&lt;/p&gt;

&lt;p&gt;However, I did not like the design of the library.  This is a matter of personal preference.  I did not like that it defined its own severity codes, while PHP offers its own standard set of error constants.  I also did not like the use of processors and formatters.&lt;/p&gt;

&lt;p&gt;Since this is just a difference of opinion on how logging should be handled, I decided to write my own library instead of bugging Jordi with sweeping changes.&lt;/p&gt;

&lt;p&gt;My &lt;a href="https://github.com/codealchemy/Log"&gt;Log&lt;/a&gt; library is the result of that effort.  It’s&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;simple to use&lt;/li&gt;
&lt;li&gt;fully unit tested with 100% code coverage&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.php.net/rfc/splclassloader"&gt;PSR-0&lt;/a&gt; compliant&lt;/li&gt;
&lt;li&gt;offers decent examples on usage&lt;/li&gt;
&lt;li&gt;released under the BSD license&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I even took inspiration from Monolog.  The &lt;a href="https://github.com/codealchemy/Log/blob/master/lib/CODEAlchemy/Component/Log/Queue.php"&gt;Queue class&lt;/a&gt; is similar to Monolog’s &lt;a href="https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/FingersCrossedHandler.php"&gt;FingersCrossedHandler&lt;/a&gt;.  It holds onto all of the log entries until a certain kind of entry is added.  Once that special entry is added, all of the queued up entries are dumped to the log along with the special entry.&lt;/p&gt;

&lt;p&gt;You can find examples on using the library, including the Queue class, in the &lt;a href="https://github.com/codealchemy/Log/tree/master/examples"&gt;repository&lt;/a&gt;.&lt;/p&gt;</description><link>http://kevingh.com/post/12631288955</link><guid>http://kevingh.com/post/12631288955</guid><pubDate>Fri, 11 Nov 2011 00:25:34 -0500</pubDate><category>projects</category></item><item><title>Google to Facebook</title><description>&lt;p&gt;As I wrote my last post, I realized something, which should have been obvious to me.&lt;/p&gt;
&lt;p&gt;There is a very fundamental difference between Google+ and Facebook.&lt;/p&gt;
&lt;p&gt;Facebook is oriented around establishing and maintaining associations with other people.  This means that contact information is exchanged through profiles, videos and photos are shared between friends/family/associates, and people can converse with each other through wall posts or (instant) messages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Facebook is for your common person.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google+ is oriented around sharing content.  Unfortunately, that’s all there is to it.  Talking to one another is “unnatural” since you have to hijack a comment thread for some shared item.  Hangouts are great for when you care to have face-to-face conversations, but that’s rarely the case with many people.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google+ is not for your common person.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think this is why Google+ will never be a competitor to Facebook, and will be abandoned by Google, in the future, like so many other projects that flopped.  Google+ will never gain the kind of moment Facebook did because it’s not fun to use for common people.  Sure there’s games to keep you entertained, but social networking isn’t about games.&lt;/p&gt;
&lt;p&gt;Sharing content is a superset of social networking, not the other way around.&lt;/p&gt;
&lt;p&gt;There needs to be a true Facebook competitor, oriented around people and not content.  Personally, I’m hoping that &lt;a title="Diaspora" href="https://joindiaspora.com/"&gt;Diaspora&lt;/a&gt; can help me break free from Facebook.  I would love to share some aspects of my life with family, friends, and strangers online, but I want to do it in such a way where I have full control over it.  Facebook makes me nervous as they continue to push the boundaries of the definition of privacy.&lt;/p&gt;</description><link>http://kevingh.com/post/12034811509</link><guid>http://kevingh.com/post/12034811509</guid><pubDate>Fri, 28 Oct 2011 12:00:12 -0400</pubDate><category>technology</category></item><item><title>Google+ Needs To Catch Up</title><description>&lt;p&gt;&lt;small&gt;&lt;strong&gt;Updated:&lt;/strong&gt; My comment about submitting photos through the web UI was incomplete. I meant using my webcam to submit pictures.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;After having used Google+ for about two days, I can safely say I would really enjoy it were it not lacking some basic functionality.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The ability to   
&lt;ul&gt;&lt;li&gt;mute individual people&lt;/li&gt;
&lt;li&gt;mute a whole circle&lt;/li&gt;
&lt;li&gt;mute GIFs posts&lt;/li&gt;
&lt;li&gt;create a custom stream&lt;/li&gt;
&lt;li&gt;submit photos directly through the web UI using my webcam&lt;/li&gt;
&lt;li&gt;change submission visibility after submitting&lt;/li&gt;
&lt;li&gt;hide submissions shared by an individual person&lt;/li&gt;
&lt;li&gt;share directly with another person  
&lt;ul&gt;&lt;li&gt;This is something that is already offered by Facebook. It’s basically just leaving a wall post on somebody else’s wall.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;These are not features.  Features are extras on top of an already usable service.  Functionality is something basic required to make the service usable.  When I have an entire stream plastered with animated GIFs, Google+ no longer becomes usable.  There will always be one or two people who you want to maintain an association with, but have no desire to see their submissions.  Others just decide to share too much.&lt;/p&gt;
&lt;p&gt;As for features, here are a few that I hope Google will implement:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Filter out submission types from a person&lt;/li&gt;
&lt;li&gt;Vanity URL&lt;/li&gt;
&lt;li&gt;Twitter and Facebook integration&lt;/li&gt;
&lt;li&gt;Share items straight from Google Reader&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Also, there happens to be a problem with the Android and iOS apps for Google Apps members.  The one I have personally experienced is the iOS one.  The app will go through the login process, but then state that you need an invitation to use Google+.  As a result, I cannot share anything easily using my phone.&lt;/p&gt;
&lt;p&gt;If anything of the things I mentioned have already been done, Google has not made it easy to find or use.  Not even a Google search helped.&lt;/p&gt;</description><link>http://kevingh.com/post/12034288464</link><guid>http://kevingh.com/post/12034288464</guid><pubDate>Fri, 28 Oct 2011 11:41:00 -0400</pubDate><category>technology</category></item><item><title>How Politicians Work?</title><description>&lt;p&gt;Sure, it may seem obvious to many, but I’m still young and learning.&lt;/p&gt;
&lt;p&gt;Politicians spend most of their career (which it shouldn’t be) pursuing the interests of the people who paid for their election campaign.  Only the months prior to the next election cycle do they even attempt to feign interest on fulfilling their campaign promises.  The gimmick is that they start to push for things, but promise to follow through if they are re-elected.&lt;/p&gt;
&lt;p&gt;And the cycle continues.&lt;/p&gt;</description><link>http://kevingh.com/post/11916647321</link><guid>http://kevingh.com/post/11916647321</guid><pubDate>Tue, 25 Oct 2011 15:52:22 -0400</pubDate><category>politics</category></item><item><title>
It’s amazing to me how many people think that voting to...</title><description>&lt;img src="http://29.media.tumblr.com/tumblr_ltdev8rlQt1r559h8o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;
&lt;p&gt;It’s amazing to me how many people think that voting to have government give poor people money is compassion.  Helping poor and suffering people &lt;strong&gt;yourself&lt;/strong&gt; is compassion.  Voting our government to use guns to give money to help poor and suffering people is immoral self-righteous bullying laziness.  People need to be fed, medicated, educated, clothed, and sheltered.  If we’re compassionate, we’ll help them, but you get no moral credit for forcing other people to do what you think is right.  There is a great joy in helping people, but no joy in doing it at gunpoint.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Penn Jillette (via &lt;a title="Penn Jillette gets it." target="_blank" href="http://www.reddit.com/r/Libertarian/comments/linno/penn_jillette_gets_it/"&gt;Reddit&lt;/a&gt;)&lt;/p&gt;</description><link>http://kevingh.com/post/11694761954</link><guid>http://kevingh.com/post/11694761954</guid><pubDate>Thu, 20 Oct 2011 11:25:56 -0400</pubDate><category>Politics</category><category>Life</category></item><item><title>"The real world won’t care as much about your self-esteem as much
as your school does. ..."</title><description>“The real world won’t care as much about your self-esteem as much&lt;br/&gt;
as your school does.  It’ll expect you to accomplish something before you&lt;br/&gt;
feel good about yourself. […]”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a title="Some rules kids won't learn in school" target="_blank" href="http://www.ime.usp.br/~rbrito/teaching/mack/loo/interessante.html"&gt;Charles J. Sykes&lt;/a&gt;&lt;/em&gt;</description><link>http://kevingh.com/post/11672217108</link><guid>http://kevingh.com/post/11672217108</guid><pubDate>Wed, 19 Oct 2011 19:44:16 -0400</pubDate><category>Personal</category></item><item><title>Back to Tumblr</title><description>&lt;p&gt;As I have been reminded, time and time again, the only way you’ll learn something is if you get hurt.&lt;/p&gt;
&lt;p&gt;Well, I’m not actually hurt, but I am very annoyed.  Posterous hasn’t made much progress on the customization front, which I was hoping would catch up to what Tumblr has to offer.  Tumblr on the other had has made vast improvements on its user interface.  Specifically, their blog customization tool.  I only stumbled on this by accident, when I was helping my father setup a new blog.&lt;/p&gt;
&lt;p&gt;I would have imported all my original posts from Posterous, but Tumblr does not offer such a tool and I don’t have the time to manually enter them in.  So forgive me for the bunch of broken links to this site!&lt;/p&gt;</description><link>http://kevingh.com/post/11671951335</link><guid>http://kevingh.com/post/11671951335</guid><pubDate>Wed, 19 Oct 2011 19:38:29 -0400</pubDate><category>Personal</category></item></channel></rss>

