<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUIGSHkyfyp7ImA9WhRaE0U.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372</id><updated>2012-02-16T09:12:09.797Z</updated><category term="Pharmaceutical" /><category term="Service" /><category term="Modelling" /><category term="SGF" /><category term="ODS" /><category term="OLAP" /><category term="Architecture" /><category term="WPS" /><category term="Project Management" /><category term="SQL" /><category term="publications" /><category term="debugging" /><category term="process" /><category term="ExcelGantt" /><category term="Statistics" /><category term="graphics" /><category term="Six Sigma" /><category term="Design" /><category term="functions" /><category term="Security" /><category term="Enterprise guide" /><category term="syntax" /><category term="Mobile BI" /><category term="leadership" /><category term="VIEWS-UK" /><category term="options" /><category term="style" /><category term="DI" /><category term="Gantt" /><category term="Admin" /><category term="editor" /><category term="NOTE:" /><category term="Data Modelling" /><category term="SAS" /><category term="BI" /><category term="Macro" /><category term="Tools" /><category term="formats" /><category term="communications" /><category term="testing" /><category term="social media" /><category term="training" /><category term="Data Warehouses" /><category term="reporting" /><category term="Excel" /><title>NOTE: The blog of RTSL.eu - Development with SAS®</title><subtitle type="html">SAS&lt;sup&gt;®&lt;/sup&gt; and software development best practice. Hints, tips, and experience that are of interest to a wide range of SAS practitioners. Published by &lt;a href="http://www.rtsl.eu"&gt;RTSL.eu&lt;/a&gt;, guiding our clients to knowledge since 1993</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.notecolon.info/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.notecolon.info/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>286</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/NoteTheBlogOfRtsleu-DevelopmentsInSas" /><feedburner:info uri="notetheblogofrtsleu-developmentsinsas" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>NoteTheBlogOfRtsleu-DevelopmentsInSas</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;C0EMRXs9cSp7ImA9WhRbFkw.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-289232876143082096</id><published>2012-02-07T09:00:00.000Z</published><updated>2012-02-07T10:48:04.569Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-07T10:48:04.569Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>NOTE: Code Kata #1 Follow-Up</title><content type="html">A few weeks ago I published the &lt;a href="http://www.notecolon.info/2012/01/code-kata-1.html"&gt;first in an irregular series&lt;/a&gt; of code katas. In a &lt;a href="http://www.notecolon.info/2012/01/code-katas.html"&gt;previous post&lt;/a&gt; I had described code katas as a form of training for programmers.&lt;br /&gt;
&lt;br /&gt;
I saw a lot of interest around the post.&lt;br /&gt;
&lt;br /&gt;
Richard Koopman posted &lt;a href="http://koopmann.us/post/2012/1/23/vending-machine-math.html"&gt;an elegant response&lt;/a&gt; on his blog, including an additional solution for US coinage. His solution was neat, making good use of arrays and iterative coding, but my attention was also caught by Richard's&amp;nbsp;&lt;a href="http://koopmann.us/post/2012/1/20/my-knex-iphone-stand.html"&gt;home-made&amp;nbsp;phone stand&lt;/a&gt; for his iPhone. Nice work Richard.&lt;br /&gt;
&lt;br /&gt;
My old friend Dave Booth emailed me a solution that he had written off the top of his head, with no access to SAS at the time. It worked. I was suitably impressed. Dave's solution, like Richard's, used what Dave describes as a &lt;a href="http://en.wikipedia.org/wiki/Greedy_algorithm"&gt;greedy algorithm&lt;/a&gt;. This is a very descriptive name and the Wikipedia entry offers the "coin change" challenge as an example. Dave also made a good point about handling errors elagantly:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Putting something in the code to try to trap unforeseen outcomes is a good habit to get into.&lt;/blockquote&gt;
I agree, and code katas are a good opportunity to practice error trapping strategies.&lt;br /&gt;
&lt;br /&gt;
Finally, Dave drew my attention to an excellent source of puzzles that could form code katas: &lt;a href="http://projecteuler.net/"&gt;ProjectEuler.net&lt;/a&gt;. The site offers a series of challenges that require a mixture of mathematical and computer science skills to solve. Take a look at &lt;a href="http://projecteuler.net/problems"&gt;the list of challenges&lt;/a&gt; and you'll see some good starting problems such as "Add all the natural numbers below one thousand that are multiples of 3 or 5".&lt;br /&gt;
&lt;br /&gt;
In summary, don't wait for me to post more code katas. There are plenty out there on the web, and they all offer great opportunities for you to improve your coding skills.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-289232876143082096?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/GGFeA72EPD8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/289232876143082096/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/02/note-code-kata-1-follow-up.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/289232876143082096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/289232876143082096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/GGFeA72EPD8/note-code-kata-1-follow-up.html" title="NOTE: Code Kata #1 Follow-Up" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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>2</thr:total><feedburner:origLink>http://www.notecolon.info/2012/02/note-code-kata-1-follow-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UEQXg5eyp7ImA9WhRbEEw.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-6456306170849318655</id><published>2012-01-31T12:00:00.001Z</published><updated>2012-01-31T12:00:00.623Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-31T12:00:00.623Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="leadership" /><title>"The Delegator" - Positive or Negative Epithet?</title><content type="html">In a recent meeting, an action arose and I asked one of my team (PJ) to catch it and complete it. He (tongue in cheek) commented to all those at the meeting that I was "the best delegator" he'd ever worked with. His humorous implication was that I don't do any work, I just get other people to do it for me. I've known PJ for years and worked on many successful projects with him, so I was happy to be the butt of his joke. However, I see delegation is a positive thing, so it set me thinking about how different people understand the verb "delegate".&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://dictionary.cambridge.org/dictionary/british/delegate_2"&gt;dictionary&lt;/a&gt; says it means "to give a particular job, duty, right, etc. to someone else so that they do it for you". The fact that one is giving one's work to somebody else to do doesn't sound altogether positive, but if we accept that a team can do more work than one individual, and if we accept that a team needs a leader to coordinate and dispatch work around the team, then the team leader isn't delegating his/her own work, they are simply spreading the team's work around the members of the team.&lt;br /&gt;
&lt;br /&gt;
However, in my mind, delegation is a tool to help the team learn and grow. And that means that I choose to delegate some of the management work to members of the team also. By doing so, I can coach them to learn new skills; and I inevitably learn new things as we go along too.&lt;br /&gt;
&lt;br /&gt;
Not everyone wants to be a manager, but everybody needs to understand the objectives and challenges of management.&amp;nbsp;Armed with knowledge of management, one can work in harmony with one's leaders and management.&amp;nbsp;Moreover, it is often the case that the perception of the team leader's role is not a match for the actuality. For me, team leadership is about a) achieving more than I can manage on my own, b challenging myself and my team to do new things, c) helping my team members to become the best they can become, d) learning from others, e) enjoying the benefits of being part of a successful team.&lt;br /&gt;
&lt;br /&gt;
So, "The Delegator", is it a positive or a negative epithet? In my mind it is a distinctively positive name. It means I'm helping my team to learn and grow, and I'm helping them with their career and their ability to enjoy their working days (and at the same time they are helping me to do the same).&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-6456306170849318655?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/Y9wFdhk4MKc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/6456306170849318655/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/delegator-positive-or-negative-epithet.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/6456306170849318655?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/6456306170849318655?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/Y9wFdhk4MKc/delegator-positive-or-negative-epithet.html" title="&quot;The Delegator&quot; - Positive or Negative Epithet?" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/delegator-positive-or-negative-epithet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMER3kzcSp7ImA9WhRUFE0.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-3164260695113669634</id><published>2012-01-24T12:00:00.002Z</published><updated>2012-01-24T12:00:06.789Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T12:00:06.789Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="leadership" /><category scheme="http://www.blogger.com/atom/ns#" term="Project Management" /><title>You Can't Fire Everyone</title><content type="html">Some years ago I was taught a memorable and valuable lesson by my erstwhile programme manager (we'll call him BJ). I was brought into the project to provide knowledge of i) business intelligence, and ii) software documentation appropriate for the regulated pharmaceutical industry. After a while on the project, BJ asked me to act as BI Delivery Lead. He promised me the ability to recruit a team but initially supplied me with two existing staff members.&lt;br /&gt;
&lt;br /&gt;
After a week I went back to BJ and said he'd have to provide me with two different staff members because the first two a) knew nothing about BI, and b) were at each other's throats all day long. BJ told me that nobody else was available; I'd have to make it work. Then he put his hand on my shoulder and told me he'd especially chosen me to act as BI Delivery Lead because he knew I had good people skills. Flattery is a good management technique! But more importantly, BJ was teaching me an important team leadership lesson: developing people is just as important as developing software.&lt;br /&gt;
&lt;br /&gt;
It's a lesson I'll never forget and, as I worked with my two staff members over the following months and we all achieved increasing degrees of success, I discovered that developing people can be at least as satisfying as developing software.&lt;br /&gt;
&lt;br /&gt;
I was reminded of this specific lesson when I read Roy Osherove's &lt;a href="http://5whys.com/blog/you-cant-fire-everyone.html"&gt;You Can't Fire Everyone&lt;/a&gt; post on his 5Whys blog in December. Roy's blog is a treasure trove for those who want to become a better team leader. Roy typifies the process of team development as following three phases: the chaos phase, the learning phase, and the self-leading phase. Roy describes &lt;a href="http://5whys.com/blog/the-3-maturity-stages-of-a-software-team-and-how-scrum-fails.html"&gt;how to recognise which phase you're currently in&lt;/a&gt;, and how to progress and develop your team. Recommended reading.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-3164260695113669634?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/cnCkLcB6lp4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/3164260695113669634/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/you-cant-fire-everyone.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3164260695113669634?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3164260695113669634?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/cnCkLcB6lp4/you-cant-fire-everyone.html" title="You Can't Fire Everyone" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/01783287181150593795</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/you-cant-fire-everyone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFQn0-fyp7ImA9WhRUFE0.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-7360761217830123266</id><published>2012-01-24T12:00:00.000Z</published><updated>2012-01-24T12:00:13.357Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T12:00:13.357Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="Admin" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>NOTE: Monitoring the SAS 9.2 Metadata Server</title><content type="html">&lt;embed align="right" allowfullscreen="true" allowscriptaccess="always" bgcolor="#FFFFFF" class="xj_video_embed" flashvars="config=http%3A%2F%2Fwww.sasprofessionals.net%2Fvideo%2Fvideo%2FshowPlayerConfig%3Fid%3D2060202%253AVideo%253A93099%26ck%3D-%26theme982Version%3D15&amp;amp;video_smoothing=on&amp;amp;autoplay=off&amp;amp;hideShareLink=1&amp;amp;isEmbedCode=1" height="172" pluginspage="http://www.macromedia.com/go/getflashplayer" scale="noscale" src="http://static.ning.com/socialnetworkmain/widgets/video/flvplayer/flvplayer.swf?v=201112072021" type="application/x-shockwave-flash" width="214" wmode="opaque"&gt;&lt;/embed&gt; There's a nice walkthrough of some of the &lt;a href="http://www.sasprofessionals.net/video/monitoring-the-sas-9-2-metadata-server"&gt;features of the SAS 9.2 metadata server&lt;/a&gt;&amp;nbsp;on the &lt;a href="http://www.sasprofessionals.net/"&gt;SAS Professionals web site&lt;/a&gt; in the Social Media / Videos section. You'll have to be a SAS Professionals member to view it from the link I've provided, but if you're not already a member it's a good reason to join now (it's free).&lt;br /&gt;
&lt;br /&gt;
The 7 minute video is particularly useful if you've recently upgraded from 9.1 and would like a reminder of the nice new features you now have available to you.&lt;br /&gt;
&lt;br /&gt;
It particularly caught my eye because I've just recently added the &lt;a href="http://www.sas.com/offices/europe/uk/education/courses/spaft.html"&gt;SAS Platform Administration: Fast Track (SPAFT)&lt;/a&gt; five-day course to my training repertoire. So, if you plan to attend this SAS UK course this year, you might just find me teaching you (please don't let that put you off booking!).&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-7360761217830123266?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/ssKZF7mvYPU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/7360761217830123266/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/note-monitoring-sas-92-metadata-server.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7360761217830123266?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7360761217830123266?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/ssKZF7mvYPU/note-monitoring-sas-92-metadata-server.html" title="NOTE: Monitoring the SAS 9.2 Metadata Server" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/note-monitoring-sas-92-metadata-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIGRnc-eip7ImA9WhRVGEU.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-5118419737980715342</id><published>2012-01-18T12:00:00.000Z</published><updated>2012-01-18T12:08:47.952Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-18T12:08:47.952Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>Code Kata #1</title><content type="html">In &lt;a href="http://www.notecolon.info/2012/01/code-katas.html"&gt;yesterday's post&lt;/a&gt; I described Code Katas and how they can be a useful form of programming practice. Dave Watson (the "inventor" of Code Katas) offers 21 on his &lt;a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html"&gt;Code Kata blog&lt;/a&gt;. I intend to publish my own from time-to-time, and here is the first. Enjoy...&lt;br /&gt;
&lt;br /&gt;
Imagine you have to write some code for a vending machine. You are given a) the price of the product to be vended, and b) the amount of money tendered by the customer. Your task is to deduce what change to offer, i.e. how many of each type of coin. Optimise your result by minimising the number of coins given in change. Assume your vending machine has unlimited stocks of the following denomination:&amp;nbsp;1p, 2p, 5p, 10p, 20p, 50p, £1, £2.&lt;br /&gt;
&lt;br /&gt;
Two examples of input and output follow:&lt;br /&gt;
&lt;br /&gt;
i) Product price is 70p; money tendered is £1, i.e. 100p. Optimal output is 1 x 10p and 1 x 20p&lt;br /&gt;
&lt;br /&gt;
ii) Product price is 63p; money tendered is 80p. Optimal output is 1 x 10p, 1 x 5p, 1 x 2p&lt;br /&gt;
&lt;br /&gt;
This challenge is entirely language-independent, so your solution can be produced in the manner that best suits your regular coding activities. Hence, you might write your solution using DATA Steps and/or you might use macros. Your input values might be provided as global macro variables, or parameters to your macro(s), or supplied within a data set.&lt;br /&gt;
&lt;br /&gt;
Once you've cracked the above, you might want to consider the following additions - perhaps on subsequent days.&lt;br /&gt;
&lt;br /&gt;
A) Accept a "list" of coin denominations as additional input rather than hard-coding the list I supplied above. The list might be as a parameter to your macro, or in a data set&lt;br /&gt;
&lt;br /&gt;
B) Rather than assume an unlimited stock of each coin in the machine, accept an input "list" that tells you how many coins of each denomination are in the machine. Consequently, you will need to consider the possibility that your result is a refusal to vend due to "insufficient change"&lt;br /&gt;
&lt;br /&gt;
C) Rather than writing a simple textual result to the SAS log, produce some kind of coloured report or graph depicting the change given&lt;br /&gt;
&lt;br /&gt;
You also might like to consider different solutions.&amp;nbsp;The use of&amp;nbsp;arrays or hash tables would be two alternatives.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-5118419737980715342?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/xlYb6q7VBog" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/5118419737980715342/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/code-kata-1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/5118419737980715342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/5118419737980715342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/xlYb6q7VBog/code-kata-1.html" title="Code Kata #1" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/code-kata-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EER38-eCp7ImA9WhRVGE0.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-3642899692250809514</id><published>2012-01-17T12:00:00.001Z</published><updated>2012-01-17T12:00:06.150Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-17T12:00:06.150Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>Code Katas</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-n2618C_6C9M/TwCgfUNPv3I/AAAAAAAAGp0/5zw_MoxXd_Q/s1600/kata1.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-n2618C_6C9M/TwCgfUNPv3I/AAAAAAAAGp0/5zw_MoxXd_Q/s1600/kata1.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
Last week I made a &lt;a href="http://www.notecolon.info/2012/01/do-you-read-and-write.html"&gt;brief mention of Code Katas&lt;/a&gt; and how they can help you as a form code practice. Let's find out some more.&lt;br /&gt;
&lt;br /&gt;
The basic concept surrounding Code Katas encapsulates the ideas that a) we are professional coders, b) practice improves one's skills. Wikipedia tells us "&lt;a href="http://en.wikipedia.org/wiki/Kata_(programming)"&gt;Code Kata&lt;/a&gt; is a term coined by Dave Thomas, co-author of the book &lt;a href="http://www.amazon.co.uk/Pragmatic-Programmer-Andrew-Hunt/dp/020161622X/"&gt;The Pragmatic Programmer&lt;/a&gt;, in a bow to the Japanese concept of kata in the martial arts. A code kata is an exercise in programming which helps a programmer hone their skills through practice and repetition".&lt;br /&gt;
&lt;br /&gt;
Dave has a &lt;a href="http://pragprog.com/"&gt;blog for his books&lt;/a&gt;, and a &lt;a href="http://codekata.pragprog.com/"&gt;sub-blog specifically about Code Katas&lt;/a&gt;. His Code Kata blog tells us all about the background and Dave's reasoning for using Katas.&lt;br /&gt;
&lt;br /&gt;
I greatly enjoy the consultancy and the project management work that I do, but I get at least as much enjoyment from coding too. Not only coding to a specification, but coding for coding's sake. And that, in a nutshell, is what a Code Kata is - coding for coding's sake. If you were into tennis, you might focus on competitions wherein you have to give your best, but you'll be able to achieve better results in those competitions if you practice&amp;nbsp;regularly. There are no prizes for practicing, but it sure helps.&lt;br /&gt;
&lt;br /&gt;
Who benefits if you become a better coder? Your employer or client will certainly benefit, but your own career prospects will improve too. So, don't limit yourself to doing your Code Katas within core hours. Maybe it's something you might consider doing over lunch, or after hours.&lt;br /&gt;
&lt;br /&gt;
Dave lists 21 Katas on his site, most of which I've found applicable to SAS. I'll offer my own contributions from time-to-time here on &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;NOTE:&lt;/span&gt;, starting tomorrow. In the meantime, please feel free to send your own Code Katas to me. I'll publish some of them.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-3642899692250809514?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/caplOB0Ye1E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/3642899692250809514/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/code-katas.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3642899692250809514?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3642899692250809514?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/caplOB0Ye1E/code-katas.html" title="Code Katas" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-n2618C_6C9M/TwCgfUNPv3I/AAAAAAAAGp0/5zw_MoxXd_Q/s72-c/kata1.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.notecolon.info/2012/01/code-katas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UERns4cSp7ImA9WhRVF0w.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-58735794887252953</id><published>2012-01-16T12:00:00.000Z</published><updated>2012-01-16T12:00:07.539Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T12:00:07.539Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><title>Engage More Closely With NOTE:</title><content type="html">The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;NOTE:&lt;/span&gt; blog is powered by &lt;a href="http://www.blogger.com/"&gt;Google Blogger&lt;/a&gt;. Google have rolled out a number of improvements to Blogger recently. One of those improvements is support for threaded commenting, which means that it is now much easier to differentiate between whether someone is making a general comment on the thread, or responding to another comment on the thread. &lt;br /&gt;
&lt;br /&gt;
I hope this will mean that we can engage in a more full and lively conversation in the comments on each posting. &lt;br /&gt;
&lt;br /&gt;
What do you think?&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-58735794887252953?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/om6I2ew15Zw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/58735794887252953/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/engage-more-closely-with-note.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/58735794887252953?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/58735794887252953?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/om6I2ew15Zw/engage-more-closely-with-note.html" title="Engage More Closely With NOTE:" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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>4</thr:total><feedburner:origLink>http://www.notecolon.info/2012/01/engage-more-closely-with-note.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUEQHk6fCp7ImA9WhRVEkU.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-17101437915035130</id><published>2012-01-11T12:00:00.000Z</published><updated>2012-01-11T12:00:01.714Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-11T12:00:01.714Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>Do You Read? (And Write?)</title><content type="html">Whilst New Year's resolutions are still in our minds, I'm thinking about my training plans for 2012. One key element of my plan is attendance of &lt;a href="http://support.sas.com/events/sasglobalforum/2012/index.html"&gt;SAS Global Forum&lt;/a&gt; in April, but at the other end of the scale is my choice of professional reading material - not just for the flight to Orlando.&lt;br /&gt;
&lt;br /&gt;
Stephen King is &lt;a href="http://en.wikiquote.org/wiki/On_Writing"&gt;widely quoted&lt;/a&gt; as saying "If you want to be a writer, you must do two things above all others: read a lot and write a lot." Stephen King is undoubtedly a successful author so I must assume he knows what he's talking about; and I think there is a significant degree of similarity between writing programs and writing novels.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-FElzHs7a0AQ/TwCdY0fWeUI/AAAAAAAAGpc/o5TNiv0kWmg/s1600/MyProfessionalBookshelf.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-FElzHs7a0AQ/TwCdY0fWeUI/AAAAAAAAGpc/o5TNiv0kWmg/s200/MyProfessionalBookshelf.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;Let's start with reading.&lt;/b&gt; In my experience, very few SAS developers own a SAS-related book or a software engineering book. If developers don’t know about the fundamentals of software engineering (not just code syntax but also issues like configuration management and testing) how can they explain them to non-technical folks like sales and upper management once they’ve become technical leaders?&lt;br /&gt;
&lt;br /&gt;
SAS Publishing doesn't offer too many titles that address software engineering for SAS projects, but don't let that hold you back. There are plenty of good books that offer insight that is relevant to the SAS practitioner. My own bookshelf includes classics and contemporary books alike (in no particular order):&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The Mythical Man Month, by Fred Brooks [&lt;a href="http://www.amazon.co.uk/Mythical-Month-Essays-Software-Engineering/dp/0201835959/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Refactoring: Improving the Design of Existing Code, by Martin Fowler [&lt;a href="http://www.amazon.co.uk/Refactoring-Improving-Design-Existing-Technology/dp/0201485672/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Planning Extreme Programming (XP), by Kent Beck &amp;amp; Martin Fowler [&lt;a href="http://www.amazon.co.uk/Planning-Extreme-Programming-Tom-DeMarco/dp/0201710919/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;The Data Warehouse Toolkit: The Complete Guide to Dimensional Modeling, by Ralph Kimball [&lt;a href="http://www.amazon.co.uk/Data-Warehouse-Toolkit-Complete-Dimensional/dp/0471200247/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;The Data Warehouse Lifecycle Toolkit, by Ralph Kimball [&lt;a href="http://www.amazon.co.uk/Data-Warehouse-Lifecycle-Toolkit/dp/0470149779/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Waltzing with Bears: Managing Risk on Software Projects, by Tom DeMarco and Timothy Lister [&lt;a href="http://www.amazon.co.uk/Waltzing-Bears-Managing-Software-Projects/dp/0932633609/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Head First Software Development, by Dan Pilone &amp;amp; Russ Miles [&lt;a href="http://www.amazon.co.uk/Head-First-Software-Development-Pilone/dp/0596527357/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Algorithms + Data Structures = Programs, by Niklaus Wirth [&lt;a href="http://www.amazon.co.uk/Algorithms-Structures-Prentice-Hall-automatic-computation/dp/0130224189/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;What is Lean Six Sigma, by Mike George, Dave Rowlands &amp;amp; Bill Kastle [&lt;a href="http://www.amazon.co.uk/What-Lean-Sigma-Michael-George/dp/007142668X/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;UML Distilled, by Martin Fowler [&lt;a href="http://www.amazon.co.uk/UML-Distilled-Standard-Addison-Wesley-Technology/dp/0321193687/"&gt;amazon.co.uk&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Information Revolution: Using the Information Evolution Model to Grow Your Business, by Jim Davis, Gloria Miller &amp;amp; Allan Russell [&lt;a href="https://support.sas.com/pubscat/bookdetails.jsp?catid=1&amp;amp;pc=60887"&gt;SAS bookstore&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
And what about &lt;i&gt;code&lt;/i&gt;&amp;nbsp;reading? &lt;a href="http://www.notecolon.info/2011/12/testing-peer-reviews.html"&gt;Peer reviews&lt;/a&gt; are a great driver for reading the code of your colleagues and learning from them, but if you want to really open your eyes to new and different techniques you might consider taking a look at the code of one or two of the many open source projects available on the web.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-n2618C_6C9M/TwCgfUNPv3I/AAAAAAAAGp0/5zw_MoxXd_Q/s1600/kata1.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-n2618C_6C9M/TwCgfUNPv3I/AAAAAAAAGp0/5zw_MoxXd_Q/s1600/kata1.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;With regard to writing,&lt;/b&gt; you might feel you already write enough code to be able to tick this box. Have you ever stepped back to consider the amount of time spent reading and writing emails, reading and writing specifications, and attending meetings? Perhaps you don't spend as much time actually coding as you thought.&amp;nbsp;Maybe you should consider doing “Code Katas” — little practice sessions, based on a concept borrowed from karate and other martial arts, where the practitioner fights against an imaginary opponent.&lt;br /&gt;
&lt;br /&gt;
Practice for the sake of practice is commonplace in sports and many other pursuits, why not programming? &lt;a href="http://codekata.pragprog.com/codekata/"&gt;The term&lt;/a&gt; coined by Dave Thomas, co-author of the book &lt;i&gt;The Pragmatic Programmer&lt;/i&gt;, in a nod to the Japanese concept of kata in the martial arts. A code kata is an exercise in programming which helps a programmer hone their skills through practice and repetition. I'll return to this subject in subsequent articles.&lt;br /&gt;
&lt;br /&gt;
In summary, don't leave your professional development in the hands of your manager. Consider adding a professional book to your bookshelf (and read it too). And challenge yourself to do a little off-topic coding in order to broaden your knowledge and experience. You'll thank me for it!&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-17101437915035130?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/f8b_YySCdeA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/17101437915035130/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/do-you-read-and-write.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/17101437915035130?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/17101437915035130?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/f8b_YySCdeA/do-you-read-and-write.html" title="Do You Read? (And Write?)" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-FElzHs7a0AQ/TwCdY0fWeUI/AAAAAAAAGpc/o5TNiv0kWmg/s72-c/MyProfessionalBookshelf.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://www.notecolon.info/2012/01/do-you-read-and-write.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEEQH48eip7ImA9WhRVEUQ.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-1168420282615145696</id><published>2012-01-10T12:30:00.000Z</published><updated>2012-01-10T12:30:01.072Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T12:30:01.072Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="SGF" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax" /><title>NOTE: Programming for Job Security (Golden Oldies)</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.sascommunity.org/mwiki/images/thumb/0/02/Sugi1.gif/99px-Sugi1.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://www.sascommunity.org/mwiki/images/thumb/0/02/Sugi1.gif/99px-Sugi1.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
This post ends the series of golden oldies. Looking through past conference papers has revealed many interesting nuggets. I was interested to read SAS &lt;a href="http://en.wikipedia.org/wiki/John_Sall"&gt;co-founder&lt;/a&gt; John Sall's paper on PROC MATRIX, the forerunner of SAS/IML. This paper was presented at the first SUGI, in 1976 - known SAS One.&lt;br /&gt;
&lt;br /&gt;
I was also pleased to see some opinion pieces too. I saw two papers by Grant Blank on the subject of the obsolescence of SAS (&lt;a href="http://www.sascommunity.org/sugi/SUGI85/Sugi-10-51%20Blank.pdf"&gt;SUGI 10 in 1985&lt;/a&gt; and &lt;a href="http://www.sascommunity.org/sugi/SUGI91/Sugi-91-193%20Blank.pdf"&gt;SUGI 16 in 1991&lt;/a&gt;), and another by Barbara Ison &amp;amp; Dania Ferguson comparing the newly-introduced macro facility with the existing ability to use LINK statements within DATA steps (&lt;a href="http://www.sascommunity.org/sugi/SUGI92/Sugi-92-04%20Ison%20Ferguson.pdf"&gt;SUGI 17 in 1992&lt;/a&gt;). I don't necessarily agree with too much of their arguments, but I firmly respect their freedom to offer their opinions. Discussion and opinion seems to have been lost in modern SAS conferences. The focus of papers is now on case studies and product features. Both important and valuable in their own right, but I miss the variety that used to exist.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.sascommunity.org/mwiki/images/thumb/4/47/Sugi18.gif/99px-Sugi18.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.sascommunity.org/mwiki/images/thumb/4/47/Sugi18.gif/99px-Sugi18.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
Whilst there is a wealth of good quality papers and articles available, no series of golden oldies could end without the inclusion of Art Carpenter's seminal series on Job Security. Software engineering can be a pretty dry and humourless topic, but Art managed to inject some real humour into the proceedings of several conferences. His first paper on the subject was at SUGI 18 in 1993, but I choose to highlight the paper he co-presented with my old friend Tony Payne at SUGI 23 (1998) in Nashville, &lt;a href="http://www2.sas.com/proceedings/sugi23/Training/p275.pdf"&gt;Programming for Job Security Revisited: Even More Tips and Techniques to Maximise Your Indispensability&lt;/a&gt;. Comedy gold, but also a series of high quality tips for making sure your programs are successfully peer-reviewed.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-1168420282615145696?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/C4_PLSldsZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/1168420282615145696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/note-programming-for-job-security.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1168420282615145696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1168420282615145696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/C4_PLSldsZc/note-programming-for-job-security.html" title="NOTE: Programming for Job Security (Golden Oldies)" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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>2</thr:total><feedburner:origLink>http://www.notecolon.info/2012/01/note-programming-for-job-security.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cEQ3s-eSp7ImA9WhRVEUQ.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-7814360676223961548</id><published>2012-01-10T11:30:00.000Z</published><updated>2012-01-10T11:30:02.551Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T11:30:02.551Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>NOTE: Keeping Track of Defects</title><content type="html">I recently stumbled across &lt;a href="http://blogs.sas.com/content/peerrevue/2010/09/27/keep-track-of-that/"&gt;an article on David Biesack's Peer Revue blog&lt;/a&gt; regarding SAS's defect tracking process. David provides a detailed and extensive insight into how the guys and girls in Cary (and beyond) deal with defects, from beginning to end.&lt;br /&gt;
&lt;br /&gt;
If you've ever raised a Track that was acknowledged as a bug, this article tells you what went on in the background prior to you getting a hotfix or a new version of SAS code. It's interesting reading, plus there's plenty of good practice that we can all use in our own development efforts. David highlights a number of things:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Effective tracking of defects (through their whole lifecycle)&lt;/li&gt;
&lt;li&gt;The use of a source management system to keep track of versions and releases of code&lt;/li&gt;
&lt;li&gt;Adoption of the Open/Closed Principle whereby code should be open for extension, but closed for modification. Expressed another way: when a single change to a program results in a cascade of changes to dependent modules (e.g. other macros or DI Studio jobs), that program exhibits the undesirable attributes that we have come to associate with “bad” design. The program becomes fragile, rigid, unpredictable and unreusable. The open/closed principle attacks this in a very straightforward way. It says that you should design modules that never change. When requirements change, you extend the behavior of such modules by adding new code, not by changing old code that already works. I wrote about this in &lt;a href="http://www.notecolon.info/2011/05/note-coupling-bad.html"&gt;NOTE: Coupling, Bad&lt;/a&gt; back in May of this year&lt;/li&gt;
&lt;/ul&gt;
David's article mentions the &lt;i&gt;SAS Quality Imperative&lt;/i&gt; - SAS's commitment to producing quality software and services. This is an informative white paper and well worth a read. David's link is broken but you can find the paper&amp;nbsp;&lt;a href="http://www.sas.com/software/quality-paper.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-7814360676223961548?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/y65wZR22Yr8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/7814360676223961548/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/note-keeping-track-of-defects.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7814360676223961548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7814360676223961548?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/y65wZR22Yr8/note-keeping-track-of-defects.html" title="NOTE: Keeping Track of Defects" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/08544085429581629519</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/note-keeping-track-of-defects.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQFSXs4fSp7ImA9WhRVEUQ.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-7251495813232883886</id><published>2012-01-10T09:16:00.001Z</published><updated>2012-01-10T11:18:38.535Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T11:18:38.535Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>Learn How to Code in 2012</title><content type="html">&lt;br /&gt;
Do you know someone who could benefit from learning how to code? Are your parents looking for a new hobby in retirement? Are your kids looking for wider career options? Send them along to &lt;a href="http://www.codeyear.com/"&gt;http://www.codeyear.com/&lt;/a&gt; and encourage them to sign-up for the codecademy course. It's free. &lt;br /&gt;
&lt;br /&gt;
Back in November there was an interesting piece from the BBC’s technology correspondent, Rory Cellan-Jones, entitled &lt;a href="http://www.bbc.co.uk/news/technology-15916677"&gt;Coding – the new Latin&lt;/a&gt;. Rory referenced a report from NESTA (the UK’s National Endowment for Science, Technology and the Arts) called Next Gen. Transforming the UK into the world’s leading talent hub for the video games and visual effects industries needs a generation of school leavers who have some skill and knowledge of coding. There seems to be a worldwide push to reinstroduce some kind of computer coding education back into schools. I support that. I certainly enjoyed learning computer skills when I was at school, and I know it benefited me in my career.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-7251495813232883886?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/NRL1zlwlyEg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/7251495813232883886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/learn-how-to-code-in-2012.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7251495813232883886?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7251495813232883886?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/NRL1zlwlyEg/learn-how-to-code-in-2012.html" title="Learn How to Code in 2012" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/learn-how-to-code-in-2012.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESHszfCp7ImA9WhRWFUQ.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-2527120677097431095</id><published>2012-01-03T12:00:00.001Z</published><updated>2012-01-03T12:00:09.584Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T12:00:09.584Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax" /><title>NOTE: Coding "Missing Values" (Golden Oldies)</title><content type="html">My mini-series of hints and tips from past decades would not be complete without a contribution from the&amp;nbsp;&lt;a href="http://www.sascommunity.org/wiki/SAS-L"&gt;SAS-L&lt;/a&gt;&amp;nbsp;mailing list - the 25 years old list server that continues to provide immense value to SAS practitioners worldwide. Joined by the &lt;a href="http://groups.google.com/group/comp.soft-sys.sas/topics"&gt;comp.soft-sys.sas newsgroup&lt;/a&gt; in 1993, these two services have worked hand-in-hand to answer questions and share SAS knowledge.
&lt;br /&gt;
&lt;br /&gt;
Matthew Healy's 1996 contribution to SAS-L, entitled "&lt;a href="http://www.listserv.uga.edu/cgi-bin/wa?A2=ind9602a&amp;amp;L=sas-l&amp;amp;F=&amp;amp;S=&amp;amp;P=26690"&gt;Coding Missing Values&lt;/a&gt;", offers timeless advice for data model design.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-2527120677097431095?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/whx989IygPw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/2527120677097431095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/note-coding-missing-values-golden.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/2527120677097431095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/2527120677097431095?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/whx989IygPw/note-coding-missing-values-golden.html" title="NOTE: Coding &quot;Missing Values&quot; (Golden Oldies)" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/note-coding-missing-values-golden.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcDQ3Y_cSp7ImA9WhRWFk8.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-4031508221470648536</id><published>2012-01-03T12:00:00.000Z</published><updated>2012-01-03T21:44:32.849Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T21:44:32.849Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>NOTE: Analytics 2012 Conference Series, Germany, 14-15 June</title><content type="html">The turn of a New Year is a good time to be thinking about your training plans for the year. Training can take several forms, it doesn't have to be limited to classroom sessions. Think more broadly. Are there any SAS-related books, or IT-related books that you would benefit from reading?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.sas.com/events/analytics/europe/images/top.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="75" src="http://www.sas.com/events/analytics/europe/images/top.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
And be sure to include conferences in your short-list of training activities. &lt;a href="http://support.sas.com/events/sasglobalforum/2012/index.html"&gt;SAS Global Forum 2012&lt;/a&gt; should be high on your list. If you're into analytics then you should also consider the Analytics Conference Series. The next event is the &lt;a href="http://www.sas.com/events/analytics/europe/"&gt;European event in Cologne, Germany&lt;/a&gt;, between 14th and 15th June. For statisticians, analysts, forecasters, data miners and their managers, this is likely to be the premier analytics event for SAS practitioners in Europe this year. Book before the end of February to get an early bird discount. And, before you book, check-out the &lt;a href="http://www.sas.com/events/analytics/europe/train.html"&gt;pre-conference training offers&lt;/a&gt; for further value-for-money.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-4031508221470648536?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/2tgDWQkOuRc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/4031508221470648536/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/note-analytics-2012-conference-series.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/4031508221470648536?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/4031508221470648536?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/2tgDWQkOuRc/note-analytics-2012-conference-series.html" title="NOTE: Analytics 2012 Conference Series, Germany, 14-15 June" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/01783287181150593795</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/note-analytics-2012-conference-series.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIHQHk4eip7ImA9WhRVFEs.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-3019538070592525332</id><published>2012-01-03T11:30:00.000Z</published><updated>2012-01-13T15:12:11.732Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T15:12:11.732Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="SGF" /><title>NOTE: Booked for SAS Global Forum 2012</title><content type="html">I've just booked my trip to &lt;a href="http://support.sas.com/events/sasglobalforum/2012/index.html"&gt;SAS Global Forum (SGF) 2012&lt;/a&gt;. Sadly my kids go back to school on the very day that SGF starts - Monday 23rd April - so they won't be coming with me to Walt Disney World in Florida.&lt;br /&gt;
&lt;br /&gt;
I don't recall booking so many different travel components when I travelled with my wife to my first SUGI/SGF in New York for &lt;a href="http://www.sascommunity.org/wiki/SAS_Global_Forum_Proceedings/SUGI_93"&gt;SUGI 18&lt;/a&gt;&amp;nbsp;in 1993. We arrived a few days early, toured the length and breadth of Manhattan, and had a great time. However, by the time the conference started I was glad of the opportunity to sit down.&lt;br /&gt;
&lt;br /&gt;
This year I booked flight and&amp;nbsp;accommodation&amp;nbsp;as a "holiday" package with Virgin Holidays (including free return transfer from airport to hotel). I also booked:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Car parking for my car to be left in the UK&lt;/li&gt;
&lt;li&gt;Lounges with wi-fi so I can make best use of my time whilst hanging around the airports waiting for flights&lt;/li&gt;
&lt;li&gt;An application for entry to the US through the Electronic System for Travel Authorisation (ESTA) - thankfully, last year's application was still valid&lt;/li&gt;
&lt;li&gt;Travel insurance&lt;/li&gt;
&lt;li&gt;Conference registration&lt;/li&gt;
&lt;li&gt;Did I forget anything??&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
On reflection, our 1993 trip was booked by a travel agent, and my 2012 trip was done by me on the internet. The travel agent handled all of the individual bits and pieces of the trip. I haven't used a travel agent for years. Maybe I should give it a try next year.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
109 days to departure!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-3019538070592525332?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/n8dJr6I08Nk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/3019538070592525332/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2012/01/note-booked-for-sas-global-forum-2012.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3019538070592525332?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3019538070592525332?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/n8dJr6I08Nk/note-booked-for-sas-global-forum-2012.html" title="NOTE: Booked for SAS Global Forum 2012" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2012/01/note-booked-for-sas-global-forum-2012.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ARHo8fip7ImA9WhRWE04.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-1385946407036595461</id><published>2011-12-31T12:00:00.000Z</published><updated>2011-12-31T12:17:25.476Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T12:17:25.476Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><title>NOTE: The Hits of 2011</title><content type="html">To join all of the others on the internet, here's an "end of year" list... Blogger tells me that the most popular posts on the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;NOTE:&lt;/span&gt; blog this year were:&lt;br /&gt;
&lt;br /&gt;
1.&amp;nbsp;&lt;a href="http://www.notecolon.info/2011/04/note-as-global-forum-2011-update-3.html"&gt;NOTE: SAS Global Forum 2011 - Update #3&lt;/a&gt;, 1,069 page views&lt;br /&gt;
2.&amp;nbsp;&lt;a href="http://www.notecolon.info/2011/04/note-sas-global-forum-2011-update.html"&gt;NOTE: SAS Global Forum 2011 - Update #1&lt;/a&gt;, 929 page views&lt;br /&gt;
3.&amp;nbsp;&lt;a href="http://www.notecolon.info/2011/04/note-sas-global-forum-2011-update-2.html"&gt;NOTE: SAS Global Forum 2011 - Update #2&lt;/a&gt;, 826 page views&lt;br /&gt;
4.&amp;nbsp;&lt;a href="http://www.notecolon.info/2011/04/note-sas-global-forum-2011-back-ups-and.html"&gt;NOTE: SAS Global Forum 2011 - Back-Ups, and The Last Word&lt;/a&gt;, 770 page views&lt;br /&gt;
5.&amp;nbsp;&lt;a href="http://www.notecolon.info/2011/05/note-sas-professionals-convention-2011.html"&gt;NOTE: SAS Professionals Convention 2011 - Registration is Open&lt;/a&gt;, 753 page views&lt;br /&gt;
&lt;br /&gt;
It's interesting to see that all of the posts relate to conferences - SGF in particular. I guess that's a reflection of our shared interest in the latest SAS news. I have every intention of being at &lt;a href="http://support.sas.com/events/sasglobalforum/2012/index.html"&gt;SGF 2012&lt;/a&gt; in Florida, USA between April 22 -25. And I'll endeavour to post all the latest news as soon as I find it.&lt;br /&gt;
&lt;br /&gt;
Thanks for your continued support of &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;NOTE:&lt;/span&gt;. Here's hoping we all have a healthy and happy New Year.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-1385946407036595461?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/eoEYHUlteSw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/1385946407036595461/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-hits-of-2011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1385946407036595461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1385946407036595461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/eoEYHUlteSw/note-hits-of-2011.html" title="NOTE: The Hits of 2011" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-hits-of-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUERnY6cCp7ImA9WhRXGUU.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-3129219506553617210</id><published>2011-12-27T12:00:00.000Z</published><updated>2011-12-27T12:00:07.818Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-27T12:00:07.818Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax" /><title>NOTE: Decoding the _TYPE_ Variable (Golden Oldies)</title><content type="html">Our mini-series of hints and tips from past decades continues with 1999...&lt;br /&gt;
&lt;br /&gt;
Appearing in the same issue of The Missing Semicolon (TMS) was i) an advertisement for Year 2000 Support (do you remember "Y2K"?), and ii) an article entitled "Decoding the _TYPE_ Variable (in PROC SUMMARY and PROC MEANS)" on page 5.&lt;br /&gt;
&lt;br /&gt;
The issue in question was &lt;a href="http://www.sys-seminar.com/EE/Files/tms_1999_06.pdf"&gt;June, 1999: Volume 2, Number 2&lt;/a&gt;. The Missing Semicolon, published by Systems Seminar Consultants, has been informing SAS practitioners since June 1998 (just a few months after the first edition of &lt;a href="http://www.views-uk.demon.co.uk/Newsletter/backcopy.htm"&gt;VIEWS News&lt;/a&gt; was put to print and posted to its subscribers). It continues to this day and offers &lt;a href="http://www.sys-seminar.com/newsletter"&gt;free subscriptions&lt;/a&gt;&amp;nbsp;to all SAS practitioners.&lt;br /&gt;
&lt;br /&gt;
Contemporary users of PROC MEANS and SUMMARY have the benefit of the &lt;a href="http://support.sas.com/documentation/cdl/en/proc/63079/HTML/default/viewer.htm#n1qnc9bddfvhzqn105kqitnf29cp.htm"&gt;CHARTYPE&lt;/a&gt; option, but the principles of understanding the values of the numeric _TYPE_ variable or the 1's and 0's of the character _TYPE_ are the same.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-3129219506553617210?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/fh4PBFQWuAM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/3129219506553617210/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-decoding-type-variable-golden.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3129219506553617210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3129219506553617210?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/fh4PBFQWuAM/note-decoding-type-variable-golden.html" title="NOTE: Decoding the _TYPE_ Variable (Golden Oldies)" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-decoding-type-variable-golden.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMEQng_eSp7ImA9WhRXE0U.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-577207443207273655</id><published>2011-12-20T12:00:00.000Z</published><updated>2011-12-20T12:00:03.641Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-20T12:00:03.641Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax" /><title>NOTE: 180 Terrific Ideas for Using and Learning the SAS System (Golden Oldies)</title><content type="html">Continuing my mini-series of hints and tips from previous decades, here's a paper from my first SAS Users Group International (SUGI) conference. The 18th SUGI (predecessor to today's SAS Global Forum (SGF)) was held in 1993 in New York. Helen and Ginger Carey's paper was boldly entitled "&lt;a href="http://www.sascommunity.org/sugi/SUGI93/Sugi-93-208%20Carey%20Carey.pdf"&gt;180 Terrific Ideas for Using and Learning the SAS System&lt;/a&gt;", and it didn't disappoint. Whilst not all of their ideas are useful today, a significant number of them are. Note in particular their ideas regarding a) work habits, b) testing and debugging, and c) programming style.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-577207443207273655?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/CbvxXPOr8zA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/577207443207273655/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-180-terrific-ideas-for-using-and.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/577207443207273655?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/577207443207273655?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/CbvxXPOr8zA/note-180-terrific-ideas-for-using-and.html" title="NOTE: 180 Terrific Ideas for Using and Learning the SAS System (Golden Oldies)" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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>1</thr:total><feedburner:origLink>http://www.notecolon.info/2011/12/note-180-terrific-ideas-for-using-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMERXc8cSp7ImA9WhRQGUg.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-4047964363416192460</id><published>2011-12-15T12:00:00.001Z</published><updated>2011-12-15T12:00:04.979Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T12:00:04.979Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax" /><title>NOTE: BY Variables in Titles (Golden Oldies)</title><content type="html">Whilst the capabilities of SAS software increase markedly from release to release, the core capabilities remain the same. And that means that many hints and tips from years gone by are still valid today. Starting today I'm running a mini-series of tips from past decades, starting with an article by myself in the &lt;a href="http://www.sascommunity.org/mwiki/images/8/8f/VIEWS_News_Issue1.pdf"&gt;first ever issue of VIEWS News&lt;/a&gt;&amp;nbsp;(winter 1998).&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.views-uk.demon.co.uk/Newsletter/backcopy.htm"&gt;VIEWS News&lt;/a&gt; was a printed and posted newsletter that was published quarterly by VIEWS - the UK's&amp;nbsp;independent&amp;nbsp;user group for SAS practitioners.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;BY Variables in Titles&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You can insert labels and/or values of BY variables into titles.&amp;nbsp;For example, suppose you have a data set sorted by the variable&amp;nbsp;TRTSEQ, with label "Group" and formatted values "Placebo",&amp;nbsp;"Wonder Drug", etc.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;options nobyline;&lt;br /&gt;&lt;br /&gt;proc print;&lt;br /&gt;&amp;nbsp; title "List for #byvar1 - #byval1";&lt;br /&gt;&amp;nbsp; by trtseq;&lt;br /&gt;&amp;nbsp; var var1-var10;&lt;br /&gt;run;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
For each BY group, you'll get the titles:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;List for Group - Placebo&lt;br /&gt;List for Group - Wonder Drug&lt;br /&gt;etc.&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The NOBYLINE option suppresses the normal printing of the&amp;nbsp;BY lines, so you don't see "Group=Placebo." You can turn it&amp;nbsp;back on with OPTIONS BYLINE.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-4047964363416192460?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/So95yqRr2rA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/4047964363416192460/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-by-variables-in-titles-golden.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/4047964363416192460?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/4047964363416192460?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/So95yqRr2rA/note-by-variables-in-titles-golden.html" title="NOTE: BY Variables in Titles (Golden Oldies)" /><author><name>Andy</name><uri>http://www.blogger.com/profile/02391580830365276167</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-by-variables-in-titles-golden.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAAQ3o6cSp7ImA9WhRXE0U.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-4613520623344319653</id><published>2011-12-13T12:00:00.001Z</published><updated>2011-12-20T13:45:42.419Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-20T13:45:42.419Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>Testing - Peer Reviews</title><content type="html">In my recent series on &lt;a href="http://www.notecolon.info/search/label/testing"&gt;testing&lt;/a&gt; I concentrated on &lt;i&gt;dynamic&lt;/i&gt; testing, i.e. executing some or all of your code to see if it works. The other type of testing is &lt;i&gt;static&lt;/i&gt; testing. This was featured briefly in my "&lt;a href="http://support.sas.com/resources/papers/proceedings11/124-2011.pdf"&gt;SAS Software Development With The V-Model&lt;/a&gt;" paper at this year's SAS Global Forum ( SGF).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-nve7GpNFabs/TtpFs6ohfzI/AAAAAAAAADc/yldXJT_s4IM/s1600/PeerReview.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="273" src="http://4.bp.blogspot.com/-nve7GpNFabs/TtpFs6ohfzI/AAAAAAAAADc/yldXJT_s4IM/s320/PeerReview.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
The principle form of static testing is peer review. Like all tests and reviews, you have to have something to test or review against. For testing you will have a set of requirements or a set of specifications (ref: the V-Model). For peer review,&amp;nbsp;a fellow programmer will take a look at your code and offer opinion on whether it meets the team’s coding guidelines and other standards (and whether it gives the impression of meeting the unit specification). Thus, to perform an effective peer review, you need some documented standards against which the review can be set.&lt;br /&gt;
&lt;br /&gt;
I wrote a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;NOTE:&lt;/span&gt; &lt;a href="http://www.notecolon.info/2009/11/peer-reviews-code-reviews.html"&gt;post on peer review back in 2009&lt;/a&gt;, so I won't repeat those thoughts here; however, I did see a good &lt;a href="http://www.bi-notes.com/2011/10/what-is-a-code-review/"&gt;post from Tricia&lt;/a&gt; on the BI Notes blog back on October. Tricia used the post to run through a number of potential pitfalls for those who are new to the process. In the article, Tricia offered valuable tips on how to keep the review focused &amp;amp; at the right level, and how to be properly prepared.&lt;br /&gt;
&lt;br /&gt;
Done properly, peer reviews offer increased code quality, reduced cost of rework, increased amounts of shared knowledge of your applications, and increased sharing of code and design good practice.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-4613520623344319653?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/YcnntQ_SgJI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/4613520623344319653/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/testing-peer-reviews.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/4613520623344319653?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/4613520623344319653?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/YcnntQ_SgJI/testing-peer-reviews.html" title="Testing - Peer Reviews" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/08544085429581629519</uri><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-nve7GpNFabs/TtpFs6ohfzI/AAAAAAAAADc/yldXJT_s4IM/s72-c/PeerReview.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.notecolon.info/2011/12/testing-peer-reviews.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQ305fyp7ImA9WhRQF0o.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-7909265467309949932</id><published>2011-12-13T11:30:00.000Z</published><updated>2011-12-13T11:30:02.327Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T11:30:02.327Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="WPS" /><title>NOTE: Programming Languages Can Be Copied...</title><content type="html">... so says Yves Bot, advocate general at the Court of Justice of the European Union (CJEU). &lt;a href="http://www.zdnet.co.uk/news/intellectual-property/2011/11/30/programming-languages-can-be-copied-says-eu-lawyer-40094545/?s_cid=938"&gt;Mr Bot's guidance&lt;/a&gt; was issued in response to the &lt;a href="http://www.notecolon.info/2010/11/note-world-programming-vs-sas-both.html"&gt;July 2010 High Court case&lt;/a&gt; between SAS and World Programming Limited (WPL). The CJEU still needs to make a full judgement before handing things back to the High Court, but WPL will doubtless be pleased that Mr Bot appears to have sided with them (along with a &lt;a href="http://www.teamwpc.co.uk/press/us_case_dismissed"&gt;US court in March 2011&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
However, whilst the language itself cannot be protected, the implementation of the language *is* protected. So, the code that SAS's staff in Cary (and around the world) have written in order to implement the language cannot be copied. Anybody who wishes to produce software that can interpret the SAS language must write that interpreter all by themselves. As a result, you might expect the bigger company to be able to invest more time and effort into optimising the speed and efficiency of their product.&lt;br /&gt;
&lt;br /&gt;
So, before you rush out hoping to find a cheaper, better solution, be sure to do your full due diligence on all of the candidates. Check that all elements of the language are implemented; be sure to perform some performance and reliability testing; and probe the support provisions of your potential suppliers. These things are less easy to duplicate. Caveat emptor.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-7909265467309949932?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/zElCqt-vfCI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/7909265467309949932/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-programming-languages-can-be.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7909265467309949932?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/7909265467309949932?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/zElCqt-vfCI/note-programming-languages-can-be.html" title="NOTE: Programming Languages Can Be Copied..." /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/01783287181150593795</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-programming-languages-can-be.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EFQn8-fCp7ImA9WhRQE0k.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-3520857837090330192</id><published>2011-12-08T12:00:00.001Z</published><updated>2011-12-08T12:00:13.154Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-08T12:00:13.154Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax" /><title>NOTE: Hash Tables, An Introduction</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-as0rT-XtL2k/Ttp7ghebyZI/AAAAAAAAADk/YeNwrYiT9mk/s1600/Search.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="198" src="http://1.bp.blogspot.com/-as0rT-XtL2k/Ttp7ghebyZI/AAAAAAAAADk/YeNwrYiT9mk/s200/Search.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
In my recent series of articles on &lt;a href="http://www.notecolon.info/search/label/testing"&gt;testing&lt;/a&gt; I used the hash table to provide a means to write/update a table from within a DATA step without demanding changes to the DATA statement, etc. I've had some very kind feedback on the series, plus some requests to explain what the hash table does and how it works. So here goes...&lt;br /&gt;
&lt;br /&gt;
The hash table was introduced to the DATA step as a means of performing fast, in-memory lookups. The fact that the hash table is a "component object" means that there's a steeper than usual learning curve for this feature. The &lt;i&gt;SAS Language Reference: Concepts&lt;/i&gt; manual provides an &lt;a href="http://support.sas.com/documentation/cdl/en/lrcon/62753/HTML/default/viewer.htm#n1b4cbtmb049xtn1vh9x4waiioz4.htm"&gt;introductory section on the hash table&lt;/a&gt;, but for many DATA step coders the hash table remains unused. A better route to getting started with hash tables is the "&lt;a href="http://support.sas.com/rnd/base/datastep/dot/hash-getting-started.pdf"&gt;Getting Started with the DATA Step Hash Object&lt;/a&gt;" paper in the &lt;a href="http://support.sas.com/rnd/base/datastep/index.html"&gt;DATA Step sub-section&lt;/a&gt; of R&amp;amp;D's SAS/BASE section of the SAS Support web site (follow the link to Component Objects and Dot Notation).&lt;br /&gt;
&lt;br /&gt;
In a nutshell, the hash table is a lookup table that's stored (temporarily) in memory and allows you to search for values within it and thereby get associated values returned. Let's introduce ourselves to the hash table by taking a two step approach: firstly we'll create the hash table, secondly we'll use it for lookups against each of the rows in our input table. Our DATA Step will look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;data result;&lt;br /&gt;&amp;nbsp; set input;&lt;br /&gt;&amp;nbsp; if _n_ eq 1 then&lt;br /&gt;&amp;nbsp; do; &lt;span style="color: #274e13;"&gt;/* It's first time through, so let's create hash table */&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: #660000;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;create the hash table&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;&amp;nbsp; /* For each row in input table, do a lookup in the hash table */&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: #660000;"&gt;&amp;nbsp; &amp;lt;do a lookup&amp;gt;&lt;/span&gt;&lt;br /&gt;run;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Let's make ourselves some test data and assume it contains the sales from our small car sales operation last week:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;data SalesThisWeek;&lt;br /&gt;&amp;nbsp; length make $13 model $40;&lt;br /&gt;&amp;nbsp; infile cards dsd;&lt;br /&gt;&amp;nbsp; input make model;&lt;br /&gt;&amp;nbsp; cards;&lt;br /&gt;Jaguar,XJR 4dr&lt;br /&gt;Land Rover,Discovery SE&lt;br /&gt;Jaguar,XKR convertible 2dr&lt;br /&gt;;&lt;br /&gt;run;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
We have a price list for all of the cars we sell; it's in sashelp.cars and contains variables named make, model and invoice. Frustratingly, the MODEL column contains leading blanks, so we use a quick DATA Step to get rid of them, thereby creating &lt;i&gt;work&lt;/i&gt;.cars.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;data work.cars; set sashelp.cars; model=left(model); run;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
We want to load the price list into a hash table, then lookup each of our sold cars to find its invoice value. Here's the code to &amp;lt;create the hash table&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;nbsp; DECLARE HASH notehash (DATASET:'work.cars');&lt;br /&gt;&amp;nbsp; notehash.DEFINEKEY('make','model');&lt;br /&gt;&amp;nbsp; notehash.DEFINEDATA('invoice');&lt;br /&gt;&amp;nbsp; notehash.DEFINEDONE();&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Woh! That code looks like no other SAS code we've ever seen!! That's because the hash table is a "component object" and the syntax for dealing with components objects differs from mainstream DATA Step syntax. It's called "dot notation". It quickly makes sense once you get over the fact that it's different.&lt;br /&gt;
&lt;br /&gt;
The first line tells SAS that we want to create a new hash table. Hash tables only exist temporarily in memory for the duration of the DATA Step. We use the DECLARE statement to begin to create a new component object; the first parameter (HASH) says what kind of component object we want to create; the second parameter (notehash) is an arbitrary name that we have chosen for the hash table; within the brackets we have told SAS that we're going to use some of the columns of the work.cars table as our lookup table.&lt;br /&gt;
&lt;br /&gt;
The following two lines tell SAS a bit more about how we'd like to load and use the hash table; the fourth line (with DEFINEDONE) tells SAS we've nothing more to tell it about the hash table.&lt;br /&gt;
&lt;br /&gt;
When we use dot notation we type i) the name of a component object, ii) an action we want to perform on the object, and optionally iii) parameters for the action. Parts (i) and (ii) are separated by dots, and the parameters (iii) are enclosed in brackets.&lt;br /&gt;
&lt;br /&gt;
When we create a hash table, we have to declare it, then we have to specify a) the key column(s), i.e. the column(s) that we'll use to find something in the hash table, and b) the data column(s), i.e. the column(s) whose values will be returned once the key values are found in the hash table. In our case, MAKE and MODEL are our key columns, and INVOICE is our data column.&lt;br /&gt;
&lt;br /&gt;
After specifying our key and data columns (with the DEFINEKEY and DEFINEDATA actions) we tell SAS that we're done by performing the DEFINEDONE action on the hash table.&lt;br /&gt;
&lt;br /&gt;
The dot notation is different to what we're used to, but it's not too tricky to get your head around.&lt;br /&gt;
&lt;br /&gt;
Now that we've created our hash table in memory, for use during the DATA Step, all we need to do now is use it. We lookup things in the table by performing the FIND action on the hash table. If SAS finds the key value(s) in the hash table, it will automatically put the associated data value(s) into the data variable(s) in the DATA Step. So, in our case, we need a variable in the DATA Step named INVOICE. If we don't create that variable prior to using the hash table we'll get an error.&lt;br /&gt;
&lt;br /&gt;
When we do a FIND, we're given a return code value that tells us whether SAS found the key(s) in the hash table. A return code value of zero tells us that all is well and the value was found; any other value tells us that SAS did not find the value. So, our code to &amp;lt;do a lookup&amp;gt; will look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;nbsp; length invoice 8;&lt;br /&gt;&amp;nbsp; rc = notehash.FIND();&lt;br /&gt;&amp;nbsp; if rc ne 0 then &lt;br /&gt;&amp;nbsp; &amp;nbsp; put "Oh dear, we sold something we can't identify";&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Notice that there's no direct reference to INVOICE when we do the find. The fact that FIND will put a value into INVOICE is implicit from our preceding DEFINEDATA.&lt;br /&gt;
&lt;br /&gt;
Put all together, our code looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;/* Create our test data */&lt;br /&gt;data SalesThisWeek;&lt;br /&gt;&amp;nbsp; length make $13 model $40;&lt;br /&gt;&amp;nbsp; infile cards dsd;&lt;br /&gt;&amp;nbsp; input make model;&lt;br /&gt;&amp;nbsp; put make $quote22. model $quote50.;&lt;br /&gt;cards;&lt;br /&gt;Jaguar,XJR 4dr&lt;br /&gt;Land Rover,Discovery SE&lt;br /&gt;Jaguar,XKR convertible 2dr&lt;br /&gt;;&lt;br /&gt;run;&lt;br /&gt;&lt;br /&gt;/* Strip leading blanks from MODEL */&lt;br /&gt;data work.cars; set sashelp.cars; model=left(model); run;&lt;br /&gt;&lt;br /&gt;/* Add invoice values to sales by using lookup */&lt;br /&gt;data result;&lt;br /&gt;&amp;nbsp; set SalesThisWeek;&lt;br /&gt;&amp;nbsp; keep make model invoice;&lt;br /&gt;&amp;nbsp; if _n_ eq 1 then&lt;br /&gt;&amp;nbsp; do; /* It's first time through, so let's create hash table */&lt;br /&gt;&amp;nbsp; &amp;nbsp; DECLARE HASH notehash (dataset:'work.cars');&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;notehash.DEFINEKEY('make','model');&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;notehash.DEFINEDATA('invoice');&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;notehash.DEFINEDONE();&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; /* For each row in input table, do a lookup in the hash table */&lt;br /&gt;&amp;nbsp; length invoice 8;&lt;br /&gt;&amp;nbsp; rc = notehash.FIND();&lt;br /&gt;&amp;nbsp; if rc ne 0 then&lt;br /&gt;&amp;nbsp; &amp;nbsp; put "Oh dear, we sold something we can't identify";&lt;br /&gt;run;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Once you've got the basic hang of hash tables, the two best sources of reference information are:&lt;br /&gt;
&lt;br /&gt;
a) The &lt;a href="http://support.sas.com/rnd/base/datastep/dot/hash-tip-sheet.pdf"&gt;hash table tip sheet&lt;/a&gt;, available from&amp;nbsp;&lt;a href="http://support.sas.com/rnd/base/index.html"&gt;R&amp;amp;D's SAS/BASE section of the SAS Support web site&lt;/a&gt; (see the link to the tip sheet over on the right hand side of the page)&lt;br /&gt;
&lt;br /&gt;
b) &lt;i&gt;Component Objects: Reference&lt;/i&gt; in the &lt;a href="http://support.sas.com/documentation/onlinedoc/bookshelf/93/"&gt;SAS Programmer's Bookshelf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
There are many ways to perform lookups in SAS. Some examples would be i) formats, ii) the KEY= parameter of the SET statement, iii) table joins. The hash table is another option which can offer advantages in many cases. Have fun...&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-3520857837090330192?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/Btsoo5VvIMs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/3520857837090330192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-hash-tables-introduction.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3520857837090330192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/3520857837090330192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/Btsoo5VvIMs/note-hash-tables-introduction.html" title="NOTE: Hash Tables, An Introduction" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/08544085429581629519</uri><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-as0rT-XtL2k/Ttp7ghebyZI/AAAAAAAAADk/YeNwrYiT9mk/s72-c/Search.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.notecolon.info/2011/12/note-hash-tables-introduction.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8ERXozcSp7ImA9WhRQEUo.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-1571983386173464819</id><published>2011-12-06T12:00:00.000Z</published><updated>2011-12-06T12:00:04.489Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-06T12:00:04.489Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>NOTE: Testing Macros - Parameters Revisited</title><content type="html">As my planned &lt;a href="http://www.notecolon.info/search/label/testing"&gt;series on testing&lt;/a&gt; drew to a close last week, I got an email from Quentin McMullen with some very kind words about the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;NOTE:&lt;/span&gt; blog, but also some very erudite comments about my choice of parameters for my testing macros. Rather than paraphrase Quentin's comments, I decided to publish his email verbatim (with his permission). Here's the heart of Quentin's email, followed by a few brief comments from me.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Just a quick thought:&lt;br /&gt;
&lt;br /&gt;
I have a similar macro to %assert_condition, but it only has one&amp;nbsp;(main) parameter, &amp;amp;CONDITION, instead of three; &amp;amp;LEFT &amp;amp;OPERATOR&amp;nbsp;&amp;amp;RIGHT. &amp;nbsp;So it looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%macro assert_condition(condition,tag=);&lt;br /&gt;
&amp;nbsp;if &amp;amp;CONDITION then&lt;br /&gt;
&amp;nbsp; &amp;nbsp;put "TESTING: &amp;amp;sysmacroname: TAG=&amp;amp;tag, OUTCOME=PASS";&lt;br /&gt;
&amp;nbsp;else&lt;br /&gt;
&amp;nbsp; &amp;nbsp;put "TESTING: &amp;amp;sysmacroname: TAG=&amp;amp;tag, OUTCOME=FAIL";&lt;br /&gt;
%mend assert_condition;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
So you can call it like:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%assert_condition(incount eq outcount)&lt;/code&gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;code&gt;%assert_condition (age &amp;gt; 0)&lt;/code&gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;code&gt;%assert_condition ( (incount=outcount) )&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
I tend to like the one parameter approach.&lt;br /&gt;
&lt;br /&gt;
The only tricky part is if you have an equals sign in the condition,&amp;nbsp;you have to put parentheses around the condition so the macro&amp;nbsp;processor does not interpret the left side as a keyword parameter. &amp;nbsp;The nifty&amp;nbsp;thing is that the parentheses also mask any commas,e.g.:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%assert_condition(gender IN ("M","F") )&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Do you see benefits to the 3 parameter approach vs 1 parameter?&lt;/blockquote&gt;
Yes, Quentin, I do very much see the benefits of your approach. Your example, using the IN operator, is particularly well chosen. Rest assured I'll be adapting the McMullen approach in future. Thanks for the comments. Keep reading &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;NOTE:&lt;/span&gt;!&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-1571983386173464819?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/OFWWDyp_53Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/1571983386173464819/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-testing-macros-parameters.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1571983386173464819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1571983386173464819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/OFWWDyp_53Q/note-testing-macros-parameters.html" title="NOTE: Testing Macros - Parameters Revisited" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/01783287181150593795</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-testing-macros-parameters.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ERXk6eyp7ImA9WhRRF0k.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-1415073554126236886</id><published>2011-12-01T12:00:00.001Z</published><updated>2011-12-01T12:00:04.713Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T12:00:04.713Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>NOTE: Testing (Presenting the Results)</title><content type="html">The preceding two articles in this &lt;a href="http://www.notecolon.info/search/label/testing"&gt;series on testing&lt;/a&gt; presented a simple, generic macro for testing and recording test results. All that remains now is for us to tidy-up some loose ends.&lt;br /&gt;
&lt;br /&gt;
Firstly, the macro assumes data set work.results already exists. And it also assumes that the data set contains appropriate variables named Tag and Result. We can quickly arrange that by being sure to include a call to the following macro in our testing code: &lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%macro assert_init(resultdata=work.results);&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; data &amp;amp;resultdata;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; length Tag $32 Result $4;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; stop;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; run;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;%mend assert_init;&lt;/code&gt; &lt;br /&gt;
&lt;br /&gt;
Finally, we want to present our results. We can do this easily with a simple call to PROC REPORT: &lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%macro assert_term(resultdata=work.results);&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; title "Test Results";&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; proc report data=&amp;amp;resultdata;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; columns tag result;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; define tag / order;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; run;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;%mend assert_term;&lt;/code&gt; &lt;br /&gt;
&lt;br /&gt;
Equipped thus, we can focus on our testing code, not the mechanics of collating and presenting results. For example, let's imagine we have some new code to test; the purpose of the code is to read a raw file (a.txt), create some computed columns, and write-out a SAS data set (perm.a). One of our tests is to check that the number of rows in the raw file matches the number of rows in the SAS data set. Here's our code to test this functionality:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%assert_init;&lt;br /&gt;
%include "code_to_be_tested.sas";&lt;br /&gt;
%assert_EqualRowCount(infile=a.txt,outdata=perm.a,tag=T01-1);&lt;br /&gt;
%assert_term;&lt;/code&gt; &lt;br /&gt;
&lt;br /&gt;
We can make the results a tad more visual by colourising the pass/fail values:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%macro assert_term(resultdata=work.results);&lt;br /&gt;
&amp;nbsp; proc format;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; value $bkres 'PASS'='Lime'&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'FAIL'='Red';&lt;br /&gt;
&amp;nbsp; run;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; title "Test Results";&lt;br /&gt;
&amp;nbsp; proc report data=&amp;amp;resultdata;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; columns tag result;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; define tag / order;&lt;br /&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&amp;nbsp; &lt;/span&gt;define result / style(column)={background=$bkres.};&lt;br /&gt;
&amp;nbsp; run;&lt;br /&gt;
%mend assert_term;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
This assumes you're using SAS Enterprise Guide. If not, you'll need to add some appropriate ODS statements around the PROC REPORT.&lt;br /&gt;
&lt;br /&gt;
The downside of the macros as they stand at this point is that the results data set gets recreated every time we run the code. Maybe we don't want that because we want to collate test results from a number of separate bits of test code. So, finally, we can make the creation of the results data set conditional, i.e. if it doesn't exist we'll create, if it already exists then we'll leave it alone:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%macro assert_init(resultdata=work.results);&lt;br /&gt;
&amp;nbsp; %if not %sysfunc(exist(&amp;amp;resultdata)) %then&lt;br /&gt;
&amp;nbsp; %do;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; data &amp;amp;resultdata;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; length Tag $32 Result $4;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; stop;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; run;&lt;br /&gt;
&amp;nbsp; %end;&lt;br /&gt;
%mend assert_init;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-1415073554126236886?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/Di6L1KVhdhk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/1415073554126236886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-testing-presenting-results.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1415073554126236886?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/1415073554126236886?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/Di6L1KVhdhk/note-testing-presenting-results.html" title="NOTE: Testing (Presenting the Results)" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/08544085429581629519</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-testing-presenting-results.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4MQnwzeSp7ImA9WhRRF0k.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-9025791348647145799</id><published>2011-12-01T06:00:00.000Z</published><updated>2011-12-01T12:36:23.281Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T12:36:23.281Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>NOTE: Advent Calendar 2011</title><content type="html">Today is 1st December, and that can mean only one thing: time to turn to the traditional &lt;a href="http://www.sasadventcalendar.co.uk/"&gt;SAS Professionals advent calendar&lt;/a&gt;! There will be prizes every day throughout December, so make sure you visit &lt;a href="http://www.sasprofessionals.net/"&gt;http://www.sasprofessionals.net/&lt;/a&gt; every day. &lt;br /&gt;
&lt;br /&gt;
And if you're not already a member, sign-up, check-out the Expert Channel, the forums, and benefit from the ability to network with fellow SAS practitioners online! Attend next year's SAS Professionals Convention&amp;nbsp;in Marlow&amp;nbsp;(July 10 to 12) and learn from papers delivered by a mixture of SAS staff and customers.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-9025791348647145799?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/emuLpogkAlo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/9025791348647145799/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/12/note-advent-calendar-2011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/9025791348647145799?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/9025791348647145799?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/emuLpogkAlo/note-advent-calendar-2011.html" title="NOTE: Advent Calendar 2011" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/01783287181150593795</uri><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><feedburner:origLink>http://www.notecolon.info/2011/12/note-advent-calendar-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcESXk5eSp7ImA9WhRRFUs.&quot;"><id>tag:blogger.com,1999:blog-3401137187963845372.post-6873910739747662552</id><published>2011-11-29T12:00:00.001Z</published><updated>2011-11-29T12:00:08.721Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-29T12:00:08.721Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SAS" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>NOTE: Testing (Collating the Results)</title><content type="html">We began this &lt;a href="http://www.notecolon.info/search/label/testing"&gt;series of posts on testing&lt;/a&gt; with an introduction to testing disciplines, and I followed that with a&amp;nbsp;description of&amp;nbsp;how we could quickly create some small macros that would allow us to automate some of our testing and present the results in a consistent fashion in the SAS log. However, putting the results into a SAS data set rather than the log was the next step to improve our efforts.&lt;br /&gt;
&lt;br /&gt;
We can use the tag as a unique key for the test results data set so that the data set has the most recent test results for each and every test. We can re-run individual tests and have an individual rows in the results data set updated.&lt;br /&gt;
&lt;br /&gt;
To&amp;nbsp;give us&amp;nbsp;the greatest flexibility to&amp;nbsp;add more macros to our test suite, we don't want the process of writing results to a data set to interfere with activities that are external to the macro. So, using a&amp;nbsp;SET statement, for example, would require the data set to be named in the DATA statement. This seems a good opportunity to use the OUTPUT method for a hash table. We can load the results data set into the hash table, use the TAG as the key for the table, and add/update a row with the result before outputting the hash table as the updated results data set. Here's the code:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;%macro assert_condition(left,operator,right,tag=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,resultdata=work.results);&lt;br /&gt;
&amp;nbsp; /* Load results into hash table */&lt;br /&gt;
&amp;nbsp; length Tag $32 Result $4;&lt;br /&gt;
&amp;nbsp; declare hash hrslt(dataset:"&amp;amp;resultdata");&lt;br /&gt;
&amp;nbsp; rc = hrslt.defineKey('TAG');&lt;br /&gt;
&amp;nbsp; rc = hrslt.defineData('TAG','RESULT');&lt;br /&gt;
&amp;nbsp; rc = hrslt.defineDone();&lt;br /&gt;
&amp;nbsp; /* Update the hash table */&lt;br /&gt;
&amp;nbsp; tag = "&amp;amp;tag";&lt;br /&gt;
&amp;nbsp; if &amp;amp;left &amp;amp;operator &amp;amp;right then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; result="PASS";&lt;br /&gt;
&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; result="FAIL";&lt;br /&gt;
&amp;nbsp; rc=hrslt.replace(); /* Add/update */&lt;br /&gt;
&amp;nbsp; /* Write back the results data set */&lt;br /&gt;
&amp;nbsp; rc = hrslt.output(dataset:"&amp;amp;resultdata");&lt;br /&gt;
&amp;nbsp; rc = hrslt.delete();&lt;br /&gt;
%mend assert_condition; &lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
By adding the maintenance of the results data set to our basic assert macro, the functionality gets inherited by any higher-level macro (such as yesterday's %assert_EqualRowCount).&lt;br /&gt;
&lt;br /&gt;
Clearly, the new macro won't work if the results data set doesn't already exist, and we'd like to present the results in a format better than a plain data set. We'll cover that in the next post.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;
&lt;hr/&gt;
&lt;br/&gt;
You are very welcome to share this email with your colleagues. However, if you do so, please recommend that they subsequently create their own subscription to NOTE: by linking to http://feedburner.google.com/fb/a/mailverify?uri=NoteTheBlogOfRtsleu-DevelopmentsInSas&amp;loc=en_US. Thank you for your continued support of NOTE:.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3401137187963845372-6873910739747662552?l=www.notecolon.info' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~4/A3vqcndSQhw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.notecolon.info/feeds/6873910739747662552/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.notecolon.info/2011/11/note-testing-collating-results.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/6873910739747662552?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3401137187963845372/posts/default/6873910739747662552?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NoteTheBlogOfRtsleu-DevelopmentsInSas/~3/A3vqcndSQhw/note-testing-collating-results.html" title="NOTE: Testing (Collating the Results)" /><author><name>Andrew Ratcliffe</name><uri>http://www.blogger.com/profile/08544085429581629519</uri><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><feedburner:origLink>http://www.notecolon.info/2011/11/note-testing-collating-results.html</feedburner:origLink></entry></feed>

