<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Northern Nevada Software Developers Group</title>
	
	<link>http://softwaredevelopersgroup.com</link>
	<description />
	<lastBuildDate>Thu, 24 May 2012 22:41:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/NorthernNevadaSoftwareDevelopersGroup" /><feedburner:info uri="northernnevadasoftwaredevelopersgroup" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Doug Holland Presentation</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/ydY_Fukk1Kk/</link>
		<comments>http://softwaredevelopersgroup.com/2012/05/doug-holland-presentation/#comments</comments>
		<pubDate>Thu, 24 May 2012 22:41:17 +0000</pubDate>
		<dc:creator>NNSDG</dc:creator>
				<category><![CDATA[Blogs]]></category>

		<guid isPermaLink="false">http://softwaredevelopersgroup.com/?p=1097</guid>
		<description><![CDATA[A big thank you to Doug Holland for his Windows 8 METRO Style Apps presentation.]]></description>
			<content:encoded><![CDATA[<p>A big thank you to Doug Holland for his Windows 8 METRO Style Apps presentation.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/ydY_Fukk1Kk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://softwaredevelopersgroup.com/2012/05/doug-holland-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://softwaredevelopersgroup.com/2012/05/doug-holland-presentation/</feedburner:origLink></item>
		<item>
		<title>Bret Simmons Presentation</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/sZ2oHpjCELM/</link>
		<comments>http://softwaredevelopersgroup.com/2012/04/bret-simmons-presentation/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 18:17:20 +0000</pubDate>
		<dc:creator>NNSDG</dc:creator>
				<category><![CDATA[Blogs]]></category>

		<guid isPermaLink="false">http://softwaredevelopersgroup.com/?p=1085</guid>
		<description><![CDATA[Thanks to Bret Simmons for his presentation on personal branding.  You can view his website and use of social media as a great example of a personal brand.  Also, thanks to the rest of the roundtable members: Ryan Polk and Jesse Anderson.]]></description>
			<content:encoded><![CDATA[<p>Thanks to <a href="http://www.bretlsimmons.com">Bret Simmons</a> for his presentation on personal branding.  You can view his website and use of social media as a great example of a personal brand.  Also, thanks to the rest of the roundtable members: <a href="http://ryanpolk.com/">Ryan Polk</a> and <a href="http://www.jesse-anderson.com/">Jesse Anderson</a>.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/sZ2oHpjCELM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://softwaredevelopersgroup.com/2012/04/bret-simmons-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://softwaredevelopersgroup.com/2012/04/bret-simmons-presentation/</feedburner:origLink></item>
		<item>
		<title>New Meeting Location</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/5NjmaerxChc/</link>
		<comments>http://softwaredevelopersgroup.com/2012/04/new-meeting-location/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 22:22:10 +0000</pubDate>
		<dc:creator>NNSDG</dc:creator>
				<category><![CDATA[Blogs]]></category>

		<guid isPermaLink="false">http://softwaredevelopersgroup.com/?p=1080</guid>
		<description><![CDATA[There are some changes for this meeting and all future meetings. Bangkok Cuisine South has been a great host to our meetings, but we have a late scheduling conflict this month that we just found out about.  We decided to look at another venue for this month&#8217;s and all future meetings.  We will be hosting the meetings at The Firkin [...]]]></description>
			<content:encoded><![CDATA[<p>There are some changes for this meeting and all future meetings.</p>
<p>Bangkok Cuisine South has been a great host to our meetings, but we have a late scheduling conflict this month that we just found out about.  We decided to look at another venue for this month&#8217;s and <em>all future</em> meetings.  We will be hosting the meetings at <a href="http://www.thefirkinandwolf.com/index.php" target="_blank">The Firkin and Wolf</a> at Summit Sierra by The Apple Store and Century Theatre.  Here is <a href="http://maps.google.com/maps?q=13971+S.+Virginia+Street+Reno,+NV,+89511&amp;hl=en&amp;ll=39.403687,-119.746342&amp;spn=0.019996,0.021415&amp;sll=-9.968851,-82.089844&amp;sspn=143.743535,175.429688&amp;vpsrc=6&amp;z=16" target="_blank">the map</a> in case you don&#8217;t know where The Apple Store or the Century Theatre is.</p>
<p>This venue change brings about some other good changes.  We will have a room that is more conducive to training and presentations.  We will no longer need to have an RSVP count.  Once you get there, please put in your own order from<del> anything</del> the 4 we choose items off <a href="http://www.thefirkinandwolf.com/images/Wolf%20Menu.pdf" target="_blank">the menu</a>.  It will be up to each member to pay for their own food now.  As before, there is <strong>no charge</strong> to attend the meeting.  If you want to stick around after the meeting and socialize, there are darts and a pool table.</p>
<p>Some members don&#8217;t know and we would appreciate everyone letting other members know about the change.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/5NjmaerxChc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://softwaredevelopersgroup.com/2012/04/new-meeting-location/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://softwaredevelopersgroup.com/2012/04/new-meeting-location/</feedburner:origLink></item>
		<item>
		<title>Collecting Thoughts</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/jbjgdazDlhk/collecting-thoughts.html</link>
		<comments>http://oratips-ddf.blogspot.com/2012/02/collecting-thoughts.html#comments</comments>
		<pubDate>Mon, 27 Feb 2012 20:21:00 +0000</pubDate>
		<dc:creator>David Fitzjarrell</dc:creator>
		
		<guid isPermaLink="false">http://softwaredevelopersgroup.com/?guid=c80ac3d8928e27a69481891819e08540</guid>
		<description><![CDATA[Collections are an interesting lot.  They can be one of the most useful tools in the Oracle arsenal, yet they can also be very frustrating to implement.  For those unfamiliar with them a collection/varray is defined as "an ordered group of elements, al...]]></description>
			<content:encoded><![CDATA[Collections are an interesting lot.  They can be one of the most useful tools in the Oracle arsenal, yet they can also be very frustrating to implement.  For those unfamiliar with them a collection/varray is defined as "an ordered group of elements, all of the same type. Each element has a unique subscript that determines its position in the collection." The definition seems simple enough but it may be deceptively so.  To make matters even more confusing to use a collection you must create a database type for it to reference; a varray requires a type as well but that type can be declared in the PL/SQL block.  To clear the air a bit let's go through some examples of defining and using collections and varrays:  The first example uses a collection to store vendor ids and then process them for a report.  The code builds two 'tables' and compares the contents of them by loading collections and comparing one collection to the other; output is displayed for the conditions of the two tables being equal and the two tables not being equal:<br />
<br />
<pre><span style="color:#3333ff;">
SQL> 
SQL> set serveroutput on size 1000000
SQL> 
SQL> CREATE OR REPLACE type integer_table is table of integer;
  2  /

Type created.

SQL> 
SQL> DECLARE
  2  
  3  
  4   vendor_key_table   integer_table;
  5   vendor_key_table2   integer_table;
  6   CURSOR tst
  7   IS
  8      SELECT   purch_order, SUM (dollars),
  9        CAST (COLLECT (TO_NUMBER (vendor_key)) AS integer_table)
 10          FROM (SELECT 1 purch_order, 3 dollars, 435235 vendor_key
 11           FROM DUAL
 12         UNION ALL
 13         SELECT 1 purch_order, 8 dollars, 123452 vendor_key
 14           FROM DUAL
 15         UNION ALL
 16         SELECT 2 purch_order, 7 dollars, 433738 vendor_key
 17           FROM DUAL
 18         UNION ALL
 19         SELECT 2 purch_order, 4 dollars, 383738 vendor_key
 20           FROM DUAL
 21         UNION ALL
 22         SELECT 2 purch_order, 5 dollars, 387118 vendor_key
 23           FROM DUAL)
 24      GROUP BY purch_order;
 25  
 26  
 27    CURSOR tst2
 28   IS
 29    SELECT purch_order, SUM (dollars),
 30        CAST (COLLECT (TO_NUMBER (vendor_key)) AS integer_table)
 31          FROM (SELECT 1 purch_order, 3 dollars, 435235 vendor_key
 32           FROM DUAL
 33         UNION ALL
 34         SELECT 2 purch_order, 4 dollars, 383738 vendor_key
 35           FROM DUAL
 36         UNION ALL
 37         SELECT 2 purch_order, 7 dollars, 433738 vendor_key
 38           FROM DUAL
 39         UNION ALL
 40         SELECT 2 purch_order, 5 dollars, 387118 vendor_key
 41           FROM DUAL)
 42      GROUP BY purch_order;
 43   v_purch_order    NUMBER;
 44   v_dollars    NUMBER;
 45  
 46  
 47   mystr     VARCHAR2 (4000);
 48  
 49  
 50   v_purch_order2     NUMBER;
 51   v_dollars2     NUMBER;
 52  
 53  
 54   mystr2      VARCHAR2 (4000);
 55  BEGIN
 56   OPEN tst;
 57   open tst2;
 58  
 59  
 60   LOOP
 61      mystr := NULL;
 62      mystr2 := NULL;
 63  
 64  
 65      FETCH tst
 66       INTO v_purch_order, v_dollars, vendor_key_table;
 67  
 68  
 69      FETCH tst2
 70       INTO v_purch_order2, v_dollars2, vendor_key_table2;
 71  
 72  
 73      IF tst%NOTFOUND
 74      THEN
 75         EXIT;
 76      END IF;
 77  
 78  
 79      if vendor_key_table = vendor_key_table2 then
 80          dbms_output.put_line('equal');
 81      else
 82          dbms_output.put_line(' not equal');
 83      end if;
 84  
 85  
 86      -- loop through the collection and build a string so that
 87      -- we can display it and prove that it works
 88      FOR cur1 IN (SELECT COLUMN_VALUE vendor_key
 89       FROM TABLE (vendor_key_table))
 90      LOOP
 91         mystr := mystr || ',' || cur1.vendor_key;
 92         -- /* based on the value of the sum, you can do something with each detail*/
 93         -- if v_dollars > 12 then
 94         --   UPDATE VENDOR SET paid_status = 'P' where vendor_key = cur1.vendor_key;
 95         -- end if;
 96      END LOOP;
 97  
 98  
 99      DBMS_OUTPUT.put_line (   'Purchace Order-> '
100       || TO_CHAR (v_purch_order)
101       || ' dollar total-> '
102       || TO_CHAR (v_dollars)
103       || ' vendorkey list-> '
104       || SUBSTR (mystr, 2));
105  
106  
107      -- loop throught the collection and build a string so that
108      -- we can display it and prove that it works
109      FOR cur2 IN (SELECT COLUMN_VALUE vendor_key
110       FROM TABLE (vendor_key_table2))
111      LOOP
112         mystr2 := mystr2 || ',' || cur2.vendor_key;
113      END LOOP;
114  
115  
116      DBMS_OUTPUT.put_line (   'Purchace Order-> '
117       || TO_CHAR (v_purch_order2)
118       || ' dollar total-> '
119       || TO_CHAR (v_dollars2)
120       || ' vendorkey list-> '
121       || SUBSTR (mystr2, 2));
122  
123  
124   END LOOP;
125   CLOSE tst;
126   CLOSE tst2;
127  END;
128  /
not equal
Purchace Order-> 1   dollar total-> 11   vendorkey list-> 435235,123452
Purchace Order-> 1   dollar total-> 3   vendorkey list-> 435235
equal
Purchace Order-> 2   dollar total-> 16   vendorkey list-> 433738,387118,383738
Purchace Order-> 2   dollar total-> 16   vendorkey list-> 383738,387118,433738

PL/SQL procedure successfully completed.

SQL> 
</span></pre><br />
Comparing the collections rather than looping through each table makes the work much easier to complete.  Notice we only needed one type created; the same type satisfied the conditions for both collection tables.<br />
<br />
The next example shows how things can go astray with the bulk collect operation when the limit does not evenly divide the result set.  In the first part of the example we use the well-known 'exit when cursor%notfound;' directive with less than stellar results (we miss inserting 5 records into the second table); the second part of the example shows how to properly implement an exit from a bulk collect operation; this one uses a varray:<br />
<br />
<pre><span style="color:#3333ff;"> 
SQL> 
SQL> set echo on linesize 150 trimspool on
SQL> 
SQL> create table emp_test as select * From emp where 0=1;

Table created.

SQL> 
SQL> declare
  2        type empcoltyp is table of emp%rowtype;
  3        emp_c empcoltyp;
  4  
  5        cursor get_emp_data is
  6        select * from emp;
  7  
  8  begin
  9        open get_emp_data;
 10        loop
 11        fetch get_emp_data bulk collect into emp_c limit 9;
 12        exit when get_emp_data%notfound;
 13  
 14        for i in 1..emp_c.count loop
 15         insert into emp_test (empno, ename, sal)
 16         values (emp_c(i).empno, emp_c(i).ename, emp_c(i).sal);
 17        end loop;
 18  
 19        end loop;
 20  
 21        commit;
 22  
 23  end;
 24  /

PL/SQL procedure successfully completed.

SQL> 
SQL> select * from emp_test;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH                                            800
      7499 ALLEN                                           1600
      7521 WARD                                            1250
      7566 JONES                                           2975
      7654 MARTIN                                          1250
      7698 BLAKE                                           2850
      7782 CLARK                                           2450
      7788 SCOTT                                           3000
      7839 KING                                            5000

9 rows selected.

SQL> 
SQL> truncate table emp_test;

Table truncated.

SQL> 
SQL> declare
  2        type empcoltyp is table of emp%rowtype;
  3        emp_c empcoltyp;
  4  
  5        cursor get_emp_data is
  6        select * from emp;
  7  
  8  begin
  9        open get_emp_data;
 10        loop
 11        fetch get_emp_data bulk collect into emp_c limit 9;
 12        exit when emp_c.count = 0;
 13  
 14        for i in 1..emp_c.count loop
 15         insert into emp_test (empno, ename, sal)
 16         values (emp_c(i).empno, emp_c(i).ename, emp_c(i).sal);
 17        end loop;
 18  
 19        end loop;
 20  
 21        commit;
 22  
 23  end;
 24  /

PL/SQL procedure successfully completed.

SQL> 
SQL> select * from emp_test;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH                                            800
      7499 ALLEN                                           1600
      7521 WARD                                            1250
      7566 JONES                                           2975
      7654 MARTIN                                          1250
      7698 BLAKE                                           2850
      7782 CLARK                                           2450
      7788 SCOTT                                           3000
      7839 KING                                            5000
      7844 TURNER                                          1500
      7876 ADAMS                                           1100

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7900 JAMES                                            950
      7902 FORD                                            3000
      7934 MILLER                                          1300

14 rows selected.

SQL> 
</span></pre><br />
What happened in the first part?  Since the limit was more than the number of remaining records the NOTFOUND indicator was set at the end of the fetch.  We had 5 records left to process in the varray but the 'exit when cursor%notfound;' statement terminated the loop BEFORE we could get the remainng 5 records inserted into our table, thus they were lost.  Using the 'exit when collection.count = 0;' construct prevents us from missing records since the count was greater than 0 even when the NOTFOUND indicator was set.  This allows us to process the remaining records in the varray before exiting the loop.  [Yes, the exit could be coded at the end of the loop rather than the beginning and the 'exit when cursor%NOTFOUND;' would process the remaing records but that, to me, defeats the purpose of the conditional exit.  As I see it we want to exit the loop when no more work is to be done, not look for partial sets of data to apply then exit before the next (unsuccessful) fetch.]<br />
<br />
Our next example does two things: loads data using bulk collect into a varray then uses the FORALL loop construct to quickly process the collection and insert the data into a staging table.  The second part is a bit contrived as it uses a collection to  process deletes from a table -- deletes that could have easily been executed with a single SQL statement -- but it does show the power of using collections and varrays:<br />
<br />
<pre><span style="color:#3333ff;">
SQL> 
SQL> set echo on timing on
SQL> 
SQL> create table stage_data(
  2        uname varchar2(30),
  3        ujob varchar2(20),
  4        usal number
  5  );

Table created.

SQL> 
SQL> begin
  2        for i in 1..1000000 loop
  3        insert into stage_data
  4        values ('Blorp'||i, 'Job'||i, 1200*(mod(i,3)));
  5        end loop;
  6  
  7        commit;
  8  
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL> 
SQL> 
SQL> create table forall_load(
  2        uname varchar2(30),
  3        ujob varchar2(20),
  4        usal number
  5  );

Table created.

SQL> 
SQL> create table forall_load2(
  2        uname varchar2(30),
  3        ujob varchar2(20),
  4        usal number
  5  );

Table created.

SQL> 
SQL> CREATE OR REPLACE PROCEDURE fast_way IS
  2  
  3  TYPE myarray IS TABLE OF stage_data%ROWTYPE;
  4  l_data myarray;
  5  
  6  CURSOR r IS
  7  SELECT *
  8  FROM stage_data;
  9  
 10  BEGIN
 11   OPEN r;
 12   LOOP
 13     FETCH r BULK COLLECT INTO l_data LIMIT 1000;
 14  
 15     FORALL i IN 1..l_data.COUNT
 16        INSERT INTO forall_load VALUES l_data(i);
 17     FORALL i IN 1..l_data.COUNT
 18        INSERT INTO forall_load2 VALUES l_data(i);
 19  
 20     EXIT WHEN l_data.count=0;
 21    END LOOP;
 22    COMMIT;
 23    CLOSE r;
 24  END fast_way;
 25  /

Procedure created.

SQL> 
SQL> exec fast_way;

PL/SQL procedure successfully completed.

SQL> 
SQL> select * from forall_load where uname like '%99999%';

UNAME                          UJOB                       USAL
------------------------------ -------------------- ----------
Blorp99999                     Job99999                      0
Blorp199999                    Job199999                  1200
Blorp299999                    Job299999                  2400
Blorp399999                    Job399999                     0
Blorp499999                    Job499999                  1200
Blorp599999                    Job599999                  2400
Blorp699999                    Job699999                     0
Blorp799999                    Job799999                  1200
Blorp899999                    Job899999                  2400
Blorp999990                    Job999990                     0
Blorp999991                    Job999991                  1200

UNAME                          UJOB                       USAL
------------------------------ -------------------- ----------
Blorp999992                    Job999992                  2400
Blorp999993                    Job999993                     0
Blorp999994                    Job999994                  1200
Blorp999995                    Job999995                  2400
Blorp999996                    Job999996                     0
Blorp999997                    Job999997                  1200
Blorp999998                    Job999998                  2400
Blorp999999                    Job999999                     0

19 rows selected.

SQL> select * from forall_load2 where uname like '%99999%';

UNAME                          UJOB                       USAL
------------------------------ -------------------- ----------
Blorp99999                     Job99999                      0
Blorp199999                    Job199999                  1200
Blorp299999                    Job299999                  2400
Blorp399999                    Job399999                     0
Blorp499999                    Job499999                  1200
Blorp599999                    Job599999                  2400
Blorp699999                    Job699999                     0
Blorp799999                    Job799999                  1200
Blorp899999                    Job899999                  2400
Blorp999990                    Job999990                     0
Blorp999991                    Job999991                  1200

UNAME                          UJOB                       USAL
------------------------------ -------------------- ----------
Blorp999992                    Job999992                  2400
Blorp999993                    Job999993                     0
Blorp999994                    Job999994                  1200
Blorp999995                    Job999995                  2400
Blorp999996                    Job999996                     0
Blorp999997                    Job999997                  1200
Blorp999998                    Job999998                  2400
Blorp999999                    Job999999                     0

19 rows selected.

SQL> 
</span></pre><br />
Trust me that the data loads took very little time to process.  Here is the contrived part, but it is still a good example of the power of using collections:<br />
<br />
<pre><span style="color:#3333ff;">
SQL> CREATE OR REPLACE PROCEDURE del_rows IS
  2  
  3  TYPE myarray IS TABLE OF stage_data.uname%TYPE;
  4  l_data myarray;
  5  
  6  CURSOR r IS
  7  SELECT uname
  8  FROM stage_data
  9  where uname like '%9999%';
 10  
 11  BEGIN
 12   OPEN r;
 13   LOOP
 14     FETCH r BULK COLLECT INTO l_data LIMIT 1000;
 15  
 16     FORALL i IN 1..l_data.COUNT
 17        delete from forall_load where uname = l_data(i);
 18     FORALL i IN 1..l_data.COUNT
 19        delete from forall_load2 where uname = l_data(i);
 20  
 21     EXIT WHEN l_data.count=0;
 22    END LOOP;
 23    COMMIT;
 24    CLOSE r;
 25  END del_rows;
 26  /

Procedure created.

SQL> 
SQL> show errors
No errors.
SQL> 
SQL> exec del_rows;

PL/SQL procedure successfully completed.

SQL> 
SQL> select * from forall_load where uname like '%99999%';

no rows selected

SQL> select * from forall_load2 where uname like '%99999%';

no rows selected

SQL> 
</span></pre><br />
Collections can be a real timesaver for bulk processng of data; they may not be applicable in every sitution but when the conditions are right they can make your job so much easier.  Master collections and varrays and you may be able to amaze your friends.<br />
<br />
Collections, anyone?<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28935478-7907386764933314772?l=oratips-ddf.blogspot.com' alt='' /></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blogspot/oratips?a=jbjgdazDlhk:qotWMxpl2Ag:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blogspot/oratips?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blogspot/oratips?a=jbjgdazDlhk:qotWMxpl2Ag:63t7Ie-LG7Y"><img src="http://feeds.feedburner.com/~ff/blogspot/oratips?d=63t7Ie-LG7Y" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/jbjgdazDlhk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://oratips-ddf.blogspot.com/feeds/7907386764933314772/comments/default</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://oratips-ddf.blogspot.com/2012/02/collecting-thoughts.html</feedburner:origLink></item>
		<item>
		<title>Jason Jarrett Presentation</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/FGeacksbPbk/</link>
		<comments>http://softwaredevelopersgroup.com/2012/02/jason-jarrett-presentation/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 22:55:29 +0000</pubDate>
		<dc:creator>NNSDG</dc:creator>
				<category><![CDATA[Blogs]]></category>

		<guid isPermaLink="false">http://softwaredevelopersgroup.com/?p=1002</guid>
		<description><![CDATA[Thanks to Jason Jarrett for his presentation on S.O.L.I.D principles.  You can view the syndication of his posts on his site or right here on the NNSDG site.]]></description>
			<content:encoded><![CDATA[<p>Thanks to <a href="http://staxmanade.blogspot.com/">Jason Jarrett</a> for his presentation on S.O.L.I.D principles.  You can view the syndication of his posts on his site or right here on the NNSDG site.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/FGeacksbPbk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://softwaredevelopersgroup.com/2012/02/jason-jarrett-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://softwaredevelopersgroup.com/2012/02/jason-jarrett-presentation/</feedburner:origLink></item>
		<item>
		<title>NuGet Project Uncovered: SpecificationExtensions.[MSTest | NUnit | Xunit]</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/LfJpcP7y5c0/</link>
		<comments>http://elegantcode.com/2012/02/22/nuget-project-uncovered-specificationextensions-mstest-nunit-xunit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-specificationextensions-mstest-nunit-xunit#comments</comments>
		<pubDate>Thu, 23 Feb 2012 05:05:00 +0000</pubDate>
		<dc:creator>Jason Jarrett</dc:creator>
				<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2012/02/22/nuget-project-uncovered-specificationextensions-mstest-nunit-xunit/</guid>
		<description><![CDATA[If you are coming to this series of posts for the first time you might check out my introductory post for a little context. NOTE: this project is one I created and as it turns out this has now become it’s introductory post. The SpecificationExtensions.[MSTest &#124; NUnit &#124; Xunit] are a set of NuGet packages [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>If you are coming to this series of posts for the first time you might check out <a href="http://elegantcode.com/2012/01/22/nuget-project-uncovered-an-introduction-to-the-series/" >my introductory post</a> for a little context.</p>
</blockquote>
<blockquote><p>NOTE: this project is one I created and as it turns out this has now become it’s introductory post.</p>
</blockquote>
<p>The SpecificationExtensions.[MSTest | NUnit | Xunit] are a set of NuGet packages that add C# <a href="http://staxmanade.blogspot.com/2009/02/fluent-specification-extensions.html" >fluent specification extensions</a> to your test project. I first blogged about this in early 2009 and have had a set of these that I take with me for every project I work on.</p>
<p>There are a number of other options out there for specification extensions, but since I first created my original set, I haven’t used anything else (although I should as I might be able to learn a little from each).</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb10_thumb1.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb10_thumb" border="0" alt="image_thumb10_thumb" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb10_thumb_thumb.png" width="339" height="202" /></a></p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/LfJpcP7y5c0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2012/02/22/nuget-project-uncovered-specificationextensions-mstest-nunit-xunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://elegantcode.com/2012/02/22/nuget-project-uncovered-specificationextensions-mstest-nunit-xunit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-specificationextensions-mstest-nunit-xunit</feedburner:origLink></item>
		<item>
		<title>NuGet Project Uncovered: EventAggregator.Net</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/Xu0dZUPAKQ0/</link>
		<comments>http://elegantcode.com/2012/02/21/nuget-project-uncovered-eventaggregator-net/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-eventaggregator-net#comments</comments>
		<pubDate>Wed, 22 Feb 2012 05:04:00 +0000</pubDate>
		<dc:creator>Jason Jarrett</dc:creator>
				<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2012/02/21/nuget-project-uncovered-eventaggregator-net/</guid>
		<description><![CDATA[If you are coming to this series of posts for the first time you might check out my introductory post for a little context. NOTE: this project is one I created and as it turns out this has now become it’s introductory post. EventAggregator.Net is a single C# file that can provide a basis for [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>If you are coming to this series of posts for the first time you might check out <a href="http://elegantcode.com/2012/01/22/nuget-project-uncovered-an-introduction-to-the-series/" >my introductory post</a> for a little context.</p>
</blockquote>
<blockquote><p>NOTE: this project is one I created and as it turns out this has now become it’s introductory post.</p>
</blockquote>
<p><a href="http://nuget.org/packages/EventAggregator.Net" >EventAggregator.Net</a> is a single C# file that can provide a basis for a simple in memory Pub/Sub event aggregator.</p>
<p>I extracted this out of my <a href="http://statlight.codeplex.com" >StatLight</a> project as I found that I often wanted a similar one and kept finding myself copy/pasting this into projects. I figured a single location for this project would be better and I use StatLight as the first dog bowl when I need to dog food the project.</p>
<p>If you’re familiar with the…</p>
<blockquote><p>Install-Package Caliburn.Micro.EventAggregator      </p>
</blockquote>
<p>…then you know probably know what this project is like. </p>
<p>Its history starts a few years ago when I read <a href="http://jeremydmiller.com/" >Jeremey Miller’s</a> Braindump on <a href="http://codebetter.com/jeremymiller/2009/07/22/braindump-on-the-event-aggregator-pattern/" >Event Aggregator Pattern</a> and decided I wanted rip out StatLight’s usage of the Prism event aggregator and replace it with a similar one to the one found in StoryTeller. It’s gone through quite a few revisions inside of StatLight since then and eventually made its way into its own project.</p>
<p>Some thanks have to go out to the great feedback and pull requests from <a href="https://github.com/JakeGinnivan" >Jake Ginnivan</a> who found this project on his own (before I publicized it).</p>
<p>If you’re interested in using it, I’d recommend checking out the source’s test project and the SampleUsage project. The SampleUsage project demonstrates how you can configure the tool to publish events in an async mode.</p>
<p>One concept introduced in this EventAggregator is taking the IEventAggregator interface and breaking it up into two interfaces (<strong>IEventPublisher</strong> and <strong>IEventSubscriptionManager</strong>). This proved extremely useful when trying to diagnose components that did both aggregator subscription management vs ones that only published events. It even helped to easily diagnose components that did not correctly unregister objects.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/Xu0dZUPAKQ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2012/02/21/nuget-project-uncovered-eventaggregator-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://elegantcode.com/2012/02/21/nuget-project-uncovered-eventaggregator-net/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-eventaggregator-net</feedburner:origLink></item>
		<item>
		<title>NuGet Project Uncovered: DumpToText</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/RqLgVxNq60g/</link>
		<comments>http://elegantcode.com/2012/02/20/nuget-project-uncovered-dumptotext/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-dumptotext#comments</comments>
		<pubDate>Tue, 21 Feb 2012 05:01:00 +0000</pubDate>
		<dc:creator>Jason Jarrett</dc:creator>
				<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2012/02/20/nuget-project-uncovered-dumptotext/</guid>
		<description><![CDATA[If you are coming to this series of posts for the first time you might check out my introductory post for a little context. NOTE: this project is one I created and as it turns out this has now become its introductory post. DumpToText is a single C# extension I wrote a little while back. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>If you are coming to this series of posts for the first time you might check out <a href="http://elegantcode.com/2012/01/22/nuget-project-uncovered-an-introduction-to-the-series/" >my introductory post</a> for a little context.</p>
</blockquote>
<blockquote><p>NOTE: this project is one I created and as it turns out this has now become its introductory post.</p>
</blockquote>
<p><a href="http://nuget.org/packages/DumpToText" >DumpToText</a> is a single C# extension I wrote a little while back. The inspiration from this came from the need to view the values of an object graph quickly and easily during a TDD session.</p>
<p>Have you ever been doing TDD and something isn’t working quite as expected? Would it be nice to just dump out the values of an object quickly without having to spin up the debugger?</p>
<p>The inspiration for this project came from an amazing feature of <a href="http://www.linqpad.net/" >LINQPad</a>. If you have ever used <a href="http://www.linqpad.net/" >LINQPad</a> then you’re aware of the amazing ability for it to take any object and create a view of it’s data. Take the simple anonymous type below.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb2_thumb.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb2_thumb" border="0" alt="image_thumb2_thumb" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb2_thumb_thumb.png" width="471" height="315" /></a></p>
<p>Now wouldn’t it be great to have that “.Dump()” extension method at hand anywhere in your code and during a TDD session?</p>
<p>That’s why I create <a href="https://github.com/staxmanade/DumpToText" >DumpToText</a>.</p>
<p>Now if I have a test as follows and want to see it’s data. I can use the ‘.DumpToText()” extension method to have it print out an ASCII based representation of the object graph.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb4_thumb.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb4_thumb" border="0" alt="image_thumb4_thumb" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb4_thumb_thumb.png" width="323" height="178" /></a></p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb6_thumb.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb6_thumb" border="0" alt="image_thumb6_thumb" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb6_thumb_thumb.png" width="390" height="156" /></a></p>
<p>By default this just uses the System.Diagnostics.Trace(…) to write the output to, but you can override the “write” implementation by giving your own delegate as shown below.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb8_thumb.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb8_thumb" border="0" alt="image_thumb8_thumb" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb8_thumb_thumb.png" width="871" height="52" /></a></p>
<p>The below shows an example of a nested object that also has an array of items.</p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb14_thumb.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb14_thumb" border="0" alt="image_thumb14_thumb" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb14_thumb_thumb.png" width="264" height="171" /></a></p>
<p><a href="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb13_thumb1.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image_thumb13_thumb1" border="0" alt="image_thumb13_thumb1" src="http://elegantcode.com/wp-content/uploads/2012/01/image_thumb13_thumb1_thumb.png" width="573" height="349" /></a></p>
<h5>Anyone out there using <a href="http://approvaltests.sourceforge.net/" >ApprovalTests</a>? (You can get it on NuGet)</h5>
<p>I’ve not taken the chance to use ApprovalTests yet in a project, but I have a strong feeling that my DumpToText helper could be very useful when leveraged in conjunction with ApprovalTests. If anyone out there is using ApprovalTests, I’d love to hear how it’s going, and if you think that DumpToText would be useful there.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/RqLgVxNq60g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2012/02/20/nuget-project-uncovered-dumptotext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://elegantcode.com/2012/02/20/nuget-project-uncovered-dumptotext/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-dumptotext</feedburner:origLink></item>
		<item>
		<title>NuGet Project Uncovered: Nancy</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/lDaIBigcTC8/</link>
		<comments>http://elegantcode.com/2012/02/19/nuget-project-uncovered-nancy/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-nancy#comments</comments>
		<pubDate>Mon, 20 Feb 2012 04:59:00 +0000</pubDate>
		<dc:creator>Jason Jarrett</dc:creator>
				<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2012/02/19/nuget-project-uncovered-nancy/</guid>
		<description><![CDATA[If you are coming to this series of posts for the first time you might check out my introductory post for a little context. Nancy is another project founded by an elegant coder. Andreas has blogged about it a number of times here on ElegantCode. Nancy is a lightweight HTTP framework for building web services [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>If you are coming to this series of posts for the first time you might check out <a href="http://elegantcode.com/2012/01/22/nuget-project-uncovered-an-introduction-to-the-series/" >my introductory post</a> for a little context.</p>
</blockquote>
<p><a href="http://nuget.org/packages/Nancy" >Nancy</a> is another project founded by an elegant coder. <a href="http://elegantcode.com/about/andreas-hakansson/" >Andreas</a> has blogged about it a <a href="http://bit.ly/xIlUmy" >number of times here</a> on ElegantCode. </p>
<blockquote><p>Nancy is a lightweight HTTP framework for building web services and sites. The framework runs on both the .net framework and <a href="http://mono-project.com/">Mono</a>.</p>
</blockquote>
<p>I have not used this project myself, but as I started to look it over I think I might have to spin up a site quickly just to try it out.</p>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/lDaIBigcTC8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2012/02/19/nuget-project-uncovered-nancy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://elegantcode.com/2012/02/19/nuget-project-uncovered-nancy/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-nancy</feedburner:origLink></item>
		<item>
		<title>NuGet Project Uncovered: Extended.Wpf.Toolkit</title>
		<link>http://feedproxy.google.com/~r/NorthernNevadaSoftwareDevelopersGroup/~3/SQGEES4QBVE/</link>
		<comments>http://elegantcode.com/2012/02/18/nuget-project-uncovered-extended-wpf-toolkit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-extended-wpf-toolkit#comments</comments>
		<pubDate>Sun, 19 Feb 2012 04:58:00 +0000</pubDate>
		<dc:creator>Jason Jarrett</dc:creator>
				<category><![CDATA[NuGet]]></category>

		<guid isPermaLink="false">http://elegantcode.com/2012/02/18/nuget-project-uncovered-extended-wpf-toolkit/</guid>
		<description><![CDATA[If you are coming to this series of posts for the first time you might check out my introductory post for a little context. Extended.Wpf.Toolkit is a project that should not need an introduction, and if you follow this blog you’ve probably heard Brian talk about it. If not, check out some of the posts [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>If you are coming to this series of posts for the first time you might check out <a href="http://elegantcode.com/2012/01/22/nuget-project-uncovered-an-introduction-to-the-series/" >my introductory post</a> for a little context.</p>
</blockquote>
<p><a href="http://nuget.org/packages/Extended.Wpf.Toolkit" >Extended.Wpf.Toolkit</a> is a project that should not need an introduction, and if you follow this blog you’ve probably heard <a href="http://elegantcode.com/about/brian-lagunas/" >Brian</a> talk about it. If not, check out some of the posts on the <a href="http://bit.ly/yV7cma" >Extended WPF Toolkit! </a></p>
<p>This project is one of the most download on codeplex, discussed on <a href="http://channel9.msdn.com" >Channel9</a>, Coding4Fun, and is being leveraged by <a href="http://www.telerik.com" >Telerik</a> in their <a href="http://www.telerik.com/products/orm.aspx" >Open Access ORM</a> product.</p>
<h5>Below is a sample of some of the controls you can find in the toolkit:    <br />(but make sure you check out the <a href="http://wpftoolkit.codeplex.com/" >project site</a> for the full list of controls)</h5>
<ul>
<li>BusyIndicator </li>
<li>Calculator </li>
<li>ChildWindow </li>
<li>ColorCanvas </li>
<li>ColorPicker </li>
<li>DateTimePicker </li>
<li>Magnifier </li>
<li>MultiLineTextEditor </li>
<li>PrimitiveTypeCollectionEditor </li>
<li>RichTextBox </li>
<li>SplitButton </li>
<li>WatermarkTextBox </li>
<li>Wizard </li>
</ul>
<img src="http://feeds.feedburner.com/~r/NorthernNevadaSoftwareDevelopersGroup/~4/SQGEES4QBVE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://elegantcode.com/2012/02/18/nuget-project-uncovered-extended-wpf-toolkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://elegantcode.com/2012/02/18/nuget-project-uncovered-extended-wpf-toolkit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nuget-project-uncovered-extended-wpf-toolkit</feedburner:origLink></item>
	</channel>
</rss>

