<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6998934275988922537</id><updated>2026-05-14T18:15:47.613-04:00</updated><category term="linux"/><category term="cvs"/><category term="shell"/><category term="tag"/><category term="PIBS"/><category term="bash"/><category term="boot loader"/><category term="perl"/><category term="vim"/><category term="xargs"/><category term="440GX"/><category term="alias"/><category term="amcc"/><category term="cms"/><category term="concrete5"/><category term="exercise"/><category term="find"/><category term="fitness"/><category term="ghs"/><category term="grep"/><category term="health"/><category term="ibm"/><category term="joomla"/><category term="mount"/><category term="nfs"/><category term="repeat"/><category term="script"/><category term="scripting"/><category term="search"/><category term="share drive"/><category term="strength training"/><category term="administration"/><category term="archive"/><category term="background"/><category term="binary"/><category term="blogspot"/><category term="branch"/><category term="broken"/><category term="case"/><category term="change control"/><category term="core dump"/><category term="date"/><category term="diet"/><category term="eval board"/><category term="file system"/><category term="ftp"/><category term="google"/><category term="healthy eating"/><category term="here document"/><category term="integrity"/><category term="kernel"/><category term="learn"/><category term="macro"/><category term="muscles"/><category term="network drive"/><category term="non-interactive"/><category term="ocotea"/><category term="or"/><category term="pid"/><category term="process"/><category term="protein"/><category term="ps"/><category term="rename"/><category term="replace"/><category term="repository"/><category term="rpm"/><category term="rtos"/><category term="sauna"/><category term="schedule"/><category term="scm"/><category term="sefault"/><category term="share"/><category term="sitemap"/><category term="sub-shell"/><category term="tutorial"/><category term="ulimit"/><category term="verifymsg"/><category term="version control"/><category term="video"/><category term="webmaster"/><category term="wget"/><category term="windows"/><title type='text'>Chiefs and Endians</title><subtitle type='html'>A compilation of varied technical gems learned over many years of experience in the industry. &lt;br&gt;&#xa;&lt;u&gt;Hint for the confused:&lt;/u&gt; Endian is a Computer Science term--the title is a play on words, not a misspelling.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-7165548810256447056</id><published>2025-09-16T11:17:00.002-04:00</published><updated>2025-09-16T11:17:38.563-04:00</updated><title type='text'>Fifteen Years Later: Tech Was the Gateway, AI Is the Warp Drive</title><content type='html'>&lt;div&gt;







