<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13877533</id><updated>2011-07-28T05:53:53.374-07:00</updated><title type='text'>Naboo</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13877533.post-5939501127846961187</id><published>2011-04-21T22:27:00.000-07:00</published><updated>2011-04-21T22:28:01.666-07:00</updated><title type='text'></title><content type='html'>&lt;u&gt;&lt;b&gt;Java Pitfall: pass by value? by reference?&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;I ran into this pitfall trying to print out all valid combinations of n pair of parenthesis. The recursive code I wrote was pretty straightforward:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f3f3f3;"&gt;public static void recurPrint(int l, int r, String str) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; if (l==0 &amp;amp;&amp;amp; r==0) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(str); &lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(l&amp;gt;0) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; str+='(';&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&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; recurPrint(l-1, r, str);&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (r&amp;gt;0) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; str+=')';&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recurPrint(l, r-1, str);&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;}&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;public static void main(String[] args) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp; recurPrint(2,2,""); &lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;}&lt;/div&gt;&lt;br /&gt;However, instead of giving me "()(), (())", it keeps giving me "(()), (()()". l and r seems to behave just the way I want during recursion, so it's gotta be the only other parameter that's screwing up the recursion: str. It indeed is.&lt;br /&gt;&lt;br /&gt;Correct code:&lt;br /&gt;&lt;div style="background-color: #f3f3f3;"&gt;public static void recurPrint(int l, int r, String str) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; if (l==0 &amp;amp;&amp;amp; r==0) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println(str); &lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(l&amp;gt;0) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strike&gt;str+='(';&lt;/strike&gt;&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&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; recurPrint(l-1, r, &lt;strike&gt;str&lt;/strike&gt; &lt;span style="background-color: yellow;"&gt;str+'('&lt;/span&gt;);&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (r&amp;gt;0) {&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strike&gt;str+=')';&lt;/strike&gt;&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recurPrint(l, r-1, &lt;strike&gt;str&lt;/strike&gt; &lt;span style="background-color: yellow;"&gt;str+')'&lt;/span&gt;);&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div style="background-color: #f3f3f3;"&gt;}&lt;/div&gt;&lt;br /&gt;Make the code work is easy. Understand what's happening here takes a little more effort. &lt;br /&gt;Back to Java 101:&lt;br /&gt;All strings are instances of String class. Java  pass by value for primitive types and reference for objects.&lt;br /&gt;&lt;br /&gt;The incorrect "(()()" is caused by Java passing by reference, while str still possess the "((" value from last recursion. My brain tends to go nuts trying to imagine full recursion cycles, and using reference during recursion is only gonna make it worse. Therefore, always try pass by value for recursion.&lt;br /&gt;&lt;br /&gt;BTW: Strings are constants. All strings are initialized at create time and can't be changed afterwards. When we do str += ')', what's happening behind the scene is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a string buffer is created.&lt;/li&gt;&lt;li&gt;content of str is copied to string buffer&lt;/li&gt;&lt;li&gt;string buffer is appended with ')'&lt;/li&gt;&lt;li&gt;new memory chunk is allocated and copied with content of string buffer&lt;/li&gt;&lt;li&gt;str is assigned with the new memory chunk reference.&lt;/li&gt;&lt;/ul&gt;So if you have a loop that's doing this += a lot, try create a StringBuffer outside the loop and do these += with the StringBuffer inside the loop. It'll save you a lot of object creation and destruction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-5939501127846961187?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/5939501127846961187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=5939501127846961187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/5939501127846961187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/5939501127846961187'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2011/04/java-pitfall-pass-by-value-by-reference.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-7378723696701657826</id><published>2011-04-20T12:26:00.000-07:00</published><updated>2011-04-20T12:26:54.437-07:00</updated><title type='text'></title><content type='html'>&lt;u&gt;&lt;b&gt;A Different Thinking Process for "Count the number of two's from 1 to n"&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Careercup-150 solves this problem by this approach:&lt;br /&gt;Pattern: 0-10: 1 2s; 0-100: 20 2s; 0-1000: 300 2s; between 0 and 10^n, there are n*(10^n-1) 2s. Let f(n)=n*(10^n-1), we have: between 0 and x*10^n, number of 2s becomes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;x&amp;gt;2&amp;nbsp; -- x*f(n) + 10^(n-1)&lt;/li&gt;&lt;li&gt;x=2&amp;nbsp; -- x*f(n) + 1&lt;/li&gt;&lt;li&gt;x&amp;lt;2 -- f(n-1)&lt;/li&gt;&lt;/ul&gt;For 2145, we have to consider these 4 intervals: 1-2000, 2000-2099, 2100-2139, 2140-2145. Pattern solves counting in intervals starting from 0 or 1, I am too dumb to see how this split is going to use the pattern. Surprisingly, code in the book seems to be exactly same as mine, which indicates that my thinking process should be correct. Hence the elaboration below:&lt;br /&gt;&lt;br /&gt;Think of the problem as your car pedometer, the numbers roll up, over and push the next column. Patter: every 10 miles, the digit for 2 rolls once; Every 100 miles, the 10's digit rolls 2 10 times; Every 1000, the 3rd digit rolls 2 100 times. Take the number 2145, starting from 5 as p0 slot, we have p3p2p1p0 four slots. Number of 2's occurred for each slot would be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;p0&lt;/b&gt;: (214+1)*1 &amp;nbsp; //pedometer slot 0 was rolled from 0-9 214 times, plus 1 to reach 5&lt;/li&gt;&lt;li&gt;&lt;b&gt;p1&lt;/b&gt;: (21+1)*10&amp;nbsp; //pedometer slot 1 was in 2 position for 22 times, which includes rolling 0-9 for 21 times, and 1 time before it reaches 4&lt;/li&gt;&lt;li&gt;&lt;b&gt;p2&lt;/b&gt;: 2*100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //pedometer slot 2 was rolled from 0-9 2 times, i.e., 200-299, and 1200-1299.&lt;/li&gt;&lt;li&gt;&lt;b&gt;p3&lt;/b&gt;: 146 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //bcoz p3=2 and p3 is the highest slot, this slot has stayed at 2 from 2000 for 146 times.&lt;/li&gt;&lt;/ul&gt;In a nutshell: First look at left slot to calculate how many "full roll" current has gone through, multiple it by 10^(slotPosition-1). Then, depending on whether current slot is &amp;lt;2, 2 or &amp;gt;2, do corresponding calculation.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Code(shorter than Careercup hooray!) &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;public static int CountTow(int n) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sum = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int temp = n;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int base = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(temp&amp;gt;10) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; sum += base * temp/10 + (temp%10&amp;gt;1? 1:0);&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; temp = temp/10;&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; base*=10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (temp==2) {&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; sum += (n-2*base+1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(temp &amp;gt;2) {&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; sum += base;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sum;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Unitest&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;CountTow(-1)&amp;nbsp;&amp;nbsp; - 0&lt;br /&gt;CountTow(0)&amp;nbsp;&amp;nbsp;&amp;nbsp; - 0&lt;br /&gt;CountTow(1)&amp;nbsp;&amp;nbsp;&amp;nbsp; - 0&lt;br /&gt;CountTow(2)&amp;nbsp;&amp;nbsp;&amp;nbsp; - 1&lt;br /&gt;CountTow(12)&amp;nbsp; - 2&lt;br /&gt;CountTow(20)&amp;nbsp; - 3 &lt;br /&gt;CountTow(29)&amp;nbsp; - 13&lt;br /&gt;CountTow(100) -20&lt;br /&gt;CountTow(1000)&amp;nbsp; -300&lt;br /&gt;CountTow(2145) &amp;nbsp; -786&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-7378723696701657826?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/7378723696701657826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=7378723696701657826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/7378723696701657826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/7378723696701657826'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2011/04/different-thinking-process-for-count.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-4030580628496518038</id><published>2011-04-07T21:47:00.000-07:00</published><updated>2011-04-07T21:47:33.408-07:00</updated><title type='text'></title><content type='html'>&lt;u&gt;&lt;b&gt;Checklist for Commodity Java Programmer&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Commodity Java programmer is in general a sad thing to be. However, same as the fact that good anything is hard to find, a full blown Java programmer with all the right armor is scarce too. At a time hiring is finally heating up again, be, or at least appear to be a good Java programmer will come in handy. Hence the checklist.&lt;br /&gt;&lt;br /&gt;First of all, think about what companies hire Java programmers for. &lt;br /&gt;Hardcore infrastructure ground zero? Rarely. They should already been built for most cases unless it's a pre-startup bunch of people with just an idea and at most seed money. &lt;br /&gt;Data processing for specific areas like video, cognitive, mechanics, games etc? Rarely. Those are C family dominated areas with heavy stress on embedded possibilities.&lt;br /&gt;Java programmers are pretty much left with the highly abstract, application level development, the most common among e-commerce, web services and (high-level) automation tools. Basically business logic heavy performance sensitive scalability essentially relatively not-sexy but revenue visible part of the software.&lt;br /&gt;&lt;br /&gt;With this in mind, here comes the skill-set checklist:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Algorithm - pre-requisite for any decent programmer.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Patterns - these are the building blocks. Should be able to slam out code for most of them.&lt;/li&gt;&lt;li&gt;SQL - complicated queries, performance, stored procedure, schema design.&lt;/li&gt;&lt;li&gt;Ajax - a deep understanding of what happens behind the scene gains you insight into all platforms.&lt;/li&gt;&lt;li&gt; I18n &amp;amp; l10n - get yourself familiar with unicode, utf-8&lt;/li&gt;&lt;li&gt;Cloud &amp;amp; cluster - distributed systems, ways they talk, and key elements in each of the communication categories.&lt;/li&gt;&lt;li&gt;Security - encryption, protocol, standard and elevated practices for identity control of web apps&lt;/li&gt;&lt;li&gt;VM, garbage collection, strong/weak reference, lazy loading, aka the Java specifics in and out.&lt;/li&gt;&lt;li&gt;Testing - code coverage, path coverage, security test, stress test, regression. Spend 2h familiarize yourself with the concepts.&lt;/li&gt;&lt;li&gt;Your resume - any question on your resume is fair question. Try to remember your projects.&lt;/li&gt;&lt;/ul&gt;With the right amount of domain knowledge, one with decent insight into all the above areas would make a very strong candidate. If he/she knows scripting, then it's a must-hire, and it's a sweet spot for a commodity Java programmer to be =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-4030580628496518038?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/4030580628496518038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=4030580628496518038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/4030580628496518038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/4030580628496518038'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2011/04/checklist-for-commodity-java-programmer.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-3383982650968203351</id><published>2009-01-14T13:11:00.000-08:00</published><updated>2009-01-14T13:14:12.596-08:00</updated><title type='text'></title><content type='html'>&lt;span style="font-size:130%;"&gt;(C#)Serialize image file into string&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To convert an image file to Base64 string, use the code below. It's also easy to modify it to return in other string formats.&lt;br /&gt;&lt;br /&gt;Image im = Image.FromFile(imagePath);&lt;br /&gt;MemoryStream ms = new MemoryStream();&lt;br /&gt;im.Save(ms, im.RawFormat);&lt;br /&gt;byte[] array = ms.ToArray();&lt;br /&gt;string result = Convert.ToBase64String(array);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-3383982650968203351?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/3383982650968203351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=3383982650968203351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/3383982650968203351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/3383982650968203351'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2009/01/cserialize-image-file-into-string-to.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-8323536095766164346</id><published>2008-10-20T21:00:00.000-07:00</published><updated>2009-01-14T13:20:09.145-08:00</updated><title type='text'></title><content type='html'>How to debug spring mvc application with tomcat? &lt;div&gt; &lt;/div&gt;&lt;div&gt;I found myself lost when I needed to debug into the simplest web service client code, which is behind Spring mvc. I have a web app up and running. Instead of the old-school way of finding glitches by gazing at it, e.g., a typo in buildproperties, or unmatching bean names between controller and viewer, we want to debug it. How to debug into your controller or deeper code?&lt;/div&gt;&lt;div&gt;I don't recommend turning on remote debugging from eclipse. It was a pain and never worked. What worked was adding a target to build.xml and tomcat-start-debug from build.xml dir. Detail look at&lt;/div&gt;&lt;div&gt;&lt;p style="MARGIN: 0px; FONT: 11px Monaco; COLOR: #000080"&gt;http://ptrthomas.wordpress.com/2006/03/25/how-to-start-and-stop-tomcat-from-ant/&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-8323536095766164346?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/8323536095766164346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=8323536095766164346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/8323536095766164346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/8323536095766164346'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2008/10/how-to-debug-spring-mvc-application.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-116614212960428830</id><published>2006-12-14T15:55:00.000-08:00</published><updated>2006-12-14T16:27:05.960-08:00</updated><title type='text'></title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Thread Safe Hashtable (C#)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;There are not a lot articles around about Hashtable thread safety, oh maybe yes, but blame google.&lt;br /&gt;&lt;br /&gt;Between thread-safe and thread-unsafe, there is something called "conditional thread-safe", which means each individual operation may be thread-safe, but certain sequences of operations may require external synchronization. The most common example of conditional thread safety is traversing an iterator returned from Hashtable or Vector(Java), or Collection(C#).&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;List&lt;string&gt; stringList = new List&lt;string&gt;();&lt;/em&gt;&lt;br /&gt;&lt;em&gt;stringList.Add("a");//pretty much synchronized&lt;/em&gt;&lt;br /&gt;&lt;em&gt;foreach(string s in stringList) &lt;/em&gt;&lt;br /&gt;&lt;em&gt;{&lt;/em&gt;&lt;br /&gt;&lt;em&gt;    Console.WriteLine(s); //not safe. Add is allowed to happen within the foreach loop&lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thus, if you do need loop the collection a lot while Add and Remove are also called frequently, you will get a lot "InvalidOperationException: Collection was modified, enumeration not allowed". The way to solve this will be to 2 steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Wrap the collection with another class implement thread-safety for it. &lt;/li&gt;&lt;li&gt;Whenever enumeration is needed, lock.&lt;/li&gt;&lt;/ol&gt;Example:&lt;br /&gt;&lt;strong&gt;Step 1:&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;public class ThreadSafeDictionary : Dictionary&lt;string,&gt;&lt;br /&gt;{&lt;br /&gt;      private object _syncRoot = new object();&lt;br /&gt;     public object SyncRoot()&lt;br /&gt;    {   return _syncRoot; }&lt;br /&gt;     public void SyncAdd(KeyFacetTuple key, ISet value)&lt;br /&gt;   { &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;        lock(_syncRoot)  { Add(key, value); }&lt;br /&gt;    }&lt;br /&gt;    public void SyncRemove(KeyFacetTuple key)&lt;br /&gt;   {&lt;br /&gt;       lock (_syncRoot) { Remove(key); }&lt;br /&gt;   }&lt;br /&gt;    public void SyncBatchRemove(ICollection removes)//To avoid too frequent locking/unlocking&lt;br /&gt;   {&lt;br /&gt;      lock (_syncRoot) { &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;            foreach (string key in removes) { Remove(key); }&lt;br /&gt;      }&lt;br /&gt;} }&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;&lt;br /&gt;put lock(threadSafeDictionary.SyncRoot) around any "foreach KeyValuePair" for this class&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;lock(threadSafeDictionary.SyncRoot) &lt;/em&gt;&lt;br /&gt;&lt;em&gt;{&lt;/em&gt;&lt;br /&gt;&lt;em&gt;    foreach(KeyValuePair&lt;string,string&gt; pair in threadSafeDictionary) &lt;/em&gt;&lt;br /&gt;&lt;em&gt;    {&lt;/em&gt;&lt;br /&gt;&lt;em&gt;     //do stuff&lt;/em&gt;&lt;br /&gt;&lt;em&gt;     }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Of course, this implementation only ensures the foreach loop won't encounter embarrasing moments, remember the elements in the threadSafeDictionary could be non-primitive data types and they are not locked. E.g. it can be an &lt;arraylist,&gt;dicationary, then you must be careful about what you want to do with ArrayList and ISet too.&lt;br /&gt;&lt;br /&gt;Another way for thinking about this whole problem is, can we implement a data structure so that it keeps track of the Enumerators. If there is any Enumerators alive, no Add/Remove can be executed. Whether this thought is worthwhile depends on performance: using SyncRoot VS. tracking Enumerators, which one consumes less resource?&lt;br /&gt;&lt;br /&gt;I am also planning to write up an interface for thread-safe data structure built on conditional-thread-safe data structure. Will update this entry when I am done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-116614212960428830?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/116614212960428830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=116614212960428830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/116614212960428830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/116614212960428830'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2006/12/thread-safe-hashtable-c-there-are-not.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-114559782400363921</id><published>2006-04-20T22:30:00.000-07:00</published><updated>2006-04-20T22:37:04.016-07:00</updated><title type='text'></title><content type='html'>&lt;strong&gt;How to Deploy Project from Dev Machine to UT Machine&lt;/strong&gt;&lt;br /&gt;This article is written for TGP lobbyist and campaign consulting project, which developes on EBB, and deployes to WEBTOP.&lt;br /&gt;&lt;br /&gt;1. On EBB,  check in solution in VS.NET&lt;br /&gt;2. From BAY, on which dev database is running, duplicate database to Webtop(refer to previous article)&lt;br /&gt;3. On Webtop, open VS.NET, create a new project with exactly same name as the project to be deployed. If it says 404 error on not being able to locate source on xxxx/Techonrati/xxxxx folder, select the option of creating folder on different location, and delete the Technorati in the path.&lt;br /&gt;4. After creating new project, go to File-&gt;Source Control-&gt;Change Source Control, connect to VSS on BAY and bind.&lt;br /&gt;5. Browse to the new project on VSS, open from there. It will warn you there is conflict. Say ok to everything.&lt;br /&gt;6. Do a "Get latest(recursive)", till you see all good files loaded from VSS.&lt;br /&gt;7. Exclude Web.config from VSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-114559782400363921?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/114559782400363921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=114559782400363921' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/114559782400363921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/114559782400363921'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2006/04/how-to-deploy-project-from-dev-machine.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-113372932158424802</id><published>2005-12-04T12:30:00.000-08:00</published><updated>2005-12-04T12:48:41.636-08:00</updated><title type='text'></title><content type='html'>&lt;span style="font-size:130%;"&gt;How to duplicate a database in SQL Server 2003 on another machine.&lt;/span&gt;&lt;br /&gt;Suppose you have database on machine A, and you want to duplicate on B with exactly same database. This usually happens when your developement reaches a milestone and you want to deploy a stable version onto another machine.&lt;br /&gt;Step 1 and 2 are carried out on machine A, step 3 and 4 are on machine B.&lt;br /&gt;1. Generate sql for all stored procedures and table definitions&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Browse to the database you want to duplicate in enterprise manager&lt;/li&gt;&lt;li&gt;Right click on database name-&gt;All tasks-&gt;Generate SQL statement&lt;/li&gt;&lt;li&gt;On general panel, click on "Show All", then check "All tables" and "All procedures"&lt;/li&gt;&lt;li&gt;Click ok, specify the file you want to save to, e.g. db.sql, click Finish&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;2. Export data of some tables&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Right click on database name-&gt;All tasks-&gt;Export data&lt;/li&gt;&lt;li&gt;Default data source should be Microsoft OLE DB provider for SQL server. Keep it, click next&lt;/li&gt;&lt;li&gt;Destination, choose Text File, specify path and file name, e.g. "data", click next&lt;/li&gt;&lt;li&gt;On Specify Table copy or Query page,  select copy table(s) and view(s) from the source database, click next&lt;/li&gt;&lt;li&gt;On Select destination file format page, on "Source" drop down list, choose the table you want data to be export, keep others as default, click next.&lt;/li&gt;&lt;li&gt;On this page, "run immediately" should be checked. Just click next.&lt;/li&gt;&lt;li&gt;Click Finish&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;3. Import database and stored procedure to new database.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If machine B doesn't have a database yet, create one with exactly same name as A's&lt;/li&gt;&lt;li&gt;Enterprise manager-&gt;Tools-&gt;SQL Query Analyzer, copy all text in db.sql into it, press F5&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;4. Import data to new database&lt;/p&gt;&lt;ul&gt;&lt;li&gt;In enterprise manager, browse to the database, right click-&gt;All tasks-&gt;Import data&lt;/li&gt;&lt;li&gt;Click Next on first page&lt;/li&gt;&lt;li&gt;Choose Text File and browse to "data" file, click Next&lt;/li&gt;&lt;li&gt;Keep default setting and click Next.&lt;/li&gt;&lt;li&gt;On Specify Column Delimiter page, keep default settings and click Next&lt;/li&gt;&lt;li&gt;On Choose a destination page, keep default setting and click Next&lt;/li&gt;&lt;li&gt;On Select source table and views page, select the table you want to import data to (should be same as where you exported from),  and then click on Transform column&lt;/li&gt;&lt;li&gt;On Column Mappings and Transformations page, click on Transformations panel, check "Transform information as it is copied to destination"&lt;/li&gt;&lt;li&gt;Click Ok, then click Next, on the page with "Run immediately", click Next&lt;/li&gt;&lt;li&gt;Click Finish&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-113372932158424802?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/113372932158424802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=113372932158424802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/113372932158424802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/113372932158424802'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/12/how-to-duplicate-database-in-sql.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-113349982937242106</id><published>2005-12-01T20:52:00.000-08:00</published><updated>2005-12-01T21:09:54.583-08:00</updated><title type='text'></title><content type='html'>&lt;span style="font-size:130%;"&gt;Beginner's mod_write on windows&lt;/span&gt;&lt;br /&gt;The documentation of mod_write is exhaustive. For a beginner however, it is still talking about core use of the module, but not step by step manual. I made mod_write to work and here is a detailed step by step manual.&lt;br /&gt;&lt;br /&gt;Preliminary:&lt;br /&gt;1. You have Apache2 installed.&lt;br /&gt;2. Put a test.html under C:\Program Files\Apache Group\Apache2\htdocs\test, start apache, then type &lt;a href="http://localhost:8080/test/test.html"&gt;http://localhost:8080/test/test.html&lt;/a&gt;, it shows the webpage.&lt;br /&gt;&lt;br /&gt;Background:&lt;br /&gt;Apache claims that modules are designed for the ease of web developers. They can be appended and removed by simply modifying config file, etc. As a beginner, don't have this in mind. With time passing by you will realize this by heart, but trying to understand this at first will only confuse you.&lt;br /&gt;&lt;br /&gt;OK, here comes the very simple use of mod_rewrite, which the apache server apply for redirecting urls.&lt;br /&gt;&lt;strong&gt;Step 1.&lt;/strong&gt; Check if mod_rewrite is enabled.&lt;br /&gt;Under C:\Program Files\Apache Group\Apache2\conf, there is a httpd.conf file. Search for mod_write in it, and you will probably find it commented with #. Uncomment it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2.&lt;/strong&gt; Make two html files for testing.&lt;br /&gt;I suggest test under \Apache2\htdocs\test. So, make a.html and b.html under it, with different content. Start apache, you should be able to load them using &lt;a href="http://localhost:8080/test/a.html"&gt;http://localhost:8080/test/a.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 3.&lt;/strong&gt; Make a .htaccess file.&lt;br /&gt;This is a typical UNIX file for access control. Mod_rewrite only talks to it, so we have to make one for Windows. Under \Apache2\htdocs\test where we want to redirect webpages, make a file called .htaccess. If you have trouble save it, do it this way: open a notepad, choose "All files" when saving, then you should be able to name it .htaccess.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 4.&lt;/strong&gt; Acknowledge .htaccess to Apache on windows.&lt;br /&gt;Open Apache2\conf\httpd.conf, find "AllowOverride None". Change them to "AllowOverride All". Save, restart Apache&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 5.&lt;/strong&gt; Edit .htaccess file&lt;br /&gt;Add two lines:&lt;br /&gt;&lt;em&gt;RewriteEngine on&lt;/em&gt;&lt;br /&gt;&lt;em&gt;RewriteRule ^a.html$ b.html&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;Now you are good to test. try &lt;a href="http://localhost:8080/test/a.html"&gt;http://localhost:8080/test/a.html&lt;/a&gt;, it should show b webpage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-113349982937242106?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/113349982937242106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=113349982937242106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/113349982937242106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/113349982937242106'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/12/beginners-modwrite-on-windows.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-113226927676600641</id><published>2005-11-17T15:13:00.000-08:00</published><updated>2005-11-17T15:14:36.780-08:00</updated><title type='text'></title><content type='html'>Setting up SMPT relay in .NET&lt;br /&gt;The following steps are to set the permission:&lt;br /&gt;1. Go to Start-&gt;Settings-&gt;Control Panel-&gt;Administrative Tools-&gt;IIS Maneger (Internet Information Services).&lt;br /&gt;2. Go to Internet Information Services-&gt;Localhost(local computer)-&gt; smtpserver.&lt;br /&gt;3. Right Click smtp server and click properties.&lt;br /&gt;4. In properties dialog ... General (tab) -&gt; Check Name and IP of local computerClick Advance if list is blank Add local computer IP and TCP port 25.&lt;br /&gt;5. Click on Access Tab... Click Relaya. Select Only the list below (option).b. if list is blank Add local computer IP.c. if you want to send mail from other computer of the networkadd that computer IP also and in list you will see Granted (IP). d. check true allow all computer ........&lt;br /&gt;6. Ok then Apply (lol).Try the program now with System.Web.Mail.SmtpMail.SmtpServer = "127.0.0.1" (smtp server ip)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-113226927676600641?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/113226927676600641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=113226927676600641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/113226927676600641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/113226927676600641'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/11/setting-up-smpt-relay-in.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112923501033329449</id><published>2005-10-13T13:08:00.000-07:00</published><updated>2005-10-13T13:23:30.353-07:00</updated><title type='text'></title><content type='html'>&lt;strong&gt;Nauty Berkeley DB XML in Apache module (python, windows)&lt;/strong&gt;&lt;br /&gt;Hi! If you are looking at this article, you must be one of the very few persons in the world, who is trying to write an apache module in python, in which there is code working with Berkeley DB XML. To avoid all the painful struggling, you might like to read on.&lt;br /&gt;&lt;br /&gt;1. versions&lt;br /&gt;Berkeley DB XML can only work with python 2.3 or higher. If use python2.2, the setup.py in src/python won't run successfully.(refer to my last article)&lt;br /&gt;The official mod_python.exe won't support python higher than 2.2.  But Nicolas the man provides beautiful mod_python.exe for Python2.4. You can get it from &lt;a href="http://www.lehuen.com/nicolas/download/mod_python/"&gt;http://www.lehuen.com/nicolas/download/mod_python/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. concepts&lt;br /&gt;By running setup.py under dbxml/src/python, we add a Berkeley db xml library to python language so that you can think bdbxml as a common python module now.&lt;br /&gt;By installing mod_python.exe, we tell apache "Hey, now you can also speak python!" Thus, now apache knows bdbxml.&lt;br /&gt;&lt;br /&gt;3. just a little more&lt;br /&gt;You need to modify apache's configuration to let it handle .py requests. Look at item2.9 of this link:&lt;br /&gt;&lt;a href="http://www.modpython.org/FAQ/faqw.py?query=mod_python.so&amp;querytype=simple&amp;amp;casefold=yes&amp;req=search"&gt;http://www.modpython.org/FAQ/faqw.py?query=mod_python.so&amp;amp;querytype=simple&amp;casefold=yes&amp;amp;req=search&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. simplest helloBerkeleyDBXML apache module in python&lt;br /&gt;import sys&lt;br /&gt;&lt;em&gt;from bsddb import *&lt;/em&gt;&lt;br /&gt;&lt;em&gt;from dbxml import *&lt;/em&gt;&lt;br /&gt;&lt;em&gt;from mod_python import apache  &lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;myid = r"19136512"&lt;br /&gt;def handler(req):    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   myname = "&lt;xml&gt;&lt;name&gt;cindy&lt;/name&gt;&lt;/xml&gt;"&lt;br /&gt;   mgr = XmlManager()    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   uc = mgr.createUpdateContext()    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   container = mgr.createContainer("test.dbxml")    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   container.putDocument(myid,name,uc)    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   document = container.getDocument(myid)    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   s = document.getContent()    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   req.write(str(s))   &lt;/em&gt;&lt;br /&gt;&lt;em&gt;  return apache.OK&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;If you configure everything as instructed by above link, then, &lt;a href="http://localhost/test/YOURFILENAME.py"&gt;http://localhost/test/YOURFILENAME.py&lt;/a&gt; will print "&lt;xml&gt;&lt;name&gt;cindy&lt;/name&gt;&lt;/xml&gt;" to browser.&lt;br /&gt;Now, apply any business logic and have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112923501033329449?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112923501033329449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112923501033329449' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112923501033329449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112923501033329449'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/10/nauty-berkeley-db-xml-in-apache-module.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112922628289931028</id><published>2005-10-13T10:39:00.000-07:00</published><updated>2005-10-13T10:58:02.916-07:00</updated><title type='text'></title><content type='html'>&lt;strong&gt;Working with Berkeley DB XML on Python, on Windows&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Berkeley DB XML is based on Berkeley DB. The latter provides fast, reliable and relational db, and the former supports XQuery.&lt;br /&gt;Due to the fame of Berkeley DB, python2.4 is now shipped with a module called bsddb to support it. You can find source in /Python24/lib/bsddb. By simply "from bsddb import *", your python program can use "fruitDB = db.DB()" etc for any database actions. But, dbxml is not shipped with python. How could we make it can also be used simply by "from dbxml import *"?&lt;br /&gt;&lt;br /&gt;Look into the dbxml source of Berkeley DB XML, Sleepycat Software\Berkeley DB XML 2.1.8\dbxml\src\python, you see some dbxml.py, setup.py, etc, don't you? If not, you are missing the meat, go download it from sleepycat!&lt;br /&gt;Now, if you have python.exe in system path, ring up a dos command window, browse to this folder and fire a "python setup.py install". If windows complains about python is not a command, and you are as lazy as me, go to Python24 or wherever you install Python, grab python.exe and paste it there. Then run "python setup.py install"&lt;br /&gt;&lt;br /&gt;Now you are set. The dbxml module written in C by sleepycat guys are now wrapped into a python module and installed with python core! You can then use it just as any other common modules.&lt;br /&gt;&lt;br /&gt;Hint: For 3rd party modules, if you see a xxxx.py and setup.py, that means the nice guy has did everything for wrapping his code into python, all you need to do is to run setup.py. To find out more about this, read &lt;a href="http://www.python.org/dev/doc/devel/inst/trivial-install.html#new-standard"&gt;http://www.python.org/dev/doc/devel/inst/trivial-install.html#new-standard&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now that you are ready to go, don't forget under Sleepycat Software\Berkeley DB XML 2.1.8\dbxml\examples\python there is an example.py that contains almost everything. No studying, no research, just apply your business logic!&lt;br /&gt;Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112922628289931028?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112922628289931028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112922628289931028' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112922628289931028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112922628289931028'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/10/working-with-berkeley-db-xml-on-python.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112837201777012748</id><published>2005-10-03T12:35:00.000-07:00</published><updated>2005-10-03T19:09:33.266-07:00</updated><title type='text'></title><content type='html'>&lt;strong&gt;Research Reading Notes.&lt;/strong&gt;&lt;br /&gt;1. The Apache web server for XML applications (&lt;a href="http://idealliance.org/proceedings/xtech05/papers/02-04-02/"&gt;http://idealliance.org/proceedings/xtech05/papers/02-04-02/&lt;/a&gt;)&lt;br /&gt;Since filters can be arbitarily trained, inserted and removed, and they are good at dealing with processes that require both input and output data, Apache2 is good for processing XML.&lt;br /&gt;valet.webthing.com is a case of xml app with Apache 2. It takes user input which is the url of a website, go fetch the html of that page and validate against W3C and WDG validators. I understand it is processing HTML as markup language, and the site is on Apache 2. But I don't know how exactly it works and what its architecture is.&lt;br /&gt;&lt;br /&gt;2.&lt;a href="http://codea.sourceforge.net/"&gt;http://codea.sourceforge.net/&lt;/a&gt;&lt;br /&gt;This is an OO dev environment for quickly building apache modules. It makes development transparent as I need not consider I am working with apache.&lt;br /&gt;But, it only works on RedHat Linux7.x with Apache 2.0.16. Too strict, don't feel good&lt;br /&gt;&lt;br /&gt;3. &lt;a href="http://www.danga.com/memcached/"&gt;http://www.danga.com/memcached/&lt;/a&gt;&lt;br /&gt;highlights: distributed--works on multiple machines&lt;br /&gt;object caching&lt;br /&gt;nature: giant hashtable&lt;br /&gt;no authentication/security, has to work under firewall&lt;br /&gt;easy to convert to.&lt;br /&gt;&lt;br /&gt;4. PHP Sessions&lt;br /&gt;This is common session control/attributes. Regarding PHP, I found a detailed tutorial about how to implement PHP session:&lt;a href="http://www.phpfreaks.com/tutorials/41/2.php"&gt;http://www.phpfreaks.com/tutorials/41/2.php&lt;/a&gt;. This is raw PHP session control code.&lt;br /&gt;It will be nice if jeteye could put &lt;a href="http://wb.pro-net.co.uk/php.html"&gt;http://wb.pro-net.co.uk/php.html&lt;/a&gt; OO PHP session functions&lt;br /&gt;into php-mcache module. I think this is in fringe of my project. If writing modules turns out to be very easy for me, I will do this:)&lt;br /&gt;&lt;br /&gt;Questions:&lt;br /&gt;1. Why do I need Axis for SOAP?&lt;br /&gt;2. Codea might be nice. But, if I stick to M$ windows, do I have to use raw C?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112837201777012748?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112837201777012748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112837201777012748' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112837201777012748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112837201777012748'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/10/research-reading-notes.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112564028114326947</id><published>2005-09-01T22:38:00.000-07:00</published><updated>2005-09-01T22:51:21.150-07:00</updated><title type='text'></title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Jeteye Returns...&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Project Summary&lt;/strong&gt;&lt;br /&gt;My purpose of taking Master's project right after summer course is to do a continous and big project and build really cool things.&lt;br /&gt;During the summer, my teammate and I built a series of things for jeteye:&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt; REST interface. e.g. &lt;a href="http://www.jeteye.com/users/cindy"&gt;http://www.jeteye.com/users/cindy&lt;/a&gt; will get back all jetpaks owned by user cindy.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt; Java API. e.g. public Jetpak XMLProcessor.getJetpakByID(int id) {...}&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt; Pinging service. This pings many updating services like ping-o-matic to broadcast update of jetpaks&lt;br /&gt;&lt;strong&gt;4.&lt;/strong&gt; Data consuming. This gets feed from other sites like technorati and generate jetpaks.&lt;br /&gt;&lt;br /&gt;For Master's project, I will:&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt; Continue on the REST interface&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt; Make it so it automatically detects new functionality, thatis, new XML calls (this might be done several different ways)&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt; Make it broadcast/advertise its available function calls toclients so they can automatically "discover" them instead of having topublish an API and so forth.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Project Planning&lt;/strong&gt;&lt;br /&gt;Now through Sep 8th: research on xml automation; prepare for demoing summer product to boss.&lt;br /&gt;On Sep 9th, after demo and getting idea/advise from boss, Ivo and I will sit down to nail down details(contract) of the project.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pattern of working:&lt;/strong&gt;&lt;br /&gt;I will go to jeteye as much as possible and work with engineers there.&lt;br /&gt;On-site working time is approximately 15-18 hours/week. Off-site working time varies on needs.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Other:&lt;/strong&gt;&lt;br /&gt;Getting excited...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112564028114326947?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112564028114326947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112564028114326947' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112564028114326947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112564028114326947'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/09/jeteye-returns.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112170836695059750</id><published>2005-07-18T10:35:00.000-07:00</published><updated>2005-07-18T10:40:20.200-07:00</updated><title type='text'></title><content type='html'>1-888-680-2954 is one of the numbers that does commiting fraudulent business and the consumers getting the shaft.&lt;br /&gt;I've been getting a call every morning at 8:15, even on weekends, and as soon as I answered the call, they hang up. If I don't answer it, there is a voice message asking me to call back that 888#.&lt;br /&gt;It is getting quite annoying as I have to either delete voice message or answer it and both waste my minutes!&lt;br /&gt;So far there is no way I can deal with this as their number is not shown when they call, so there is no way to block any number.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112170836695059750?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112170836695059750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112170836695059750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112170836695059750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112170836695059750'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/07/1-888-680-2954-is-one-of-numbers-that.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112128439552788827</id><published>2005-07-13T12:52:00.000-07:00</published><updated>2005-07-17T16:29:39.963-07:00</updated><title type='text'></title><content type='html'>&lt;strong&gt;Lobbyist Demo 2005-07-13 brief...(draft)&lt;/strong&gt;&lt;br /&gt;&lt;span style="color:#666666;"&gt;&lt;span style="color:#006600;"&gt;1. home page for initial-regi, should look into and fix the txt --fixed&lt;br /&gt;2. Payment and Lobbying Page-- where it says "Provide..." say "For this payment, provide the name and title, if applicable, of each..." --fixed&lt;br /&gt;3. On that same page, order by payment made to, outcome sought, and then list of city officers.--fixed&lt;br /&gt;4. Continue button on each page marked "Done" not mark as complte and continue. --fixed&lt;br /&gt;5. on all pages, the "Select From People" link should be called "Select from Existing" --fixed&lt;br /&gt;6. On lists, don't say "Here is a list..." Just say "List of saved..." --fixed&lt;br /&gt;7. If user tries to submit and hasn't completed all forms, in the warning message dont say error, but say:&lt;br /&gt;"A form should only be submitted when you have completed and verified all parts. You have not completed all parts yet-- you must at least click on the "Continue" button on each page to do so. If you would like to leave the form in an incomplete state, you may click on the Forms Status Page link. --fixed&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#006600;"&gt;8. Make sure forms in progress list is sorted by date with newest on top. --done&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#006600;"&gt;9. When they terminate, instead of forcing them to go back and delete any pending forms, give them a dialog box that says, "You have n pending forms. These will be deleted from system if you terminate your registration. Do you still want to terminate?"&lt;/span&gt; &lt;span style="color:#006600;"&gt;--done&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;10.When quarterly report-no activity chosen, do a popup that says, "This will record a quarterly report with no activity" and ask if should proceed. If so, mark as "Quarterly-Report-- No activity" in the Forms Completed List.&lt;/span&gt; &lt;span style="color:#006600;"&gt;--done&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;11. The Modify Client Form should be called Edit Info form which allows editing basic info and client list. --done&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;12. User Profile not User PRofiler. --done&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#006600;"&gt;13. Check for duplicates on name lists-- don't allow --done&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;14. Need to get delete link on Forms in Progress on right not left.&lt;/span&gt; &lt;span style="color:#006600;"&gt;--done&lt;/span&gt;&lt;br /&gt;15. Viewing of submitted and pending forms...web/pdf? --in progress&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Next Version&lt;br /&gt;&lt;/strong&gt;When user enters name, lets check against database and if any name matches ask user if that is the one they're talking about.&lt;br /&gt;screen cast to help lobbyists use system&lt;br /&gt;cookie to remember user name and password&lt;br /&gt;user can have multiple lobbyists&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112128439552788827?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112128439552788827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112128439552788827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112128439552788827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112128439552788827'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/07/lobbyist-demo-2005-07-13-brief.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-112122528236920573</id><published>2005-07-12T20:27:00.000-07:00</published><updated>2005-07-13T12:52:47.180-07:00</updated><title type='text'></title><content type='html'>Testing Technorati ing...&lt;br /&gt;http://cs.usfca.edu/~xczhou/Jeteye&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-112122528236920573?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/112122528236920573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=112122528236920573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112122528236920573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/112122528236920573'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/07/testing-technorati-ing.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13877533.post-111946747058853257</id><published>2005-06-22T12:10:00.000-07:00</published><updated>2005-06-22T12:16:56.806-07:00</updated><title type='text'></title><content type='html'>&lt;span style="font-family:arial;font-size:130%;"&gt;Welcome to Naboo! Interesting posts will come soon!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13877533-111946747058853257?l=cindynaboo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cindynaboo.blogspot.com/feeds/111946747058853257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13877533&amp;postID=111946747058853257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/111946747058853257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13877533/posts/default/111946747058853257'/><link rel='alternate' type='text/html' href='http://cindynaboo.blogspot.com/2005/06/welcome-to-naboo-interesting-posts.html' title=''/><author><name>Cindiana</name><uri>http://www.blogger.com/profile/15202483811438252366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_l5pNAw05EC4/THx_vx3ds1I/AAAAAAAABX0/8f0gX_Q5TSE/S220/CIMG7643.JPG'/></author><thr:total>0</thr:total></entry></feed>
