<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-372545379405128450</id><updated>2012-03-20T22:19:21.102-04:00</updated><category term='ssl'/><category term='apache'/><category term='atlassian'/><category term='regex'/><category term='grails'/><category term='github'/><category term='productivity'/><category term='groovy'/><category term='tips'/><category term='subversion'/><title type='text'>Coding With Intent</title><subtitle type='html'>Intent - ADJ. Having the mind and will focused on a specific purpose.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-1738402891503834926</id><published>2012-02-09T10:21:00.000-05:00</published><updated>2012-02-09T10:22:50.134-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>Why I'm Sticking With Remember the Milk</title><content type='html'>I'm a list maker by nature - my wife sniggers at me sometimes as I add something to my to-do list that I've already done, only to mark it completed immediately (I like having a record of those things).&lt;br /&gt;&lt;br /&gt;For years, my&amp;nbsp;to-do&amp;nbsp;list flow was something like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Remember just before bed that there are a couple important things I need to do the next day.&lt;/li&gt;&lt;li&gt;Grab a piece of paper (blank paper, a bill, whatever's laying around).&lt;/li&gt;&lt;li&gt;Make a quick&amp;nbsp;to-do&amp;nbsp;list in the corner, rip it off the full paper and put it with my wallet.&lt;/li&gt;&lt;li&gt;Come home from work the next day and find the piece of paper with my wallet with most of the&amp;nbsp;tasks&amp;nbsp;undone.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;When I got an iPhone a couple of years ago, I decided I was going to start using a better system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the past couple of years, I have used &lt;a href="http://rmilk.com/"&gt;Remember the Milk&lt;/a&gt;, a fantastic&amp;nbsp;to-do&amp;nbsp;list manager that has a great iPhone application. &amp;nbsp;It has some benefits and drawbacks though:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Remember the Milk Benefits:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Easy to use&lt;/li&gt;&lt;li&gt;Keyboard commands&lt;/li&gt;&lt;li&gt;&lt;a href="http://itunes.apple.com/us/app/remember-the-milk/id293561396?mt=8%2F%2Fitunes.apple.com%2Fus%2Fapp%2Fremember-the-milk%2Fid293561396%3Fmt%3D8&amp;amp;ei=seIzT9azK4ba0QGTmd2wAg&amp;amp;usg=AFQjCNFkUUPdbIxCIYaZufmd0tSuRI9hsw"&gt;Great iPhone app&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Reminders&lt;/li&gt;&lt;li&gt;Repeating Tasks&lt;/li&gt;&lt;li&gt;Tasks can be set for a specific time as well as date&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Remember the Milk Drawbacks:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;iPhone app requires a $25/year Pro membership&lt;/li&gt;&lt;li&gt;Email reminders are only for that day's tasks, not for anything that's overdue&lt;/li&gt;&lt;li&gt;Can't reorder tasks other than using priority or the like&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;When the time came for renewal of my $25 Pro membership this year, I decided to look around. &amp;nbsp;My only major requirement was that whatever I did needed to have a native app on the iPhone so it could remind me about tasks.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I discovered &lt;a href="http://www.wunderlist.com/"&gt;Wunderlist&lt;/a&gt; fairly quickly, due to the amount of buzz around it and gave it a try. &amp;nbsp;I really really wanted to like it. &amp;nbsp;I went all in, migrating by hand my entire existing list of short term and long term&amp;nbsp;tasks. &amp;nbsp;I gave it a full month before I finally threw my hands up and had to go back to Remember the Milk.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Wunderlist Benefits over Remember the Milk:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Reorder tasks to your heart's content&lt;/li&gt;&lt;li&gt;Native Mac App&lt;/li&gt;&lt;li&gt;FREE&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Wunderlist Drawbacks:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Reminders only worked when adding tasks from the iPhone app (if you set them at all).&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Any tasks added from the web interface don't get a reminder email.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Can't set a time on a reminder (Call John at 1pm tomorrow)&lt;/li&gt;&lt;li&gt;No repeating tasks&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;These drawbacks all ended up becoming an overall deal breaker for me. &amp;nbsp;I need my&amp;nbsp;to-do&amp;nbsp;list to remind me every month when various bills are due, every 6 months to renew my auto insurance, etc. &amp;nbsp;I need to be able to be reminded at a specific time about something. &amp;nbsp;Finally, I needed to be reminded when I had something due, regardless of where I entered the task.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope Wunderlist can add these features someday and if so, I'll give them another shot. &amp;nbsp;For now though, I am happily back at Remember the Milk as a Pro member again. &amp;nbsp;It's just not that important for me to be able to reorder tasks and save $25/year.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now if Remember the Milk could just let me &lt;a href="http://www.rememberthemilk.com/forums/ideas/3154/"&gt;reorder&lt;/a&gt; tasks and add &lt;a href="http://www.rememberthemilk.com/forums/ideas/180/"&gt;subtasks&lt;/a&gt; into the mix, I'll be a member for life!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-1738402891503834926?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/1738402891503834926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2012/02/why-im-sticking-with-remember-milk.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/1738402891503834926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/1738402891503834926'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2012/02/why-im-sticking-with-remember-milk.html' title='Why I&apos;m Sticking With Remember the Milk'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-2396390285679510234</id><published>2012-02-08T11:48:00.003-05:00</published><updated>2012-02-08T11:48:46.385-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Setting up Atlassian FishEye with GitHub</title><content type='html'>The other day a co-worker asked me if we could point our &lt;a href="http://www.atlassian.com/software/fisheye/overview"&gt;Atlassian FishEye&lt;/a&gt; instance at &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt; repositories. &amp;nbsp;I did some poking around and after having a hard time finding any specific instructions in any one place, I decided to write a post about how I made it work.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Assumptions&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Admin access to FishEye.&lt;/li&gt;&lt;li&gt;Admin access to a GitHub repository.&lt;/li&gt;&lt;li&gt;Git client and SSH client installed on the FishEye server and available in the PATH.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;Instructions&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Login to FishEye, go to Administration -&amp;gt; Repositories and click "Add Existing...".&lt;/li&gt;&lt;li&gt;Choose "Git" from the dropdown, give it a name/description and click "Next".&lt;/li&gt;&lt;li&gt;Grab the SSH url from your repository in GitHub and enter it into the "Repository Location".&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Will look something like "git@github.com:ORGANIZATION/REPONAME.git"&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Under "Authentication Style", choose "Generate key pair for ssh" and click "Generate".&lt;/li&gt;&lt;li&gt;Copy the resulting block of text into your clipboard.&lt;/li&gt;&lt;li&gt;Go to your repository in GitHub, go to "Admin" and choose the "Deploy Keys" tab.&lt;/li&gt;&lt;li&gt;Click "Add another deploy key", name it "FishEye", paste the block of text into the "Key" field and click "Add Key".&lt;/li&gt;&lt;li&gt;Back in FishEye, click "Test Connection" and if all is well, click "Next" and then click "Add".&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;You will very quickly start seeing that the GitHub repository is being indexed and when done, you'll be off to the races!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-2396390285679510234?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/2396390285679510234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2012/02/setting-up-atlassian-fisheye-with.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/2396390285679510234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/2396390285679510234'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2012/02/setting-up-atlassian-fisheye-with.html' title='Setting up Atlassian FishEye with GitHub'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-4033552554493948468</id><published>2011-10-24T10:01:00.000-04:00</published><updated>2011-10-24T10:01:45.305-04:00</updated><title type='text'>Tools</title><content type='html'>Every time I do a home improvement job, the same pattern repeats itself. &amp;nbsp;Every. Single. Time.&lt;br /&gt;&lt;br /&gt;I start out trying to "make do" with the tools I have on hand to save myself some money and trips to the hardware store. &amp;nbsp;In the end, after much time, frustration and cursing (if the job involves plumbing, my mortal enemy), I find myself over at the hardware store buying the tools I actually need to do the job. &amp;nbsp;I come home, try things again using the right tool and am amazed at how much easier it was to do with the proper tools.&lt;br /&gt;&lt;br /&gt;Case in point - this weekend I was installing a nice big cast iron sink in the kitchen and needed to reroute some plumbing to handle the upgrade from a single basin to a double basin. &amp;nbsp;My groove joint pliers weren't big enough to handle the nut on the new drain and I spent way too much time trying to mess around with alternative options before breaking down and grabbing a nice big 16" set at Lowe's. &amp;nbsp;While I was there, I grabbed a head mounted flashlight as well - what a difference that makes! &amp;nbsp;I finished the job in no time with a nice large set of pliers and a well lit work environment (no more balancing a flashlight against the side of my head while I work on my back under the sink).&lt;br /&gt;&lt;br /&gt;This got me thinking about software and techniques for my "real" job. &amp;nbsp;I don't have the benefit of water spraying in my face and raw knuckles to force me to realize that I'm using the wrong tools. &amp;nbsp;Where might I be trying to get by with the wrong tools when I could change things up and use the right tool for the right job?&lt;br /&gt;&lt;br /&gt;I don't have an answer yet, but I think it's time to evaluate what's working and what's not and ruthlessly trim/upgrade to reduce wasted time and energy. &amp;nbsp;Look for a future report about what's working and what's not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-4033552554493948468?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/4033552554493948468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2011/10/tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/4033552554493948468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/4033552554493948468'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2011/10/tools.html' title='Tools'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-3409010557260808070</id><published>2011-02-17T12:47:00.000-05:00</published><updated>2011-02-17T12:47:39.092-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Atlassian Summit 2011 - Call for Speakers!</title><content type='html'>Atlassian is looking for speakers for their annual Summit in June - do you have a good case study to share? &amp;nbsp;The deadline is March 1st, so if you want a free ticket to the Summit, submit an abstract for a talk ASAP. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://summit.atlassian.com/speakers"&gt;http://summit.atlassian.com/speakers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I run the local &lt;a href="http://meetup.com/DC-AUG"&gt;Atlassian User Group in the Washington, DC area&lt;/a&gt; - if you get a talk accepted, contact me and I'll see if we can schedule you for our next meeting in April/May to get a chance to try it out on an audience!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-3409010557260808070?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/3409010557260808070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2011/02/atlassian-summit-2011-call-for-speakers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/3409010557260808070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/3409010557260808070'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2011/02/atlassian-summit-2011-call-for-speakers.html' title='Atlassian Summit 2011 - Call for Speakers!'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-7203091854957482854</id><published>2010-12-06T07:53:00.000-05:00</published><updated>2010-12-06T07:53:01.276-05:00</updated><title type='text'>Putting Google Maps In Its Place</title><content type='html'>Did you know that Google Maps is not perfect? &amp;nbsp;I know, I know, crazy, but it's true!&lt;br /&gt;&lt;br /&gt;A few months ago, while trying to map out a different route to visit a family member in Kinsman, Ohio, I realized that Google Maps thought that Kinsman was somewhere in Southeast Ohio. &amp;nbsp;This is completely incorrect (Kinsman is pretty far up in Northeast Ohio) and it made it really difficult to get directions. &amp;nbsp;In fact, even if I used the full street address with zip code, Google kept throwing me to the wrong location.&lt;br /&gt;&lt;br /&gt;So, I decided to try out the "Report a Problem" button and ask Google to put it in the correct place. &amp;nbsp;A couple weeks later I received an email confirming that I was correct and a couple months after that, Kinsman was back in its proper place. &amp;nbsp;Yes ladies and gentleman, I moved a city across the state of Ohio!&lt;br /&gt;&lt;br /&gt;Looking at various news sources online, it would appear that this is not an uncommon problem. &amp;nbsp;&lt;a href="http://www.cnn.com/2010/TECH/web/09/22/google.lost.sunrise.florida/index.html"&gt;CNN reported&lt;/a&gt; back in September about how Google Maps kept "losing" Sunrise, Florida. &amp;nbsp;Even worse, last month &lt;a href="http://www.wired.com/dangerroom/2010/11/google-maps-error-blamed-for-nicaraguan-invasion/"&gt;Nicaragua accidentally invaded Costa Rica&lt;/a&gt; due to an incorrect border line on Google Maps.&lt;br /&gt;&lt;br /&gt;&lt;s&gt;I've also noticed lately that when trying to map directions in the DC area that no matter how hard I try, Google Maps won't let my route take I-66 outside the beltway, forcing my route onto all manner of side roads to get around.&lt;/s&gt;&amp;nbsp;&amp;nbsp;CORRECTION: This is now fixed. &amp;nbsp;Not sure why it had such an aversion to I-66 (other than the obvious fact that it's an overcrowded, backup-prone freeway).&lt;br /&gt;&lt;br /&gt;Moral of the story? &amp;nbsp;Always sanity check things before blindly following Google Maps directions (especially if you're preparing to do any border patrolling). &amp;nbsp;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-7203091854957482854?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/7203091854957482854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2010/12/putting-google-maps-in-its-place.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/7203091854957482854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/7203091854957482854'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2010/12/putting-google-maps-in-its-place.html' title='Putting Google Maps In Its Place'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-6380838032009683671</id><published>2010-12-03T22:13:00.000-05:00</published><updated>2010-12-03T22:13:49.429-05:00</updated><title type='text'>Back in the Saddle</title><content type='html'>After a long hiatus, it's about time for me to startup the ol' blog again! &lt;br /&gt;&lt;br /&gt;I've redesigned everything, added "About" and "Currently Reading" pages and plan to start more regular posts. &amp;nbsp;Expect to see topics in the near future such as Atlassian Meetups, Bitbucket, Google Apps Migrations, iPhone Programming and Conferences/Personal Development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-6380838032009683671?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/6380838032009683671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2010/12/back-in-saddle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/6380838032009683671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/6380838032009683671'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2010/12/back-in-saddle.html' title='Back in the Saddle'/><author><name>Mike Norton</name><uri>http://www.blogger.com/profile/11287482943138290083</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://2.bp.blogspot.com/_R66Fr4MPBck/TPmMM5dDKUI/AAAAAAAAAAY/YGryCg1FYKM/S220/profile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-5114409182264694593</id><published>2010-03-16T11:56:00.002-04:00</published><updated>2010-12-03T22:30:24.718-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Proxying Atlassian Apps - Part Deux</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="title" style="color: #494949; font-size: 16px; font-weight: bold; padding-bottom: 0px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span class="Apple-style-span" style="color: #6e7173; font-size: 13px; font-weight: normal; line-height: 15px;"&gt;In my&amp;nbsp;&lt;a href="http://codingwithintent.blogspot.com/2010/03/running-your-atlassian-apps-behind.html" style="color: #6e7173; text-decoration: underline;"&gt;previous post&lt;/a&gt;&amp;nbsp;I explained how to setup your Atlassian applications behind a proxy server.&lt;/span&gt;&lt;/div&gt;&lt;div class="copy" style="color: #6e7173; font-size: 13px; line-height: 15px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;One of the benefits I didn’t mention was that as your usage grows, if you need to move one (or more) of the applications off onto their own servers, you can do this by getting the application setup on the new server and then changing your Apache config file settings to make the ProxyPass and ProxyPassReverse point to the new server IP instead of “localhost” for the application in question.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;However, if you are using Crowd for your centralized Authentication and SSO, you may find that logging into the application you moved becomes a little, shall we say “quirky”? &amp;nbsp;The best way to explain what you’ll see and how to fix it, is by way of an example.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Let’s say you had JIRA, Confluence and Crowd all installed on one server as described in my&amp;nbsp;&lt;a href="http://codingwithintent.tumblr.com/post/917890826/running-your-atlassian-apps-behind-a-proxy-server" style="color: #6e7173; text-decoration: underline;"&gt;previous post&lt;/a&gt;. &amp;nbsp;As part of the Crowd setup for JIRA and Confluence, you will have setup a “crowd.properties” file to tell each application where to authenticate. &amp;nbsp;The default setting in that file is “http://localhost:8095/crowd/services” and we’ll assume you left it that way for both JIRA and Confluence.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;As you get more and more users up and running, you’ve decided that JIRA needs it’s own server to handle the load, so you move it to another server and modify the ProxyPass settings to point to the right location. &amp;nbsp;When you were setting up the JIRA on the new server, you were smart and remembered that a locahost url for Crowd wouldn’t work anymore, so you changed the JIRA “crowd.properties” file to point to “http://your.server.name/crowd/services”. &amp;nbsp;All seems to be well with the world. &amp;nbsp;You can still login to JIRA, so the Crowd integration seems to be working. &amp;nbsp;You browse over to Confluence and you hit a login screen. &amp;nbsp;What’s this? &amp;nbsp;A login screen? &amp;nbsp;So, you login to Confluence using the same credentials - hmm, it seems to work. &amp;nbsp;You browse back to JIRA and you hit another login screen. &amp;nbsp;What in the world is going on?&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;You’ve entered the netherworld of “Trusted Proxy Servers” (bum BUM BUM BUUUMMMMM)!!!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;If you were to login to the Crowd Administration Console, goto the Administration Tab and click the “Trusted Proxy Servers” section, you’ll see a list of IPs and a text box to allow you to add more. &amp;nbsp;The only IP in the system at the moment is likely “127.0.0.1”. &amp;nbsp;The reason you are not staying logged in between JIRA and Confluence now is because when you login from JIRA, the request is coming from the new JIRA server via the Apache proxy. &amp;nbsp;The IP being associated with the session is the public IP of your Apache instance, not the 127.0.0.1 “localhost” IP that Confluence registers when it talks to Crowd directly on port 8095.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;If you find the public IP of your Apache instance and put it here in Trusted Proxy Servers, you will find that everything magically works again! &amp;nbsp;If you are having trouble, I recommend turning the logging on “root” and “com.atlassian.crowd” to ALL, browse to JIRA or Confluence after logging into the other and then look in the logs - you’ll see something about the session tokens “not matching” and the IP address being registered will be right there in the logs. &amp;nbsp;Just don’t forget to turn the logging back to INFO when you’re done - no sense running out of disk space in about 15 minutes…&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-5114409182264694593?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/5114409182264694593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2010/03/proxying-atlassian-apps-part-deux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/5114409182264694593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/5114409182264694593'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2010/03/proxying-atlassian-apps-part-deux.html' title='Proxying Atlassian Apps - Part Deux'/><author><name>Mike</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-1299338322667374568</id><published>2010-03-16T11:54:00.001-04:00</published><updated>2010-09-06T11:55:58.946-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Running your Atlassian Apps behind a Proxy Server</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="title" style="color: #494949; font-size: 16px; font-weight: bold; padding-bottom: 0px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span class="Apple-style-span" style="color: #6e7173; font-size: 13px; font-weight: normal; line-height: 15px;"&gt;The&amp;nbsp;&lt;a href="http://www.atlassian.com/" style="color: #6e7173; text-decoration: underline;"&gt;Atlassian&lt;/a&gt;&amp;nbsp;suite of applications (&lt;a href="http://www.atlassian.com/software/jira" style="color: #6e7173; text-decoration: underline;"&gt;JIRA&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.atlassian.com/software/confluence" style="color: #6e7173; text-decoration: underline;"&gt;Confluence&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.atlassian.com/software/crowd" style="color: #6e7173; text-decoration: underline;"&gt;Crowd&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.atlassian.com/software/fisheye" style="color: #6e7173; text-decoration: underline;"&gt;FishEye/Crucible&lt;/a&gt;and&amp;nbsp;&lt;a href="http://www.atlassian.com/software/bamboo" style="color: #6e7173; text-decoration: underline;"&gt;Bamboo&lt;/a&gt;) is an amazing set of tools for anyone trying to run a halfway serious development shop.&lt;/span&gt;&lt;/div&gt;&lt;div class="copy" style="color: #6e7173; font-size: 13px; line-height: 15px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The easiest way to get started is to install the “standalone” versions, which essentially means each application comes in its own Tomcat instance - this allows for seperation of your application JVMs and gets you the ability to restart just the application you want when doing maintenance (not to mention the fact that I find the deployment instructions for their non-standalone version a bit long-winded).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The problem with this approach is that each application will, by default, end up running in the root context (/) of its own port. So, your JIRA instance might be at&lt;a href="http://your.server.name:8080/" style="color: #6e7173; text-decoration: underline;"&gt;http://your.server.name:8080&lt;/a&gt;&amp;nbsp;and your Confluence might be at&lt;a href="http://your.server.name:9080/" style="color: #6e7173; text-decoration: underline;"&gt;http://your.server.name:9080&lt;/a&gt;&amp;nbsp;(and so on and so forth).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;I have found that the simplest solution is to put everything behind an Apache proxy so that you can run the whole thing on port 80 with the various applications on their own paths (“/jira”, “/confluence”, etc).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The first step is that you need to modify the “server.xml” for each of your applications to run them on something other than “/”. To do this, look for the following:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre class="xml" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;&lt;span&gt;&amp;lt;Context&lt;/span&gt; &lt;span&gt;path&lt;/span&gt;=&lt;span&gt;"/"&lt;/span&gt;...&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;and change it to something like:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre class="xml" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;&lt;span&gt;&amp;lt;Context&lt;/span&gt; &lt;span&gt;path&lt;/span&gt;=&lt;span&gt;"/jira"&lt;/span&gt;...&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Once you restart the applications, they’ll now be available on the port at the path you’ve just configured - something like&amp;nbsp;&lt;a href="http://your.server.name:8080/jira." style="color: #6e7173; text-decoration: underline;"&gt;http://your.server.name:8080/jira.&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The second step is actually pretty straightforward. You’ll need an install of Apache with mod_proxy enabled. Within the VirtualHost section of your Apache config files, you’ll want to put the following:&lt;/div&gt;&lt;pre style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;ProxyPreserveHost On&lt;br /&gt;ProxyPass /jira http://localhost:8080/jira&lt;br /&gt;ProxyPassReverse /jira http://localhost:8080/jira&lt;br /&gt;ProxyPass /confluence http://localhost:9080/confluence&lt;br /&gt;ProxyPassReverse /confluence http://localhost:9080/confluence&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Once you restart Apache (and assuming it’s listening on port 80), you can now browse to&amp;nbsp;&lt;a href="http://your.server.name/jira" style="color: #6e7173; text-decoration: underline;"&gt;http://your.server.name/jira&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://your.server.name/confluence." style="color: #6e7173; text-decoration: underline;"&gt;http://your.server.name/confluence.&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Don’t forget to update the server urls in the Administration sections of the various applications to make sure that things like emails and RSS feeds and things like that all have the appropriate links.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-1299338322667374568?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/1299338322667374568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2010/03/running-your-atlassian-apps-behind.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/1299338322667374568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/1299338322667374568'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2010/03/running-your-atlassian-apps-behind.html' title='Running your Atlassian Apps behind a Proxy Server'/><author><name>Mike</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-4566550163928919437</id><published>2008-09-25T11:53:00.002-04:00</published><updated>2010-09-06T11:54:41.024-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Thinking in Groovy</title><content type='html'>&lt;span class="Apple-style-span" style="color: #6e7173; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 13px; line-height: 15px;"&gt;I’m currently reading&amp;nbsp;&lt;em&gt;&lt;a href="http://www.amazon.com/Programming-Groovy-Productivity-Developer-Programmers/dp/1934356093/" style="color: #6e7173; text-decoration: underline;" target="_blank"&gt;Programming Groovy&lt;/a&gt;&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;&lt;a href="http://www.amazon.com/Groovy-Recipes-Greasing-Pragmatic-Programmers/dp/0978739299/" style="color: #6e7173; text-decoration: underline;" target="_blank"&gt;Groovy Recipes&lt;/a&gt;&lt;/em&gt;&amp;nbsp;to hone my Groovy skillz and I’ve come to a realization: my Grails apps and the several scripts I’ve written for work have been nothing more than a thin veneer of Groovy syntax over Java programming.&amp;nbsp; I’ve still been “thinking in Java” as I write code.&amp;nbsp; This is not necessarily a bad thing - I’m still able to write code that is *much* more syntactically simple (lists and strings are so much easier to work with in Groovy), but I’m not really writing true Groovy meta-programming code.&amp;nbsp; Venkat and Scott’s books are helping me down that path…maybe someday I’ll actually be “Thinking in Groovy”.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-4566550163928919437?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/4566550163928919437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2008/09/thinking-in-groovy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/4566550163928919437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/4566550163928919437'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2008/09/thinking-in-groovy.html' title='Thinking in Groovy'/><author><name>Mike</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-6116848495253343939</id><published>2008-09-25T11:50:00.000-04:00</published><updated>2010-09-06T11:53:28.690-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Install Subversion on Apache with SSL</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="copy" style="color: #6e7173; font-size: 13px; line-height: 15px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;&lt;em&gt;Guest post by my brother John.&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Mike and I need a good place to share code, so I decided to install subversion on our server. I had a couple requirements for our source control setup:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;accessible from anywhere&lt;/li&gt;&lt;li&gt;browsable via the web&lt;/li&gt;&lt;li&gt;authenticated access (for both read and write — this is for private code)&lt;/li&gt;&lt;li&gt;secure connection (don’t want my password sent in the clear)&lt;/li&gt;&lt;li&gt;easy to use (eg, once I have a working copy set up, I don’t want to type my password every time it connects to the server)&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;I looked at the options, and discovered that svn+ssh can be a great secure option, but didn’t deliver on everything I wanted. I decided to try subversion over HTTPS, and so far I’m very happy with that solution.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;When I started, I didn’t have Subversion installed on our server, I didn’t have WebDav enabled, and I didn’t have any sites set up with SSL. I did have several basic virtual hosts set up in Apache 2, and a couple tutorials to help me along the way.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;Install Subversion and set up repository&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Start by installing subversion. On Ubuntu, it was as easy as this (thanks to this&amp;nbsp;&lt;a href="http://articles.slicehost.com/2007/9/5/introduction-to-subversion" style="color: #6e7173; text-decoration: underline;"&gt;Introduction to Subversion&lt;/a&gt;):&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;aptitude&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; subversion&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Then we want to create our first repository. I decided to have only a single repository, which will store all of our projects. It’s fairly simple to change to multiple repositories if desired. You can put the repository just about anywhere, but I wanted a common location, so I used this:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;mkdir&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;repository&lt;br /&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;svnadmin&lt;/span&gt; create &lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;repository&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;We’re going to want Apache to be able to write to the repository, so we’ll make it own the files right now (apache runs as www-data on my server):&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; www-data.www-data &lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;repository&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;Set up authentication&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;We’re going to use basic HTTP authentication over our SSL connection. To do this, we’ll need to set some users and passwords up in a new /etc/svn-passwd file (you could put it somewhere else, if you want):&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; htpasswd &lt;span&gt;-cm&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;svn-passwd john&lt;br /&gt;&lt;span&gt;sudo&lt;/span&gt; htpasswd &lt;span&gt;-m&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;svn-passwd mike&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The first command created a new /etc/svn-passwd file, and set the password for john using an md5 hash. The second command set the password for mike. Both of them prompt for the new password to be set.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;I’m not going any further than that on authentication. I believe that I could set up more detailed privileges in the /var/repository/conf/svnserve.conf file, but I’m not going to worry about that — any user that is able to authenticate via the svn-passwd file will be granted full access to the repository.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;Create self-signed certificate&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;For my purposes, a free self-signed certificate for SSL is all I need. I found a&amp;nbsp;&lt;a href="http://articles.slicehost.com/2007/11/26/ubuntu-gutsy-generating-a-self-signed-ssl-certificate" style="color: #6e7173; text-decoration: underline;"&gt;great tutorial&lt;/a&gt;&amp;nbsp;on creating this cert, and followed all of their directions. First, I made sure that the ssl-cert package was installed:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;aptitude&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; ssl-cert&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Then I created the cert by running the following command and answering all prompts:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; make-ssl-cert &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;share&lt;span&gt;/&lt;/span&gt;ssl-cert&lt;span&gt;/&lt;/span&gt;ssleay.cnf &lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;ssl&lt;span&gt;/&lt;/span&gt;certs&lt;span&gt;/&lt;/span&gt;selfsigned.pem&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;Install and configure SSL&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;I mostly followed the instructions in&amp;nbsp;&lt;a href="http://articles.slicehost.com/2007/11/26/ubuntu-gutsy-apache-ssl-and-vhosts" style="color: #6e7173; text-decoration: underline;"&gt;this tutorial&lt;/a&gt;&amp;nbsp;to enable and configure SSL support. mod_ssl was already installed, but not enabled, so I ran this to enable it:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; a2enmod ssl&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;That links the mod_ssl.conf and mod_ssl.load files into /etc/apache2/mods-enabled/. The default settings in mod_ssl.conf should be fine.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Now we need to set up SSL on one of our vhosts. Choose a vhost, edit the conf file for it, and duplicate the existing virtual host with a few modifications.&lt;/div&gt;&lt;pre class="apache" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&amp;lt;&lt;span&gt;VirtualHost&lt;/span&gt; *:&lt;span&gt;80&lt;/span&gt;&amp;gt;&lt;br /&gt;  &lt;span&gt;ServerAdmin&lt;/span&gt; webmaster@localhost&lt;br /&gt;  &lt;span&gt;ServerName&lt;/span&gt;  domain.com&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  ...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;/&lt;span&gt;VirtualHost&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Copy that, change to 443, and enable SSL:&lt;/div&gt;&lt;pre class="apache" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&amp;lt;&lt;span&gt;VirtualHost&lt;/span&gt; *:&lt;span&gt;443&lt;/span&gt;&amp;gt;&lt;br /&gt;  &lt;span&gt;ServerAdmin&lt;/span&gt; webmaster@localhost&lt;br /&gt;  &lt;span&gt;ServerName&lt;/span&gt;  domain.com&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  ...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  SSLEngine &lt;span&gt;on&lt;/span&gt;&lt;br /&gt;  SSLCertificateFile /etc/ssl/certs/selfsigned.pem&lt;br /&gt;&amp;lt;/&lt;span&gt;VirtualHost&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Now restart Apache, and make sure there are no errors on startup:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;init.d&lt;span&gt;/&lt;/span&gt;apache2 restart&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Test that https is indeed working:&amp;nbsp;&lt;a href="https://domain.com/" style="color: #6e7173; text-decoration: underline;"&gt;https://domain.com/&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;Install mod_dav and mod_dav_svn&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;We need to make sure the mod_dav_svn.so is installed on the server.&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;aptitude&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; libapache2-svn&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Check and make sure that the mods-enabled directory contains links to both dav.load and dav_svn.load — if not, run these commands:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;cd&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;apache2&lt;span&gt;/&lt;/span&gt;mods-enabled&lt;br /&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;ln&lt;/span&gt; &lt;span&gt;-s&lt;/span&gt; ..&lt;span&gt;/&lt;/span&gt;mods-available&lt;span&gt;/&lt;/span&gt;dav.load&lt;br /&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;ln&lt;/span&gt; &lt;span&gt;-s&lt;/span&gt; ..&lt;span&gt;/&lt;/span&gt;mods-available&lt;span&gt;/&lt;/span&gt;dav_svn.load&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Edit that virtual host conf file again, and add a new section inside the 443 virtual host:&lt;/div&gt;&lt;pre class="apache" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&amp;lt;&lt;span&gt;VirtualHost&lt;/span&gt; *:&lt;span&gt;443&lt;/span&gt;&amp;gt;&lt;br /&gt;  &lt;span&gt;ServerAdmin&lt;/span&gt; webmaster@localhost&lt;br /&gt;  &lt;span&gt;ServerName&lt;/span&gt;  domain.com&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  ...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &amp;lt;&lt;span&gt;Location&lt;/span&gt; /svn&amp;gt;&lt;br /&gt;    DAV svn&lt;br /&gt;    SVNPath /var/repository&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span&gt;AuthType&lt;/span&gt; Basic&lt;br /&gt;    &lt;span&gt;AuthName&lt;/span&gt; &lt;span&gt;"Subversion repository"&lt;/span&gt;&lt;br /&gt;    &lt;span&gt;AuthUserFile&lt;/span&gt; /etc/svn-passwd&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span&gt;Require&lt;/span&gt; valid-&lt;span&gt;user&lt;/span&gt;&lt;br /&gt;  &amp;lt;/&lt;span&gt;Location&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;  SSLEngine &lt;span&gt;on&lt;/span&gt;&lt;br /&gt;  SSLCertificateFile /etc/ssl/certs/selfsigned.pem&lt;br /&gt;&amp;lt;/&lt;span&gt;VirtualHost&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Restart apache once again:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;init.d&lt;span&gt;/&lt;/span&gt;apache2 restart&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;And now you should be able to access svn via https, using the user and password you set up in the svn-passwd file at&amp;nbsp;&lt;a href="https://domain.com/svn/" style="color: #6e7173; text-decoration: underline;"&gt;https://domain.com/svn/&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;And If you want to import a project to the repository, you should be able to do something like this:&lt;/div&gt;&lt;pre class="bash" style="background-color: #e6e6e6; font: normal normal normal 11px/normal Courier, monospace; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px;"&gt;&lt;span&gt;svn&lt;/span&gt; import &lt;span&gt;/&lt;/span&gt;path&lt;span&gt;/&lt;/span&gt;to&lt;span&gt;/&lt;/span&gt;existing&lt;span&gt;/&lt;/span&gt;code https:&lt;span&gt;//&lt;/span&gt;domain.com&lt;span&gt;/&lt;/span&gt;svn&lt;span&gt;/&lt;/span&gt;myproject&lt;span&gt;/&lt;/span&gt;trunk &lt;span&gt;-m&lt;/span&gt; &lt;span&gt;"initial import"&lt;/span&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Hope this helps someone, and that I didn’t forget any key steps in the process.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-6116848495253343939?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/6116848495253343939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2008/09/install-subversion-on-apache-with-ssl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/6116848495253343939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/6116848495253343939'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2008/09/install-subversion-on-apache-with-ssl.html' title='Install Subversion on Apache with SSL'/><author><name>Mike</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-372545379405128450.post-965682809444175463</id><published>2008-09-12T11:44:00.002-04:00</published><updated>2010-09-06T11:46:31.498-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><title type='text'>Regex to strip spaces and SGML tags</title><content type='html'>&lt;span class="Apple-style-span" style="color: #6e7173; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 13px; line-height: 15px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;A DBA coworker wanted some regex to strip SGML tags and spaces from a database for some reports he was doing.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;He wanted to turn this:&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;&lt;span&gt;BiScO&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;:&amp;lt;html_ent glyph=”@nbsp;” ascii=” “&amp;gt;&amp;lt;/html_ent&amp;gt; Centrosymmetric BiMnO&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;-type Oxide&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;into:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;strong&gt;BiScO3:CentrosymmetricBiMnO3-typeOxide&lt;/strong&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;So, I came up with this pattern: &amp;lt;(.|\n)*?&amp;gt;|\s and tested it at&amp;nbsp;&lt;a href="http://www.regextester.com/" style="color: #6e7173; text-decoration: underline;"&gt;&lt;/a&gt;&lt;a href="http://www.regextester.com/" style="color: #6e7173; text-decoration: underline;"&gt;http://www.regextester.com&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Apparently, in Oracle 10g, you can use the REGEXP_REPLACE function to do some nifty lookups and transformations.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/372545379405128450-965682809444175463?l=www.codingwithintent.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codingwithintent.com/feeds/965682809444175463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.codingwithintent.com/2008/09/regex-to-strip-spaces-and-sgml-tags.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/965682809444175463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/372545379405128450/posts/default/965682809444175463'/><link rel='alternate' type='text/html' href='http://www.codingwithintent.com/2008/09/regex-to-strip-spaces-and-sgml-tags.html' title='Regex to strip spaces and SGML tags'/><author><name>Mike</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
