<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Matthew&#039;s Personal Blog &#187; Technology</title>
	<atom:link href="http://matthew.komputerwiz.net/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://matthew.komputerwiz.net</link>
	<description>My little place on the web</description>
	<lastBuildDate>Sun, 29 Jan 2012 04:57:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Symfony Forms, Entities, and Validation</title>
		<link>http://matthew.komputerwiz.net/2012/01/symfony-forms-entities-and-validation/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=symfony-forms-entities-and-validation</link>
		<comments>http://matthew.komputerwiz.net/2012/01/symfony-forms-entities-and-validation/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 01:27:34 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=450</guid>
		<description><![CDATA[In a previous post, I discussed some of the design patterns behind Symfony 2’s Form component that make it so fast and stable. As requested by Luis Cordova from Craft it Online, I have done further research into how Symfony 2 deals with forms, validation, and entities. Much of the information in this post can [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://matthew.komputerwiz.net/2011/07/symfony-2-form-design-patterns/" title="Symfony 2 Design Patterns">previous post</a>, I discussed some of the design patterns behind Symfony 2’s <strong>Form</strong> component that make it so fast and stable. As requested by Luis Cordova from <a href="http://www.craftitonline">Craft it Online</a>, I have done further research into how Symfony 2 deals with forms, validation, and entities. Much of the information in this post can be learned from the <a href="http://www.symfony.com/doc/current/book/">online documentation</a>, and I highly recommend reading it.</p>
<p><!-- more --></p>
<h3>Forms (<code>Symfony\Component\Form</code>)</h3>
<p>Forms are created through a <strong>Factory</strong> service (<code>form.factory</code>), which subsequently uses a <strong>Builder</strong> object, to automate the creation of fields and assembly of the <code>Form</code> <strong>Composite</strong> tree. The best way to illustrate and explain this process is to walk through an example usage scenario.</p>
<p><code style="font-size: 0.9em; color: #900;">$myForm = $this->createForm(new MyType(), $entity, array(...));</code></p>
<p>Symfony’s <code>Controller</code> class (<code>Symfony\<wbr />Bundle\<wbr />FrameworkBundle\<wbr />Controller\<wbr />Controller</code>) defines the <code>createForm</code> method shortcut, which accepts the following parameters: a string identifier or an instance of a <code>Type</code> class, an entity to which the form will bind its information, and an array of options to pass to the <code>Type</code>’s <code>buildForm()</code> function. The last two parameters, the entity and the options array, are optional. If no entity is provided, then the data can be retrieved by calling <code>$form->getData()</code> after binding.</p>
<p><code>Controller::createForm()</code> delegates to <code>FormFactory::<wbr />create()</code>. <code>FormFactory</code> acts as a <strong>Façade</strong> to the Form component by automating and abstracting much of the creation process. <code>FormFactory::<wbr />create()</code> then delegates to a <code>FormBuilder</code> object, which creates the form recursively for each of the nested <code>Type</code> objects. Afterwards, the <code>FormFactory</code> returns the completed Form tree by calling <code>$builder->getForm()</code>.</p>
<p><code style="font-size: 0.9em; color: #900;">class MyType extends AbstractType {...}</code></p>
<p>This is the definition of a <code>Type</code> class that will control how a node on the <code>Form</code> tree will be constructed by the builder. Note that Symfony 2 discourages users from directly defining <code>Form</code> subclasses: using the builder reduces dependency on the <code>Form</code>’s interface and allows its internal structure to vary as Symfony evolves without affecting the user’s code.</p>
<p><code style="font-size: 0.9em; color: #900;">public function buildForm(FormBuilder $bldr, array $opts) {...}</code></p>
<p>This function is a member of the <code>MyType</code> class and is the callback for when a node of type MyType is created. The form factory passes a builder to this callback so this node’s children can be created (even recursively, if necessary by calling <code>$fieldOrSubForm->buildForm($bldr, array(...))</code>). The options are passed from the parent node (or the constructor if this particular <code>Type</code> object was instantiated) and can be used to dynamically configure form elements.</p>
<p><code style="font-size: 0.9em; color: #900;">$bldr->add('name', 'text', array('required' => true));</code></p>
<p>This statement would reside in the definition of <code>MyType::buildForm()</code> and gives me the opportunity to explain how the builder works. The builder’s <code>add</code> function creates a child on the current Form node with the given arguments: name, type, options.</p>
<ul>
<li>The name acts as an identifier for the child (and the input field’s name attribute when rendered as HTML), much like the key to a PHP array value.</li>
<li>The type is optional and can be either a string or an instance of Form (or any of its subclasses, including Type objects). If omitted, the builder can guess the type using doctrine metadata. If a string is given for the type, the builder uses it to look up the type class in a registry of built-in Type classes (all of which are defined in <code>Extension\CoreType</code>). I cannot determine whether the registry of built-in types follows the <strong>Flyweight</strong> pattern or the <strong>Prototype</strong> pattern (or a combination of both), but that’s not important now. If a Type instance is given, the builder can skip the lookup step and process it immediately. This is how one can embed a form within a form in Symfony 2.</li>
<li>The options array will be used for configuration in the child node’s <code>buildForm()</code> method. Note that the ‘required’ option in the code example above is <em><strong>NOT</strong></em> a part of the validation model. Rather, it is an HTML5 attribute that is added to the rendered field for browser-based, client-side validation. This is not meant to be used in place of server-side validation as the ‘required’ attribute is not supported by all browsers.</li>
</ul>
<p>When the builder creates a child node, it sets the new node’s parent reference to the current node that called for the child’s construction. The builder is actually a lot more complicated than how I have explained it here: it uses lazy loading so that it does not create any child objects until it absolutely has to. Calling <code>$builder->getForm()</code> triggers this mechanism. The resulting <code>Form</code> object will allow for data binding and validation and acts as a wrapper for the data object underneath.</p>
<p><code style="font-size: 0.9em; color: #900;">return array('view' => $form->createView());</code></p>
<p>Because the <code>Form</code> object only serves as a wrapper to an entity, array, or other data form, it cannot be rendered into HTML as-is. To resolve this, the controller passes an instance of <code>FormView</code> to the templating engine at render-time. A <code>FormView</code> is a PHP abstraction of the HTML input tags and provides a way for the templating engine to iterate over the fields in the form.</p>
<p>In summary, the <code>FormFactory</code> is the main interface for the Form component; the <code>FormBuilder</code> is responsible for adding fields (Types) to the Form object being built; the <code>Form</code> is a lightweight composite wrapper for the data object that stores the information, and the <code>FormView</code> encapsulates information pertinent to rendering HTML input fields.</p>
<h3>Entities</h3>
<p>Dynamic web applications depend heavily on storing and retrieving data. Symfony has <a href="http://symfony.com/doc/2.0/reference/model.html#paradigm-shift" title="Introduction to the "Model" - Paradigm Shift">altered the traditional norm</a> in favor of Domain Driven Design.</p>
<p>Entities are nothing more than plain-old PHP classes that mimic the properties and behavior of real-life objects. They do not extend any base Entity class and are thus entirely self-contained. This is another reason Symfony is so fast and lightweight. Entities help the Symfony framework feel more like working with a statically typed object-oriented language like Java or C++.</p>
<p>Entities are persisted by the Doctrine ORM. The ORM understands how to communicate with the entities because of the metadata information associated with the fields to be saved and by conventional getter and setter names. I prefer using annotations because I can define mapping and validation metadata for each field in the same file. I am also amused by the fact that Doctrine (and other Symfony components) can read and cache the PHPdoc <em>comments</em> that are ignored by the PHP interpreter. Symfony also provides ways to configure entity metadata using YAML, XML, or PHP files.</p>
<h3>Validation (<code>Symfony\Component\Validator</code>)</h3>
<p>Validation, the act of checking data legitimacy, has traditionally been closely integrated with forms: when a user submits data, a validation script checks that all required fields have been filled, certain numeric or date values are within a predetermined range, and email addresses are correctly formatted. Validation also applies on a coding level: a RESTful web service could submit information directly into the controller without the use of an HTML form; unit tests populate entities directly through setter methods.</p>
<p>Validation must be made available to both Forms and Entities. Symfony 2 solves this problem by extracting the validation subsystem into its own Validator component. According to the <a href="http://www.symfony.com/doc/current/book/validation.html">Symfony 2 online documentation</a>, “This component is based on the <a href="http://jcp.org/en/jsr/detail?id=303">JSR303 Bean Validation specification</a>.”</p>
<p>Like Doctrine, the Validator component knows how to validate an object based on metadata, which can be defined on the Entity using Annotations or in separate YAML, XML, or PHP configuration files. Regardless of how the metadata is defined, the Validator caches it for faster performance.</p>
<p>There are two ways to use the Validator component: either directly or through the Form component. Using it directly is very straightforward. From the controller level, the Validator service can be obtained by calling <code>$this->get('validator')</code>. Inside a Unit test, the Validator is created with <code>ValidatorFactory::buildDefault()->getValidator()</code>. Once we have a Validator, we can pass it an entity to be validated:</p>
<p><code style="font-size: 0.9em; color: #900;">$validator = $this->get('validator');<br />
$errors = $validator->validate($entity);</code></p>
<p>When binding data to a Form, the Form object automatically transfers the data to the underlying entity object and calls the Validation component to check it.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2012/01/symfony-forms-entities-and-validation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony Design Patterns</title>
		<link>http://matthew.komputerwiz.net/2011/07/symfony-2-form-design-patterns/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=symfony-2-form-design-patterns</link>
		<comments>http://matthew.komputerwiz.net/2011/07/symfony-2-form-design-patterns/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 01:06:28 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=439</guid>
		<description><![CDATA[As recommended by Dr. Andreas Klappenecker, my CSCE 222 professor last semester, I have been reading through the Gang of Four’s Design Patterns: Elements of Reusable Object-Oriented Software book this summer. In agreement with Dr. Klappenecker, this is a must-read for anyone who works with code. I’ve previously written about the Symfony 2 PHP framework, [...]]]></description>
			<content:encoded><![CDATA[<p>As recommended by <a href="http://faculty.cs.tamu.edu/klappi/">Dr. Andreas Klappenecker</a>, my CSCE 222 professor last semester, I have been reading through the <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612">Gang of Four’s <em>Design Patterns: Elements of Reusable Object-Oriented Software</em></a> book this summer. In agreement with Dr. Klappenecker, this is a must-read for anyone who works with code.</p>
<p>I’ve <a href="http://matthew.komputerwiz.net/2011/06/symfony-2-walkthrough/">previously written</a> about the <a href="http://www.symfony.com">Symfony 2</a> PHP framework, and as the release date draws near (currently in RC6—it <em>has</em> to be soon), I’ve been trying to help the Symfony developers solve user-reported issues on their <a href="http://www.github.com/symfony/symfony/">public repository</a>. Many issues are categorized under “Forms”, so I’ve been trying to understand how Symfony’s Form component works. I had attempted to do this prior to reading <em>Design Patterns</em> and was very confused by all of the abstraction and delegation to other classes. Now that I understand more about software design, it’s much easier to fit the pieces together:</p>
<p>In Symfony 2, the Form component is a <strong>Factory Façade</strong> object that provides access to a <strong>Composite</strong> object (enabling embedded forms) that is created via a <strong>Builder</strong> that delegates type-specific configuration to <strong>Flyweight</strong> Type objects… These are just a few of the simple design patterns that I’ve read about!</p>
<p>There are many other design patterns used throughout the Symfony framework: a huge indication that it is well-designed. This is most likely the reason behind its incredible speed and low memory footprint.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2011/07/symfony-2-form-design-patterns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Symfony 2 Walkthrough</title>
		<link>http://matthew.komputerwiz.net/2011/06/symfony-2-walkthrough/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=symfony-2-walkthrough</link>
		<comments>http://matthew.komputerwiz.net/2011/06/symfony-2-walkthrough/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 04:59:30 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Websites]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=412</guid>
		<description><![CDATA[Sensio unveiled the first preview releases of the Symfony 2 framework a while ago (note the capital ‘S’). I couldn’t help but think, great, and just after I was getting the hang of symfony 1.4. At the time I was converting from CakePHP to symfony in search of more flexible routing, but even now I [...]]]></description>
			<content:encoded><![CDATA[<p>Sensio unveiled the first preview releases of the Symfony 2 framework a while ago (note the capital ‘S’). I couldn’t help but think, <em>great, and just after I was getting the hang of symfony 1.4</em>. At the time I was converting from CakePHP to symfony in search of more flexible routing, but even now I appreciate Symfony 2 even more than the symfony 1.4 legacy version.</p>
<p>In general, Symfony 2 is much lighter and <em>faster</em> than all of the other PHP frameworks I’ve used (including CakePHP, Zend, and CodeIgnitor).  At the time of writing, the current version is 2.0.0 Beta 3, and as I have learned more about this revolutionary redesign, I have come to understand more about the inner workings of the Internet rather than relying on “automagic” components. Symfony 2 offers a way of dealing with HTTP requests and responses in a familiar, object-oriented, MVC fashion. I won’t bother to explain the exact details, but I will summarize:</p>
<p>An HTTP Request begins its journey when the user performs an action on a web page. For simplicity, suppose the user clicks a link to an “About” page and makes a simple GET request. In a Symfony 2 application, the request is caught by the front controller, a single file that handles all requests and passed to a Kernel for processing.</p>
<p>The Kernel analyzes the request and matches it to a route defined in a cached configuration file. If the route matches a firewall pattern protecting a certain resource, then the user may be asked to provide authentication credentials (i.e. redirected to a login page). The route redirects the response and its parameters to a controller action that resides in a “Bundle”</p>
<p>The Controller handles the request and performs any logic to gather information from a database (if necessary). At this point, the “Model” paradigm has been replaced by <em>Entities</em>—plain-old standalone PHP objects that can be saved (or persisted) to a database by an external entity management service (in Symfony’s case, Doctrine). Symfony 2 also provides support for the Document storage design popularized by the <a href="http://www.mongodb.org">MongoDB</a> database engine.</p>
<p>After performing all necessary logic and processing, the action returns a response object, which could be anything from a redirection to a JSON file to an HTML page. This response is handed back to the client’s web browser. </p>
<p>Traditionally, HTML responses are rendered in templates. Symfony 2 uses a new templating engine called <a href="http://www.twig-project.org">Twig</a>, which uses syntax highly similar to the Python <a href="http://www.djangoproject.com">Django</a> framework. The Twig is rendered as PHP and then cached for easy reuse.</p>
<p>Without any additional logic, a simple GET request in Symfony 2 takes less than 50 milliseconds to process, render, and return a response. A complex POST request that persists information to a database and fetches more information takes slightly longer: usually less than 100 milliseconds.</p>
<p>The <a href="http://symfony.com/doc/current/book/index.html">Symfony 2 documentation</a> offers more information, and I highly recommend reading the first couple parts it even if you aren’t a web developer. If, on the other hand, you are a web developer, Symfony is insanely fast, easy to learn, and powerful/flexible enough to customize your own core components.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2011/06/symfony-2-walkthrough/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LaTeX: More than Math</title>
		<link>http://matthew.komputerwiz.net/2011/01/latex-more-than-math/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=latex-more-than-math</link>
		<comments>http://matthew.komputerwiz.net/2011/01/latex-more-than-math/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 18:55:44 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[College]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[college]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[course]]></category>
		<category><![CDATA[document]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[libreoffice]]></category>
		<category><![CDATA[logic]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[word processor]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=302</guid>
		<description><![CDATA[These first weeks of school have gone by so fast: 16 hours of coursework will definitely keep anyone busy. Nonetheless, CSCE 221 “Data Structures and Algorithms” and its co-curricular, CSCE 222 “Discrete Structures for Computing”, have definitely proven to be the most interesting classes I have taken thus far: CSCE 222 is a “math” course, [...]]]></description>
			<content:encoded><![CDATA[<p>These first weeks of school have gone by so fast: 16 hours of coursework will definitely keep anyone busy.  Nonetheless, CSCE 221 “<em>Data Structures and Algorithms</em>” and its co-curricular, CSCE 222 “<em>Discrete Structures for Computing</em>”, have definitely proven to be the most interesting classes I have taken thus far: CSCE 222 is a “math” course, but it involves logic more than arithmetic, algebra, and calculus; and CSCE 221 is a course on abstract (theoretical) data storage and manipulation, so there is very little actual programming involved. Most of what I write now is pseudocode, and the reason for this is so the algorithms are language-independent.</p>
<p>Since both of these courses require special formatting and special characters, I’ve been delving more into the <a href="http://www.latex-project.org/">LaTeX</a> <sup><a name="footnote-latex-ref" href="#footnote-latex">[1]</a></sup> markup language for taking notes.  Writing raw LaTeX in a plain text editor has proven to be more straightforward and more powerful than using a WYSIWYG word processor (like Microsoft Word or LibreOffice <sup><a name="footnote-libreoffice-ref" href="#footnote-libreoffice">[2]</a></sup> Writer).  Granted, LaTeX has a <a href="http://www.wikibooks.org/wiki/LaTeX" title="LaTeX Manual on Wikibooks">steep learning curve</a>, but the compiled output looks extremely uniform and professional: LaTeX is to printed documents as HTML and CSS are to web pages.</p>
<p>Because LaTeX markup is plain text, it can be shared and tracked using a versioning system like Subversion or Git.  The only other word processing system (that I’m aware of) that offers this kind of collaborative editing is <a href="http://docs.google.com">Google Docs</a>.  Microsoft Word, Rich Text, and Open Document file formats are all stored in either a binary package or cryptic markup—both of which are hard to track with versioning/collaborative software.  LaTeX, on the other hand, has human-readable source code.</p>
<p>By default, the <tt>latex</tt> executable outputs to DVI files, but LaTeX packages like <a href="http://www.tug.org/texlive/">TeX Live</a> include <tt>pdflatex</tt>, which outputs to more universally-accepted PDF files. For more information about obtaining a distribution/build for your system, visit the <a href="http://www.latex-project.org">LaTeX home page</a>.</p>
<p>I understand that LaTeX is not for everyone.  Some people do not need the fine-tuned control that LaTeX offers—in which case Microsoft Office, LibreOffice, or another word processor would better suit that person’s needs.  Some might not have the time required to learn LaTeX.  Nonetheless, I recommend it to anyone looking for a powerful markup-based word processing tool for writing books, articles, reports, or even letters.</p>
<p>Until next time, Gig ‘em and God bless!</p>
<h3>Footnotes</h3>
<ol>
<li><a href="#footnote-latex-ref" name="footnote-latex">↑</a> I had mentioned LaTeX before when setting up <a href="http://matthew.komputerwiz.net/2010/10/unix-or-not-installing-mediawiki-on-mac-os-x/">math rendering in MediaWiki</a>, but the packages that power this feature in MediaWiki aren’t even a snowflake on the tip of the iceberg! For a good example of what LaTeX can do, look at <em>any</em> textbook: symbols, math-type, columns, listings, images, figures, graphs, charts, plots, diagrams, tables, indices, appendices, bibliographies, cross-references, chapters, sections, typesettings, formatting, whatever—LaTeX can do all of it (and still even more).</li>
<li><a href="#footnote-libreoffice-ref" name="footnote-libreoffice">↑</a> When Oracle acquired Sun Microsystems and all of their products (including OpenOffice.org), the founders of the OpenOffice.org project decided to form an independent organization—<a href="http://www.documentfoundation.org">The Document Foundation</a>.  However, Oracle has not allowed them to continue using the name “OpenOffice.org”.  After improvements and rebranding, The Document Foundation released <a href="http://www.libreoffice.org">LibreOffice 3.3</a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2011/01/latex-more-than-math/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Very Special Operating System</title>
		<link>http://matthew.komputerwiz.net/2010/12/a-very-special-operating-system/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-very-special-operating-system</link>
		<comments>http://matthew.komputerwiz.net/2010/12/a-very-special-operating-system/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 19:51:12 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=239</guid>
		<description><![CDATA[Mac OS X has received a lot of love from me recently, and, as one of my friends was so kind to point out, there is another operating system that doesn’t get enough credit at times. This operating system is much more compatible with all computers (even prehistoric ones), it has incredible boot times, it [...]]]></description>
			<content:encoded><![CDATA[<p>Mac OS X has received a lot of love from me recently, and, as one of my friends was so kind to point out, there is another operating system that doesn’t get enough credit at times.  This operating system is much more compatible with all computers (even prehistoric ones), it has incredible boot times, it has a plethora of available programs waiting for you to give the order to install, it was built <em>by</em> people who know computers <em>for</em> people who know computers, it powers the Internet and is therefore even more widely distributed than Windows, and above all it’s free.<br />
Yes—I’m talking about Linux.<span id="more-239"></span></p>
<p>I have been a Linux fan for several years, and I still use it on a regular basis: all of my family’s Windows computers can dual-boot into Linux (<a href="http://www.ubuntu.com">Ubuntu</a> for easy computing, <a href="http://www.archlinux.org">ArchLinux</a> for powerful custom installations). Additionally, I have a dedicated server at my house running Ubuntu Server 10.10 (terminal-only; no <abbr title="Graphical User Interface">GUI</abbr>) that serves as:</p>
<ul>
<li>a print server,</li>
<li>a file server for my local network,</li>
<li>an <abbr title="Internet Relay Chat">IRC</abbr> server,</li>
<li>a web server for many sites including my <a href="http://notes.komputerwiz.net:8000">notes</a>,</li>
<li>a Subversion server for all of my coding projects, and</li>
<li>a <abbr title="Secure Shell">SSH</abbr> server for remote administration.</li>
</ul>
<p>The server automatically updates and remotely backs itself up, so maintenance is almost non-existant. I find it impressive—if not mind-boggling—that the “powerful” computer that performs these feats is an obscenely old 3.2 GHz single-core Compaq Presario with less than 1 GB of RAM that was built before HP even considered acquiring Compaq.</p>
<p>I recall a time before the Linux server in which printing to a shared printer was difficult &amp; slow—if it even worked—and could only be done from Windows.  It would seem that Linux solved all of my networking problems and provided a whole bunch of goodies in the process…  I wonder why I didn’t set up this server earlier.</p>
<p>What about you? Do you use Linux? If so, what is (are) your favorite distro(s)?</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2010/12/a-very-special-operating-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X Hosting Unleashed</title>
		<link>http://matthew.komputerwiz.net/2010/12/mac-hosting-unleashed/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mac-hosting-unleashed</link>
		<comments>http://matthew.komputerwiz.net/2010/12/mac-hosting-unleashed/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 15:19:00 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=215</guid>
		<description><![CDATA[I covered Mac OS X web hosting before when I wrote about <a href="http://matthew.komputerwiz.net/2010/10/unix-or-not-installing-mediawiki-on-mac-os-x/">installing MediaWiki on Mac OS X</a>, but in that tutorial, I used XAMPP, a preconfigured Server Bundle, instead of the existing Apache installation that all Mac OS X installations have by default.  At the time, I was somewhat unaware of all the software that comes with Mac OS X.  As a courtesy to fellow newbie Mac-based developers like myself, I have included a list of bundled software.]]></description>
			<content:encoded><![CDATA[<p>I covered Mac OS X web hosting before when I wrote about <a href="http://matthew.komputerwiz.net/2010/10/unix-or-not-installing-mediawiki-on-mac-os-x/">installing MediaWiki on Mac OS X</a>, but in that tutorial, I used XAMPP, a preconfigured Server Bundle, instead of the existing Apache installation that all Mac OS X installations have by default.  At the time, I was somewhat unaware of all the software that comes with Mac OS X.  As a courtesy to fellow newbie Mac-based developers (like myself), I have included a list of bundled server software.<span id="more-215"></span></p>
<p>The full path to executables can be ascertained with the <tt>which</tt> command (e.g. <tt>which apachectl</tt>)</p>
<h3>Apache 2.2</h3>
<p><strong>Executables:</strong> <tt>apachectl</tt>, <tt>httpd</tt><br />
<strong>Configuration:</strong> <tt>/private/etc/apache2/httpd.conf</tt></p>
<h3>PHP 5.3.3</h3>
<p><strong>Executable:</strong> <tt>php</tt><br />
<strong>Configuration:</strong> <tt>/private/etc/php.ini</tt></p>
<p>PHP is disabled by default, but <a href="http://foundationphp.com/tutorials/php_leopard.php">relatively easy to enable</a>.</p>
<h3>MySQL 5 (Mac OS X Server Edition Only)</h3>
<p><strong>Executable:</strong> <tt>mysql</tt>, <tt>mysqladmin</tt><br />
<strong>Configuration:</strong> <tt>/private/etc/my.cnf</tt></p>
<p>MySQL 5 comes bundled with Mac OS X Server, but the Apple Developer website explains how to <a href="http://developer.apple.com/internet/opensource/osdb.html">install MySQL on Mac OS X</a> for the rest of us.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2010/12/mac-hosting-unleashed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Direction, New Theme</title>
		<link>http://matthew.komputerwiz.net/2010/12/new-direction-new-theme/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=new-direction-new-theme</link>
		<comments>http://matthew.komputerwiz.net/2010/12/new-direction-new-theme/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 04:25:56 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Websites]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=188</guid>
		<description><![CDATA[Typography and elegance add a lot to a website’s content. Since adopting Mac OS X, I’ve developed an eye for smooth, monochromatic, minimalist themes that really make the focal content stand out. Craving ye olde Webster’s classy feel, I’ve been on the hunt for a more elegant theme for quite some time now. I also [...]]]></description>
			<content:encoded><![CDATA[<p>Typography and elegance add a lot to a website’s content.  Since <a href="http://matthew.komputerwiz.net/2010/08/the-ultimate-hypocrisy/">adopting Mac OS X</a>, I’ve developed an eye for smooth, monochromatic, minimalist themes that really make the focal content stand out.  Craving ye olde Webster’s classy feel, I’ve been on the hunt for a more elegant theme for quite some time now.</p>
<p>I also find that I write long blog posts every once in a long while.  In order to boost my blogging habits, I will try to post short, meaningful posts at a greater frequency, so I’ve also been looking for a theme that makes the most out of a little content.  Full-width themes with small fonts make my blog feel empty, and adding links to the sidebar and footer to take up space make the site feel like “information overload”.  </p>
<p>I believe I have finally found what I have been looking for:  <em>The Erudite</em> by Soma Design fits my taste perfectly.  I can’t wait to start writing!</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2010/12/new-direction-new-theme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UNIX or Not? Installing MediaWiki on Mac OS X</title>
		<link>http://matthew.komputerwiz.net/2010/10/unix-or-not-installing-mediawiki-on-mac-os-x/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=unix-or-not-installing-mediawiki-on-mac-os-x</link>
		<comments>http://matthew.komputerwiz.net/2010/10/unix-or-not-installing-mediawiki-on-mac-os-x/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 06:40:29 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[advanced]]></category>
		<category><![CDATA[instructions]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[MacPorts]]></category>
		<category><![CDATA[MediaWiki]]></category>
		<category><![CDATA[notes]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[XAMPP]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=148</guid>
		<description><![CDATA[I’ve been taking notes on my MacBook using a local MediaWiki installation (there’s a public version at http://notes.komputerwiz.net:8000). Here’s a list of the necessary packages: Apache, MySQL, PHP, ImageMagick, LaTeX, Inkscape, MediaWiki, OCaml, Make, and G++ Note that I’m running these packages on Mac OS X. Also note that they are GNU Linux packages. (If [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been taking notes on my MacBook using a local MediaWiki installation (there’s a public version at <a href="http://notes.komputerwiz.net:8000">http://notes.komputerwiz.net:8000</a>). Here’s a list of the necessary packages:</p>
<p><a title="Apache HTTP Server" href="http://httpd.apache.org">Apache</a>, <a title="MySQL Database Server" href="http://dev.mysql.com">MySQL</a>, <a title="PHP: Hypertext Preprocessor" href="http://www.php.net">PHP</a>, <a title="ImageMagick Image manipulation tools" href="http://www.imagemagick.org">ImageMagick</a>, <a title="LaTeX Markup Language (for rendering math equations/formulas in MediaWiki)" href="http://www.latex-project.org/">LaTeX</a>, <a title="Inkscape SVG rendering plugin" href="http://www.inkscape.org">Inkscape</a>, <a href="http://www.mediawiki.org">MediaWiki</a>, <a title="OCaml Programming Language" href="http://caml.inria.fr/ocaml/">OCaml</a>, <a title="GNU Makefile interpreter" href="http://www.gnu.org/software/make/">Make</a>, and <a title="GNU C++ Compiler" href="http://www.gnu.org/software/gcc/">G++</a></p>
<p>Note that I’m running these packages on Mac OS X. Also note that they are <em>GNU Linux</em> packages. (If you aren’t laughing yet, consult the infinite acronyms and trivia below)</p>
<p>GNU stands for “<strong>G</strong>NU’s <strong>N</strong>ot <strong>U</strong>NIX” <span style="color:#999;">‘s Not UNIX</span> <span style="color:#bbb;">‘s Not UNIX</span> <span style="color:#ddd">…</span><br />
Linux stands for “<strong>L</strong>inux <strong>I</strong>s <strong>N</strong>ot <strong>U</strong>NIX” <span style="color:#999;">Is Not UNIX</span> <span style="color:#bbb;">Is Not UNIX</span> <span style="color:#ddd">…</span></p>
<p>Mac OS X is built on a Berkley UNIX BSD Subsystem, which means that it is a <strong>UNIX operating system</strong>; so the doubly-declared <strong>“Not UNIX”</strong> packages listed above are running happily on a UNIX machine… Just another reason why my MacBook is <a title="The Ultimate Hypocrisy" href="http://matthew.komputerwiz.net/2010/08/the-ultimate-hypocrisy/">the ultimate hypocrisy</a>.</p>
<hr />
<h3>Here’s how I did it (and so can you):</h3>
<div style="background:red;color:#fff;font-weight:bold;padding:5px;font-size:1.1em;letter-spacing:1px;margin-bottom:1em;">WARNING: Technological, geeky content. Proceed with caution!</div>
<p>You’ll need the following packages.  Download them now if you want.</p>
<ul>
<li><a title="XAMPP Beta" href="http://www.apachefriends.org/en/xampp-beta.html">XAMPP</a> server bundle (get the beta; it has PHP 5.3.2)</li>
<li><a title="MediaWiki CMS Framework" href="http://www.mediawiki.org">MediaWiki</a> <abbr title="Content Management System">CMS</abbr> Framework</li>
<li><a title="Apple Developer Tools" href="http://developer.apple.com/technologies/xcode.html">Xcode</a> Apple Developer Tools (free download after <a title="Apple Developer Free Registration" href="http://developer.apple.com/programs/register/">free registration</a>; includes <strong>make</strong> and <strong>g++</strong>)</li>
<li><a title="MacPorts Package Manager for Mac OS X" href="http://www.macports.org/">MacPorts</a> package manager (similar to aptitude/zypper/YaST/pacman on Linux)</li>
<li><a title="Inkscape SVG plugin" href="http://www.inkscape.org">Inkscape</a> SVG Plugin (optional)</li>
</ul>
<h4>Install XAMPP Server</h4>
<ol>
<li>Extract to <tt>/Applications</tt> (or wherever you want to install it.<br />From now on, I’ll refer to this directory as <tt>$XAMPP</tt></li>
<li>Run the following command in Terminal:<br />
<blockquote><code>$XAMPP/xamppfiles/xampp security</code></p></blockquote>
</li>
<li>Launch Apache and MySQL from the control panel and/or load their daemons available in <tt>$XAMPP/xamppfiles/bin/</tt> at startup</li>
<li>I configured XAMPP to use a <a title="Apache Virtual Host configuration" href="http://httpd.apache.org/docs/1.3/vhosts/">virtual host</a> to run MediaWiki, but it’s not necessary</li>
<li>(Optional) Add the following to <tt>/etc/hosts</tt> to make http://notes.local point to MediaWiki:<br />
<blockquote><code>127.0.0.1 notes.local</code></p></blockquote>
</li>
<li><a name="apache-user"></a>By default, Apache runs as ‘nobody’. Edit <code>$XAMPP/etc/httpd.conf</code> to run Apache as your user (short name).<br /><span style="color:#900;">THIS IS A MAJOR SECURITY RISK IF YOUR SERVER IS PUBLIC</span>, but it allows Apache to run files without much configuration.<br />Alternatively, follow <a href="http://www.mediawiki.org/wiki/Manual_talk:Running_MediaWiki_on_Mac_OS_X#Mathematics">these instructions</a></li>
</ol>
<h4>Install MediaWiki</h4>
<ol>
<li>Extract to <tt>$XAMPP/htdocs</tt> (or the virtual host document root).  I’ll refer to the MediaWiki root directory (e.g. <tt>/Applications/XAMPP/htdocs/w</tt>) as $MediaWiki from now on. </li>
<li>(Optional) Set up <a title="MediaWiki Short URLs" href="http://www.mediawiki.org/wiki/Manual:Short_URL/wiki/Page_title_--_no_root_access">pretty URLs</a></li>
<li>Create the MySQL database on <a title="MySQL Administration on YOUR computer." href="http://localhost/phpmyadmin">http://localhost/phpmyadmin</a></li>
<li>Visit Run the MediaWiki Installation to generate a <tt>LocalSettings.php</tt> configuration file</li>
<li>Move this file to <tt>$MediaWiki</tt> as instructed by the MediaWiki install wizard</li>
<li>(Recommended) Check out the other <a href="http://www.mediawiki.org/wiki/Manual:LocalSettings.php">configuration options</a> in <tt>LocalSettings.php</tt></li>
<li>Install any desired <a title="MediaWiki Extensions" href="http://www.mediawiki.org/wiki/Category:Extensions">extensions</a> (I recommend <a title="MediaWiki Cite Extension" href="http://www.mediawiki.org/wiki/Extension:Cite">Cite</a> for Wikipedia-style footnotes).</li>
</ol>
<p><strong>If you want a simple installation of MediaWiki, you can stop here.<br />If you want Math, SVG, and other goodies, please continue.</strong></p>
<h4>Install Xcode Developer Tools</h4>
<ol>
<li>Run the install package</li>
</ol>
<h4>Install MacPorts Package Manager, etc.</h4>
<ol>
<li>Install MacPorts</li>
<li>Run the following command in Terminal:<br />
<blockquote><code>sudo port install ImageMagick <del>teTeX</del> <ins>texlive texlive-latex-extras</ins> ghostscript ocaml</code></p></blockquote>
</li>
<p> This will take a <em>long</em> time and install a <em>lot</em> of packages, but don’t worry; they’re confined to <tt>/opt/local</tt> (<tt>/opt</tt> doesn’t exist by default on Mac OS X)<br /><strong>Update:</strong> <tt>teTeX</tt> is no longer a supported port; use <tt>texlive</tt> and its extras instead.</p>
<li>Run the following command in Terminal:<br />
<blockquote><code>sudo nano /etc/paths</code></p></blockquote>
</li>
<li>Add the following to the end of the file and type <tt>Ctrl+X Y</tt> to save and quit (<a title="Running MediaWiki/LaTeX on Mac OS X" href="http://www.mediawiki.org/wiki/Manual_talk:Running_MediaWiki_on_Mac_OS_X#Mathematics">The guide to installing MediaWiki on Mac OS X</a> makes this more difficult than it actually is):<br />
<blockquote><code>/opt/local/bin<br />/opt/local/sbin</code></p></blockquote>
</li>
</ol>
<h4>Compile texvc (included with MediaWiki) and Activate Math</h4>
<ol>
<li>Recall from <a href="#apache-user">#6 on XAMPP Apache Configuration</a>:  If Apache is still running as ‘nobody’, check that you’ve <a href="http://www.mediawiki.org/wiki/Manual_talk:Running_MediaWiki_on_Mac_OS_X#One_more_try">modified <tt>render.ml</tt> appropriately</a></li>
<li>Open a terminal and run the following commands to compile the plugin between MediaWiki and LaTeX:<br />
<blockquote><code>cd $MediaWiki/math<br />make</code></p></blockquote>
</li>
<li>Enable LaTeX and uploads in <tt>$MediaWiki/LocalSettings.php</tt> if you haven’t done so already.</li>
<li>Make <tt>archive/</tt>, <tt>math/</tt>, <tt>thumb/</tt>, and <tt>tmp/</tt> directories inside <code>$MediaWiki/images</code>.</li>
<li>Make the <tt>images</tt> folder writable by executing the following command in Terminal:<br />
<blockquote><code>sudo chmod -R 777 $MediaWiki/images</code></p></blockquote>
</li>
</ol>
<h4>Install Inkscape SVG Rendering Plugin</h4>
<ol>
<li>Install Inkscape to <tt>/Applications</tt></li>
<li>Add the following lines to <tt>$MediaWiki/LocalSettings.php</tt>:<br />
<blockquote><code>$wgSVGConverter = "inkscape"<br />$wgSVGConverterPath = "/Applications/Inkscape.app/Contents/Resources/bin"</code></p></blockquote>
</li>
</ol>
<p>That concludes the advanced MediaWiki installation. Tweak <tt>$MediaWiki/LocalSettings.php</tt> to your liking: I’d love to hear what you come up with.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2010/10/unix-or-not-installing-mediawiki-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to Speed Up a Windows Computer</title>
		<link>http://matthew.komputerwiz.net/2010/08/speed-up-windows-computer/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=speed-up-windows-computer</link>
		<comments>http://matthew.komputerwiz.net/2010/08/speed-up-windows-computer/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 21:05:57 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=145</guid>
		<description><![CDATA[Free Up Space on Your Hard Disk Consolidate all of your large photos, movies, and music onto a separate drive, if possible. Find and delete any duplicated, outdated, or unused documents from your personal or shared folders. Manually Archive/Compress Old Files I highly recommend using 7-Zip. Use the 7-Zip format (.7z) with the “Ultra” compression [...]]]></description>
			<content:encoded><![CDATA[<h2>Free Up Space on Your Hard Disk</h2>
<ol>
<li>Consolidate all of your large photos, movies, and music onto a separate drive, if possible.</li>
<li>Find and delete any duplicated, outdated, or unused documents from your personal or shared folders.</li>
</ol>
<h3>Manually Archive/Compress Old Files</h3>
<p>I <em>highly</em> recommend using <a href="http://www.7-zip.org" target="_blank">7-Zip</a>.  Use the 7-Zip format (.7z) with the “Ultra” compression setting: it will take longer, but it will save more disk space.</p>
<h3>CCleaner</h3>
<ol>
<li>Download the latest version of <a href="http://www.ccleaner.com" target="_blank">CCleaner</a></li>
<li>Close all programs, especially web browsers</li>
<li>Check all options on both tabs except for <strong>wipe free space<br />
<span style="font-weight: normal;">When you run CCleaner again, do not check </span>old prefetch data </strong></li>
<li>Analyze and Run Cleaner.</li>
<li>Click on the <strong>Registry</strong> tab</li>
<li>Scan for Issues and Fix all issues<br />
CCleaner will ask if you want to back up changes to the Registry.  I have not had any problems with the registry cleaner, but it’s always a good idea to keep a backup.</li>
</ol>
<h3>Disk Cleanup</h3>
<p>To open, right click on a Hard Drive in My Computer and click Properties.  The Disk Cleanup option will be on the General tab next to the Disk Usage pie chart.</p>
<p>Be careful when using Windows Disk Cleanup that you don’t delete important files like the <strong>Hibernation file</strong> or the <strong>Office Setup Files</strong></p>
<hr />
<h2>Remove Malware and Spyware</h2>
<p>There are many free programs available around the internet to help with this task, but I highly recommend <a title="Spybot Search &#038; Destroy" href="http://www.safer-networking.org/en/spybotsd/index.html">Spybot — Search &amp; Destroy</a></p>
<p>Run a full scan and clean any issues that the program finds. (This may take a while depending on your computer).</p>
<hr />
<h2>Defragment your Hard Drive</h2>
<p>Use either the built-in Windows defragmenter (Right-click on a drive in My Computer, go to Properties, and click on the Defragment option in the Tools tab) or a third-party program like <a title="Defraggler" href="http://wwwdefraggler.com" target="_blank">Defraggler</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2010/08/speed-up-windows-computer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Ultimate Hypocrisy</title>
		<link>http://matthew.komputerwiz.net/2010/08/the-ultimate-hypocrisy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-ultimate-hypocrisy</link>
		<comments>http://matthew.komputerwiz.net/2010/08/the-ultimate-hypocrisy/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 15:33:23 +0000</pubDate>
		<dc:creator>Matthew</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://matthew.komputerwiz.net/?p=136</guid>
		<description><![CDATA[Remember that post in which I described my absolute despise for Apple and all Apple products (particularly the Safari web browser)? Well, God has a sense of humor: Not only has Safari become my favorite browser, but I have also adopted a MacBook Pro for my mobile computing needs. I was even using an iPhone [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://matthew.komputerwiz.net/wp-content/uploads/2010/08/Apple-mac-logo-150x150.jpg" alt="Apple mac logo" width="150" height="150" class="alignleft size-thumbnail wp-image-528" />Remember that <a href="http://matthew.komputerwiz.net/2009/07/safari-4-released/">post</a> in which I described my absolute despise for Apple and all Apple products (particularly the Safari web browser)?  Well, God has a sense of humor: Not only has Safari become my favorite browser, but I have also adopted a MacBook Pro for my mobile computing needs. I was even using an iPhone at the time I posted that article.</p>
<p>I guess I owe Apple an apolology… I learned that Chrome is based on the WebKit framework, which is an Apple project that is open standard to all developers.  Chrome actually removed some of the extra cool effects that Apple included so that it would be a more lightweight web browser.  Safari was the slowest browser on my old computer which had a 32-bit Windows (Vista) operating system running on a 1.2 GHz CPU with only 2 GB of RAM.  Now, I have a <em>64-bit Mac OS X Snow Leopard</em> operating system running on a <em>2.4 GHz</em> CPU with <em>4 GB</em> of RAM.  Safari opens to my “Top Sites” well within 2 seconds… and that’s from a cold start!</p>
<p>Another thing I’d just like to throw out there: I’ve been using iPhone 4 for a while now, and I have not had <em>any</em> problems whatsoever with reception or “Antennagap” (or whatever the sue-happy people are calling it).  I actually get better reception now than I did with my iPhone 3G.  Bottom-line, the iPhone 4 is a <em>vastly superior</em> smartphone in my opinion.</p>
<p>I must say that I am very pleased with what Apple has been doing recently: the iPad, iPhone 4, Unibody MacBook Pro, Mac Mini, etc.  My friends tell me that it would be extremely ironic if I start working for Apple once I graduate.  To be honest, I’m actually considering it…</p>
]]></content:encoded>
			<wfw:commentRss>http://matthew.komputerwiz.net/2010/08/the-ultimate-hypocrisy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