&lt;p class=&quot;p1&quot;&gt;I dug through the archives recently — posts from 2010 about mounting remote NFS shares, writing Linux aliases, comparing Joomla vs Concrete5, messing with shell behavior.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt; Those were the warm-ups.&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Fast forward to now: I’m not just hacking together tools. I’m &lt;i&gt;making&lt;/i&gt; stuff that used to live entirely in thought experiments. I’m building mobile apps and websites and AI features that solve real problems — especially in youth sports. Because the idea of watching your kid practice and wondering if there was a tool to help, a better way to analyze performance, mattered to me enough that I built it.&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Here’s what’s different:&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;PitchGrid&lt;/b&gt;&lt;/span&gt; — our flagship mobile app (free) that lets athletes, parents, and coaches sync up multiple videos and do frame-by-frame analysis, zoom/crop, real-time feedback, sharing, exporting. Things I never tried doing before because it seemed way too big.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p class=&quot;p1&quot;&gt;Using &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;AI&lt;/b&gt;&lt;/span&gt; not for gimmickry, but to speed up dev, to solve things I used to hack around — like building web tools to help coaches analyze data to make them better leaders.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p class=&quot;p1&quot;&gt;Opening doors: I can now build tools that matter in youth sports (where budgets are tight, where coaches aren’t all tech-wizards) and still ship something solid. &lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;So this new place — &lt;a href=&quot;https://proliferaite.com&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&lt;b&gt;Proliferaite.com&lt;/b&gt;&lt;/span&gt;&lt;/a&gt; — is where all that meets. I am excited for what the future holds, because for the first time in my life it is only bound by my imagination.&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display: none;&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/7165548810256447056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2025/09/fifteen-years-later-tech-was-gateway-ai.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/7165548810256447056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/7165548810256447056'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2025/09/fifteen-years-later-tech-was-gateway-ai.html' title='Fifteen Years Later: Tech Was the Gateway, AI Is the Warp Drive'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-4775814011177056244</id><published>2015-03-16T11:25:00.001-04:00</published><updated>2015-03-16T11:25:34.952-04:00</updated><title type='text'>JoeJIRA.com created for Freelance Consulting presence</title><content type='html'>Work is great, and I thank God for my job and its present stability. &amp;nbsp;What tomorrow brings, I do not know, but in the here and now I want to make sure I am making the most of my talents and keeping myself diverse. &amp;nbsp;This blog has gone silent for years as I changed jobs and worked at an insane pace, learning and teaching. &amp;nbsp;&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I have spent time a lot of time working with some of the smartest people I have ever met. &amp;nbsp;I have been awed, demeaned, humbled, and eventually praised and admired. &amp;nbsp;The experience of the past years has been so fulfilling. &amp;nbsp;It definitely has raised my mental standards and I now expect a lot from Software Engineers. &amp;nbsp;It comes as a continued shock when I see how far behind in terms of best practices most companies are. &amp;nbsp;I have learned many best practices from my colleagues, created several on my own, and am still fully cognizant that I have barely scratched the surface on process improvement and leading efficiency. &amp;nbsp;I have brought automation, improved workflows, transparency, and better communication to many different areas of the business; it is very satisfying to see how much of an immediate improvement I can make in the company and often provide a better quality of work for the team members themselves.&lt;a href=&quot;http://www.chiefsandendians.com/&quot; rel=&quot;tag&quot; style=&quot;display: none;&quot;&gt;CodeProject&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Current circumstances thrust me into learning JIRA. &amp;nbsp;I had a wish list of ideas for the &quot;professionals&quot; we were going to hire to setup our JIRA instance. &amp;nbsp;I had workflows drawn out in VISIO and comments on how the approval flow should gate the releases before our CAB meetings reviewed them. &amp;nbsp;I, along with others on a team dedicated to new tool analysis, presented the proposed stack of tools to the COO and upper management. &amp;nbsp;We got the buy in to change to the more cutting edge stack, but when push came to shove and multiple consulting agencies quoted over $50k for basic setup, the support seemed to fizzle out. &amp;nbsp;The push for technology did not wane however, and I was the lucky winner (based on drive and ability) to self-learn JIRA administration and roll-out the tool-set myself.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It was touch and go for a while as I had to juggle my regular workload of Configuration &amp;amp; Release Management, but in the end we did manage to successfully migrate to the new tools and are continuously working to improve it, adding new teams to manage their own processes and workflows in JIRA. &amp;nbsp;As is usually the case from any saga, I am very thankful in hindsight for the new set of skills I learned. &amp;nbsp;My immersion in JIRA became a joke and some &quot;wise&quot; software developers began calling me &quot;Joe Jira&quot;. &amp;nbsp;The name was catchy enough and the idea of taking these new skills out into the world for some freelance work got me thinking...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
LONG STORY to basically tell anyone who stumbles here that I have created a new site called&amp;nbsp;&lt;a href=&quot;http://www.joejira.com/&quot; target=&quot;_blank&quot;&gt;http://www.joejira.com&lt;/a&gt;&amp;nbsp;in order to diversify myself with some freelance consulting off-hours. &amp;nbsp;Head over there for more info and let your friends know. &amp;nbsp;If anyone needs some shell scripting (bash or powershell), some Jenkins/Hudson CI setups, or some JIRA installation and workflow setup, send them my way.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/4775814011177056244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2015/03/joejiracom-created-for-freelance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/4775814011177056244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/4775814011177056244'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2015/03/joejiracom-created-for-freelance.html' title='JoeJIRA.com created for Freelance Consulting presence'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-5324704915744287313</id><published>2010-08-19T15:15:00.000-04:00</published><updated>2010-08-19T15:15:13.615-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cms"/><category scheme="http://www.blogger.com/atom/ns#" term="concrete5"/><category scheme="http://www.blogger.com/atom/ns#" term="joomla"/><title type='text'>CMS: Concrete5 CEO, Franz Maruna, Stops By For A Visit</title><content type='html'>In our last post, &lt;a href=&quot;http://www.chiefsandendians.com/2010/08/cms-joomla-vs-concrete5.html&quot;&gt;CMS: Joomla vs Concrete5 -- First Look&lt;/a&gt;, we reviewed an up-and-coming Web CMS called Concrete5 and compared it to the well established giant, Joomla.  &lt;br /&gt;
&lt;br /&gt;
We were very honored to have the CEO and Founder of Concrete5 stop by to read the review and join in on the discussion going on in the comments section.  We also had the pleasure of the President and CEO of &lt;a href=&quot;http://www.trivera.com/&quot;&gt;Trivera&lt;/a&gt; starting off the discussion and sharing his own experiences with Concrete5.  &lt;br /&gt;
&lt;br /&gt;
It&#39;s great to see that we not only have industry professionals giving us their opinions, but we even get those who are closest to the tool chiming in as well.  Let&#39;s try to keep up this open communication as we do some more in depth reviews in coming posts!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/5324704915744287313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/cms-concrete5-ceo-franz-maruna-stops-by.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/5324704915744287313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/5324704915744287313'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/cms-concrete5-ceo-franz-maruna-stops-by.html' title='CMS: Concrete5 CEO, Franz Maruna, Stops By For A Visit'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-8541907522985841420</id><published>2010-08-17T14:55:00.003-04:00</published><updated>2010-08-18T09:26:50.654-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cms"/><category scheme="http://www.blogger.com/atom/ns#" term="concrete5"/><category scheme="http://www.blogger.com/atom/ns#" term="joomla"/><title type='text'>CMS: Joomla vs Concrete5 -- First Look</title><content type='html'>I&#39;ve been delving into the fun world of web design lately and have been trying my hand at using a Content Management System to make it easier.  Turns out, using a CMS makes the website simpler in some ways, but adds its own complexities.  As I&#39;m working between the different CMS&#39;s, I think it would be worth sharing some top level opinions for those who are trying to decide between them.&lt;br /&gt;
&lt;br /&gt;
All 3 systems are open source and typically freely available on most web hosting services.  If not, they are easy enough to install.  I am not going to look at that right now.  Perhaps in later posts we&#39;ll drill down further into the differences, but for now, I am just looking at the admin interface.&lt;br /&gt;
&lt;br /&gt;
I started with Joomla, since it is best known, discarded it, tried Drupal, discarded it, played with WordPress, liked it but discarded it, and finally hit upon the lesser known Concrete5.  For a while, I had hit upon a gem, made my site, then as I tried to add a few features, I found myself limited.  I then began my way backwards through Drupal and eventually found myself with Joomla again.  Each have their strengths and weaknesses...&lt;br /&gt;
&lt;br /&gt;
Concrete5 is phenomenal in terms of interface for contributors.  Setting up the page is rather simple; take a template you like and insert just a few php statements, then upload it to the Concrete5 backend.  From there, using the front end you can just click around on the page itself (when it edit mode) and do wyswig style edits.  You can add blocks of text, html, images, flash content, etc.  Once added, if you want to change the layout, you can just grab the blocks and rearrange them.  There is version control as well!  Each edit versions that page and you can roll back to other versions.  &lt;br /&gt;
&lt;br /&gt;
Joomla on the other hand is much harder to setup.  The backend is not as simple or user friendly/intuitive.  Editing content is not as visual and requires work in the admin console.  Once you get used to it, Joomla can become easy, but adding/modifying content is nowhere near as easy as it is in Concrete5.&lt;br /&gt;
&lt;br /&gt;
So why did I switch back to Joomla?  Concrete5 fails when it comes to extendability and community support.  As I wanted to add advanced features to my site, like eCommerce shopping carts, I found that Concrete5 couldn&#39;t compete with the other CMS&#39;s available.  They did offer modules to extend Concrete5, but at a cost.  Now, I pursued an Open Source CMS enticed by the no-cost solution, so hearing that I have to pay to extend it turned me off.  Joomla, Drupal, and WordPress blow Concrete5 out of the water in this arena.  Not to say they are all free...All of them have paid and free extensions/modules/plugins.  The difference is there is usually a free version of everything and paid versions for more advanced/professional features.&lt;br /&gt;
&lt;br /&gt;
Drupal is a little weak compared to Joomla in terms of eCommerce, so I glossed over it in my search and moved back to Joomla.  WordPress was a very good solution too, but I discarded it since it really is designed for blogging sites.  There are ways to use WordPress for a non-blog site, but I didn&#39;t want to force the circle peg into the square hole. (Side note: this blog is hosted on Blogger.com, not a WordPress site).  Joomla finally fit the bill here.&lt;br /&gt;
&lt;br /&gt;
I&#39;ll try to talk in more detail about the features later, but since this is a blog, I&#39;ll have to curb myself here from going on and on.  My quick summary:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;1.  Concrete5 is great for simple sites with content contributors that are not too technically savvy.&lt;br /&gt;
&lt;br /&gt;
2.  Joomla is great for a lot of different tasks, very flexible, very powerful, but pays for this all with added admin complexity.&lt;/blockquote&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/8541907522985841420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/cms-joomla-vs-concrete5.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/8541907522985841420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/8541907522985841420'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/cms-joomla-vs-concrete5.html' title='CMS: Joomla vs Concrete5 -- First Look'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-6568624629905652351</id><published>2010-08-11T09:16:00.001-04:00</published><updated>2010-08-18T09:28:47.188-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="learn"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Learn with Lynda.com Video Tutorials</title><content type='html'>I don&#39;t share links often as this blog is really just for me to post tips &amp; tricks I learn on the job, but this link is amazing.  A coworker told me about www.lynda.com when we were discussing learning how to use video editing software.  This website has excellent video training on almost anything you can think of.  Basically any of the major multimedia or office software has extensive training videos available: Adobe Photoshop, Premiere, After Effects, Microsoft Excel, Access, etc.  They even have programming languages like PHP, Python, etc.  I signed up for the 7 day free trial (Google it and you will find a link) and after just 20 minutes of watching videos I was blown away at the possibilities.  &lt;br /&gt;
&lt;br /&gt;
The link I found for the 7 day free trial is &lt;a href=&quot;http://www.lynda.com/promo/trial/Default.aspx?lpk35=197&quot;&gt;http://www.lynda.com/promo/trial/Default.aspx?lpk35=197&lt;/a&gt;.  That is at the time of this post, but no guarantees that it will still be valid when you try it.  If not, just Google it: &lt;a href=&quot;http://www.google.com/custom?hl=en&amp;safe=active&amp;client=pub-8543699131032757&amp;cof=FORID:13;AH:left;CX:Chiefs%2520And%2520Endians%2520search;L:http://www.google.com/intl/en/images/logos/custom_search_logo_sm.gif;LH:30;LP:1;LC:%230000ff;VLC:%23663399;DIV:%23336699;&amp;adkw=AELymgWdGCaq544o5dMzfNFwhNmdhV9minkdrY80Hk4fhH2fZqMmoQSv032D9g0eLjd9mHinhkJ140iLj0si-PDcxZzwTs9hW2kATLzMAj-dLDEbj0Bm5KU&amp;channel=1188616536&amp;boostcse=0&amp;ie=ISO-8859-1&amp;oe=ISO-8859-1&amp;q=7+day+free+trial+lynda.com&amp;btnG=Search&amp;cx=!partner-pub-8543699131032757:lpz9eyuk1h6&quot;&gt;&quot;7 day free trial lynda.com&quot;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/6568624629905652351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/learn-with-lyndacom-video-tutorials.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/6568624629905652351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/6568624629905652351'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/learn-with-lyndacom-video-tutorials.html' title='Learn with Lynda.com Video Tutorials'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-878709857452718580</id><published>2010-08-10T12:42:00.001-04:00</published><updated>2010-08-18T09:28:57.704-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="background"/><category scheme="http://www.blogger.com/atom/ns#" term="script"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><category scheme="http://www.blogger.com/atom/ns#" term="sub-shell"/><title type='text'>LINUX: Sub-shells</title><content type='html'>I mentioned&amp;nbsp;sub-shells&amp;nbsp;before and the way the affect aliases, but I did not talk much about the use of&amp;nbsp;sub-shells&amp;nbsp;themselves. &amp;nbsp;A sub-shell can be quite useful in scripting, either to isolate certain environments, or to run sets of commands in parallel.&lt;br /&gt;
&lt;br /&gt;
Using them are simple: &amp;nbsp;Encapsulate the commands you want in a sub-shell within parentheses. &lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell&quot;&lt;br /&gt;
export ENVVAR=&quot;This is my sub-shell variable&quot; )&lt;br /&gt;
&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
&lt;/blockquote&gt;The first thing you will notice when running this script is that the environment variable we set within the sub-shell does not propagate back to the script.  The echo of $ENVVAR will be blank.  Sub-shells are unidirectional; they use one-way passing of the environment, so it can inherit your current environment, but will not give back anything.  This is very useful if you need to do multiple things that all require separate environments.&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 1&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
export ENVVAR=&quot;1&quot;&lt;br /&gt;
echo $ENVVAR )&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 2&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
export ENVVAR=&quot;2&quot;&lt;br /&gt;
echo $ENVVAR )&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 3&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
export ENVVAR=&quot;3&quot;&lt;br /&gt;
echo $ENVVAR )&lt;br /&gt;
&lt;/blockquote&gt;From the output, you will see that the ENVVAR set in one sub-shell does not carry over to the other.  Each environment is isolated.  This technique can be used if you are doing multiple code builds in parallel, each with their own development environment, variables, compilers, etc.  As it stands, the above executes each sub-shell serially, running one then the next.  How about running in parallel?  Add an ampersand &quot;&amp;&quot; at the end of each sub-shell to indicate backgrounding the whole block.&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 1&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
sleep 2&lt;br /&gt;
export ENVVAR=&quot;1&quot;&lt;br /&gt;
echo $ENVVAR ) &amp;&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 2&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
sleep 2&lt;br /&gt;
export ENVVAR=&quot;2&quot;&lt;br /&gt;
echo $ENVVAR ) &amp;&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 3&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
sleep 2&lt;br /&gt;
export ENVVAR=&quot;3&quot;&lt;br /&gt;
echo $ENVVAR ) &amp;&lt;br /&gt;
&lt;/blockquote&gt;I put sleep 2 in each block to slow it down so you can see the effects of backgrounding.  What you will see is that it will execute all the echo commands to print &quot;Start...&quot; at the same time, then waits 2 seconds, then the numbers get printed later.  The three sub-shells are running in parallel!  Did you catch the problem in the above though?  You were returned to the prompt prior to the script finishing.  You received your prompt and then all the sudden, the numbers got printed out after.  In order to tell the script to wait till all the sub-shells are finished before exiting the script, simply type &quot;wait&quot; at the end of the script.  The final script will look like:&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 1&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
export ENVVAR=&quot;1&quot;&lt;br /&gt;
echo $ENVVAR ) &amp;&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 2&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
sleep 2&lt;br /&gt;
export ENVVAR=&quot;2&quot;&lt;br /&gt;
echo $ENVVAR ) &amp;&lt;br /&gt;
&lt;br /&gt;
( echo &quot;Start sub-shell 3&quot;&lt;br /&gt;
echo $ENVVAR&lt;br /&gt;
sleep 2&lt;br /&gt;
export ENVVAR=&quot;3&quot;&lt;br /&gt;
echo $ENVVAR ) &amp;&lt;br /&gt;
&lt;br /&gt;
wait&lt;/blockquote&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/878709857452718580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/linux-sub-shells.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/878709857452718580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/878709857452718580'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/linux-sub-shells.html' title='LINUX: Sub-shells'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-3580440398520360618</id><published>2010-08-05T14:53:00.002-04:00</published><updated>2010-08-18T09:30:01.600-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="case"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="vim"/><title type='text'>LINUX: Case Insensitive in VIM Editor</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq4csKGoxxq1Ca5y0e6naj3ejz2agmGFvanIXgjcGyiRJZyt6upTBDmc8YJ0HeUOjaouzzg5JA9xO-8Nq1eJb0nu71HP2QGj2IL7UptzEgojyenIcMtbioP-EcDPyHrLwqNGE7jJ-FYFs/s1600/vim-editor_logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq4csKGoxxq1Ca5y0e6naj3ejz2agmGFvanIXgjcGyiRJZyt6upTBDmc8YJ0HeUOjaouzzg5JA9xO-8Nq1eJb0nu71HP2QGj2IL7UptzEgojyenIcMtbioP-EcDPyHrLwqNGE7jJ-FYFs/s200/vim-editor_logo.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;Just a quickie here.  If you are in the VIM editor and want to search for a term, but do not want it to be case sensitive, type &quot;:set ic&quot; enter.  This tells VIM to treat UPPER and lowercase the same.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/3580440398520360618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/linux-case-insensitive-in-vim-editor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/3580440398520360618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/3580440398520360618'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/linux-case-insensitive-in-vim-editor.html' title='LINUX: Case Insensitive in VIM Editor'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq4csKGoxxq1Ca5y0e6naj3ejz2agmGFvanIXgjcGyiRJZyt6upTBDmc8YJ0HeUOjaouzzg5JA9xO-8Nq1eJb0nu71HP2QGj2IL7UptzEgojyenIcMtbioP-EcDPyHrLwqNGE7jJ-FYFs/s72-c/vim-editor_logo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-8767391190892025276</id><published>2010-08-04T15:09:00.001-04:00</published><updated>2010-08-04T15:09:51.491-04:00</updated><title type='text'>Essential Effortless Efficiency</title><content type='html'>There&#39;s now a &quot;lens&quot; over on Squidoo that is geared towards collecting different technical time-saving tips from the community.&lt;br /&gt;
&lt;br /&gt;
Head on over and contribute: &lt;a href=&quot;http://www.squidoo.com/work-smarter-and-faster&quot;&gt;http://www.squidoo.com/work-smarter-and-faster&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/8767391190892025276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/essential-effortless-efficiency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/8767391190892025276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/8767391190892025276'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/essential-effortless-efficiency.html' title='Essential Effortless Efficiency'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-5039224797413855967</id><published>2010-08-04T11:41:00.001-04:00</published><updated>2010-08-18T09:40:52.531-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="macro"/><category scheme="http://www.blogger.com/atom/ns#" term="repeat"/><category scheme="http://www.blogger.com/atom/ns#" term="vim"/><title type='text'>LINUX: Creating Macros in VIM Editor</title><content type='html'>A fantastically efficient way to repeat a series of actions is to use a macro.  You may be familiar with macros from common products like MS Word.  They are quite easy to create and use.&lt;br /&gt;
&lt;br /&gt;
The simple steps we are going to follow are:&lt;br /&gt;
&lt;blockquote&gt;1. Assign macro to a key&lt;br /&gt;
2. Start recording&lt;br /&gt;
3. Do a bunch of stuff&lt;br /&gt;
4. Tell VIM we are done recording&lt;br /&gt;
5. Use the macro!&lt;br /&gt;
&lt;/blockquote&gt;To assign the macro to a key and start recording in one shot, what we do is type &quot;q&quot; followed by whatever key we want to set the macro to.  Let&#39;s say here we will use &quot;s&quot;.  So typing &quot;qs&quot; will cause a message &quot;recording&quot; to appear in the bottom left, indicating that we have started recording a macro to store in &quot;s&quot;.  Don&#39;t worry, you wont accidentally run the macro, by typing &quot;s&quot; since macros are run by typing the &quot;@&quot; symbol first.&lt;br /&gt;
&lt;br /&gt;
Now that we are recording, it is time to do some stuff.  Let us say that we need to add a semicolon to the end of the line, and then move the cursor to the next line to prepare for running the macro again.  Here is what you do:&lt;br /&gt;
&lt;blockquote&gt;1. Type &quot;i&quot; to go into insert mode&lt;br /&gt;
2. Press &lt;end&gt; key to go to end of line&lt;br /&gt;
3. Type &quot;;&quot; since we are in the right place&lt;br /&gt;
4. Press the down arrow key to move to the next line&lt;br /&gt;
5. Press Escape &lt;esc&gt; key to tell VIM we are done inserting text&lt;br /&gt;
6. Press &quot;q&quot; one more time to stop recording (the &quot;recording&quot; message goes away)&lt;br /&gt;
&lt;/blockquote&gt;Now the macro is set.  Type &quot;@s&quot; to run the macro.  Now, let&#39;s say we want to run it on 20 lines of code...Use the trick learned in a previous post to repeat the macro 20 times:  &quot;20@s&quot;.  Viola!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/5039224797413855967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/linux-creating-macros-in-vim-editor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/5039224797413855967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/5039224797413855967'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/08/linux-creating-macros-in-vim-editor.html' title='LINUX: Creating Macros in VIM Editor'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-4142133663597551347</id><published>2010-07-30T12:17:00.002-04:00</published><updated>2010-08-18T09:41:08.207-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="repeat"/><category scheme="http://www.blogger.com/atom/ns#" term="vim"/><title type='text'>LINUX: Repeat Command/Action N Times in VIM Editor</title><content type='html'>All too often I find myself redoing a command over and over.  I&#39;ve often said, there must be a better way to do this.  And there is!  While writing some automation scripts in an agile &quot;paired-programming&quot; method yesterday, I learned a few neat tricks for VI from my programming partner. I&#39;ll share them in the next few posts.&lt;br /&gt;
&lt;br /&gt;
The first is repeating a command.  If, for example, you want to delete 100 lines from your file in VIM.  Pressing the &quot;d&quot; key twice deletes a single line.  So I used to just keep typing dd 100 times till everything I want was deleted.  If you know how many times you want to run the command, you just type the number first, then the command.&lt;br /&gt;
&lt;blockquote&gt;100dd&lt;/blockquote&gt;Typing the above in VIM will repeat the single line delete (dd) command 100 times.  How else can it be use?  It can even insert text repeatedly!  Type the following&lt;br /&gt;
&lt;blockquote&gt;50iTHE END IS NEAR&amp;lt;escape&amp;gt;&amp;lt;escape&amp;gt;&lt;/blockquote&gt;The 50i tells VIM that you are going to insert some text that you want repeated 50 times.  The text &quot;THE END IS NEAR&quot; is what will be repeated.  And pressing the escape key twice implements it.  You would get:&lt;br /&gt;
&lt;blockquote&gt;THE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEARTHE END IS NEAR&lt;/blockquote&gt;Notice it is all one line.  In order to make it appear on multiple lines, just press the enter key and then end of the text, before the escape.  Very simple.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/4142133663597551347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-repeat-commandaction-n-times-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/4142133663597551347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/4142133663597551347'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-repeat-commandaction-n-times-in.html' title='LINUX: Repeat Command/Action N Times in VIM Editor'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-9041361837323086915</id><published>2010-07-29T12:46:00.002-04:00</published><updated>2010-08-18T09:41:22.500-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="alias"/><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="scripting"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><title type='text'>LINUX: Alias and Script Subshells</title><content type='html'>This is an update to my last post on &lt;a href=&quot;http://www.chiefsandendians.com/2010/07/linux-scripts-and-alias.html&quot;&gt;Scripts and Alias.&lt;/a&gt;  Almost immediately after posting about the solution of enabling the expand_aliases shell option in scripts, I tried it in a more complicated script with a subshell, and it didn&#39;t work.&lt;br /&gt;
&lt;br /&gt;
I&#39;ll make this post quick.  In a script, you can run commands in a subshell (remember, the script itself is already in a subshell).  This sub-subshell is not &lt;i&gt;really&lt;/i&gt; a subshell, because if you echo the $SHLVL environment variable within it to see what shell level you are at, you will see that it is at the same level of the script.  However, we are going to consider it a sub-subshell because it doesn&#39;t influence the rest of the script with what it does or sets.  You run these sub-subshells by encapsulating them in parentheses.  Eg:&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
shopt -s expand_aliases&lt;br /&gt;
alias testme1=&quot;echo It Worked&quot;&lt;br /&gt;
alias&lt;br /&gt;
testme1&lt;br /&gt;
( shopt -s expand_aliases&lt;br /&gt;
echo &quot;I am in a subshell!&quot;&lt;br /&gt;
echo &quot;Can anyone hear me?&quot; &lt;br /&gt;
alias testme2=&quot;echo Subshell Alias&quot;&lt;br /&gt;
testme2 )&lt;br /&gt;
&lt;/blockquote&gt;If you run this, you will see that testme1 works, while testme2 doesn&#39;t.  Even putting the shopt -s expand_aliases within the sub-subshell still doesn&#39;t fix it.&lt;br /&gt;
&lt;br /&gt;
SO, the solution?  I went back to my old dirty hack, and that worked fine.  &lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
shopt -s expand_aliases&lt;br /&gt;
alias testme1=&quot;echo It Worked&quot;&lt;br /&gt;
alias&lt;br /&gt;
testme1&lt;br /&gt;
( shopt -s expand_aliases&lt;br /&gt;
echo &quot;I am in a subshell!&quot;&lt;br /&gt;
echo &quot;Can anyone hear me?&quot; &lt;br /&gt;
alias testme2=&quot;echo Subshell Alias&quot;&lt;br /&gt;
&lt;b&gt;  `alias | grep testme2 | cut -d\&#39; -f2` &lt;/b&gt;)&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
One caveat to point out:  If you don&#39;t have an alias set, this will mess up things.  I tried running a &quot;make&quot; command using my above hack, but in one case, the build environment didn&#39;t bother setting up an aliases &quot;make&quot;, working fine with just a standard &quot;make&quot;.  When it tried my hack, it didn&#39;t find anything in the alias, so did nothing.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/9041361837323086915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-alias-and-script-subshells.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/9041361837323086915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/9041361837323086915'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-alias-and-script-subshells.html' title='LINUX: Alias and Script Subshells'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-3642157620867748231</id><published>2010-07-27T13:07:00.002-04:00</published><updated>2010-08-18T09:41:36.361-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="alias"/><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="broken"/><category scheme="http://www.blogger.com/atom/ns#" term="non-interactive"/><category scheme="http://www.blogger.com/atom/ns#" term="script"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><title type='text'>LINUX:  Scripts and Alias</title><content type='html'>This one stumped me for a while; we had build scripts that kept failing, yet if you manually executed the commands from the script, everything worked fine.  Eventually I discovered that it wasn&#39;t properly executing the &quot;make&quot; command as was setup in the alias.  When we set up our build environment, we alias &quot;make&quot; to have a bunch of compiler flags so when you finish running the setupenv file (to set environment variables and such), all you have to do is run &quot;make&quot; and the alias keeps track of all the necessary build flags.&lt;br /&gt;
&lt;br /&gt;
Scripts never work properly because they interpret your &quot;make&quot; command to be just that--&quot;make&quot; with no build flags.  It turns out this is because scripts (non-interactive shells) (1) don&#39;t expand aliases and (2) don&#39;t bring in the current environment.&lt;br /&gt;
&lt;br /&gt;
Concerning point 2 about the current environment:  This is actually a good thing.  Imagine if you have a special environment you set up and the script runs fine in your area, then someone else tries to run it in theirs and it fails.  It would be a pain to begin debugging by comparing what is in your .bashrc file and what you did to customize your environment.  A script should be self contained, able to run in any environment.  So when you run it, it doesnt carry over your environment variables into its non-interactive subshell that it runs in.&lt;br /&gt;
&lt;br /&gt;
We are more concerned with point 1 though:  A shell script, at least on all the Fedora and RedHat servers I&#39;ve worked on, do not expand the aliases by default.  Before I came across the good solution on the internet, I hacked together my own solution of parsing the expanded command out of the alias output:&lt;br /&gt;
&lt;blockquote&gt;`alias | grep make | cut -d\&#39; -f2`&lt;/blockquote&gt;That works, but is not an elegant solution by any means.  Recently a coworker was having trouble with a build script and I got into explaining to him he may have a problem with a non-expanding alias.  I showed him my solution and then gave the caveat that there is probably a better, easier solution out there.  Then I looked for one and found it (don&#39;t ask me why I didn&#39;t find it the first time when I created my hack solution).  Just place the following command in the begginning of your shell script:&lt;br /&gt;
&lt;blockquote&gt;shopt -s expand_aliases&lt;/blockquote&gt;What this does is sets the shell option (shopt) to enable (-s) the expansion of aliases (expand_aliases).  The man page says that this option is enabled by default for interactive shells, so the implication (and reality we&#39;ve witnessed) is that it is disabled by default for non-interactive shells.&lt;br /&gt;
&lt;br /&gt;
If you want to see this in action, try this script:&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
alias testme=&quot;echo It Worked&quot;&lt;br /&gt;
alias&lt;br /&gt;
testme&lt;br /&gt;
&lt;/blockquote&gt;The result will print the new alias you assigned (typing alias in line 3 prints out current aliases) for testme.  Notice there are no other aliases set, not even the ones that are set globally for the system.  The execution of the testme command fails with &quot;command not found&quot; because it is not recognizing the alias.&lt;br /&gt;
&lt;br /&gt;
Now try again with the shopt set:&lt;br /&gt;
&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;
&lt;b&gt;shopt -s expand_aliases&lt;/b&gt;&lt;br /&gt;
alias testme=&quot;echo It Worked&quot;&lt;br /&gt;
alias&lt;br /&gt;
testme&lt;br /&gt;
&lt;/blockquote&gt;Now it will work perfectly, showing the alias we set and echoing the &quot;It Worked&quot; statement.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/3642157620867748231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-scripts-and-alias.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/3642157620867748231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/3642157620867748231'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-scripts-and-alias.html' title='LINUX:  Scripts and Alias'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-2456183404321732500</id><published>2010-07-14T17:18:00.002-04:00</published><updated>2010-08-18T09:41:47.264-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="here document"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="scripting"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><title type='text'>LINUX: The Power of HERE Documents</title><content type='html'>After doing things the manual, brute force way, you will be able to truly appreciate the elegance of HERE documents.  If you wanted to create a file with a few lines of text in them, you would redirect the echo command to it.  E.g.&lt;br /&gt;
&lt;blockquote&gt;echo &quot;The old method&quot; &amp;gt; temp.txt&lt;br /&gt;
echo &quot;Appending a second line to the file &amp;gt;&amp;gt; temp.txt&lt;/blockquote&gt;Side note--a single redirect arrow, the &quot;greater than&quot; sign, will create a new file called temp.txt containing the text on the left hand side.  The double redirect arrow as shown on the second line, will not create a new file (nor erase the contents of the existing one), but rather, it will append to it.&lt;br /&gt;
&lt;br /&gt;
So that method is okay for doing a few small things, but it isn&#39;t efficient or powerful when your needs are greater.  We can use a HERE document to put several lines of text into a file without having to continuously echo and redirect.  A HERE document can be used for more that just this, but that is the focus of this post.  So, the example is as follows:&lt;br /&gt;
&lt;blockquote&gt;cat &amp;gt; temp.txt &amp;lt;&amp;lt; EOF&lt;br /&gt;
The Old Method&lt;br /&gt;
Appending a second line to the file&lt;br /&gt;
EOF&lt;/blockquote&gt;The temp.txt and EOF can be changed to whatever you want.  The temp.txt is just a file to dump the text into.  The EOF is a label to indicate the beginning and end of the HERE document.  Notice that there is a matching EOF at the end.  If you wanted to use the word HERE, that is perfectly fine, just make sure that at the end of the section to put into the file, you write a matching HERE to indicate the end of the block.  &lt;br /&gt;
&lt;br /&gt;
The end result of the two methods are the same, however the HERE document scales much better.  You can put a 100 lines of text right in there if you desired with little effort.&lt;br /&gt;
&lt;br /&gt;
There is even more power to be had here.  We can do things like executing commands at run time when compiling the HERE document.  E.g.&lt;br /&gt;
&lt;blockquote&gt;cat &amp;gt; tmp1 &amp;lt;&amp;lt;EOF&lt;br /&gt;
this is the first file&lt;br /&gt;
this is the 2nd line of 1st file&lt;br /&gt;
`echo hello`&lt;br /&gt;
did the above come out as &quot;hello&quot; or echo hello?&lt;br /&gt;
no, it executed the echo and just printed hello...nice&lt;br /&gt;
EOF&lt;br /&gt;
&lt;/blockquote&gt;Using the technique of appending mentioned above, along with the HERE document, we can also grow our HERE document.  E.g.&lt;br /&gt;
&lt;blockquote&gt;cat &amp;gt; tmp1 &amp;lt;&amp;lt;EOF&lt;br /&gt;
this is the first file&lt;br /&gt;
this is the 2nd line of 1st file&lt;br /&gt;
`echo hello`&lt;br /&gt;
did the above come out as &quot;hello&quot; or echo hello?&lt;br /&gt;
no, it executed the echo and just printed hello...nice&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
cat &amp;gt;&amp;gt; tmp1 &amp;lt;&amp;lt;EOF&lt;br /&gt;
did everything get deleted?&lt;br /&gt;
nope, it appended&lt;br /&gt;
EOF&lt;br /&gt;
&lt;/blockquote&gt;The results of the above script would be (inside tmp1 file):&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;this is the first file&lt;br /&gt;
this is the 2nd line of 1st file&lt;br /&gt;
hello&lt;br /&gt;
did the above come out as &quot;hello&quot; or echo hello?&lt;br /&gt;
no, it executed the echo and just printed hello...nice&lt;br /&gt;
did everything get deleted?&lt;br /&gt;
nope, it appended&lt;/b&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/2456183404321732500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-power-of-here-documents.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2456183404321732500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2456183404321732500'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/07/linux-power-of-here-documents.html' title='LINUX: The Power of HERE Documents'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-6238270654474343489</id><published>2010-06-29T16:30:00.001-04:00</published><updated>2010-08-18T09:41:57.511-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="perl"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><title type='text'>PERL: Removing Text Within Parentheses</title><content type='html'>I recently wanted to get a list of major landmarks, but the text list had the name of the landmark, followed by the location of the landmark in parentheses: ex. Eiffel Tower (Paris, France).  I just wanted the names of the landmarks without the text in the parentheses, so had to figure out the command to remove all the parenthesized text.&lt;br /&gt;
&lt;br /&gt;
Perl was the winner as tool of choice.  There was a small trick to doing this seemingly trivial task, so document it we shall.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Original&lt;/b&gt;:  Eiffel Tower (Paris, France)&lt;br /&gt;
&lt;b&gt;Desired&lt;/b&gt;: Eiffel Tower&lt;br /&gt;
&lt;br /&gt;
There are two ways to do it based on what you want:&lt;br /&gt;
&lt;blockquote&gt;perl -p -e &#39;s#\(.*\)##g&#39; &lt;i&gt;textfile&lt;/i&gt;&lt;/blockquote&gt;You may have seen &#39;s/oldtext/newtext/g&#39; as the syntax before and are wondering why I am using hash marks (or pound signs) instead.  You don&#39;t have to use the forward slash, it is just the common way, but if you want to use the forward slash in the search text without having to escape, using hash marks are the way.  It can also be used to make it easier to read.  Now, onto the command--the \( obviously says look for a left parenthesis, then there is the critical .* which says find any number of any characters.  Finally, we close it off with a right parenthesis.  This will find anything encapsulated by two parentheses.  &lt;br /&gt;
&lt;blockquote&gt;perl -p -e &#39;s#\([^)]*\)##g&#39; &lt;i&gt;textfile&lt;/i&gt;&lt;/blockquote&gt;This solution will also do the same thing based on our Original text string, but it is slightly different.  The [^)] is telling &quot;any character that is not a right parenthesis.&quot;  The carat (^) is negating everything in the brackets.  This is useful if you are making an exclusion set.  You can place several characters, [^$)?], and it will look for any character &lt;b&gt;except&lt;/b&gt; a $, ), or ?.  &lt;br /&gt;
&lt;br /&gt;
Since the two commands work the same for the given example, let&#39;s show how the commands will vary in different situations:&lt;br /&gt;
If &lt;i&gt;textfile&lt;/i&gt; contains&lt;br /&gt;
&lt;blockquote&gt;1. Paris (France,) Hilton (Hotel)&lt;/blockquote&gt;&lt;blockquote&gt;2. Paris (France (Hilton) Hotel)&lt;/blockquote&gt;Using &lt;blockquote&gt;perl -p -e &#39;s#\(.*\)##g&#39; &lt;i&gt;textfile&lt;/i&gt;&lt;/blockquote&gt;The results would be:&lt;br /&gt;
&lt;blockquote&gt;1. Paris&lt;/blockquote&gt;&lt;blockquote&gt;2. Paris&lt;/blockquote&gt;Note the danger here is that, even though in line 1 Hilton is not in parentheses, it gets removed because there is an ending right parenthesis at the end of the line.  This may not be the expected/intended operation.&lt;br /&gt;
&lt;br /&gt;
Next, using &lt;blockquote&gt;perl -p -e &#39;s#\([^)]*\)##g&#39; &lt;i&gt;textfile&lt;/i&gt;&lt;/blockquote&gt;The results would be:&lt;br /&gt;
&lt;blockquote&gt;1. Paris Hilton&lt;/blockquote&gt;&lt;blockquote&gt;2. Paris Hotel)&lt;/blockquote&gt;The operation for line 1 may have been what we were expecting, but line 2 doesn&#39;t look good.  The moral here is to understand what you are trying to do and choose the correct command to do the appropriate operation.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/6238270654474343489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/06/perl-removing-text-within-parentheses.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/6238270654474343489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/6238270654474343489'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/06/perl-removing-text-within-parentheses.html' title='PERL: Removing Text Within Parentheses'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-429737406976036035</id><published>2010-06-24T12:37:00.001-04:00</published><updated>2010-08-02T12:00:30.681-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="exercise"/><category scheme="http://www.blogger.com/atom/ns#" term="fitness"/><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="strength training"/><title type='text'>HEALTH: Quasar Workouts</title><content type='html'>My new favorite method of exercise is Quasar Training.  It is a method my friend and I made up recently in the gym to help &quot;spice up&quot; our gym routine.  I can&#39;t say that the idea is novel--I think most everything has been thought of already--but it is new for us.  We called it Quasar because it sounds awesome and motivating, but it really is QSSR training.&lt;br /&gt;
&lt;br /&gt;
Quick Start, Slow Release (QSSR), aka Quasar, is a technique that follows exactly what the name implies.  Start the exercise with a Quick Start effort, working the Fast Twitch muscles for speed increases.  At the peak of the movement, right before you begin the return movement, you change over from &quot;Quick&quot; to &quot;Slow&quot;.  The Slow Release is returning in a very slow motion, about 2 &quot;Mississippi Counts&quot; worth.&lt;br /&gt;
&lt;br /&gt;
In one exercise, you are increasing your explosive speed, and gaining strength.  The muscle strength you gain is also being exercised differently.  Since the return is often a quick release of muscle tension, most workouts rarely exercise the muscles in this fashion.  Slow Release will allow quicker gains and a more complete muscular workout as you employ stabilizer muscles as well.  &lt;br /&gt;
&lt;br /&gt;
A great way to experience Quasar Training immediately is to a set of Quasar Push-Ups right now.  Lay on the floor in Push-Up position, but with your chest on the floor.  Launch yourself up as fast you can (Quick Start) and then lower yourself back down very slowly (Slow Release).  Repeat for a complete set.  Do not let your chest touch the ground between repetitions.  Each time you are pushing up as fast as you can to build explosive speed, then you are returning down, fighting gravity very slowly.&lt;br /&gt;
&lt;br /&gt;
This has been talked about on EzineArticles as well: &lt;a href=&quot;http://ezinearticles.com/?Quasar-Workouts-Are-the-Brightest-Way-to-Stellar-Physical-Fitness&amp;id=4523423&quot;&gt;http://ezinearticles.com/?Quasar-Workouts-Are-the-Brightest-Way-to-Stellar-Physical-Fitness&amp;id=4523423&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/429737406976036035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/06/health-quasar-workouts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/429737406976036035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/429737406976036035'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/06/health-quasar-workouts.html' title='HEALTH: Quasar Workouts'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-722209912174219366</id><published>2010-05-26T09:49:00.002-04:00</published><updated>2010-08-02T12:00:44.135-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="exercise"/><category scheme="http://www.blogger.com/atom/ns#" term="fitness"/><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="strength training"/><title type='text'>HEALTH: Interval Strength Training</title><content type='html'>If you do strength training, you probably know that your body can plateau and changing up your exercise pattern is a good way to kick your body back into gear.  In an effort to do just such a kick start, my gym buddy and I often try new techniques.  One such that we find very effective is what we call &lt;span style=&quot;font-weight:bold;&quot;&gt;Interval Strength Training&lt;/span&gt;.  &lt;br /&gt;
&lt;br /&gt;
The term Interval Training is overused already, utilized for other techniques unrelated to what we are talking about here.  While a better name is needed, when we use it in our workout routine, we always know what &lt;span style=&quot;font-style:italic;&quot;&gt;we &lt;/span&gt;mean by it.&lt;br /&gt;
&lt;br /&gt;
You can call it what you want, but in context of this post, Interval Training is a method of simply changing the order of the weight changes in a set.  Traditional methods do 3 sets of 10 repetitions (reps) of increasing strength: light, medium, heavy.  It is also a good idea to always start with a warm up set that isn&#39;t counted in the above 3.  &lt;br /&gt;
&lt;br /&gt;
Interval Strength Training is a little different.  We shock the muscle by jumping back and forth, and also change the reps per set.  The first set is the traditional &quot;light&quot; set at 10 - 12 reps.  Next, we jump up to our heaviest set at 4 - 6 reps.  If you are able to do more than 6 reps on Heavy, than you have misjudged your weight selection and should fix it next time.  The 3rd set is Medium; somewhere between the heavy and light, and should be 8 - 10 reps.  Finally, we push out a set of what we call &quot;Super Light&quot; which is set below the Light set from before and we have to do 20 reps at this weight.  &lt;br /&gt;
&lt;br /&gt;
The method here allows for your muscles to work on heavier weights earlier in the workout before they fatigue, which will encourage muscle growth.  The super light set at the end helps to build endurance as you push your muscles to fatigue.  Our own application of this technique is to do 2 or 3 weeks traditional, then a week of Interval Strength Training to &quot;change it up&quot;.  &lt;br /&gt;
&lt;br /&gt;
Give it a try and see the results.  Feel free to report them here for others to benefit.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;To Recap:&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;1. Light = 10 - 12 Reps&lt;br /&gt;
2. Heavy = 4 - 6 Reps&lt;br /&gt;
3. Medium = 8 - 10 Reps&lt;br /&gt;
4. Super Light = 20 Reps&lt;br /&gt;
&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/722209912174219366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/health-interval-strength-training.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/722209912174219366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/722209912174219366'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/health-interval-strength-training.html' title='HEALTH: Interval Strength Training'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-4843240197230394201</id><published>2010-05-06T13:58:00.001-04:00</published><updated>2010-08-18T09:42:10.148-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="change control"/><category scheme="http://www.blogger.com/atom/ns#" term="cvs"/><category scheme="http://www.blogger.com/atom/ns#" term="perl"/><category scheme="http://www.blogger.com/atom/ns#" term="verifymsg"/><title type='text'>CVS: Using Perl to Restrict Commits</title><content type='html'>This is one of the most useful tricks I have used in terms of SCM controlling of a CVS repository, so listen closely.&lt;br /&gt;
&lt;br /&gt;
CVS is a great tool, and a horrible tool all in once Open Source package.  It can do a lot, but often it can do too much as well.  In order to stand a chance of having a well controlled environment, it is often important to have CVS do some of the enforcement work for you.  Let &lt;span style=&quot;font-style:italic;&quot;&gt;it &lt;/span&gt;be the bad guy instead of &lt;span style=&quot;font-style:italic;&quot;&gt;you&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
First, check out the CVSROOT module from CVS:&lt;br /&gt;
&lt;blockquote&gt;$ cvs co CVSROOT&lt;/blockquote&gt;The most important file here is verifymsg.  This file tells CVS which files to pay attention to when someone commits a file.  In this file, we will tell CVS to restrict one file to a set of rules, and let another file slide no matter what.  Take for example 2 subdirectories, one called GUI and one called TEST.  Let&#39;s say we don&#39;t care about TEST code and can let developers change this stuff at will, but GUI is our production code that we want to keep tight control on.  How do we control it?&lt;br /&gt;
&lt;br /&gt;
We can either require them to submit some sort of change document like a bug id, problem report (PR), software change request (SCR), etc. OR we can put certain requirements on the content of the commit comment.  The method I employed was to tie them to using SCR&#39;s that they had to create with a 3rd party tool called Serena ChangeMan Dimensions.  It is a tool for Change Tracking (a critical SCM concept and we were able to do it by doing this hacked integration of CVS and Dimensions.  A tighter, more seamless integration already exists with Bugzilla and CVS, but we are not always given flexibility to use the tools we want to use, so we figure out how to use the tools we have to use.&lt;br /&gt;
&lt;br /&gt;
In any case, in order to require them to create an SCR in Dimesnions for each check in, we will need to do a few steps:&lt;br /&gt;
&lt;blockquote&gt;1)&amp;nbsp;&amp;nbsp;&amp;nbsp; Tell CVS which files to NOT-enforce on in verifymsg&lt;br /&gt;
2)&amp;nbsp;&amp;nbsp;&amp;nbsp; Write a perl script to check the commit message for an SCR number. This perl script is the key--if we wanted to make sure they wrote a full sentence in their message instead of checking for an SCR number, we could do that here instead too.&lt;br /&gt;
3)&amp;nbsp;&amp;nbsp;&amp;nbsp; Tell CVS which files we DO want to enforce checking on and point it to the perl script created above to verify the commit message.&lt;br /&gt;
4)&amp;nbsp;&amp;nbsp;&amp;nbsp; Commit the verifymsg file to CVS&lt;br /&gt;
5)&amp;nbsp;&amp;nbsp;&amp;nbsp; Ensure the script is executable by everyone.&lt;br /&gt;
&lt;/blockquote&gt;Now to work on the perl script.  A good place for it would be /usr/local/bin, but you can put it anywhere you want.  This is going to be a perl script.  Don&#39;t know what Perl is?  It is not something precious made in clams and strung around a pretty girl&#39;s neck.  It is a powerful scripting language.  That is all I will say about it here.  If you want to know details, visit http://perldoc.perl.org/index-tutorials.html or http://www.perl.com.  My goal here is to just show the shortcuts to get the job done, without delving into the guts of any of this.&lt;br /&gt;
&lt;br /&gt;
So we&#39;ll start with an empty file, call it verify-scr.pl, and place the following in the very first line of the file to declare it as a perl file:&lt;br /&gt;
&lt;blockquote&gt;#!/usr/bin/perl -w&lt;/blockquote&gt;Next we will place a BEGIN command to tell perl that this block of code should be run as soon as possible (even before the rest gets compiled).  In this block we will set $valid=0, and at the end of the file, we will return this variable.  This is what our code looks like so far:&lt;br /&gt;
&lt;blockquote&gt;#/usr/bin/perl -w&lt;br /&gt;
BEGIN&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$valid = 0;&lt;br /&gt;
}&lt;/blockquote&gt;The purpose of this block is so that, even if there is a problem interpreting the rest of the perl script, we can still give something back for CVS to understand.  Namely, we will immediately set the check to fail, so as a default if the script fails right now, the whole CVS commit will be denied.  This is a safety precaution since we don&#39;t want developers to commit code that doesn&#39;t meet our requirements just because there is a typo in the perl script.&lt;br /&gt;
&lt;br /&gt;
On to the meat of the perl script.  Each line is being interpreted individually in this script.  What we are analyzing is the text content of the CVS commit &lt;b&gt;comment&lt;/b&gt;.  We will encapsulate the check within a while loop and want to read the input from STDIN (which is the CVS commit comment that is being sent in).  Type while (&amp;lt;&amp;gt;), then we will put the rest in curly braces.  The next part is where perl shines--using a regular expression to find the SCR number and capturing it to a variable.  In this example, I required users to type &quot;SCR: &quot; followed by the SCR number.  The perl script will find that token SCR: and then look at the SCR id right after it.&lt;br /&gt;
&lt;blockquote&gt;if (/^SCR:\s*([A-Za-z0-9_]+[SCR|scr][_0-9]+)/)&lt;/blockquote&gt;Goodness that looks complicated, and I wont lie to you, it is!  But let&#39;s simplify it.  Obviously the if statement is just a simple common programming construct, so we&#39;ll skip it.  The ^ indicates that we are looking for something at the beginning of the line.  Without the ^ it will try to match the SCR: anywhere in the line.  This is preference, but I believe they should have this SCR number declared in the beginning of a line, not embedded in the middle of a sentence.  Much cleaner that way.  We already answered the next part...the SCR: after the ^ is just an exact text string we are looking for.  The \s is vital magic here; it tells perl that everything within the that matches the regular expression within the proceeding parenthesis will be stored in predefined variable $1.  Ex. if the CVS commit comment is &quot;SCR: PROJECT_SCR_22&quot;, it will parse out only the PROJECT_SCR_22 into $1.  Now we tell perl how to find that PROJECT_SCR_22 string.  The [A-Za-z0-9_] means find any combination of UPPERCASE or lowercase letters and numbers, all followed by an underscore.  PROJECT_ matches, as well as ProJect_, or even MAcH5_.  The + that follows actually doesn&#39;t mean &quot;plus the following&quot; as intuition leads you to believe--it actually means &quot;at least one or more of the previous&quot;.&lt;br /&gt;
&lt;br /&gt;
I will diverge for just a slight moment.  What we are using in the above &quot;if&quot; statement is what is called a &lt;span style=&quot;font-style:italic;&quot;&gt;regular expression&lt;/span&gt; and is found in much more than just perl.  Often the syntax is very similar, or seemingly exact, but keep in mind we are still doing perl here.&lt;br /&gt;
&lt;br /&gt;
We left off looking for any string that contains at least one UPPERCASE, lowercase, number, or underscore.  In my implementation, I have multiple SCRs for multiple projects, so there is ABC_SCR_1, XYZ_SCR_1, and JoeSmith_123_SCR_1.  All are valid SCRs, so our perl regex (short way of saying regular expression) says to look for basically anything, followed by the string &quot;SCR&quot; in either UPPERCASE or lowercase.  I didn&#39;t allow mixed case in this example.  So the next part, right after the first + we saw, is the [SCR|scr].  As you may have guessed by my previous statements, this means find the term SCR &lt;span style=&quot;font-weight:bold;&quot;&gt;or &lt;/span&gt;scr.  The pipe operator &quot;|&quot; means or in this case.  Again, only all UPPERCASE or all lowercase is matched, not mixed case.  Notice that I did not put a + sign after this square bracketed part.  The reason is I don&#39;t want to find SCR &quot;one or more times&quot; nor do I want to find it &quot;zero or more times&quot; (which is what * would mean)--I want to find it one time and exactly one time...no more, no less.  At this point, we now have some string indicating the project, then we have the SCR keyword that we &lt;span style=&quot;font-style:italic;&quot;&gt;have &lt;/span&gt;to find, and finally we&#39;ll look for some number.  That is the [_0-9]+ part; we look for any number, but again it has a + sign so we have to least have SCR followed by some number.  It could be 3, 10, 42, or even 2395678542.&lt;br /&gt;
&lt;br /&gt;
Once we close the parentheses, this tells the &quot;s&quot; which was placed before the first parenthesis that the string we just matched will be placed into $1.  Note, if you had placed multiple instances of s(some_regex), they would incrementally be matched and placed into $1, $2, $3, etc.  Place another close parenthesis to close off the &quot;if&quot;. &lt;br /&gt;
&lt;br /&gt;
Now that the hardest part is done, we&#39;ll breeze through the rest.  Create an open curly brace to say that we are going to put a block of code that will be executed if the if statement above succeeds.  In here we will do a bunch of things at once:&lt;br /&gt;
&lt;blockquote&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;my $scr = $1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;print &quot;We matched $scr from your commit comment\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;$valid = 1;&lt;br /&gt;
}&lt;/blockquote&gt;First line puts the matched string into a variable called $scr.  The print line is just a message we are printing to screen to let the user know what we are doing.  Since we used $1 in the print line, it will show them the string we matched.  The \n just passes in a new line.  We could get fancy at this point and wait for a user input to verify if we matched the right thing...but not in this post.  Finally, we set the $valid variable that we used in the BEGIN statement.  Remember that we assumed it is immediately false back in the BEGIN, but now we are setting it to TRUE.  So if we get to this line and set this variable, when we exit the script, the CVS commit will succeed.&lt;br /&gt;
&lt;br /&gt;
Close up the Curly braces now for the if statement and while statement, then put an &quot;exit !($valid)&quot; and we are all done.  The final product looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
#/usr/bin/perl -w&lt;br /&gt;
BEGIN&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$valid = 0;&lt;br /&gt;
}&lt;br /&gt;
while (&amp;lt;&amp;gt;)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;if (/^SCR:\s*([A-Za-z0-9_]+[SCR|scr][_0-9]+)/)&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;my $scr = $1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;print &quot;We matched $scr from your commit comment\n&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;$valid = 1;&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
exit !($valid)&lt;br /&gt;
&lt;/blockquote&gt;Our Perl script is done, so now to tell CVS when to use it.  Edit the verifymsg file from within the CVSROOT module we checked out.  At the end of the file, we are going to add another regex to catch commits and route them to the perl script.  Going back to the example started at the beginning of this post, we need to put a line in this verifymsg file to tell CVS that all code in GUI needs to have an SCR, but all code in TEST does &lt;b&gt;not&lt;/b&gt;.  This is how:&lt;br /&gt;
&lt;blockquote&gt;^TEST&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/bin/true&lt;br /&gt;
^GUI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/usr/local/bin/verify-scr.pl&lt;/blockquote&gt;Remember, we saved our perl script from above in the /usr/local/bin folder, so now we are calling it when the CVS commit matches the ^GUI line.  The carot (^) is a regex notation for &quot;the beginning of the line&quot; so it is looking for GUI as the first word in the line.  If GUI and TEST were part of a larger module, say CODE, then it would be ^CODE/GUI.&lt;br /&gt;
&lt;br /&gt;
Security warning:  The file /usr/local/bin/verify-scr.pl needs to be executable to all users (or at least those in the cvs group), but should not be editable to anyone.  Make sure to change permissions accordingly.&lt;br /&gt;
&lt;br /&gt;
Save and commit the verifymsg file.  Keep in mind that CVS will match only the first instance in the verifymsg file, so if you have something that matches 2 regex lines in verifymsg, only the first one will be used.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/4843240197230394201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/cvs-using-perl-to-restrict-commits.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/4843240197230394201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/4843240197230394201'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/cvs-using-perl-to-restrict-commits.html' title='CVS: Using Perl to Restrict Commits'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-5120175017655302121</id><published>2010-05-06T00:29:00.002-04:00</published><updated>2010-08-18T09:42:28.450-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogspot"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="sitemap"/><category scheme="http://www.blogger.com/atom/ns#" term="webmaster"/><title type='text'>WEB: Google Webmaster Tools, Sitemaps, and Blogger/Blogspot</title><content type='html'>Today I looked at my Google Webmaster Tools and once again puzzled as to why the sitemap kept showing an error.  My site was not indexing properly and this was really bugging me.  I submitted atom.xml as a sitemap and it failed.  I submitted rss.xml as a sitemap, and still it failed.  The failure is not as bizarre as the fact that I host 2 different blogs on blogspot.com and the old one works fine using atom.xml as a sitemap, but the new one (this one) refuses.&lt;br /&gt;
&lt;br /&gt;
Finally, after some web searching, I stumbled upon an answer.  Using &quot;feeds/posts/full&quot; as the address for the sitemap seemed to work.&lt;br /&gt;
&lt;br /&gt;
So, if you are trying to get the sitemap to work in Webmaster Tools, follow these steps:&lt;br /&gt;
&lt;blockquote&gt;1)&amp;nbsp;&amp;nbsp;&amp;nbsp; Log into your Google Webmaster Tools account (http://www.gooogle.com/webmasters/tools).&lt;br /&gt;
2)&amp;nbsp;&amp;nbsp;&amp;nbsp; Click on your site--we are assuming you already created your account and verified the site&lt;br /&gt;
3)&amp;nbsp;&amp;nbsp;&amp;nbsp; Click on Sitemaps under Site Configuration&lt;br /&gt;
4)&amp;nbsp;&amp;nbsp;&amp;nbsp; Click on Submit a Sitemap&lt;br /&gt;
5)&amp;nbsp;&amp;nbsp;&amp;nbsp; At the time of this post, doing the above shows a box that has the base web address filled in and an empty text field to add the location of the sitemap.  In this empty text field, add feeds/posts/full and click Submit Sitemap.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
That&#39;s it!  It should show up shortly.  Check to make sure there are no crawl errors and you are done.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/5120175017655302121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/web-google-webmaster-tools-sitemaps-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/5120175017655302121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/5120175017655302121'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/web-google-webmaster-tools-sitemaps-and.html' title='WEB: Google Webmaster Tools, Sitemaps, and Blogger/Blogspot'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-7253408172020130806</id><published>2010-05-04T22:15:00.005-04:00</published><updated>2010-08-02T15:04:04.716-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="diet"/><category scheme="http://www.blogger.com/atom/ns#" term="healthy eating"/><category scheme="http://www.blogger.com/atom/ns#" term="muscles"/><category scheme="http://www.blogger.com/atom/ns#" term="protein"/><category scheme="http://www.blogger.com/atom/ns#" term="sauna"/><category scheme="http://www.blogger.com/atom/ns#" term="schedule"/><title type='text'>HEALTH: Tips from a Body Builder</title><content type='html'>Well, this blog cannot survive as just a purely technical blog.  Especially not with me as an author.  A month ago I bought a Venus Fly Trap; today I was considering buying a Mango Tree to grow in a Hardiness Zone 5 region and was thinking about learning Bonsai techniques so I can prune a large Nam Doc Mai Mango into a size able to be grown in a container.  My point is, my brain does a lot more than think about technical things and my wife is loving and patient enough to let me entertain some of my weird passions/hobbies.  Heck, last week I freelanced as a second photographer for a friend of mine who is a professional wedding photographer!&lt;br /&gt;
&lt;br /&gt;
So, while cleaning up some files on my computer, I found a document I jotted down some notes in from 2 years ago.  My cousin&#39;s husband was visiting America for a Body Building competition and stayed with us for a few days.  He gave me some great tips on how to get in shape and get definition in my body.  I do go to the gym a few times a week and martial arts occasionally, so this advice might have stood a chance of being followed, but my laziness won over and I have never actually followed his &quot;plan to bodily perfection&quot;.  However, I will share it here so this jewel of information is not lost and perhaps someone will benefit from it.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Morning&lt;/span&gt;&lt;br /&gt;
--) 2 eggs (whites only) &lt;br /&gt;
--) Oatmeal or potatoes for carbs&lt;br /&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;All meals&lt;br /&gt;
&lt;/span&gt;--) Avoid fried or oily foods but anything is good&lt;br /&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Sweets&lt;/span&gt;&lt;br /&gt;
--) Sweets are okay during day&lt;br /&gt;
--) No sweets after 6pm&lt;br /&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Nighttime&lt;br /&gt;
&lt;/span&gt;--) Eat protein before sleeping&lt;br /&gt;
--) No sweets&lt;br /&gt;
--) Avoid carbs (can eat but very little)&lt;br /&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Working out&lt;br /&gt;
&lt;/span&gt;--) 30 min to 1 hour before workout&lt;br /&gt;
~~~~~) Whey protein prior to strength training&lt;br /&gt;
--) Immediately after workout&lt;br /&gt;
~~~~~) 5 tablets of Amino Acids&lt;br /&gt;
~~~~~) 5 gram scoop in water of Glutamine&lt;br /&gt;
--) 3 times a week, cardio&lt;br /&gt;
--) Massage muscles often&lt;br /&gt;
--) Sauna every 15 days (jump in cold water immediately after)</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/7253408172020130806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/health-tips-from-body-builder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/7253408172020130806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/7253408172020130806'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/health-tips-from-body-builder.html' title='HEALTH: Tips from a Body Builder'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-1360080014199599983</id><published>2010-05-02T16:43:00.002-04:00</published><updated>2010-08-18T09:42:40.215-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="branch"/><category scheme="http://www.blogger.com/atom/ns#" term="cvs"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="repository"/><category scheme="http://www.blogger.com/atom/ns#" term="scm"/><category scheme="http://www.blogger.com/atom/ns#" term="tag"/><category scheme="http://www.blogger.com/atom/ns#" term="version control"/><title type='text'>CVS: Getting into the mind of CVS and how it works</title><content type='html'>Since some of my posts are discussing manipulating CVS backend files, it is important to now explain a little bit about the way CVS works.&lt;br /&gt;
&lt;br /&gt;
CVS only cares about its own copy of the code in $CVSROOT.  Each folder under $CVSROOT is called a module.  The files in here are kept in the same structure with the same filenames, EXCEPT every file has a &quot;,v&quot; at the end of it.  No need to go into why, just understand that these are the backend files of files under CVS control and that each &quot;,v&quot; file contains all the version history of the file in it.  Developers should NEVER be here, never look here, and I have probably done wrong just telling you about it because your curiosity may cause you to go look in this folder.  Screwing up something here can be disastrous.&lt;br /&gt;
&lt;br /&gt;
So why doesn&#39;t CVS care about your files?  It doesn&#39;t need to until you try to do something using the &quot;cvs&quot; command.  First you do a checkout to get code to your local area to work on.&lt;br /&gt;
&lt;blockquote&gt;$ cvs co &amp;lt;module&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
The &quot;co&quot; is a shortcut for &quot;checkout&quot; but either can be used.  This will get the latest copy of the code out of CVS, called the HEAD...or the HEAD of the TRUNK.  We can talk more about HEAD, TRUNK, BRANCH later when we talk about proper revision control&lt;br /&gt;
&lt;br /&gt;
Once the code is checked out, you will notice a CVS sub-folder in every directory.  This CVS folder contains the information about&lt;br /&gt;
1. Where the CVS repository is (can even be on a remote machine -- this may hardcode usernames)&lt;br /&gt;
2. What module you have checked out from the repository&lt;br /&gt;
3. What tag/branch if any&lt;br /&gt;
4. What versions of every file is checked out&lt;br /&gt;
&lt;br /&gt;
If this CVS folder gets deleted, there is no link back to CVS.  When you do a commit to CVS, it goes into this folder and looks up the data on where to put the files.  It will also do checks to make sure you have the latest code prior to allowing you to commit.  There is a nuance to be aware of when using code on remote servers: If $CVSROOT is on a remote machine, then your Root file in CVS folder probably contains a :pserver: line with your username hardcoded.  This means that, if you are sharing code with another developer (copy and paste whole directories), they will get your username all over the place.  I wrote another blog post on how to quickly correct this problem.  If the CVS repository is on the same server as you are checking out code to, this problem isn&#39;t manifest.&lt;br /&gt;
&lt;br /&gt;
We&#39;ll talk more in later posts about how to manipulate CVS in the backend for restructuring code.  This a dangerous, but occasionally necessary task.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/1360080014199599983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/cvs-getting-into-mind-of-cvs-and-how-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/1360080014199599983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/1360080014199599983'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/cvs-getting-into-mind-of-cvs-and-how-it.html' title='CVS: Getting into the mind of CVS and how it works'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-2107514216934790894</id><published>2010-05-02T16:40:00.003-04:00</published><updated>2010-08-18T09:42:50.554-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cvs"/><category scheme="http://www.blogger.com/atom/ns#" term="find"/><category scheme="http://www.blogger.com/atom/ns#" term="xargs"/><title type='text'>CVS: Changing username in CVS/Root files</title><content type='html'>It is possible to share a CVS checkout that has been compiled (to avoid having everyone need to recompile it) by just changing the username in the Root files.  This only really applies if your code resides on a remote server and you are using :pserver: or some other protocol that hard-codes your username into the $CVSROOT.&lt;br /&gt;
&lt;blockquote&gt;find -path &#39;*CVS*&#39; -name Root | xargs perl -p -e &quot;s/pserver\:&amp;lt;user1&amp;gt;/pserver\:&amp;lt;user2&amp;gt;/g&quot;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
This changes &amp;lt;user1&amp;gt; to &amp;lt;user2&amp;gt;. For debugging purposes, the test executables have the source file locations hardcoded. So even if the directory is copied and the above change is made, debugging will still point to the original file locations (if it exists). This also happens if using shared objects or dynamically linked libraries rather than static libraries.  This is frustrating but does not defeat the usefulness of this concept.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/2107514216934790894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/cvs-changing-username-in-cvsroot-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2107514216934790894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2107514216934790894'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/cvs-changing-username-in-cvsroot-files.html' title='CVS: Changing username in CVS/Root files'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-712815210544751934</id><published>2010-05-02T16:35:00.002-04:00</published><updated>2010-08-18T09:43:07.282-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="network drive"/><category scheme="http://www.blogger.com/atom/ns#" term="search"/><category scheme="http://www.blogger.com/atom/ns#" term="share"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>WINDOWS: Permission Denied to Network Drive/Share</title><content type='html'>A strange case manifested itself where a user could not log onto a Linux Samba share drive. He could log on from another machine, so there was no problem with the share, but while attempting access through his Remote Desktop session on the server, he was given a message about being locked out or permission denied to the shortcut or network resource. An odd solution did the trick; searching for the computer, creating a link on the desktop for it, then opening the link works fine to connect to the share. After that happens, it will work from the original link.&lt;br /&gt;
&lt;br /&gt;
Using Search/files and folders/computers, search for the network/computer name&lt;br /&gt;
The computer should be found. Clicking on it from here will still not work.&lt;br /&gt;
Make a shortcut of the found link on the desktop.  &lt;br /&gt;
Then clicking this desktop shortcut, you will be taken to the computer/server you were looking for. &lt;br /&gt;
The strange part is, now, after clicking on the shortcut, both the original link and using \\&amp;lt;server name&amp;gt; from the address bar will work.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/712815210544751934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/windows-permission-denied-to-network.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/712815210544751934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/712815210544751934'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/windows-permission-denied-to-network.html' title='WINDOWS: Permission Denied to Network Drive/Share'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-2154211750296340089</id><published>2010-05-01T16:32:00.002-04:00</published><updated>2010-08-18T09:43:16.169-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="440GX"/><category scheme="http://www.blogger.com/atom/ns#" term="amcc"/><category scheme="http://www.blogger.com/atom/ns#" term="boot loader"/><category scheme="http://www.blogger.com/atom/ns#" term="eval board"/><category scheme="http://www.blogger.com/atom/ns#" term="ibm"/><category scheme="http://www.blogger.com/atom/ns#" term="ocotea"/><category scheme="http://www.blogger.com/atom/ns#" term="PIBS"/><title type='text'>PIBS: Changing Speeds/Frequencies</title><content type='html'>While setting up a factory AMCC 440GX Eval Board, it may be necessary to change the default settings for frequency, CPU speed, etc.&lt;br /&gt;
&lt;br /&gt;
To change the boards to 533MHz for the CPU speed, use the following command in PIBS:&lt;br /&gt;
&lt;blockquote&gt;chipclk prom0 cpu 533333333 152380952 76190476 76190476 152380952 30000&lt;br /&gt;
&lt;/blockquote&gt;To change the boards to 800MHz for the CPU speed, use the following command in PIBS:&lt;blockquote&gt;chipclk prom0 cpu 800000000 133333333 66666666 66666666 66666666 30000&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Type &quot;help chipclk&quot; into PIBS to see information on what all the arguments mean. The above commands switch back and forth between the two configurations.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/2154211750296340089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/pibs-changing-speedsfrequencies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2154211750296340089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2154211750296340089'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/pibs-changing-speedsfrequencies.html' title='PIBS: Changing Speeds/Frequencies'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-554028362186836139</id><published>2010-05-01T16:30:00.002-04:00</published><updated>2010-08-18T09:43:27.996-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ghs"/><category scheme="http://www.blogger.com/atom/ns#" term="integrity"/><category scheme="http://www.blogger.com/atom/ns#" term="kernel"/><category scheme="http://www.blogger.com/atom/ns#" term="rtos"/><title type='text'>GHS: Flashing networking settings to kernel on board</title><content type='html'>After the GHS Integrity Kernel boots for the first time, the IP address and Netmask need to be set again and saved there to non-volatile memory. These commands should be run after the  Kernel banner is displayed and commands can once again be typed into Hyperterminal. A quick test would be to first type &quot;help&quot; to see if the Kernel help menu is displayed (this is different than the PIBS help menu). There is no prompt so just type the following into the empty area below the Kernel banner:&lt;br /&gt;
&lt;blockquote&gt;nc I 192.168.0.13&lt;br /&gt;
nc s&lt;br /&gt;
nc N 255.255.255.0&lt;br /&gt;
nc s&lt;br /&gt;
nc H Board3&lt;br /&gt;
nc s&lt;/blockquote&gt;&lt;br /&gt;
The &quot;nc I&quot; sets the IP for the board (customize it appropriately), the &quot;nc N&quot; sets the Netmask, the &quot;nc H&quot; sets the Hostname of the board that is displayed when the banner comes up, and the &quot;nc s&quot; after each command saves the info to non-volatile memory. You could just type the &quot;nc s&quot; once at the end instead of between each command--depends on your level of paranoia.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/554028362186836139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/integrity-flashing-networking-settings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/554028362186836139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/554028362186836139'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/integrity-flashing-networking-settings.html' title='GHS: Flashing networking settings to kernel on board'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6998934275988922537.post-2432640768874615739</id><published>2010-05-01T16:28:00.002-04:00</published><updated>2010-08-18T10:52:13.498-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="boot loader"/><category scheme="http://www.blogger.com/atom/ns#" term="ftp"/><category scheme="http://www.blogger.com/atom/ns#" term="mount"/><category scheme="http://www.blogger.com/atom/ns#" term="nfs"/><category scheme="http://www.blogger.com/atom/ns#" term="PIBS"/><category scheme="http://www.blogger.com/atom/ns#" term="share drive"/><title type='text'>PIBS: Timeout or Connection Refused</title><content type='html'>If using FTP or mounting an NFS share or doing some other network related activity on the board (other than connecting Multi with RTSERV), timeouts or connection refused messages may occur. The solution is simple: If the date/time on the board is way off it will need to be set correctly. Use the following:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;PIBS $ dateset YYYY MM DD&lt;br /&gt;
PIBS $ timeset HH MM SS&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.chiefsandendians.com&quot; rel=&quot;tag&quot; style=&quot;display:none&quot;&gt;CodeProject&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://chiefsandendians.blogspot.com/feeds/2432640768874615739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/pibs-timeout-or-connection-refused.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2432640768874615739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6998934275988922537/posts/default/2432640768874615739'/><link rel='alternate' type='text/html' href='http://chiefsandendians.blogspot.com/2010/05/pibs-timeout-or-connection-refused.html' title='PIBS: Timeout or Connection Refused'/><author><name>Site Monger</name><uri>http://www.blogger.com/profile/01988514418454217216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>