MikeKeran.com https://www.mikekeran.com/rss.xml en I voted! https://www.mikekeran.com/node/165 <span class="field field--name-title field--type-string field--label-hidden">I voted!</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sun, 03/13/2016 - 8:20pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><img alt="Image saying &quot;I voted.&quot;" data-entity-type="file" data-entity-uuid="815e100e-c594-466c-a637-55905b6ec2f1" src="/sites/default/files/inline-images/DAElection-IVoted%5B1%5D.png" class="align-right" />You can't complain if you don't vote. Drupal Association members are <a href="https://association.drupal.org/boardelection">currently voting</a> for the at-large board member position. If you want a say in the future direction of the DA, you'd better cast your vote now -- voting closes on 18 March.</p> <p>If you work with Drupal, and make money using Drupal, you should join the Drupal Association. You won't be able to vote in this round of elections, but you will be supporting all that the DA does -- running drupal.org (including all the sub-domains and testbots!), DrupalCons, financing Drupal Camps, Community Cultivation grants, global training days, and generally minding the health and well-being of the Drupal community in general.</p></div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/category/webdev/programming/drupal" hreflang="en">Drupal</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/copyright" hreflang="en">Copyright</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-538"></a> <article data-comment-user-id="0" about="/comment/538" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1484826108"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="" content="Reviews of essay writing service">Reviews of ess… (not verified)</span> on Thu, 01/19/2017 - 3:41am</span> <span property="schema:dateCreated" content="2017-01-19T11:41:48+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/538#comment-538" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/538" class="permalink" rel="bookmark" hreflang="en">Well that is a exceptional…</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Well that is a exceptional dialogue you might have made here. I particularly respect all above recounted statements a couple of specific and a brand new development subject. I believe this is one of the predominant discipline the readers must make a exceptional understandings about it.</p></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=538&amp;1=full&amp;2=en&amp;3=" token="20beb7fe"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=165&amp;2=comment&amp;3=comment" token="f1c86eeb"></drupal-render-placeholder> </section> Mon, 14 Mar 2016 03:20:30 +0000 MikeKeran 165 at https://www.mikekeran.com Making sql-sync Safer https://www.mikekeran.com/other/making-sql-sync-safer <span class="field field--name-title field--type-string field--label-hidden">Making sql-sync Safer</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 12/04/2013 - 8:17pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Drush aliases can be a huge timesaver when you’re working back-and-forth between your local dev environment and a remote server. You can clear caches remotely as easily as adding <code>@remote</code> to your usual <code>drush cc all</code> command. Or use the sql-cli command to log into the remote server’s MySQL instance without leaving the comfort of your local command prompt. My favorite is updating my local database to what’s on the remote server: <code>drush sql-sync @remote @local</code> (followed by a coffee break).</p> <p>We've all accidentally swapped parameters on the command line, usually after too much work and too little sleep. Not a big deal when you swap source and destination for <code>ln –s</code>, it politely warns you that it can’t overwrite an existing file. But do that with <code>sql-sync</code> and you’ve just replaced your live server’s database with whatever test content you’ve been tooling around with! It’s good practice to test your daily backups from time to time, but not while your live server is showing nothing but <a href="http://baconipsum.com/">Bacon Ipsum</a>. Let’s save us the heart attack and data loss by preventing this situation in the first place.</p> <p>One option is to never specify the destination using a site alias: use <code>drush sql-sync @remote example.com</code> to replace the database pointed to by <em>sites/example.com/settings.php</em>. Removing the <code>@</code> in the destination prevents you from ever blowing away any database other than your local one. You’ll need to run this from within the Drupal install of the site you’re updating and you’ll need to get everyone working on the project to do it. But it’s a good habit to get into.</p> <p>Option two solves the problem is a more systemic way. By implementing <code>drush_hook_COMMAND_validate</code>, we can add extra validation code to any Drush command. Open <em>~/.drush/policy.drush.inc</em> and add the following code:</p> <pre class="code-sample"> &lt;?php /** * Implements drush_hook_COMMAND_validate. * * Prevent a catastrophic brain-fart -- only allow users to overwrite their * local database. */ function drush_policy_sql_sync_validate($source = NULL, $dest = NULL) { if ($dest == '@local' || FALSE === strpos($dest, '@')) { return TRUE; } else { return drush_set_error(dt('You may only overwrite your local database -- check your source/destination order. It should be similar to "drush sql-sync @remote @local".')); } }</pre> <p>This is a slightly more restrictive version of what ships in the <a href="http://api.drush.ws/api/drush/examples%21policy.drush.inc/function/drush_policy_sql_sync_validate/master">Drush example policy file</a>. This one disallows any site alias in the destination parameter except <code>@local</code> under the assumption that any you would never want to overwrite a remote database. If you use sql-sync to move databases from staging to production, you may need to add an override that will allow this.</p> <p>Safe now, we can happily sql-sync databases late into the night.</p> </div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/category/webdev/programming/drupal" hreflang="en">Drupal</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/drupal-planet" hreflang="en">Drupal Planet</a></div> <div class="field__item"><a href="/articles/drush" hreflang="en">Drush</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-440"></a> <article data-comment-user-id="0" about="/comment/440" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1387445212"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.bariswanschers.com" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">BarisW (not verified)</a> on Thu, 12/19/2013 - 1:26am</span> <span property="schema:dateCreated" content="2013-12-19T09:26:52+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/440#comment-440" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/440" class="permalink" rel="bookmark" hreflang="en">Thanks for sharing</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=440&amp;1=full&amp;2=en&amp;3=" token="0d077d8b"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=163&amp;2=comment&amp;3=comment" token="81bf780d"></drupal-render-placeholder> </section> Thu, 05 Dec 2013 04:17:52 +0000 MikeKeran 163 at https://www.mikekeran.com https://www.mikekeran.com/other/making-sql-sync-safer#comments Adding Custom Mobile Protocols to Drupal https://www.mikekeran.com/other/adding-custom-mobile-protocols-to-drupal <span class="field field--name-title field--type-string field--label-hidden">Adding Custom Mobile Protocols to Drupal</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 11/25/2013 - 8:34pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>With the proliferation of mobile apps and Web sites on mobile devices, developers are often asked to integrate the two. Mobile apps can register a custom protocol with the mobile OS so that a link on a Web page such as <code>&lt;a href=”myapp://openapp”&gt;Open in MyApp&lt;/a&gt;</code> will open MyApp on the user’s phone. An early example of this was to have links on phone numbers actually call the number on mobile phones.</p> <p>On a recent project, I was asked to include a “Back to App” link on the site’s menu. “No problem,” I thought, “I’ll just set that as the destination of that menu item.” However trying to add <code>myapp://openapp</code> as a menu item destination lead to a</p> <blockquote> <p><em>Notice</em>: Undefined index: path in <em>menu_edit_item_validate()</em> (line <em>399</em> of <em>//modules/menu/menu.admin.inc</em>).</p> <p>The path '' is either invalid or you do not have access to it.</p> </blockquote> <p>A little digging lead me to the problem: Drupal has a limited list of protocols it considers 'valid'. Fortunately, those are accessed via <code>variable_get</code>. Unfortunately, there is no admin page where you can edit that list. And, more confusingly, Drupal uses two different default values for the list of protocols (includes/common.inc@1336 includes the <code>tel</code> protocol but modules/filter/filter.module@1398 does not). Finally, by default, Drupal doesn't set this variable in the database so the default value passed to <code>variable_get</code> is what gets used.</p> <p>My solution was to add a <code>hook_update_N</code> to an existing (custom) module to add the protocol I needed.</p> <pre class="code-sample">/** * Adds myapp:// protocol to the list of allowed protocols. */ function example_update_7001(&amp;$sandbox) { // From include/common.inc @ 1336 $protocols = variable_get('filter_allowed_protocols', array('ftp', 'http', 'https', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'tel', 'telnet', 'webcal')); $protocols[] = 'myapp'; variable_set('filter_allowed_protocols', $protocols); }</pre> <p>Not interested in writing an update hook? You can also set this directly in your <code>settings.php</code> file:</p> <pre class="code-sample">$conf['filter_allowed_protocols'] = array('ftp', 'http', ...);</pre> <p>I prefer the first option. If there is another module trying to add a protocol to the list, the second option would negate that. But you can't beat editing your settings.php for a quick-fix that avoids the need for a custom module.</p> </div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/category/webdev/programming/drupal" hreflang="en">Drupal</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/drupal-planet" hreflang="en">Drupal Planet</a></div> <div class="field__item"><a href="/articles/mobile-phones" hreflang="en">Mobile Phones</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-441"></a> <article data-comment-user-id="0" about="/comment/441" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1387464347"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">gmclelland (not verified)</span> on Thu, 12/19/2013 - 6:45am</span> <span property="schema:dateCreated" content="2013-12-19T14:45:47+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/441#comment-441" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/441" class="permalink" rel="bookmark" hreflang="en">As an alternative see</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=441&amp;1=full&amp;2=en&amp;3=" token="ac3ef965"></drupal-render-placeholder> </div> </article> <a id="comment-536"></a> <article data-comment-user-id="0" about="/comment/536" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1479356691"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Sarah (not verified)</span> on Wed, 11/16/2016 - 8:24pm</span> <span property="schema:dateCreated" content="2016-11-17T04:24:51+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/536#comment-536" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/536" class="permalink" rel="bookmark" hreflang="en">Make it easy</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>http://forum.viva.co.id/indeks/threads/madu-dapat-menyembuhkan-mata-minus-benarkah.2273827/<br /> http://forum.idws.id/threads/6-cara-menjaga-agar-mata-tetap-sehat.585071/<br /> https://www.bersosial.com/threads/benarkah-vitamin-c-baik-untuk-kesehatan-mata.40258/<br /> http://warungkopi.okezone.com/thread/581128/mata-minus-dapat-diobati-dengan-wortel-mitos-atau-faktah<br /> http://forum.liputan6.com/t/konsumsi-makanan-ini-mata-minus-bisa-sembuh/71814</p></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=536&amp;1=full&amp;2=en&amp;3=" token="595295af"></drupal-render-placeholder> </div> </article> <a id="comment-537"></a> <article data-comment-user-id="0" about="/comment/537" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1481071035"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Toni (not verified)</span> on Tue, 12/06/2016 - 4:37pm</span> <span property="schema:dateCreated" content="2016-12-07T00:37:15+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/537#comment-537" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/537" class="permalink" rel="bookmark" hreflang="en">Fight !</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"><p><a href="https://www.dpreview.com/members/4318677761/overview">lecithinsoftgel</a></p></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=537&amp;1=full&amp;2=en&amp;3=" token="f86b1141"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=162&amp;2=comment&amp;3=comment" token="2086fce3"></drupal-render-placeholder> </section> Tue, 26 Nov 2013 04:34:34 +0000 MikeKeran 162 at https://www.mikekeran.com https://www.mikekeran.com/other/adding-custom-mobile-protocols-to-drupal#comments Migrating a CCK Field into the Node Title Field https://www.mikekeran.com/other/migrating-a-cck-field-into-the-node-title-field <span class="field field--name-title field--type-string field--label-hidden">Migrating a CCK Field into the Node Title Field</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 10/28/2013 - 10:26am</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>On a recent migration project I came across an odd error:</p> <blockquote><code>Illegal offset type in isset or empty File ...snip...\sites\all\modules\pathauto\pathauto.inc, line 182</code></blockquote> <p>I was using Migrate 2.5 to move date from a Drupal 6 project into Drupal 7 and had already migrated several content types without having problems with my pathauto settings.</p> <p>After digging for a bit, I realized that pathauto was being passed an array for the node title causing problems with checking the cache for a previous calculated pathauto URL. Odd, node titles are always strings. Then I realized that this is the first content type that I was pulling the node title from a CCK text field and Migrate will pass that along as an array (just like all other CCK fields).</p> <p>The fix is easy enough, add a <code>prepare</code> routine to your migration object such as this:</p> <pre class="code-sample">public function prepare($entity, stdClass $row) { // Because the title field is imported from a CCK field, it shows up as an // array. Node titles have to be strings. if (is_array($entity-&gt;title)) { $entity-&gt;title = $entity-&gt;title[0]; } }</pre> <p>And pathauto is happy again!</p> </div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/category/webdev/programming/drupal" hreflang="en">Drupal</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/migration" hreflang="en">Migration</a></div> <div class="field__item"><a href="/articles/drupal-planet" hreflang="en">Drupal Planet</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-458"></a> <article data-comment-user-id="0" about="/comment/458" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1394933165"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Tanout (not verified)</span> on Sat, 03/15/2014 - 6:26pm</span> <span property="schema:dateCreated" content="2014-03-16T01:26:05+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/458#comment-458" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/458" class="permalink" rel="bookmark" hreflang="en">Thanks for sharing</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=458&amp;1=full&amp;2=en&amp;3=" token="438fbfc7"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=161&amp;2=comment&amp;3=comment" token="18bd7790"></drupal-render-placeholder> </section> Mon, 28 Oct 2013 17:26:34 +0000 MikeKeran 161 at https://www.mikekeran.com https://www.mikekeran.com/other/migrating-a-cck-field-into-the-node-title-field#comments Google Transit Directions got Lost https://www.mikekeran.com/other/google-transit-directions-got-lost <span class="field field--name-title field--type-string field--label-hidden">Google Transit Directions got Lost</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 07/22/2013 - 12:08pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>When recently trying to plan a trip to the airport, I realized that Google has over-optimized their transit directions. I assume much of this is downstream of the <a href="http://google-latlong.blogspot.com//2013/05/meet-new-google-maps-map-for-every.html">Google Maps upgrade</a> announced at the <a href="https://developers.google.com/events/io/">recent IO conference</a>. Or perhaps part of it is that Google’s dogfooders – their own employees using their products in real-world scenarios – don’t take public transit that much.</p> <p>Recent example: I know the route I need to take to get from my house to the airport (26 to downtown, transfer to light rail), but I often use Google Maps' directions to figure out which bus I need to take to get to the airport at a given time. The 26 passes one block from my house and runs downtown every 30 minutes mid-day, but Google suggested I take the 26 and transfer to either the 40 or 16 or, what the hell, just walk to the eight blocks to the 16 and take that.</p> <p>Perhaps the updated Maps with it’s spiffy new interface would find the correct route? The UI was much more polished, but it was still suggesting I take the 26 and transfer, or walk even farther to another bus and then transfer. For whatever reason the 40 is out of favor in Google’s brave new UX; I’m to transfer to the 21 instead.</p> <p>The 26 follows the same route as the 40 or 16 once it hits downtown. In fact, all the light rail stations are served by all those bus routes. So why does Google want me to transfer? Doesn't the Google hive-brain know that every time you transfer you leave yourself open to a missed connection?  Guess not...</p> <p>This hasn’t always been a problem. In a recent trip to Portland (car-free), Google guided me all over town on a mix of light rail, buses and walking. For the last several years, my family – especially my oldest who got an Orca card instead of yellow-bus transportation to high school – have used Google Maps religiously to plan transit-based trips around town. Clearly something changed recently.</p> <p align="left">I have two guesses as to Google’s recent transit mapping failures.</p> <p align="left">First, Google’s <a href="http://google-latlong.blogspot.com/2013/05/meet-new-google-maps-map-for-every.html">latest update to Maps</a> prioritizes high frequency transit lines. However that criteria has been given too much clout – telling people to transfer from a bus they've already caught to another that may come more frequently. Both the 26 and the 16 end up at the same location so perhaps the differing routes have better or worse on-time records? My personal experience is that the 16, which travels down SR99 into downtown is slightly faster than the 26 which travels on Dexter for that same stretch. But any regular transit rider knows that the bus you’re on is worth two down the road.</p> <p align="left">My second guess occurred to me when I went to King County Metro’s site to check the actual <a href="http://metro.kingcounty.gov/schedules/026/s0.html">schedule for the 26</a>. Seems they’ve also spiffed up their site with a fancy redesign that doesn’t help the site visitor. Schedules are loaded via asynchronous calls (which may screw up Google’s spiders) and they’ve combined similar routes into the same timetable making the already-long-and-complicated schedules even harder to read. Haven’t they heard to fixed table headers so you can scroll through the dozens of entries and still see the stop locations?</p> <p align="left">Regardless, Google knows how to gather and parse data from web sites. I can't imagine that Metro's new layout is really the cause. Hopefully some Googlers will plot a course across town on transit and notice the quirks in their new algorithm. In the meantime, I'd say to use Bing's Maps, but their transit directions aren't much better. While Bing doesn't tell you to transfer, it doesn't seem to know that the 26 exists...</p> </div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/webdev/the-internet" hreflang="en">The Internet</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/google" hreflang="en">Google</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-439"></a> <article data-comment-user-id="0" about="/comment/439" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1386943480"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.pegasustransit.com/" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">Perl (not verified)</a> on Fri, 12/13/2013 - 6:04am</span> <span property="schema:dateCreated" content="2013-12-13T14:04:40+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/439#comment-439" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/439" class="permalink" rel="bookmark" hreflang="en">Public Transit</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=439&amp;1=full&amp;2=en&amp;3=" token="abaf0b72"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=159&amp;2=comment&amp;3=comment" token="d812582a"></drupal-render-placeholder> </section> Mon, 22 Jul 2013 19:08:38 +0000 MikeKeran 159 at https://www.mikekeran.com https://www.mikekeran.com/other/google-transit-directions-got-lost#comments Browsing the Drupal 7 Variable Table https://www.mikekeran.com/other/browsing-the-drupal-7-variable-table <span class="field field--name-title field--type-string field--label-hidden">Browsing the Drupal 7 Variable Table</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sun, 11/25/2012 - 2:39pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Drupal's <em>variable</em> table -- where most admin settings are saved -- had an overhaul between Drupal 6 and Drupal 7. No longer is it simple to browse the table with the SQL command line or using tools such as phpMyAdmin. Here are a few tricks to make browsing this table simple again.</p> <p> </p><p>The value of most of Drupal’s admin settings are saved in the <em>variable</em> table. In Drupal 6 is was easy to browse through this table – the <em>value</em> field was <code>longtext</code> and the value being saved was serialized allowing storage of both simple data (strings, numbers) and complicated data (arrays, objects). You could also find all instances of a given value with simple SQL:</p> <pre class="code-sample">SELECT * FROM variable WHERE value LIKE "%some_value%" </pre> <p>But serializing doesn’t work well for objects with protected or private members or for binary data.  So the <em>value</em> column <a href="http://drupal.org/node/690746">became a <code>blob</code></a> in Drupal 7.  This allowed us much greater flexibility in what we can save in the <em>variable</em> table at the cost of easy “reading” of the values in that table.  (It also prevents us from indexing that column, but that was already the case since we stored only serialized data in the D6 version of this column).</p> <p>Here are some tricks I’ve been using to make it easy to browse the <em>variable</em> table in Drupal 7:</p> <ul><li>When using SQL to browse the variable table: <ol><li>Use the MySQL command <code>CONVERT</code> to un-blob data you’re displaying. <pre class="code-sample" style="width: auto;">SELECT CONVERT (value USING utf8) FROM variable WHERE name="site_mail" </pre> </li> <li>Use the MySQL command <code>CAST</code> to un-blob data you’re querying. <pre class="code-sample" style="width: auto;">SELECT * FROM variable WHERE CAST(value AS CHAR) LIKE "%some_value%" </pre> </li> </ol></li> <li>In phpMyAdmin, select the <em>Show blob contents</em> option. This lets you browse a tables just like you did in Drupal 6. Just beware of actual binary data stored in <code>blobs</code>, they don't display well.<br /><img src="/sites/mikekeran.com/files/variable-1.PNG" /><br /><img src="/sites/mikekeran.com/files/variable-2.PNG" /></li> </ul><p>I feel the need to point out that this is exactly <strong>NOT</strong> how you would do it if you were writing code for Drupal – that’s what the <a href="http://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/variable_set/7">variable_set()</a> and <a href="http://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/variable_get/7">variable_get()</a> functions are for.</p> <p>Also, having never worked on a PostgreSQL project, I have no idea if CONVERT and CAST work similarly on that platform.</p> </div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/category/webdev/programming/drupal" hreflang="en">Drupal</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/drupal-planet" hreflang="en">Drupal Planet</a></div> <div class="field__item"><a href="/articles/drupal-bits" hreflang="en">Drupal Bits</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-508"></a> <article data-comment-user-id="0" about="/comment/508" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1447016744"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">John (not verified)</span> on Sun, 11/08/2015 - 1:05pm</span> <span property="schema:dateCreated" content="2015-11-08T21:05:44+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/508#comment-508" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/508" class="permalink" rel="bookmark" hreflang="en">change site_name from URL</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=508&amp;1=full&amp;2=en&amp;3=" token="e98aacf3"></drupal-render-placeholder> </div> </article> <a id="comment-535"></a> <article data-comment-user-id="0" about="/comment/535" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1468019128"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Mandy1954 (not verified)</span> on Fri, 07/08/2016 - 4:05pm</span> <span property="schema:dateCreated" content="2016-07-08T23:05:28+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/535#comment-535" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/535" class="permalink" rel="bookmark" hreflang="en">oh this is nice24</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item">nice resource here!</div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=535&amp;1=full&amp;2=en&amp;3=" token="61691edc"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=156&amp;2=comment&amp;3=comment" token="00c7fe95"></drupal-render-placeholder> </section> Sun, 25 Nov 2012 22:39:49 +0000 MikeKeran 156 at https://www.mikekeran.com https://www.mikekeran.com/other/browsing-the-drupal-7-variable-table#comments Relative Privacy https://www.mikekeran.com/other/relative-privacy <span class="field field--name-title field--type-string field--label-hidden">Relative Privacy</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 05/07/2012 - 5:25pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>No one likes being spied on. If you need proof, look no further than the push-back against <a href="http://www.abc.net.au/news/2012-02-06/privacy-questions-over-airport-body-scan-laws/3813760">TSA’s body scanners</a>, concerns about <a href="http://seattletimes.nwsource.com/html/localnews/2018090173_drones28m.html">unmanned aerial drones</a>, or the recent clamor over <a href="http://www.zdnet.com/blog/violetblue/google-privacy-policy-changes-survival-guide/1102">online privacy policy changes</a>. While I don’t think much about my own privacy – I never cared who saw me naked or heard what I’m ranting about with friends – but raising two daughter has added perspective to my hippie-dippie attitude.</p><p>I recently <a href="http://www.flickr.com/photos/mikekeran/7145275025/">found them both at the playground</a>…  in Google Maps’ street view. Granted no one but my wife and I would’ve identified them, but it gave me pause.</p><p>There has been much talk about browser privacy recently. The <a href="http://www.nytimes.com/2012/05/03/technology/personaltech/how-to-muddy-your-tracks-on-the-internet.html">NY Times recently weighted in</a> claiming that browsing the Internet is “like that dream where you realize that your suddenly stark naked,” and then implied that your searches would affect your health insurance and credit ratings.</p><p>But none of these discussions have looked at the benefits of giving up a little of ourselves. If we show a little skin while online, what do we get in return? In part, we get the free services we’ve come to expect from the Web.</p><p>Let’s start in the past, in the pre-Web days of my teenage years. The 1980’s. (Yeah, it’s been that long…) Back then the only free we could find was on TV. It was “free” in that we didn’t have to pay to watch a program. We just had to tune it at a given time, in a given location, and deal with <a href="http://en.wikipedia.org/wiki/Television_advertisement#United_States_of_America">18 minutes of advertisements</a> each hour or <a href="http://www.csun.edu/science/health/docs/tv&amp;health.html">a bit over an hour of ads per day</a> for the average American.</p><p>I can still sing the Oreos cookie jingle even though I hate Oreos cookies. But that’s what advertising was back then: a wide net thrown over a large, and largely-unknown, audience. They needed 18 minutes each hour because the odds of them hitting their target audience was low. I know many freelancers that charge more than $90/hour – now consider the cost of this “free” TV.</p><p>Today’s online advertising is much more targeted. The ubiquitous <a href="https://www.google.com/adsense/">Google AdSense ads</a> you see on many sites analyze the words on the page and place ads relevant to those words and, hopefully, the reader. If I were to use AdSense on this site, you’d likely see ads for Web hosting companies or Web development businesses as that’s what I primary write about. I think we can all agree that doesn’t invade anyone’s privacy.</p><p>But Google also knows that I searched for “<a href="http://www.google.com/search?ix=aca&amp;sourceid=chrome&amp;ie=UTF-8&amp;q=bulk+email+service+provider">bulk email service providers</a>” recently and clicked through to a few pages that compared different services. On a techie blog they may serve up ads for <a href="http://sendgrid.com/">SendGrid</a> or <a href="http://mailchimp.com/">MailChimp</a> – in their eyes, I’m reading about Web development and I’ve recently been looking for a service to handle large mailing lists. When I click on one of those ads, the company placing the ad makes a payment to Google and Google gives some of that money to the site showing the ad.</p><p>How does Google know it was me that ran the bulk email search? That’s because I logged into my Google account to check the blogs and news sites that I follow. Google collects all those headlines for me and puts them into one convenient <a href="http://www.google.com/ig">homepage</a>. For “free” – again in quotes because instead of wasting 30% of my TV watching time watching ads, I’m giving Google access to my search results so that they can serve me fewer, better targeted ads. No Oreo cookies with this system.</p><p>It starts to get a little creepy when you consider Gmail. Google now has access to all the emails sent to and by me and can incorporate that information in targeting it’s ads. But I’m getting an email account for free. In fact I’m getting my personal email, several business email accounts branded with my domain name, and I can offer clients 10 emails addresses for each domain. Google Docs and Google Voice allows Google to add to it’s growing profile of me a few letters to Mom, our list of annual donations, voicemail messages, and whatever else I use those services for. But in return I get word processing, spreadsheet software, and long distance calling. All for “free.”</p><p>This is not limited to Google by any means. Any company making money off of ad sales is trying to get a better idea of who you are. In Google’s case, they give back something tangible. There are plenty of ad services that don’t give you anything directly. But with better targeted ads, the odds of you clicking on an ad for more information – the odds of that ad working – is greater which means more money to the site hosting the ad and less money being spent by companies advertising to you.</p><p>Kate Murphy’s <a href="http://www.nytimes.com/2012/05/03/technology/personaltech/how-to-muddy-your-tracks-on-the-internet.html">NY Times article</a> I mentioned at the top talks about how Google, for example, could sell their profile of me to heath insurers or credit rating agencies and thereby ruin my life. I don’t think so.</p><p>Google has by far the most information on me and, one assumes, the most accurate profile of my online life. Why would Google sell their unique advantage over the competition? Besides would a credit rating agency risk basing my credit score on the number of times I’ve Googled “bankruptcy?” I can think of no faster way to have the government drop a metric ton of regulation on an industry than to use such a broken metric.</p><p>Ms. Murphy’s suggest spending (her prices) $40 – $90/year to have a VPN shield your IP address or $55 – $85/year to host your domain’s email. She also suggests turning on the built-in privacy setting in most modern browsers. At least that doesn’t cost anything. Or does it?</p><p>Remember that 10-page blog post about with step-by-step instructions on <a href="http://mikekeran.com/drupal-developer-setup-windows">how to setup a Windows machine for Drupal development</a>? That took time to write and writers like to get paid. You didn’t have to buy a book or subscribe to a magazine for it. You got it for free. (No quotes, this time – you really did get it for free…)</p><p>At the risk of sounding communist, I do wish the Internet ran more like an open source project where we give according to our abilities and consume according to our needs and advertising was limited to  companies sponsoring projects that are then donated back to the community.</p><p>But let’s face it, advertising is big money and that’s why there is so much “free” online – it’s the same as those Oreos ads on TV, only fewer, better targeted, and more relevant. When you hide yourself from the ad networks, when you run around the Internet incognito, you make it harder to show ads that are relevant. You make sites put up more ads to make their money or hide behind taller and taller pay-walls as the <a href="http://abcnews.go.com/blogs/headlines/2012/03/new-york-times-tightens-pay-wall/">NY Times has done</a>. You make it harder for companies to keep “free” as the default price of services online.</p><p>For decades we were happy to give up 30% of our time to watch TV for “free.” Imagine if you went to a Web site and had to sit 18 minutes of commercials every hour? I don’t see that site making it to next week with that business model! But companies still have to make money and these days we have to give up a bit of ourselves, we have to show a little skin, if we want the Internet’s default price to be “free.”</p></div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/webdev/the-internet" hreflang="en">The Internet</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/privacy" hreflang="en">Privacy</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-539"></a> <article data-comment-user-id="0" about="/comment/539" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1484826248"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">WilbertPark (not verified)</span> on Thu, 01/19/2017 - 3:44am</span> <span property="schema:dateCreated" content="2017-01-19T11:44:08+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/539#comment-539" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/539" class="permalink" rel="bookmark" hreflang="en">Well that could be a fine…</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Well that could be a fine talk you might have made here. I especially respect all above recounted statements a couple of particular and a manufacturer new progress area. I believe this is without doubt one of the predominant discipline the readers need to make a great understandings about it.</p> <p><strong>http://essayreviewratings.com/</strong></p></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=539&amp;1=full&amp;2=en&amp;3=" token="81873310"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=154&amp;2=comment&amp;3=comment" token="99c5f108"></drupal-render-placeholder> </section> Tue, 08 May 2012 00:25:36 +0000 MikeKeran 154 at https://www.mikekeran.com https://www.mikekeran.com/other/relative-privacy#comments How to Setup a Domain https://www.mikekeran.com/other/how-to-setup-a-domain <span class="field field--name-title field--type-string field--label-hidden">How to Setup a Domain</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 02/14/2012 - 1:39pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>I get asked this question a lot: What’s the best way to setup a new domain? Unfortunately, the answer has dozens of variations based on what sort of traffic you’re expecting, what kind of Web site you’re running, and what software is running that site. But there is one recommendation that has remained the same for several years: divide or be conquered – put your domain registration, Web hosting, and email hosting with three different companies.</p> <p>Now, before you start ranting about economies of scale and multiple billing cycles, let me start by saying that most of my clients are small to medium sized businesses and don’t have a dedicated IT department. Other than me. And I don’t want to be up all night when some hacker takes down a client’s hosting provider. “Far fetched,” you say? <a href="http://michaeltorbert.com/blog/media-temple-hacked/">Ask</a> <a href="http://www.inquisitr.com/47860/the-epic-wordpress-mediatemple-failure/">these</a> <a href="http://adrian3.com/2009/11/mediatemplewordpress-hack/">folks</a> <a href="http://jeffreybarke.net/2009/11/media-templewordpress-hacked/">who</a>, along with myself, had Media Temple accounts compromised by the total incompetence of their hosting provider.  (MT stored our account passwords in <em>plain text</em> in their database so when their database was compromised, so were all our accounts).</p> <p>Very shortly after having my pants dropped by Media Temple I realized that if I had those three crucial aspects of an online business – DNS, Web hosting, and email – at three different locations I was protected from morons at any one of those companies crippling my online presence. If any one aspect failed I could redirect that failed aspect to a new provider from one of the remaining aspects.</p> <p>Most hosting companies will give you a “free” domain registration with your Web hosting contract and domain registrars will offer attractive bundles that include email and Web hosting all for one low price. Resist the urge and follow the divide-or-be-conquered approach.</p> <p>Here’s why.</p> <ul><li>My hosting company goes black (or starts to suck after being bought by another company): Since my domain registration is with another company, I can log into my registrar’s account and redirect my domain to a new Web hosting provider and have my Web site back up within hours. While your Web site is down, you email will continue working since it’s hosted elsewhere.</li> <li>My email provider goes black: since the MX records for your domain are controlled by either your domain registrar or your Web hosting company, you can log into the appropriate account and  point those records at a new email hosting provider. At least your Web site will be up during the outage.</li> <li>My domain registrar goes black: that’s a tough one. If the DNS settings for your domain go down with the registrar then you, and a large portion of the Internet, are completely hosed. More likely, it’s a case of your current domain registrar acting <a href="http://thenextweb.com/insider/2011/12/23/go-daddy-publishes-position-on-sopa-and-turns-off-blog-commenting/">like a bunch of dicks</a> and you can’t <a href="http://howto.wired.com/wiki/Break_Your_GoDaddy_Dependency">hold your nose any longer</a>. Since your site and email are hosted elsewhere, it’s easy to transfer the domain to a new registrar (where you’ve already set your DNS and MX records) without interruption to your site or email.</li> </ul><p>I recommend the following companies for each of these important aspects of your online presence:</p> <ul><li>Domain registration: <a href="http://www.namecheap.com/?aff=35830">Namecheap.com</a>. I used to recommend GoDaddy.com for those that could ignore the frat-boy marketing, but after <a href="http://www.reddit.com/r/politics/comments/nmnie/godaddy_supports_sopa_im_transferring_51_domains/">their support of SOPA and PIPA</a>, I’ve ditched the <a href="http://www.youtube.com/watch?v=HhFMD6ybP2E">big boobs</a> in favor of the domain registrar <a href="http://lifehacker.com/5685843/best-domain-name-registrar-namecheap">picked by LifeHacker</a> readers well before the SOPA/PIPA kerfuffle. The fact that Namecheap.com actively campaigned against SOPA and PIPA is just icing on the cake.</li> <li>Email hosting: <a href="https://www.google.com/a/cpanel/standard">Google Apps Free Edition</a> or <a href="https://www.google.com/a/cpanel/premier">Google Apps for Business</a>, depending on the size of your business. The free edition used to allow up to 50 accounts (essentially email addresses) but that has recently been reduced to 10. If you’re a non-profit, you may qualify for <a href="http://www.google.com/apps/intl/en/nonprofit/index.html">Google Apps for Non-profits</a>, which gives you Google Apps for Business for cheap or free (if your non-profit has less than 3000 users), though the application process can take up to a month. In my experience, I got a reply from Google 29 days into their 30 reply window.</li> <li>Web hosting: This aspect depends greatly on what sort of site you’re running. For most Drupal sites, I go with <a href="http://hotdrupal.com/">HotDrupal.com</a> – dumb name, great performance – but it comes with some limitations on disk space and number of domains. I used to recommend ANHosting.com (a reseller for MidPhase.com) but recently their performance has sucked. If only I could host multiple domains on HotDrupal’s entry level account, I’d be a happy developer. If you’re not afraid of Linux admin and like playing in shell the so-called “cloud” hosting options from <a href="http://vps.net/">VPS.NET</a>, <a href="http://www.rackspace.com/">Rackspace</a> or <a href="http://aws.amazon.com/">Amazon Web Services</a> are also <a href="/other/aws-“micro”-instances-or-how-web-sites-are-like-mini-marts">great options</a>.</li> </ul></div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/webdev/the-internet" hreflang="en">The Internet</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/hosting" hreflang="en">Hosting</a></div> <div class="field__item"><a href="/articles/email" hreflang="en">Email</a></div> <div class="field__item"><a href="/articles/domain-registration" hreflang="en">Domain registration</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-506"></a> <article data-comment-user-id="0" about="/comment/506" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1446859350"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.argyletryit.com" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">Janine (not verified)</a> on Fri, 11/06/2015 - 5:22pm</span> <span property="schema:dateCreated" content="2015-11-07T01:22:30+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/506#comment-506" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/506" class="permalink" rel="bookmark" hreflang="en">Favorite</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=506&amp;1=full&amp;2=en&amp;3=" token="90668ea2"></drupal-render-placeholder> </div> </article> <a id="comment-507"></a> <article data-comment-user-id="0" about="/comment/507" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1446859368"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.argyletryit.com" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">Janine (not verified)</a> on Fri, 11/06/2015 - 5:22pm</span> <span property="schema:dateCreated" content="2015-11-07T01:22:48+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/507#comment-507" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/507" class="permalink" rel="bookmark" hreflang="en">Favorite</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=507&amp;1=full&amp;2=en&amp;3=" token="315f0a4c"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=152&amp;2=comment&amp;3=comment" token="e9b2e7ee"></drupal-render-placeholder> </section> Tue, 14 Feb 2012 21:39:46 +0000 MikeKeran 152 at https://www.mikekeran.com https://www.mikekeran.com/other/how-to-setup-a-domain#comments A Drupal Developer’s Setup on Windows https://www.mikekeran.com/drupal-developer-setup-windows <span class="field field--name-title field--type-string field--label-hidden">A Drupal Developer’s Setup on Windows</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 05/04/2011 - 1:22pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><strong>UPDATE</strong>: 3/23/2013: In general, these instructions still work for Windows 8. While some of the UI aspects have changed, the basic directions are the same. One exception is when downloading PuTTy. Since it’s an unsigned .exe file, Windows will boldly claim that “Windows protected your PC.” Click <em>More info</em> followed by <em>Run anyways</em> and you’re on your way.</p> <p><strong>UPDATE</strong>: 4/22/2012: A few more scattered updates, plus a new section on setting up XDebug on Aptana for super-easy  debugger config.</p> <p><strong>UPDATE</strong>: 12/1/2011: Got a new work laptop so I’ve updated these instructions – mostly with regards to Drush (5.x branch has great Windows support) and some optional performance tweaks when setting up MySQL.</p> <p>This page outlines what I’ve done to get a good Drupal dev environment – Apache, MySQL, PHP, Git, Drush and most Linux-style shell commands – running on Windows. There are other solutions out there and I’m always interested in hearing what others have done to optimize their setup. Please leave any suggestions is the comments.</p> <p>This page <strong>DOES NOT</strong> go into migrating content from dev/staging servers to live servers. If that’s what you’re lo0king for, sorry. I’ve been to endless DrupalCon BoF’s, Drupal group meetings and numerous online conversations around content migration and there is no real solution except “wait for 8.”</p> <p>I was lucky (???) enough to have my laptop’s motherboard fail so I was able to refine these steps on a brand-new computer with a clean install of Windows 7. It’s a pretty long process, but you only have to do it once…  Well, once per laptop failure.</p> <h2>Setting up a Drupal Dev Environment</h2> <ol><li>Install and configure WAMP Server: <ol><li>Install <a href="http://www.wampserver.com/en/download.php">WAMP Server</a> using the default settings. Be sure to pick the 64-bit version if you’re running a 64-bit Windows.  If you’ve got more than 4 GB of memory (which you should!) you need to run 64-bit Windows to take advantage of it. If you have a firewall running, you may get an alert about Apache HTTP Server communicating on various networks. If you’re only doing local development (meaning other computers will not need to access your localhost) then you can deny the firewall request.</li> <li><em>Start –&gt; Control Panel –&gt; System and Security –&gt; Administrative Tools –&gt; Services</em> <ol><li>Double click the <em>wampapache</em> service. Set the <em>Startup type</em> to <em>Automatic (Delayed Start)</em>, click the <em>Start</em> button, then OK.</li> <li>Repeat for the <em>wampmysqld</em> service.</li> <li>The delayed start option simple puts these services at the end of the list of services started when you computer boots up. If you really need to have your WAMP server running as soon as your computer starts, set the <em>Startup type</em> to <em>Automatic</em>.</li> </ol></li> <li>To start the WAMP Manager – which gives you easy access to the various WAMP services – automatically on start up, follow these steps. Otherwise you can run it off the <em>Start</em> menu as needed. <ol><li><em>Control Panel</em> –&gt; <em>System and Security</em> –&gt; <em>Administrative Tools</em> –&gt; <em>Task Scheduler</em> <ol><li>Click <em>Create task…</em> in the right-hand pane.</li> <li>General tab: name this task, tick the <em>Run with highest privileges</em> checkbox , ensure that <em>Run only when user is logged on</em> is selected, and that <em>Configure for</em> is set to <em>Windows 7</em>.</li> <li>Trigger tab: Click <em>New…</em> and set <em>Begin the task</em> to <em>At log on</em>, then click OK.</li> <li>Actions tab: Click <em>New…</em> and point <em>Program/script</em> to your <em>wampmanager.exe</em> (usually C:\wamp\wampmanager.exe) then click OK.</li> <li>Conditions tab: (if you’re on a laptop) uncheck <em>Stop if computer switches to battery power</em>, <em>Start the task only if the computer is on AC power</em> and every option in the <em>Idle</em> section. (Oddly, you need to check a parent item in order to uncheck a child item in this dialog…)</li> <li>Settings tab: uncheck <em>Stop the task if it runs longer than</em> and <em>If the task does not end when requested, force it to stop.</em></li> <li>Click OK to create the task and reboot your computer to test it out.</li> </ol></li> <li>You can force Windows to show the WAMP Manager icon all the time by clicking the little up arrow next to the notifications area, clicking <em>Customize…</em>, and setting <em>Aestan Tray Menu</em> to <em>Show icon and notifications</em>.</li> <li>If you want to use Clean URLs, click on the WAMP Manager icon and select <em>Apache –&gt; Apache Modules –&gt; rewrite_module.</em></li> <li>Click on the WAMP Manager icon in the task bar and select <em>Put online</em> .</li> </ol></li> <li>Decide where your localhost root directory will be. I recommend making this your dev root directory as well, such as <em>C:\dev</em> or <em>C:\Users\&lt;user-name&gt;\Documents\dev</em>. I use the latter option so I can keep all my important files in the same directory. In the following steps, we’ll call this <em>&lt;path_to_root&gt;</em>.</li> <li>Configure your httpd.conf file: click the WAMP Manager icon in the Taskbar notifications area and select <em>Apache –&gt; httpd.conf</em>. If the system asks, set <em>notepad.exe</em> as the editor for this file type. <ol><li>Search for the line <em>Include conf/extra/httpd-vhosts.conf</em> and uncomment it (remove the leading ‘#’ character) and save.</li> <li>Search for <em>DocumentRoot</em> and change the directory to your <em>&lt;path_to_root&gt;</em> directory. The line should look similar to <em>DocumentRoot "C:/Users/mikeker/Documents/dev"</em>. If you have spaces in your path name, the quotes are required.</li> <li>A couple lines below the <em>DocumentRoot</em> location you’ll find: <pre># This should be changed to whatever you set DocumentRoot to. # &lt;directory "c:/wamp/www"&gt;</pre> Do what  the man behind the curtain says and change <em>c:/wamp/www</em> to your <em>&lt;path_to_root&gt;</em>.</li> </ol></li> <li>If you have plenty of memory in your dev machine (and you should), give MySQL more room to work: in <em>&lt;path to wamp&gt;\bin\mysql\mysql&lt;version-number&gt; </em>rename the existing <em>my.ini</em> to <em>my-original.ini</em>, then rename <em>my-innodb-heavy-4G.ini</em> to <em>my.ini</em>.</li> <li>Drupal loads a lot of files and WAMP’s default <a href="http://php.net/manual/en/ini.core.php#ini.realpath-cache-size">realpath_cache_size</a> is easily overwhelmed. Click the WAMP Manager icon and select <em>PHP</em> –&gt; <em>php.ini</em>, uncomment (remove the leading semi-colon) the <em>realpath_cache_size = 16K</em> line and bump the number up to <em>16M</em> or <em>32M</em>. Save and close <em>php.ini</em>.</li> <li>Setup some convenient shortcuts: I usually put these on my desktop but they can go anywhere that makes sense for you. <ol><li>The system’s hosts file, which allows you to point certain Web addresses to your WAMP server instead of the Internet: Set the shortcut location to: <em>notepad.exe "&lt;path to hosts file&gt;"</em>  (You need to include the quotes if there are spaces in the path). The hosts file is usually located at <em>C:\Windows\System32\drivers\etc\hosts</em>.</li> <li>WAMP Server’s virtual hosts config file: <em>notepad.exe "&lt;path to wamp&gt;\bin\apache\&lt;apache-version-number&gt;\conf\extra\httpd-vhosts.conf"</em>  (Again, you need to include the quotes if you have spaces in the path). The virtual hosts config file is usually located at <em>C:\wamp\bin\apache\Apache2.2.17\conf\extra\httpd-vhosts.conf</em>, though the Apache version number can change with new builds of WAMP Server.</li> <li>Right-click on each shortcut and select <em>Properties</em>. On the <em>Shortcut</em> tab, click <em>Advanced…</em> and check the <em>Run as administrator</em> checkbox.</li> <li>Double-click on the virtual hosts shortcut, click <em>Yes</em> to the UAC warning, and either delete or comment out the examples that come with the file.</li> </ol></li> <li>Click the WAMP Manager icon and select <em>Stop All Services</em>. Navigate to <em>&lt;path to wamp&gt;\bin\mysql\&lt;mysql-version-number&gt;\data</em> and delete (or rename) <em>ib_logfile0</em> and <em>ib_logfile1</em>. Click the WAMP Manager icon again and select <em>Start All Services</em>.  If the icon doesn’t return to its green, “all is ok” state pretty quickly you’ve likely got an error in your <em>httpd.conf</em> file or your <em>httpd-vhosts.conf</em> file. Look at the Apache error log (WAMP Manager: <em>Apache –&gt; Apache error log</em>) for clues.</li> <li>If you have real-time malware detection software you may want to create an exemption for the MySQL data directory (eg: <em>C:\wamp\bin\mysql\mysql5.5.16\data</em>) since files in there will be changing all the time, causing your malware software to run overtime.</li> </ol></li> <li>Install <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">PuTTY</a> using the default options (I recommend using the Windows installer option): <ol><li>PuTTY allows you remote access to servers via SSH, as secure way to issue commands on your site’s server from your dev machine. If you do a lot of work on remote server, consider pinning the PuTTY program to the Taskbar.</li> <li>PuTTY also comes with PuTTYgen which lets you easily create and manage SSH key, which is what Git uses to authenticate a user on a given server. We use it in a bit.<!--EndFragment--></li> </ol></li> <li>Install and configure Git: <ol><li>Install <a href="http://git-scm.com/">Git for Windows</a> (follow the <em>Download for Windows</em> link) changing only one of the default settings: On the <em>Configure line endings</em> dialog select <em>Checkout as-is, commit as-is</em>. Unless you’re using a non-*nix aware code editor (possibly Visual Studio?) your it should be able to handle either type of line ending. If you’re unsure, go with the default as this is an option that is easy to change later, or even on a project-by-project basis.</li> <li>Click the <em>Start</em> menu and type <em>git</em>. Click on the <em>Git Bash</em> option then right-click on the Git Bash icon in the Taskbar.</li> <li>Click <em>Pin this program to the taskbar</em></li> <li> <p>Right-click (again) on the Git Bash icon in the Taskbar, right click on the <em>Git Bash</em> item and click on <em>Properties</em></p> <ol><li>Shortcut tab: Set the <em>Start in</em> option to your dev root directory, in my case: <em>%HOMEPATH%\Documents\dev</em></li> <li>Options tab: set <em>Buffer Size</em> to 900 (or however large you want your scrollbar to go back), ensure <em>Quick Edit</em> is checked.</li> <li>Layout tab: Set your preferred window size in the <em>Window size</em> and <em>Window position</em> fields, making note of the window width setting – you’ll use that later on.</li> <li>OK the <em>Properties</em> dialog.</li> </ol></li> <li> <p>Go to your <a href="http://drupal.org/user">drupal.org user account page</a>, click <em>Edit</em> followed by <em>Git access.</em></p> </li> <li> <p>Copy the <em>Git user configuration</em> lines and paste into your command shell.  This tells Git how to identify you to drupal.org and other Git servers. If you haven’t already, check the <em>I agree to these terms</em> checkbox in the <em>Git access agreement</em> section.</p> </li> <li> <p>I recommend the settings <a href="http://drupal.org/node/1542048">outlined on Drupal.org</a> for configuring Git. The most important one is setting <em>core.autocrlf</em> and <em>core.safecrlf</em> to <em>false</em> -- that prevents a lot of bogus end-of-line warnings if you use Coder to check your coding standards. Instructions to setup Coder to work with Drush is a little farther down.</p> </li> <li> <p>If you haven’t already uploaded an SSH key to drupal.org, switch to the <em>SSH Keys tab</em> and click the <em>Add a public key</em> link.</p> <ol><li>From the Windows Start menu, type <em>puttygen</em> and select the <em>PuTTygen</em> option that appears. This utility makes it easy to create and manage SSH keys.</li> <li>Click the <em>Generate</em> button and wiggle your mouse over the blank area as requested to provide some random input.  When the key is generated, add a passphrase to the key and click <em>Save public key</em> then <em>Save private key</em>.  Keep in mind that your public key is only as secure as your private key/passphrase, so use a reasonably complex passphrase and don't put your private key anywhere accessible to the general public.</li> <li>Copy the text generated in the large text box at the top of PuTTygen and paste it into the <em>Key</em> field on drupal.org and click <em>Save.</em></li> </ol></li> </ol></li> <li>Grab a few binaries that Git doesn’t install <ol><li>The Git shell install does not include the wget command and uses a piss-poor version of tar, both of which Drush uses extensively. We’ll grab better versions from GnuWin32, an open source collection of Linux shell commands for Windows. Download the <a href="http://gnuwin32.sourceforge.net/packages/wget.htm">wget</a> and <a href="http://gnuwin32.sourceforge.net/packages/libarchive.htm">libarchive</a> packages, grab the <em>Complete package, except sources</em> executable and run the installer using the default settings (feel free to uncheck the options to create Start menu folders, etc.)</li> <li>Navigate to the folder where GnuWin32 installed the binaries, usually similar to <em>C:\Program Files (x86)\GnuWin32\bin</em>, and rename <em>bsdtar.exe</em> to <em>tar.exe</em>.</li> <li>Add the <em>bin</em> directory to your path. While we're in here, we'll add a few other paths as well. In your Git shell type <em>vim ~/.bashrc</em> and add the following code and save: <pre class="code-sample"># GnuWin32 tools # Remove the " (x86)" if you're running 32-bit Windows PATH="/C/Program Files (x86)/GnuWin32/bin":$PATH # Support PHP from the command line # Update "php5.3.13" to point to the version of PHP installed PATH=/C/wamp/bin/php/php5.3.13:$PATH # MySQL for the commandline, in particular mysqldump # Update "mysql5.5.24" to point to the version of MySQL installed PATH="/C/wamp/bin/mysql/mysql5.5.24/bin":$PATH # Point Git to the correct SSH client export GIT_SSH="/C/Program Files (x86)/PuTTy/plink.exe" # This should come after any PATH additions export PATH </pre> If you are unfamiliar with vim, <a href="http://www.google.com/search?ie=UTF-8&amp;q=vim+quick+start">check Google</a> for some quick tutorials or use your favorite text editor. Note: if you have spaces in your path names, you need to enclose the entire path in double-quotes. The colon (:) character separates one entry from the next. The tilde character (~) can be used as a shortcut to <em>$HOME</em>, which on Windows is usually at <em>c:\Users\&lt;user-name&gt;</em><user-name>. Also note that we have to add the GnuWin32 binaries before the rest of the $PATH variables so that <em>bsdtar</em>, now renamed simply <em>tar</em>, will be found ahead of Git’s <em>tar</em> executable.</user-name></li> <li>There are plenty of other *nix commands not included with the Git shell (eg: more). If you grab GnuWin32 installers for those commands, they should use the same <em>bin</em> directory.</li> <li>Close and reopen your Git shell. Type <pre class="code-sample">wget --version</pre> and check that you don't get any error messages.</li> </ol></li> <li>Install and configure Drush – this part got a lot easier after the 12/1/2011 update of this page. (Note: there is a <a href="http://drush.ws/drush_windows_installer">Windows installer for Drush</a>, but I like having more control over where and what is installed. But if you’re not having fun playing around on the command line, it’s a completely acceptable option. Just be sure to unselect the PHP runtime option and skip steps 1 – 4, below). <ol><li>Go to the <a href="http://drupal.org/project/drush">Drush project page</a>, right-click on the <em>tar.gz</em> download option for the latest release of the 5.x branch, and select <em>Copy link address</em> (or whatever option your browser shows for copying a link address). The 5.x branch includes <strong>much</strong> better support for Windows than previous version of Drush. Kudos to the Drush developers for not treating Windows users as second class citizens!</li> <li>In your Git shell: Change directory to wherever you want to install Drush, (e.g.: <em>cd ~/Documents; mkdir bin; cd bin</em>).  Type <em>wget &lt;url_of_drush_5.x_download&gt;</em> followed by <em>tar –zxvf &lt;drush-5.x&gt;.tar.gz</em>.<br /><br /> Note: you can right-click on the Git shell to paste, or the keyboard combination of <em>alt+space e p</em> will select <em>Edit</em> –&gt; <em>Paste</em> from the system menu. You can also hit the <em>tab</em> button to autocomplete filenames, meaning you probably only need to type <em>tar –zxvf drush</em> and hit <em>tab</em> to unpack the download.</li> <li>In your Git shell type <em>vim ~/.bashrc</em> and add the following code between the GnuWin32 bit and the <em>export $PATH</em> line and save: <pre class="code-sample"># Drush export DRUSH_PHP=/C/wamp/bin/php/php5.3.8/php.exe # ^-- Replace with your path to php.exe export COLUMNS=110 # ^-- Replace with the window width noted above PATH=~/Documents/bin/drush:$PATH # ^-- Replace with your path to Drush</pre> </li> <li>While you’re in the <em>.bashrc</em> file add any alias or other shortcuts you like to have (e.g.: <em>alias ll=’ls -l’</em>)</li> <li>Exit and restart the shell. Type <em>drush status</em> to see if everything is working correctly: <pre>mikeker@MIKEKER-LAPTOP ~/Documents/dev $ drush status PHP configuration : C:\wamp\bin\php\php5.3.8\php.ini Drush version : 5.0-dev Drush configuration : Drush alias files :</pre> </li> </ol></li> <li>Optional: Install <a href="http://pear.php.net/">PEAR</a> and <a href="http://drupal.org/node/1419980">DrupalCS</a> to ensure your code adhears to the <a href="http://drupal.org/coding-standards">Drupal Coding Standard</a>. <ol><li>Install PEAR <ol><li>Download the <a href="http://pear.php.net/go-pear.phar">go-pear.phar</a> script and save it to <em>&lt;path_to_wamp&gt;/bin/php/php&lt;version_number&gt;/go-pear.phar</em>.</li> <li>Open a command shell as administrator (<em>Start</em> -&gt; type <em>cmd</em> -&gt; right-click on the <em>cmd.exe</em> option and select <em>Run as administrator</em>), navigate to where you saved <em>go-pear.phar</em> and type <em>php -d phar.require_hash=0 go-pear.phar</em> followed by Enter.</li> <li>The script should show you a list of file locations. Hit Enter to accept the defaults and continue.</li> <li>PEAR will install and may warn you about the PEAR directory not being in the PATH -- that's fine.</li> <li>When prompted, select Y when asked to alter php.ini. Don't close the command prompt, we'll need it in a bit.</li> <li>Open Windows Explorer and navigate to your PHP directory. You should find a PEAR_ENV.reg file here. Double-click it to add the PEAR environment variables to your registry.</li> <li>At this point you can run PEAR in command prompts (but NOT the Git shell -- .bat files don't play well with the MSysGit shell). Since I don't install PEAR packages more than once every blue moon, that works fine with me. If you do fiddle with PEAR packages regularly, you'll want to include the path to your PHP directory in your Windows path environment variable (as opposed to adding it to your <em>.bashrc</em> as we did earlier).</li> </ol></li> <li>Install Code Sniffer and configure it to work with Drush <ol><li>Back in the command prompt (not a Git shell), navigate to your PHP directory (eg: <em>c:\wamp\bin\php\php&lt;version_number&gt;</em>).</li> <li>Type <em>pear update-channels</em> and hit Enter to ensure you've got the latest and greatest.</li> <li>Type <em>pear install PHP_CodeSniffer</em> and hit Enter.</li> <li>The following commands will install Coder as a Drush extension, open a Git shell for these. This works fine UNLESS you have coder installed as a module in a project you're working on. My preferred config is to do my code checks with Drush, but if your situation doesn't allow it you can install coder anywhere else that Drush will pick it up on a project-by-project basis. See the <a href="http://drupalcode.org/project/drush.git/blob/refs/heads/7.x-5.x:/README.txt">Drush README</a> Commands section for details. <pre class="code-sample">cd ~ # Check if .drush exists, if not # mkdir .drush cd .drush drush dl coder</pre> </li> <li>Back in the command prompt with administrative permissions, navigate to your PHP directory (eg: <em>c:\wamp\bin\php\php&lt;version_number&gt;</em>) followed by <em>\pear\PHP\CodeSniffer\Standards</em>. From here type <em>mklink /j Drupal %HOMEPATH%\.drush\coder\coder_sniffer\Drupal</em> and hit Enter. If you placed coder someone other than your ~/.drush folder, you'll need to replace the second argument with the appropriate path.</li> <li>Test it out by opening a Git shell (we should be done with command prompts for now...), navigating to a Drupal install and typing <em>drush dcs index.php</em>. Note: if you're working in a Git repository, you'll get errors regarding invalid end-of-line characters and files not ending with a single newline. That's because Git converts Unix line endings to Windows when you checkout files.</li> </ol></li> </ol></li> <li>Install and configure your favorite code editor, in my case <strike><a href="http://www.aptana.com/">Aptana’s version of Eclipse</a></strike> <a href="http://www.sublimetext.com/">Sublime Text 2</a>. (Note Eclipse/Aptana config instructions <a href="http://mikekeran.com/webdev/eclipse-configuration-for-drupal-development">have been moved</a>). My ST2 configuration is a work-in-progress.</li> </ol><p><strong>You’re ready to rock! Go forth and build amazing Web sites.</strong></p> <h2>Basic workflow for a new project</h2> <p>When I’m starting work on a new site, here’s my basic workflow:</p> <ol><li>If needed, click the WAMP Manager icon, select <em>phpMyAdmin, </em>create a database and user for this project and give the user the needed permission for the new database.</li> <li>Edit the <em>hosts</em> file: Double-click the hosts shortcut created above, click <em>Yes </em>to the UAC warning, and add a line similar to <em>127.0.0.1  local.example.com</em> to the file and save. I like to preface all localhost addresses with the <em>local</em> subdomain so that it’s easy for me to tell what is live and what is dev. Plus <em>local.example.com</em> will still work with multi-site configurations of Drupal and it’s easy to switch from a given page on the live server to the same page on the dev server (assuming you’ve copied the database recently) by just swapping <em>www</em> for <em>local</em>.</li> <li>Edit <em>httpd-vhosts.conf</em>: Double-click the shortcut created above, click <em>Yes </em>to the UAC warning, and add code similar to: <pre>&lt;VirtualHost *:80&gt; DocumentRoot "&lt;path_to_root&gt;/example.com/drupal-7.0" ServerName local.example.com &lt;/VirtualHost&gt;</pre> (or whatever the current version of Drupal is) and save the file. (And make sure the example code is removed or commented out as mentioned above).</li> <li>Restart Apache: click the LAMP Manager icon then <em>Apache –&gt; Services –&gt; Restart Service</em>.</li> <li>Open the Git shell and navigate to <em>&lt;path_to_root&gt;/example.com</em>  and type <em>drush dl</em>.</li> <li>Point your browser to local.example.com and the Drupal install screen should come up</li> </ol></div> <div class="field field--name-webdev field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/category/webdev/programming/drupal" hreflang="en">Drupal</a></div> <div class="field__item"><a href="/category/webdev/programming" hreflang="en">Programming</a></div> </div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/drupal-planet" hreflang="en">Drupal Planet</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-230"></a> <article data-comment-user-id="0" about="/comment/230" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1306002283"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.selection-1.blogspot.com" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">Anonymous (not verified)</a> on Sat, 05/21/2011 - 11:24am</span> <span property="schema:dateCreated" content="2011-05-21T18:24:43+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/230#comment-230" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/230" class="permalink" rel="bookmark" hreflang="en">selection</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=230&amp;1=full&amp;2=en&amp;3=" token="fffd2a67"></drupal-render-placeholder> </div> </article> <a id="comment-242"></a> <article data-comment-user-id="0" about="/comment/242" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1321913862"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.itransition.com/sharepoint/" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">sharepoint 2010 (not verified)</a> on Mon, 11/21/2011 - 2:17pm</span> <span property="schema:dateCreated" content="2011-11-21T22:17:42+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/242#comment-242" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/242" class="permalink" rel="bookmark" hreflang="en">Great stuff! Just what I&#039;ve</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=242&amp;1=full&amp;2=en&amp;3=" token="68f5e35a"></drupal-render-placeholder> </div> </article> <a id="comment-249"></a> <article data-comment-user-id="0" about="/comment/249" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1327339864"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Anonymous (not verified)</span> on Mon, 01/23/2012 - 9:31am</span> <span property="schema:dateCreated" content="2012-01-23T17:31:04+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/249#comment-249" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/249" class="permalink" rel="bookmark" hreflang="en">One word - Quickstart</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=249&amp;1=full&amp;2=en&amp;3=" token="59555c9e"></drupal-render-placeholder> </div> </article> <div class="indented"><a id="comment-257"></a> <article data-comment-user-id="3" about="/comment/257" typeof="schema:Comment" class="comment js-comment by-node-author"> <mark class="hidden" data-comment-timestamp="1335151800"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/users/mikekeran" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span> on Sun, 04/22/2012 - 8:30pm</span> <span property="schema:dateCreated" content="2012-04-23T03:30:00+00:00" class="rdf-meta hidden"></span> </p> <p class="parent visually-hidden">In reply to <a href="/comment/249#comment-249" class="permalink" rel="bookmark" hreflang="en">One word - Quickstart</a> by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Anonymous (not verified)</span></p> <a href="/comment/257#comment-257" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/257" class="permalink" rel="bookmark" hreflang="en">Sure, but...</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=257&amp;1=full&amp;2=en&amp;3=" token="67aa8834"></drupal-render-placeholder> </div> </article> </div><a id="comment-291"></a> <article data-comment-user-id="0" about="/comment/291" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1358942289"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://www.metaabstraxion.com/" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">Web Design Firm (not verified)</a> on Wed, 01/23/2013 - 3:58am</span> <span property="schema:dateCreated" content="2013-01-23T11:58:09+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/291#comment-291" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/291" class="permalink" rel="bookmark" hreflang="en">This is simply amazing i like</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=291&amp;1=full&amp;2=en&amp;3=" token="85effe64"></drupal-render-placeholder> </div> </article> <a id="comment-302"></a> <article data-comment-user-id="0" about="/comment/302" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1360742060"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Hema (not verified)</span> on Tue, 02/12/2013 - 11:54pm</span> <span property="schema:dateCreated" content="2013-02-13T07:54:20+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/302#comment-302" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/302" class="permalink" rel="bookmark" hreflang="en">git usage</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=302&amp;1=full&amp;2=en&amp;3=" token="85e30695"></drupal-render-placeholder> </div> </article> <div class="indented"><a id="comment-303"></a> <article data-comment-user-id="3" about="/comment/303" typeof="schema:Comment" class="comment js-comment by-node-author"> <mark class="hidden" data-comment-timestamp="1360774020"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/users/mikekeran" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span> on Wed, 02/13/2013 - 8:47am</span> <span property="schema:dateCreated" content="2013-02-13T16:47:00+00:00" class="rdf-meta hidden"></span> </p> <p class="parent visually-hidden">In reply to <a href="/comment/302#comment-302" class="permalink" rel="bookmark" hreflang="en">git usage</a> by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Hema (not verified)</span></p> <a href="/comment/303#comment-303" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/303" class="permalink" rel="bookmark" hreflang="en">Git is not needed, but...</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=303&amp;1=full&amp;2=en&amp;3=" token="24da827b"></drupal-render-placeholder> </div> </article> </div><a id="comment-319"></a> <article data-comment-user-id="0" about="/comment/319" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1367970020"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">frank (not verified)</span> on Tue, 05/07/2013 - 4:40pm</span> <span property="schema:dateCreated" content="2013-05-07T23:40:20+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/319#comment-319" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/319" class="permalink" rel="bookmark" hreflang="en">git</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=319&amp;1=full&amp;2=en&amp;3=" token="f3504faa"></drupal-render-placeholder> </div> </article> <a id="comment-346"></a> <article data-comment-user-id="0" about="/comment/346" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1374953259"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">sparker888 (not verified)</span> on Sat, 07/27/2013 - 12:27pm</span> <span property="schema:dateCreated" content="2013-07-27T19:27:39+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/346#comment-346" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/346" class="permalink" rel="bookmark" hreflang="en">Can&#039;t find .bashrc either</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=346&amp;1=full&amp;2=en&amp;3=" token="aba8c243"></drupal-render-placeholder> </div> </article> <div class="indented"><a id="comment-348"></a> <article data-comment-user-id="3" about="/comment/348" typeof="schema:Comment" class="comment js-comment by-node-author"> <mark class="hidden" data-comment-timestamp="1375373880"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/users/mikekeran" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span> on Thu, 08/01/2013 - 9:18am</span> <span property="schema:dateCreated" content="2013-08-01T16:18:00+00:00" class="rdf-meta hidden"></span> </p> <p class="parent visually-hidden">In reply to <a href="/comment/346#comment-346" class="permalink" rel="bookmark" hreflang="en">Can&#039;t find .bashrc either</a> by <span lang="" typeof="schema:Person" property="schema:name" datatype="">sparker888 (not verified)</span></p> <a href="/comment/348#comment-348" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/348" class="permalink" rel="bookmark" hreflang="en">Location, location, location...</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=348&amp;1=full&amp;2=en&amp;3=" token="d244e012"></drupal-render-placeholder> </div> </article> </div><a id="comment-430"></a> <article data-comment-user-id="0" about="/comment/430" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1382904258"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://gta5savegame.com/" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">Mister Di (not verified)</a> on Sun, 10/27/2013 - 1:04pm</span> <span property="schema:dateCreated" content="2013-10-27T20:04:18+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/430#comment-430" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/430" class="permalink" rel="bookmark" hreflang="en">Thank you for this great</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=430&amp;1=full&amp;2=en&amp;3=" token="030dbb2b"></drupal-render-placeholder> </div> </article> <a id="comment-442"></a> <article data-comment-user-id="0" about="/comment/442" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1389638765"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Adrian Casillas (not verified)</span> on Mon, 01/13/2014 - 10:46am</span> <span property="schema:dateCreated" content="2014-01-13T18:46:05+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/442#comment-442" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/442" class="permalink" rel="bookmark" hreflang="en">Worth Its&#039; Weight Gold</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=442&amp;1=full&amp;2=en&amp;3=" token="94057216"></drupal-render-placeholder> </div> </article> <div class="indented"><a id="comment-443"></a> <article data-comment-user-id="3" about="/comment/443" typeof="schema:Comment" class="comment js-comment by-node-author"> <mark class="hidden" data-comment-timestamp="1389653403"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/users/mikekeran" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span> on Mon, 01/13/2014 - 2:50pm</span> <span property="schema:dateCreated" content="2014-01-13T22:50:03+00:00" class="rdf-meta hidden"></span> </p> <p class="parent visually-hidden">In reply to <a href="/comment/442#comment-442" class="permalink" rel="bookmark" hreflang="en">Worth Its&#039; Weight Gold</a> by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Adrian Casillas (not verified)</span></p> <a href="/comment/443#comment-443" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/443" class="permalink" rel="bookmark" hreflang="en">Virtualboxes and yadda yadda...</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=443&amp;1=full&amp;2=en&amp;3=" token="353cf6f8"></drupal-render-placeholder> </div> </article> </div><a id="comment-473"></a> <article data-comment-user-id="0" about="/comment/473" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1406522556"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Philip Kiff (not verified)</span> on Sun, 07/27/2014 - 9:42pm</span> <span property="schema:dateCreated" content="2014-07-28T04:42:36+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/473#comment-473" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/473" class="permalink" rel="bookmark" hreflang="en">Git Extensions is a good Windows alternative to plain Git</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=473&amp;1=full&amp;2=en&amp;3=" token="fc08edf5"></drupal-render-placeholder> </div> </article> <a id="comment-486"></a> <article data-comment-user-id="0" about="/comment/486" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1413789306"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <a rel="nofollow" href="http://atlantaka.org/?document_srl=195126" lang="" typeof="schema:Person" property="schema:name" datatype="" class="username">reparatii (not verified)</a> on Mon, 10/20/2014 - 12:15am</span> <span property="schema:dateCreated" content="2014-10-20T07:15:06+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/486#comment-486" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/486" class="permalink" rel="bookmark" hreflang="en">A Drupal Developer’s Setup on Windows | MikeKeran.com</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=486&amp;1=full&amp;2=en&amp;3=" token="ef420bdb"></drupal-render-placeholder> </div> </article> <a id="comment-534"></a> <article data-comment-user-id="0" about="/comment/534" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1457096848"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Jacob Harris (not verified)</span> on Fri, 03/04/2016 - 5:07am</span> <span property="schema:dateCreated" content="2016-03-04T13:07:28+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/534#comment-534" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/534" class="permalink" rel="bookmark" hreflang="en">A Drupal Developer’s Setup on Windows</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=534&amp;1=full&amp;2=en&amp;3=" token="c0509a32"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=149&amp;2=comment&amp;3=comment" token="9f01aed1"></drupal-render-placeholder> </section> Wed, 04 May 2011 20:22:59 +0000 MikeKeran 149 at https://www.mikekeran.com https://www.mikekeran.com/drupal-developer-setup-windows#comments The End of the Typewriter https://www.mikekeran.com/other/the-end-of-the-typewriter <span class="field field--name-title field--type-string field--label-hidden">The End of the Typewriter</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/mikekeran" typeof="schema:Person" property="schema:name" datatype="">MikeKeran</span></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 04/26/2011 - 12:20pm</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Obviously, I’m writing this on a computer. But the keyboard I use is basically the same as the Sholes &amp; Glidden typewriter of 1873, the first model to be commercially successful.  That success has run out as Godrej &amp; Boyce, <a href="http://content.usatoday.com/communities/ondeadline/post/2011/04/worlds-last-typewriter-factory-offers-it-final-500-machines-for-sale/1">possibly</a> the last typewriter manufacturer, <a href="http://www.guardian.co.uk/artanddesign/2011/apr/26/typewriters-enduring-romance-versus-technology">closes its doors</a>. While there were many innovations in the mechanics of these machines in those 140 years, some design decisions remain with us today despite the fact the original motivations have long since expired.</p><p>Keys were arranged on a diagonal so that the levers connecting keys to the typebar didn’t run into each other. Typing capital letters required lifting the entire typebar manually necessitating a shift lock (now caps lock) key. The QWERTY keyboard layout placed common letter-pairs at opposite ends of the keyboard to avoid jamming and modern developers rarely bat an eye at the terms “carriage return” and “line feed” even though there is no carriage to return nor paper being fed in my laptop.</p><p>Despite the inefficiency of some of these standards, they remain because of the momentum built over a 100 years of standardization. There have been some tweaks – my keyboard has function keys, page up/down, and dedicated media keys. But major renovations such as the <a href="http://en.wikipedia.org/wiki/Dvorak_Keyboard">Dvorak key layout</a> remain nothing more than niche products. Unless we’re posting comments on YouTube, the caps lock key is most often used in pairs – once by accident and again to correct the mistake. Yet it remains, taking up valuable real-estate on cramped laptops, though Google is <a href="http://www.tomshardware.com/news/chrome-os-laptop-search-caps-lock-cr-48,11766.html">looking to replace it</a> with (of course) a Search button. Time will tell if the Big-G can alter the keyboard landscape or a century of standardization trumps change.</p><p>I started using my mother’s electric typewriter in the 7th grade when poor penmanship was earning me lower grades on my writing assignments. Mom’s deal: if I borrowed her typewriter, I had to learn proper touch typing. I grumbled at first, but soon was typing much faster than I could write by hand. Combined with erasable typewriter paper, I was finishing longer assignments quickly which meant more time to play outside, a good deal in any boy’s mind.  (Thanks, Mom)</p><p>For the past two decades, I’ve relied on typing for my work. Communication happens by email and text messages and I write code for a living, all on computers. Yet typewriters appeal with a Beat-poet flair: late night writing binges fueled by whisky and cigarettes, the <em>ding-slap</em> at the end of a line and the raspy <em>zzzzip</em> as the page is pulled off the cartridge. Jack Kerouac, typing at 100 words a minute, wrote <a href="http://www.amazon.com/gp/product/0140283293/ref=as_li_ss_tl?ie=UTF8&amp;tag=kerpow-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=0140283293">One the Road</a> on roll paper to skip the interruption of loading new pages. William Gibson wrote <a href="http://www.amazon.com/gp/product/0441012035/ref=as_li_ss_tl?ie=UTF8&amp;tag=kerpow-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=0441012035">Neuromancer</a>, which coined the term <em>cyberspace</em>, on a Hermes 2000 manual typewriter.</p><p>As with most things nostalgic, they end. Even the exclusive <a href="http://www.writersroom.org/wrwp/">Writers Room</a> in New York, <a href="http://www.nydailynews.com/ny_local/2010/05/20/2010-05-20_untitled__typewriter20m.html">has banned typewriters</a>. “There's a different commitment when you know you're making a mark on the page, when you strike a key and bleed ink on the page,” said Skye Ferrante, who quit the club rather than work on a laptop.</p><p>New technologies always push aside old. This <a href="http://en.wikipedia.org/wiki/Creative_destruction">creative destruction</a> gives us options – I just rewrote the above paragraph – while it creates a nostalgic niche for those who are passionate about the bygone. Some like the warm sound of vinyl, others use pinhole cameras. There will always be a someone drinking whisky and banging away at a typewriter, cigarette dangling, late into the night.</p></div> <div class="field field--name-other field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/articles/nostalgia" hreflang="en">Nostalgia</a></div> <div class="field__item"><a href="/category/other/life-and-stuff" hreflang="en">Life and Stuff</a></div> </div> <section class="field field--name-comment field--type-comment field--label-hidden comment-wrapper"> <a id="comment-437"></a> <article data-comment-user-id="0" about="/comment/437" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1386870749"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Another Mike (not verified)</span> on Thu, 12/12/2013 - 9:52am</span> <span property="schema:dateCreated" content="2013-12-12T17:52:29+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/437#comment-437" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/437" class="permalink" rel="bookmark" hreflang="en">The End of the Typerwriter</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=437&amp;1=full&amp;2=en&amp;3=" token="d2432923"></drupal-render-placeholder> </div> </article> <a id="comment-438"></a> <article data-comment-user-id="0" about="/comment/438" typeof="schema:Comment" class="comment js-comment by-anonymous"> <mark class="hidden" data-comment-timestamp="1386886359"></mark> <footer class="comment__meta"> <article typeof="schema:Person" about="/user/0" class="profile"> </article> <p class="comment__submitted"><span rel="schema:author">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Mom (not verified)</span> on Thu, 12/12/2013 - 2:12pm</span> <span property="schema:dateCreated" content="2013-12-12T22:12:39+00:00" class="rdf-meta hidden"></span> </p> <a href="/comment/438#comment-438" hreflang="en">Permalink</a> </footer> <div class="content"> <h3 property="schema:name" datatype=""><a href="/comment/438" class="permalink" rel="bookmark" hreflang="en">After 30 years, I finally got</a></h3> <div property="schema:text" class="clearfix text-formatted field field--name-comment-body field--type-text-long field--label-hidden field__item"></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=438&amp;1=full&amp;2=en&amp;3=" token="0a968f9c"></drupal-render-placeholder> </div> </article> <h2 class="title comment-form__title">Add new comment</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=144&amp;2=comment&amp;3=comment" token="ded607f3"></drupal-render-placeholder> </section> Tue, 26 Apr 2011 19:20:13 +0000 MikeKeran 144 at https://www.mikekeran.com https://www.mikekeran.com/other/the-end-of-the-typewriter#comments