<?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-26752431</id><updated>2012-02-04T13:45:37.247-07:00</updated><title type='text'>survic's blog on      Programming or Enterprise Computing</title><subtitle type='html'>&lt;b&gt; reminder: to search this blog, use SEARCH THIS BLOG at the top &lt;/b&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://survic.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default?start-index=101&amp;max-results=100'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>202</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26752431.post-1921565671851360335</id><published>2009-05-18T14:53:00.005-07:00</published><updated>2009-05-18T15:20:42.291-07:00</updated><title type='text'>Silverlight, ActiveX, AIR, Sandbox, and Offline</title><content type='html'>1. Silverlight 2 stand-alone with ActiveX&lt;br /&gt;&lt;br /&gt;Silverlight 2 stand-alone html application (it is better to change the .html to .hta, the host is MSHTA.EXE), using javascript (file mode, so full trust) to call activeX (note that this approach is not cross platform).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.galasoft.ch/mydotnet/articles/article-2008042301.html"&gt;http://www.galasoft.ch/mydotnet/articles/article-2008042301.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://geekswithblogs.net/lbugnion/archive/2008/04/24/silverlight-running-standalone-full-trust-applications.aspx"&gt;http://geekswithblogs.net/lbugnion/archive/2008/04/24/silverlight-running-standalone-full-trust-applications.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/04/27/how-to-make-silverlight-be-air.aspx"&gt;http://blogs.microsoft.co.il/blogs/tamir/archive/2008/04/27/how-to-make-silverlight-be-air.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. If the requirement is not offline, but to access files and ports, can use special ActiveX with javascript.&lt;br /&gt;&lt;br /&gt;3. Silverlight 3 OOB is not that useful&lt;br /&gt;&lt;br /&gt;--a. Silverlight 3 OOB is within browser sandbox, so, cannot access file etc.&lt;br /&gt;--b. Silverlight 3 OOB (out of browser) cannot use html/javascript, so, it cannot be used together with the hta technique.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. The above is not cross-platform (but for intranet, it is good that it does not need to install any “extra” stuff), for that, AIR is the way to go.&lt;br /&gt;&lt;br /&gt;5. Is it possible to use both AIR and pure Silverlight3? Not sure: (i) Can Silverlight3 be invoked from AIR? (ii) Silverlight cannot invoke AIR (sandbox), but it can save to the storage, and AIR can poll that. (iii) Silverlight cannot mash up AIR. (iv) AIR perhaps can mash up Silverlight. As a result, it looks like we can use AIR as the “shell” (base application), and invoke Silverlight screens (because it is in sandbox, so, it does not know other instances; so, the shell must be very lightweight and can be instantiated many times without performance issues). &lt;br /&gt;&lt;br /&gt;6. For Serial port etc, it needs a generic "proxy" that translates port to socket(). Javascript can then use socket. Note that this makes it not portable. So, if we do not need offline feature, then, we can simply develop small ActiveXes to access things out of the sandbox, and use Silverlight for UI, and use javascript to glue things togother.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1921565671851360335?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1921565671851360335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1921565671851360335' title='96 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1921565671851360335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1921565671851360335'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/05/silverlight-activex-air-sandbox-and.html' title='Silverlight, ActiveX, AIR, Sandbox, and Offline'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>96</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1895686000029950752</id><published>2009-05-18T07:31:00.004-07:00</published><updated>2009-05-18T08:20:03.764-07:00</updated><title type='text'>The so-called process is actually parts of the architecture, and the so-called architecture is actually parts (use cases) of the process</title><content type='html'>The so-called process is actually parts of the architecture, and the so-called architecture is actually parts (use cases) of the process. Both of them are about three things:&lt;br /&gt;&lt;br /&gt;1. use cases&lt;br /&gt;2. data fields&lt;br /&gt;3. architecture use cases (transaction-failure handling; network-performance plus offline client, reports, direct database jobs; security, auditing)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Key understanding:&lt;br /&gt;&lt;br /&gt;1. use cases: this is the art. The core of the art is to find the representative use cases so that they are only a few but cover all data fields. Also note that they need to be described using UI terms, however, they are use cases -- using UI language and eventually doing UI design do not mean you need to jump on UI design in the very beginning.&lt;br /&gt;&lt;br /&gt;2. data fields: this is the science. All computing are based on this, including object oriented programming -- the core of domain model is in data model. However, note that this does not mean you need to jump on database physical design in the very beginning.&lt;br /&gt;&lt;br /&gt;3. Architecture use cases. They are use cases. "Architecture" is not magic; they must be organized in use cases. Users can and must understand them -- that is, if you organize them in use cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1895686000029950752?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1895686000029950752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1895686000029950752' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1895686000029950752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1895686000029950752'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/05/so-called-process-is-actually-parts-of.html' title='The so-called process is actually parts of the architecture, and the so-called architecture is actually parts (use cases) of the process'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3870276030931765366</id><published>2009-02-16T11:32:00.007-07:00</published><updated>2009-04-06T16:22:57.548-07:00</updated><title type='text'>documents and paper computer</title><content type='html'>documents and paper computer&lt;br /&gt;&lt;br /&gt;In addition to "use cases" and "data fields (data points)", another key word is "documentation". I treat "documentation" as if it were source code, and as a result, it corresponds to the real system directly -- I treat it as a "paper computer".&lt;br /&gt;&lt;br /&gt;By doing this, there is no "process". Note that "use cases/business rules" and "data fields (data points)/technical approaches" (I believe "implementation strategies" is too difficult to say quickly in meetings, so, I traded the phrase with "technical approaches") are the top-most level of the structure ("architecture") of a system.&lt;br /&gt;&lt;br /&gt;Note that we can talk some "technical approaches" to users. All those are key words in software support/development.&lt;br /&gt;&lt;br /&gt;Also note that "technical approaches" includes technical items in "use cases/business rules", for example, "transactions", "newwork (web services, report server, eim, remote)", "security", and "audit" are "use cases/business rules".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3870276030931765366?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3870276030931765366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3870276030931765366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3870276030931765366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3870276030931765366'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/02/documents-and-paper-computer.html' title='documents and paper computer'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2128062856364620315</id><published>2009-02-10T14:01:00.002-07:00</published><updated>2009-02-10T14:12:16.148-07:00</updated><title type='text'>the wording I am using: "use cases" and "data points"</title><content type='html'>I know I change a lot, and I play with words a lot.&lt;br /&gt;&lt;br /&gt;Now, again, I am changing the wording of the top level thinking “formula”. They are "use cases" and "data points".&lt;br /&gt;&lt;br /&gt;Yes, I am putting “rules” and “implementation strategy” back to where they belong – low level.&lt;br /&gt;&lt;br /&gt;I changed “common data” to “data points”, because “common data” is too abstract to users. I want the wording easy to understand, intuitively.&lt;br /&gt;&lt;br /&gt;Also, “points” kind of intuitively leads people into details, closer to implementation. This is especially true when you use "screens" for "use cases". &lt;br /&gt;&lt;br /&gt;I guess I will keep using them for a while.&lt;br /&gt;&lt;br /&gt;Now, you may say, why, why are you paying attention to the wording so much? It is important. Without a good wording, you will not say them that often, then, you will be misled, or, worse, you will mislead. Saying something, saying something aloud, saying something aloud in front of a team, are a very powerful action, and that action definitely affect your other actions and behaviors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2128062856364620315?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2128062856364620315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2128062856364620315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2128062856364620315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2128062856364620315'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/02/wording-i-am-using-use-cases-and-data.html' title='the wording I am using: &quot;use cases&quot; and &quot;data points&quot;'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4848733240474014341</id><published>2009-01-26T09:59:00.005-07:00</published><updated>2009-01-26T12:23:40.905-07:00</updated><title type='text'>Use "rules" and "non-typical implementation strategy" to replace "use cases" and "common data" respectively</title><content type='html'>Use "rules" and "non-typical implementation strategy" to replace "use cases" and "common data" respectively&lt;br /&gt;&lt;br /&gt;For a technical team, the concept (or “wording”) of “rules” is better than “use cases”, because “rules” is more technical. Users are more attentive and more tolerate to details. It is more "cut to the chase". Note that I correct myself of my previous blogs. Now, I believe the concept of “rules” corresponds/replaces to “use cases” (for technical teams), instead of replacing “common data”.&lt;br /&gt;&lt;br /&gt;For a technical team, the concept “implementation strategy” corresponds/replaces the concepts “common data”.&lt;br /&gt;&lt;br /&gt;Note that “rules” and “implementation strategy” are more “mixed”: “rules” has “common data” factors, and “implementation strategy” has “use cases” elements. However, their respective “starting point" is “use cases” and “common data” respectively.&lt;br /&gt;&lt;br /&gt;I know, it is very confusing, but it is actually simple in action: for a technical team, always have a list, with “rules” and “implementation strategy” as your cheat sheet, then, you will be safe and can proactively respond everything.&lt;br /&gt;&lt;br /&gt;Just one more bit of details. Usually there are too many details, too many “implementation strategies” – i.e., the list can be too long to be effective as a “cheat sheet”. So, the secret is to scan through the common, usual, routine “implementation strategies”, and, identify those uncommon, non-typical ones.&lt;br /&gt;&lt;br /&gt;You may ask, what are the criteria of “common” and “uncommon” (i.e. “special”, "non-typical") ones? Easy, the 90% rule (I know, usually people say 80% rule – but in technical areas, we need to be tougher).&lt;br /&gt;&lt;br /&gt;Of course, to pay attention to the non-typical ones, you have to master the common ones first, even most of the time, you do not need to do them yourself, since you only pay attention to the non-typical ones – it sounds like a paradox, but that is the secret of delegation or helping others to help yourself – that is actually your value as an experienced professional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4848733240474014341?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4848733240474014341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4848733240474014341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4848733240474014341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4848733240474014341'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/01/use-rules-and-non-core-implementation.html' title='Use &quot;rules&quot; and &quot;non-typical implementation strategy&quot; to replace &quot;use cases&quot; and &quot;common data&quot; respectively'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2504059907938467333</id><published>2009-01-24T23:29:00.004-07:00</published><updated>2009-01-25T03:07:48.972-07:00</updated><title type='text'>thumb typing is good for IT professionals</title><content type='html'>Diagrams and spreadsheet are bad, plain text is good, and therefore thumb typing is good for IT professionals&lt;br /&gt;&lt;br /&gt;The key is, drawing is not that important. If drawing is really that important, than, thumb typing is useless, we neither have to use tablet, or, paper.&lt;br /&gt;&lt;br /&gt;I find that drawing is not that important. Diagrams are totally overvalued. After all, the general computing thesis is that what you can describe, you can realize it in computing, it is not that what you can draw or clicking. For software engineering, structure English (or structured any natural languages) is the king, not diagrams, not spread sheet. Whenever you find your documents are mostly diagrams and spread sheet, you should treat it as a red flag, something is wrong.&lt;br /&gt;&lt;br /&gt;It took me so long for me to realize the importance of thumb typing. I will strongly recommend to everybody in my family to begin to use thumb typing.&lt;br /&gt;&lt;br /&gt;I know young people have been doing the texting for a while. However, I am not talking about texting. I am not that generation; I am not interested in texting. Frankly, I believe it is simply temporary anti-culture, combined with the temporary limitation of computing devices – I am talking about those texting abbreviations – BFF, best friend forever, what a heck!&lt;br /&gt;&lt;br /&gt;Even in thumb typing, I prefer the whole wordings. To me, using not absolutely common abbreviations is a sure indicator that the author is inconsiderate and therefore not professional, period. I know, this does not mean too much to a teenage. I totally understand, believe me, I was young before also :-)&lt;br /&gt;&lt;br /&gt;I also know a lot of business people have been using PDA for a long time. However, I am not sure most of them are using them to take notes.&lt;br /&gt;&lt;br /&gt;As a result, although it took me for a while to plunge into thumb typing, I believe I am still among those not too many people who have recognized the value of thumb typing and are doing it seriously.&lt;br /&gt;&lt;br /&gt;[OK, after I wrote the above, I googled thumb typing, and I found a lot materials, see below. Some of them were written in 1999 -- it means that I am soooo late! However, I can still say that those are pioneers. From what I have observed, I am not that late to use it as an everyday routine notes-taking device to replace paper-based notes-taking&lt;br /&gt;&lt;a href="http://www.blackberryforums.com/general-blackberry-discussion/800-blackberry-thumb-touch-typist-guide-typing-60-wpm-without-looking.html"&gt;http://www.blackberryforums.com/general-blackberry-discussion/800-blackberry-thumb-touch-typist-guide-typing-60-wpm-without-looking.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It says a lot of things, but all I feel I really need to know is the fact that "we can": it is possible to use thumb typing to think-write, and there are two other tips:&lt;br /&gt;&lt;br /&gt;a. Note the left thumb holding Num can give you a Uppercase for the right thumb.&lt;br /&gt;b. When typing number, left thumb holding the Alt key, and right thumb push the number keys.&lt;br /&gt;&lt;br /&gt;---Just type the quick brown fox jumps over the lazy dog.&lt;br /&gt;&lt;br /&gt;---I will try more aggressively to be able to do blind/touch typing with thumbs.&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;Also, I want to share that, in the beginning, on blackberry, I just send myself emails as my notes. Very soon, I found out that it is a bad idea. I cannot find my notes! They are buried in those emails.&lt;br /&gt;&lt;br /&gt;Now, I am using “tasks” to take notes, and periodically “select” and copy them to emails as a backup. Of course, now, “tasks” is my first icon on my blackberry.&lt;br /&gt;&lt;br /&gt;There is another thing that sucks. The company has a group security policy: the blackberry locks itself after several minutes. I have to enter password to unlock it every time I need to takes notes. I tried to ask them to make the timeout longer, but you kow the result, Sigh.&lt;br /&gt;&lt;br /&gt;For blind/touch typing, I am not sure whether I need a physical keyboard or a simulated one. I am using an old blackberry. The new blackberry model is like an iphone, with larger screen, but a simulated keyboard. I do not have the new model, I guess it is a blessing for typing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2504059907938467333?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2504059907938467333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2504059907938467333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2504059907938467333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2504059907938467333'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/01/thumb-typing-is-good-for-it_24.html' title='thumb typing is good for IT professionals'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6110527128405356081</id><published>2009-01-15T12:11:00.003-07:00</published><updated>2009-01-15T12:30:27.448-07:00</updated><title type='text'>thumb typing all the time -- on blackberry for to-do-item notes</title><content type='html'>Thumb typing, or, thumb-and-index typing, is not that difficult. You can do that pretty fast after a few hours. The problem is the software – there is no auto-spell checking, and no auto-correction in blackberry (perhaps I missed something).&lt;br /&gt;&lt;br /&gt;Thumb typing is faster than writing pad and real time recognition, but I guess we need both, because we still need drawing. Mouse drawing is not good. Touch screen is useful here.&lt;br /&gt;&lt;br /&gt;Anyway, thumb typing is worth it. I know, I am slow to pick it up, but I will begin to really do thumb typing on my blackberry to make notes, instead of using pen and paper.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This means I will use thumb typing all the time. Note that I have electronic notes that I take in VIM (not MS Word, since VIM also have spell checking – it does not have auto-correction – or I should say I am not using that, I am not user whether VIM has auto-correction or not). Those notes are detailed, and have a lot of content – that is why I use electronic notes for them long time ago. I always laugh at my college who are still using papers to do those kind of notes. It is amazing, a lot of them still doing that, make notes on paper!&lt;br /&gt;&lt;br /&gt;However, I have been using paper doing the to-do-item notes all the time. This kind of notes, they are short, just a reminder. Also, they must be extremely portable, not limited on computers.&lt;br /&gt;&lt;br /&gt;Now, I am going to move this to blackberry. I cannot draw anymore, but for those to-do-item notes, I do not do drawing anyway.&lt;br /&gt;&lt;br /&gt;Note that I blog this, because I believe this kind of thing is important for computer professionals. Too many computer professionals are too behind on using computers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6110527128405356081?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6110527128405356081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6110527128405356081' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6110527128405356081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6110527128405356081'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/01/thumb-typing-all-time-on-blackberry-for.html' title='thumb typing all the time -- on blackberry for to-do-item notes'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1657196717875778335</id><published>2009-01-11T18:16:00.007-07:00</published><updated>2009-01-12T09:00:50.197-07:00</updated><title type='text'>Personal Paperless Evolution: Use more laptop, printing pdf on paper, and thumb typing notes</title><content type='html'>As a new year resolution, starting now, I will always use electronic notes, instead of marking the notes on the margin of paper materials -- this means paper material will officially disposable at any time.&lt;br /&gt;&lt;br /&gt;Today, I cleaned up my paper materials, there are only a few of them, I will gradually move the notes to electronic notes. They are not critical, I have already been doing this, it is just a "clearing house" activity, I guess.&lt;br /&gt;&lt;br /&gt;More explanations:&lt;br /&gt;&lt;br /&gt;1. The key of doing this is to use my labtop more often (the battery is OK, I just need to stop my bad habit of prefer reading paper materials and making notes on them). When I travel or at home, I will use my blackberry and my kindle more often -- even when I have to use paper material (OK, I still prefer reading on paper than on computer. Kindle is fine, but Kindle cannot handle pdf), at least I must use thumb typing on blackberry or kindle to take notes.&lt;br /&gt;&lt;br /&gt;2. As mentioned above, Kindle is a big disappointment to me, I was hoping it can help me to realize the "paperless revolution" in my "home-office" and my personal life. It did not. Now, I have to re-do it by an evolutionary approach.&lt;br /&gt;&lt;br /&gt;Now I know, a "reader" should be have larger screen (perhaps by folding it or better bending it without the middle dividing line) so that it can handle pdf without any reformatting. It must be touch screen with stylus support to avoid thumb typing. Also, it should have a fold keyboard for typing. In short, it is a tablet computer with an electronic paper screen.&lt;br /&gt;&lt;br /&gt;I almost regret of buying Kindle, I should have gone to iLiad 1000, which has a price tag close to $900. However, the screen of iLiad is still small and not convenient for typing (does it support external key board? not sure); futher, it does not have color, which is important for some business documents. Also, it does not support video.&lt;br /&gt;&lt;br /&gt;This leads to a question, why epaper screen? Because it is easy to eyes, and it saves battery -- both are not that important for business documents.&lt;br /&gt;&lt;br /&gt;So, after all, I guess for pdf documents, let's keep it in labtop (or tablet - if you have it); for "ordinary" books, use kindle. So, I guess my decision on Kindle is an OK one, although Kindle is indeed disappointing -- the technology is slower than I expected. As a result, we need to adapt to the current status of the technology. Printing pdf on paper (sorry, trees, we still need to cut you!), and thumb typing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1657196717875778335?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1657196717875778335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1657196717875778335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1657196717875778335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1657196717875778335'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/01/personal-paperless-evolution-use-more.html' title='Personal Paperless Evolution: Use more laptop, printing pdf on paper, and thumb typing notes'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3204562807206220463</id><published>2009-01-11T16:08:00.004-07:00</published><updated>2009-01-12T09:03:40.491-07:00</updated><title type='text'>Summary of 2 "blocks" and their sub-blocks</title><content type='html'>Summary of my previous summary&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I will do things according to the following 2 "blocks" and their sub-blocks:&lt;br /&gt;&lt;br /&gt;1. “Common data”: this leads to "OUR" Object, UI, Relational, and their mappings -- OR mapping and OU mapping.&lt;br /&gt;&lt;br /&gt;2. "Use cases": this leads to UI and "facade" -- in Siebel, "business service" and "workflow", they then lead to networking (which in turn includes 4 parts: web service, EIM, reporting, and remote), logging, and security.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3204562807206220463?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3204562807206220463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3204562807206220463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3204562807206220463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3204562807206220463'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/01/summary-of-2-blocks-and-their-sub.html' title='Summary of 2 &quot;blocks&quot; and their sub-blocks'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1258266406208292425</id><published>2009-01-10T14:50:00.007-07:00</published><updated>2009-01-12T09:05:27.117-07:00</updated><title type='text'>summary and new start</title><content type='html'>I reviewed all my blogs of the past a few years – that is one advantage of blogging over private notes: it forces you to face your history of ideas! I found that sometimes I contradicted myself, and I debated with friends, and I changed my mind. The important thing is not the conclusions, but the arguments, the process of arguing, and more importantly, the understanding, insights, and friendship.&lt;br /&gt;&lt;br /&gt;OK, another immediate contradiction of myself: Now, I want to have a summary ("conclusions"!), so that we can invent more in the coming year(s).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. "Philosophy": science and technology, regardless of modern and ancient, are one. The saying that modern science is totally different from ancient science and from technology is a myth. At a high level, they are the same. We can and should use science-thinking ("scientific thinking) in technology, and vice versa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. "Time" -- the basic sequence&lt;br /&gt;&lt;br /&gt;“Analysis/Design/Coding/Testing” corresponds to “Problems/Theory/Solving Problems using the theory/Testing”.&lt;br /&gt;&lt;br /&gt;Note: in "problems", you have both "common data" and "use cases", not just "use cases".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. "Space" -- the basic structure (or “architecture” -- but I prefer small words in science/logic, instead of big words in engineering)&lt;br /&gt;&lt;br /&gt;“Common data” (this leads to "OUR" Object, UI, Relational, and their mappings -- OR mapping and OU mapping) and “use cases”. "Use cases" leads to UI and "facade" -- in Siebel, "business service" and "workflow", they then lead to networking (which in turn includes 4 parts: web service, EIM, reporting, and remote), logging, and security.&lt;br /&gt;&lt;br /&gt;Note: “Common data” is a “new” phrase I have begun to use. I discussed/debated a similar topic sometime ago in my blogs, “data model vs. domain model”. I believe “data” is more user-friendly and, well, manager-friendly. I add “common” before "data", to emphasize that the concept has inherently an element of “design”, “structuring”, or well, “modeling”. In short, it is a compromise between “data model” and “domain medel” -- but I still do not like “domain model”: it is too programmer-oriented, not user-friendly. Users are totally confused when you use the word “domain model”, but they know, I mean, really know, “data”. Note that it is not just wording. Inherently, “domain model” has too much “technical” baggage. "Domain model" concept belongs to a more limited technical context, instead of a top level concept that can be used together with the concept of “use cases”.&lt;br /&gt;&lt;br /&gt;A special note: I notice that there is a mapping between "time" and "space", or, a common spot in both "time" and "space": the "use cases" (UIs and facades) maps to "testing". This is understandable: the so-called "space" is the basic structure for software, which must follow the basic structure of human logic, which is the so-called "time" all about.&lt;br /&gt;&lt;br /&gt;4. Technical team dynamics (or "team culture" or "team leadership" or "team moral" -- pick the phrase you like):&lt;br /&gt;&lt;br /&gt;a. Basic estimate of human capability, science, technology, and education: a good high school new graduate or an average college new graduate can start to work productively within two weeks on any computer technologies, within a good team and with good mentoring.&lt;br /&gt;&lt;br /&gt;b. Rotating/pro-vertical (avoid single threading) and lean (cut self-enforcing communication overhead)&lt;br /&gt;&lt;br /&gt;Single threading is bad. When project is late, you cannot put more people on the bottlenecks. Worse, it damages team moral. It is the basis of unfairness, laziness, and even outright blackmailing. Based on my observation, it is the root cause of more than 80% of problems in IT.&lt;br /&gt;&lt;br /&gt;The irony is that out of the 80%, more than half of it is from the “solution” of the problem: heavy communication overhead. It is a self-enforcing overhead -- people first compartmentalize the team, create the hunger for information, and then, they “coordinate”. Gradually a lot of people cannot do things anymore, they only “communicate” and “coordinate” while they are devaluing the whole profession into production-line work, with extremely heavy, costly, error-prone, and misleading overhead. The double irony is that this "solution" actually aggravates the "single threading" problem.&lt;br /&gt;&lt;br /&gt;We can do better. We need, can, and should be more effective by being lean. However, to do that, we need to find a better way to solve the single threading issue.&lt;br /&gt;&lt;br /&gt;Observing other professional fields, we can find that the real solution is the opposite of the current “solution”: instead of limiting, we expand the scope – every developer should at least have 2 or 3 “fields” (remember that even an average college new graduate can pick up things in a field within two weeks!), then, we can rotate the fields within the team. Also, when we do “division of labor” in a certain project, we should always prefer “vertical” division (end-to-end of a vertical slice), instead of “horizontal” layering division (e.g., one person in UI, another person in Business layer).&lt;br /&gt;&lt;br /&gt;c. “Document driven”, meeting minutes, source control, and source control friendly format. The essence of the “document driven” is that all documents, including meeting minutes, user oriented documents, and even “private” or “personal” notes, should be treated as “source code”.&lt;br /&gt;&lt;br /&gt;There are two big challenges.&lt;br /&gt;&lt;br /&gt;One is that people want to keep some “private” and “personal” notes – this will be resolved by rotating mentioned above.&lt;br /&gt;&lt;br /&gt;Another one is “source control friendly format”: some user oriented documents, for example, “requirements” or “user manuals”, are not easy to be put into version control friendly format. Currently, too often they are in MS Word together with spreadsheets, which both are ugly and horrible for version control friendly minds! – This is actually pretty easy to resolve in web technology (wiki etc). I hope the corporate world will catch up on this quickly.&lt;br /&gt;&lt;br /&gt;d. “Process” must be simple, and not arbitrary. In more detailed terms: it must be in place before projects. Preferably, its wording should be consistent with common usage in the industry, like "analysis", "design", "coding", "testing", “use cases”, and “common data”.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1258266406208292425?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1258266406208292425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1258266406208292425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1258266406208292425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1258266406208292425'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2009/01/summary-and-new-start.html' title='summary and new start'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2309931511066188113</id><published>2008-12-12T08:53:00.002-07:00</published><updated>2008-12-12T10:47:40.138-07:00</updated><title type='text'>A Paper on TDD and Karl Popper</title><content type='html'>&lt;a href="http://www.springerlink.com/content/b2m76810u5715802/fulltext.pdf"&gt;http://www.springerlink.com/content/b2m76810u5715802/fulltext.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;G. Concas et al. (Eds.): XP 2007, LNCS 4536, pp. 253–256, 2007.&lt;br /&gt;© Springer-Verlag Berlin Heidelberg 2007&lt;br /&gt;-------------------------------------&lt;br /&gt;Epistemological Justification of&lt;br /&gt;Test Driven Development in Agile Processes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Francesco Gagliardi&lt;br /&gt;Department of Physical Sciences — University of Naples Federico II&lt;br /&gt;Via Cintia — I-80126 Napoli, Italy&lt;br /&gt;&lt;a href="mailto:francesco.gagliardi@libero.it"&gt;francesco.gagliardi@libero.it&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abstract.&lt;br /&gt;&lt;br /&gt;In this paper we outline a methodological similarity between test&lt;br /&gt;driven software development and scientific theories evolution. We argue that&lt;br /&gt;falsificationism and its modus tollens are foundational concepts for both software&lt;br /&gt;engineering and scientific method. In this perspective we propose an epistemological&lt;br /&gt;justification of test driven development using theoretical reasons&lt;br /&gt;and empirical evidences.&lt;br /&gt;&lt;br /&gt;Keywords:&lt;br /&gt;&lt;br /&gt;Software Testing; TDD; Agile Programming; Epistemology; Falsificationism;&lt;br /&gt;Modus Tollens.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Ghezzi, C., Jazayeri, M., Mandrioli, D.: Fundamentals of Software Engineering. 2nd edn.&lt;br /&gt;Prentice-Hall, Englewood Cliffs (2003) (ISBN: 0133056996)&lt;br /&gt;2. Dijkstra, E.W.: Notes On Structured Programming. 2nd edn., T.H.-Report 70-WSK-03,&lt;br /&gt;Technological University Eindhoven, Department Of Mathematics, The Netherlands (1970),&lt;br /&gt;(Url: http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF&lt;br /&gt;3. Popper, K.R.: The Logic of Scientific Discovery (Translation of Logik der Forschung).&lt;br /&gt;Hutchingson, London (1959)&lt;br /&gt;4. Kaner, C., Falk, J., Nguyen, H.Q.: Testing Computer Software, 2nd edn. John Wiley and&lt;br /&gt;Sons, Chichester (1999)   --------------&lt;br /&gt;5. Bach, J.: What software reality is really about. IEEE Computer 32(12), 148–149 (1999),&lt;br /&gt;doi:10.1109/2.809258&lt;br /&gt;6. Pettichord B.: Testers and Developers Think Differently. STQE magazine, vol. 2(1), pp.&lt;br /&gt;42-46 (2000), (Url: http://www.stickyminds.com/sitewide.asp?Function=edetail&amp;amp;Object&lt;br /&gt;Type=ART&amp;amp;ObjectId=506)  --------------------&lt;br /&gt;7. Coutts, D.: The Test Case as a Scientific Experiment. (url: http://www.stickyminds.com/&lt;br /&gt;sitewide.asp?ObjectId=8965&amp;amp;Function=DETAILBROWSE&amp;amp;ObjectType=ART) --------&lt;br /&gt;8. Edwards, S.H.: Using software testing to move students from trial-and-error to reflection-inaction.&lt;br /&gt;SIGCSE Bull. 36(1), 26–30 (2004), &lt;a href="http://doi.acm.org/10.1145/1028174.971312"&gt;http://doi.acm.org/10.1145/1028174.971312&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-------------------------------------------short quotes&lt;br /&gt;&lt;br /&gt;It is proved that an ideal test suite exists for any program, but unfortunately it is&lt;br /&gt;also proved that there is no constructive criterion (i.e. algorithm) to derive a test suite&lt;br /&gt;satisfying that property.&lt;br /&gt;&lt;br /&gt;The incomputability of ideal test suite is the primary cause of the existence of several&lt;br /&gt;empirical criteria to define the test suite such as category partition, boundary&lt;br /&gt;analysis, special values detection, an so on.&lt;br /&gt;&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;This firmly links software development to methodologies of natural sciences and to&lt;br /&gt;epistemology, in particular to theory of falsificationism by Popper. And we need to&lt;br /&gt;adopt this perspective if we want to increase the comprehension of methodology and&lt;br /&gt;practice of software development.&lt;br /&gt;&lt;br /&gt;In this perspective TDD is the unique ‘scientific’ methodology to develop software&lt;br /&gt;systems because it uses the falsificationism and embraces continuous testing.&lt;br /&gt;&lt;br /&gt;Summarizing, the successful of TDD in agile processes is based on the rediscovery&lt;br /&gt;of scientific method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2309931511066188113?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2309931511066188113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2309931511066188113' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2309931511066188113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2309931511066188113'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/12/paper-on-tdd-and-karl-popper.html' title='A Paper on TDD and Karl Popper'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4571737112773650545</id><published>2008-11-23T15:00:00.002-07:00</published><updated>2008-11-23T15:12:35.096-07:00</updated><title type='text'>Read, baby, read</title><content type='html'>It is toward the end of the year, holidays are approaching!&lt;br /&gt;&lt;br /&gt;Looking back, since the end of last year, I have been carrying out my resolution of the journey of going out the box of the software process (being it UP or TDD), and back to the richness of life.&lt;br /&gt;&lt;br /&gt;More readings, not just outside the readings of MS technologies, or, Siebel technologies, or, Unix, Internet. Much more than that. Reading is nice, it is like watching TV or go to theaters or movies. Reading does not need to be a burden, even for non-fictional readings.&lt;br /&gt;&lt;br /&gt;Software engineering is not a "field" or "discipline", it is an inter-disciplinary area. Do not let those process fool you. You can get more useful techniques in philosophy of science (and other areas) than in those theories of software processes.&lt;br /&gt;&lt;br /&gt;Expand our readings. Read, baby, read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4571737112773650545?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4571737112773650545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4571737112773650545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4571737112773650545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4571737112773650545'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/11/read-baby-read.html' title='Read, baby, read'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2057116088972501536</id><published>2008-11-23T14:32:00.002-07:00</published><updated>2008-11-23T14:49:43.501-07:00</updated><title type='text'></title><content type='html'>Another site that with similar recommedatoin of readings.&lt;br /&gt;&lt;br /&gt;It seems that "testers" are deep thinkers, shame on "project managers", "analysts", "architect", "developers",  and "programmers"! -- of course, I am NOT a tester, so, I do not really care about the testing specific things.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.satisfice.com/bibliography.shtml"&gt;http://www.satisfice.com/bibliography.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Systems Thinking&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0932633226/satisinc" target="_blank"&gt;Quality Software Management, Vol. 1: Systems Thinking&lt;/a&gt;&lt;br /&gt;1991, Gerald M. Weinberg&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0932633498/satisinc" target="_blank"&gt;An Introduction to General Systems Thinking&lt;/a&gt;&lt;br /&gt;1975, Gerald M. Weinberg&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0932633013/satisinc" target="_blank"&gt;Secrets of Consulting: A Guide to Giving and Getting Advice Successfully&lt;/a&gt;&lt;br /&gt;1986, Gerald M. Weinberg&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0932633072/satisinc" target="_blank"&gt;General Principles of Systems Design&lt;/a&gt;&lt;br /&gt;1988, Gerald M. Weinberg, Daniela Weinberg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Heuristics&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0205260837/satisinc" target="_blank"&gt;Tools of Critical Thinking&lt;/a&gt;&lt;br /&gt;David A.Levy, 1997&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0932633137/satisinc" target="_blank"&gt;Exploring Requirements: Quality Before Design&lt;/a&gt;&lt;br /&gt;1989, Don Gause, Gerald M. Weinberg&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0691023565/satisinc" target="_blank"&gt;How to Solve It&lt;/a&gt;&lt;br /&gt;1945, George Polya&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0471510041/satisinc" target="_blank"&gt;How to Read and Do Proofs&lt;/a&gt;&lt;br /&gt;1990, Daniel Solow&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ways People Think and Learn&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0262581469/satisinc" target="_blank"&gt;Cognition in the Wild&lt;/a&gt;&lt;br /&gt;1996, Edwin Hutchins&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0521659728/satisinc" target="_blank"&gt;Thinking and Deciding&lt;/a&gt;&lt;br /&gt;1994, Jonathan Baron&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0060903252/satisinc" target="_blank"&gt;Lateral Thinking: Creativity Step by Step&lt;/a&gt;&lt;br /&gt;1990, Ed De Bono&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/1578517087/satisinc" target="_blank"&gt;The Social Life of Information&lt;/a&gt;&lt;br /&gt;2000, John Seely Brown, Paul Duguid&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0201626950/satisinc" target="_blank"&gt;Things That Make Us Smart: Defending Human Attributes in the Age of the Machine&lt;/a&gt;&lt;br /&gt;1993, Donald Norman&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Scientific Thinking&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0262691914/satisinc" target="_blank"&gt;The Sciences of the Artificial, 3rd Ed.&lt;/a&gt;&lt;br /&gt;1996, Herbert A. Simon&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0415043182/satisinc" target="_blank"&gt;Conjectures and Refutations: The Growth of Scientific Knowledge&lt;/a&gt;&lt;br /&gt;1992, Karl Popper&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0262112094/satisinc" target="_blank"&gt;Theory and Evidence: The Development of Scientific Reasoning&lt;/a&gt;&lt;br /&gt;1996, Barbara Koslowski&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0521434610/satisinc" target="_blank"&gt;Abductive Inference: Computation, Philosophy, Technology&lt;/a&gt;&lt;br /&gt;1996, John R. Josephson, Susan G. Josephson&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0738203491/satisinc" target="_blank"&gt;The Pleasure of Finding Things Out&lt;/a&gt;&lt;br /&gt;1999, Richard Feynman&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0750303697/satisinc" target="_blank"&gt;Science as a Questioning Process&lt;/a&gt;&lt;br /&gt;1996, Nigel Sanitt&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0684835827/satisinc" target="_blank"&gt;Administrative Behavior, 4th ed.&lt;/a&gt;&lt;br /&gt;1997, Herbert Simon&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Software Testing&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0471358460/satisinc" target="_blank"&gt;Testing Computer Software&lt;/a&gt;&lt;br /&gt;1992, Cem Kaner, Hung Quoc Nguyen, Jack Falk&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0849308097/satisinc" target="_blank"&gt;Software Testing: A Craftman's Approach&lt;/a&gt;&lt;br /&gt;1995, Paul C. Jorgensen&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0471318264/satisinc" target="_blank"&gt;Bad Software: What to Do When Software Fails&lt;/a&gt;&lt;br /&gt;1999, Cem Kaner, David Pels&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example of an Implicit Specification&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/1556156790/satisinc" target="_blank"&gt;The Windows Interface Guidelines for Software Design&lt;/a&gt;&lt;br /&gt;1995, Microsoft&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Teamwork and Communication in a Technical Team&lt;br /&gt;&lt;a class="document" href="http://www.amazon.com/exec/obidos/ASIN/0932633285/satisinc" target="_blank"&gt;Quality Software Management, Vol. 3: Congruent Action&lt;/a&gt;&lt;br /&gt;1994, Gerald M. Weinberg&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2057116088972501536?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2057116088972501536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2057116088972501536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2057116088972501536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2057116088972501536'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/11/another-site-that-with-similar.html' title=''/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2013966237370812849</id><published>2008-10-18T22:44:00.003-07:00</published><updated>2008-10-18T22:50:37.154-07:00</updated><title type='text'>Karl Popper and Software Engineering</title><content type='html'>Karl Popper and Software Engineering&lt;br /&gt;&lt;br /&gt;I believe now -- 2008, in software engineering, a pure “practitioner” point of view is hitting a dead end. We need an “academic” or conceptual revolution. The revolution is to throw out the inductionism in software engineering. Karl Popper did it in Philosophy of Science. We need to expand that to software engineering.&lt;br /&gt;&lt;br /&gt;In my previous blog, I proposed the following theory:&lt;br /&gt;&lt;br /&gt;“Analysis/Design/Coding/Testing” corresponds to “understanding problems and anomalies/theory/solving issues using the theory/ experiment-test the theory”. Now, I am going to make it even simpler: “Analysis/Design/Coding/Testing” corresponds to “Problems/Theory/Solving Problems using the theory/Testing”.&lt;br /&gt;&lt;br /&gt;You may say, it is just a word-game. I say it is a huge, revolutionary change. Now, "analysis" is to understand problems, not “gathering” those so-called “requirements” anymore! In meetings with users, when we ask “what is the problem” and “how do we solve the problem”, it is always more effective than asking “what are the requirements”! In fact, we all know that “requirement gathering” is the source of all problems in software development. Now, we know why – OK, pun is intended here!&lt;br /&gt;&lt;br /&gt;I googled about it (Karl Popper and Software Engineering). Surprise, Surprise, I am not the only one!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/imtesty/archive/2007/01/15/the-science-of-software-testing.aspx"&gt;http://blogs.msdn.com/imtesty/archive/2007/01/15/the-science-of-software-testing.aspx&lt;/a&gt; A deep thinker in MS!&lt;br /&gt;&lt;br /&gt;The following is a short quote (please go to the above URL for a complete read, it is fun!):&lt;br /&gt;&lt;br /&gt;Testing as a science&lt;br /&gt;Computer software is similar to a scientific hypothesis; both are inherently fallible. The basic framework of the software debugging process is analogous to the trial and error practice that advances scientific hypotheses. Computer software is simply technical conjecture. Test engineers attempt to refute the assumption of flawless software through rigorous tests mostly designed to prove that defects exist (falsification).&lt;br /&gt;&lt;br /&gt;The falsification process sharply contrasts with data-driven approaches such as induction and deduction, which attempt to justify validity based on the repetition of facts. Justificatory approaches mostly attempt to support claims through confirmation. Confirmation primarily endeavors to validate the error-free uncertainty by using specific data that demonstrates proper functionality. This approach clearly only proves that software functions correctly under certain conditions; it does not prove that the software is error free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2013966237370812849?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2013966237370812849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2013966237370812849' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2013966237370812849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2013966237370812849'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/10/karl-popper-and-software-engineering.html' title='Karl Popper and Software Engineering'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5049766384259941581</id><published>2008-10-05T18:39:00.008-07:00</published><updated>2008-10-05T19:28:41.185-07:00</updated><title type='text'>Problem Solving Areas (PSAs), Problem Solving Lean Process (PSLP), Analysis/Design/Coding/Testing and General Problem Solving</title><content type='html'>Problem Solving Areas (PSAs), Problem Solving Lean Process (PSLP), Analysis/Design/Coding/Testing and General Problem Solving&lt;br /&gt;&lt;br /&gt;Ya, you may say that all this blog is about names; but good names indicate the maturity of a theory.&lt;br /&gt;&lt;br /&gt;1. I changed the 8 core "techniques" into 8 core "Problem Solving Areas (PSAs). See the 8 PSAs at the bottom of the blog.&lt;br /&gt;&lt;br /&gt; 2. In this blog, I changed the process name into “problem solving lean process”: it is a lean process, with problem solving in its focus.&lt;br /&gt;&lt;br /&gt;3. I retreat from my noble fighting with “Analysis/Design/Coding/Testing”; now, I believe it is a paraphrase or a parallel mechanism of the “problem solving process”: thinking about problems, a theory, solve issues in the theory, and experiments for the theory. By doing this, I have “saved” the analysis/design/coding/testing, and, more importantly, saved myself from craziness! As a result of this realization, on the one hand, I am now a big fan of the micros-waterfall, because it is the same micro-mechanism of any problem solving processes. On the other hand, I do believe the micro-waterfall is flexible, any step of this micro-waterfall reflects the whole – for example, in analysis, there is testing already.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------8 PSAs&lt;br /&gt;&lt;br /&gt;1. "OR mapping" (including "UOW", Unit of Work, equiv. to Siebel's BO)&lt;br /&gt;2. ("O") "entity": rules in entities, rules engine(******), scripting in entities&lt;br /&gt;3. ("U") "Web2 UI": ("ActiveX" and "Ajax")&lt;br /&gt;4. "Data Binding" ("OU mapping")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. "transaction" (and non-transaction, with "facsades" and "workflows") (business service and workflows, tasks. Also here: "unit testing" ******)&lt;br /&gt;&lt;br /&gt;6. "networking (at application level, as "connected applications")"&lt;br /&gt;--i. async and sync EAI (background) "messaging" for integration and need "user push notification" (activities or an area on every screen)&lt;br /&gt;--ii. batch EIM&lt;br /&gt;--iii. offline web client&lt;br /&gt;--iv. reporting server&lt;br /&gt;7. "logging (that is runtime-configurable)"&lt;br /&gt;8. "security"("authorization" and "authentication")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5049766384259941581?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5049766384259941581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5049766384259941581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5049766384259941581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5049766384259941581'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/10/problem-solving-areas-psas-problem.html' title='Problem Solving Areas (PSAs), Problem Solving Lean Process (PSLP), Analysis/Design/Coding/Testing and General Problem Solving'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1686397318233466537</id><published>2008-08-02T17:30:00.005-07:00</published><updated>2008-08-03T01:38:51.691-07:00</updated><title type='text'>Seven square number of Problem-Solving-Items (PSI)</title><content type='html'>Seven square number of Problem-Solving-Items (PSI)&lt;br /&gt;&lt;br /&gt;What are problem solving items?&lt;br /&gt;&lt;br /&gt;As a first-level approximation, they are requirements + “architecture” requirements.&lt;br /&gt;However, they also include technical design items, source control items, testing items, support items. They include all problems. For details why I put all of them together, please read my previous blogs.&lt;br /&gt;&lt;br /&gt;Of course, we all know that our corporate world does not like the word “problems”, we find all different words for it, “issues”, “challenges”, etc. I do not like those other words, and I like the word “problem” – I like all the honesty, history, weight, and power that go with it. However, I do understand and appreciate the needs from the corporate world; so, I add a positive word with it, and add an “unit” word, hence the phrase, “problem-solving-items”.&lt;br /&gt;&lt;br /&gt;What is the “7-square”?&lt;br /&gt;&lt;br /&gt;Psychology shows that the short memory of human’s brain can only handle 7 items. The optimal is half of it, around 3. That is the reason that when we speak or write, we use 1, 2, 3, or 4, not that often we use more than 4. If we really need to, we re-organize them, make it two levels, 1, 2, 3, under each item, we have a, b, c.&lt;br /&gt;&lt;br /&gt;You may believe it is trivial. I do not believe so. I believe the universe is “consistent” or even “anthropic” – see &lt;a href="http://en.wikipedia.org/wiki/Anthropic_principle"&gt;http://en.wikipedia.org/wiki/Anthropic_principle&lt;/a&gt; . As a result, I believe those 1, 2, 3 things are “consistent” with those “thesis”, “antithesis”, and “synthesis” in Hegel’s philosophy.&lt;br /&gt;&lt;br /&gt;I apologize to drag you into this physics-philosophy-psychology indulgence, that is my weakness; but I am also very practical and pragmatic, so, let’s be back to the real business.&lt;br /&gt;&lt;br /&gt;IT (Information Technology) is about handling large amount of information. Its complexity comes from the large amount of seeming unrelated items. As a result, we have to maximize the capacity of human minds. In short, we have to use 7, not 3; further, we have to use two levels, instead of just one. And use two levels all at once – we have to treat the two levels as if there were one, i.e. we have to treat 49 items all at once, and not make the two levels too restrictive.&lt;br /&gt;&lt;br /&gt;In short, next time you think about IT, just think about “49 PSIs”!&lt;br /&gt;&lt;br /&gt;------------------&lt;br /&gt;There are no categorical differences between the "problem solving" in sciences and that in engineering disciplines.&lt;br /&gt;&lt;br /&gt;Further, the best minds, or, at least best documented best minds, due to the very nature of basic sciences, are not in engineering, but in basic sciences.&lt;br /&gt;&lt;br /&gt;As a result, in addition to Lean literatures, I will resume my love for reading philosophy and history of sciences.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf"&gt;http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://philsci-archive.pitt.edu/archive/00004037/01/The_reductionist_blind_spot-08-05-01-2300.pdf"&gt;http://philsci-archive.pitt.edu/archive/00004037/01/The_reductionist_blind_spot-08-05-01-2300.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://philsci-archive.pitt.edu/view/year/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1686397318233466537?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1686397318233466537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1686397318233466537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1686397318233466537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1686397318233466537'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/08/seven-square-number-of-problem-solving.html' title='Seven square number of Problem-Solving-Items (PSI)'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7401600098522571615</id><published>2008-08-01T12:10:00.002-07:00</published><updated>2008-08-01T12:12:12.747-07:00</updated><title type='text'>Problem Solving Logic-Centric Lean Process (PSLCLP)</title><content type='html'>I believe I am in a creativity storm.&lt;br /&gt;&lt;br /&gt;I believe I found out the problem of all “software processes” and “IT project management”. It is the “inductionism”, we need a “deductionism” paradigm shift just as Karl Popper did in philosophy of science.&lt;br /&gt;&lt;br /&gt;I believe the key is indeed “requirement gathering” – the starting point of the waterfall, it is wrong, everything is wrong.&lt;br /&gt;&lt;br /&gt;We need to replace it with “problem”. The whole thing should be “problem solving”.&lt;br /&gt;&lt;br /&gt;The name of the process should be Problem Solving Logic-Centric Lean Process (PSLCLP), I know, it is long. The key is to remember “problem solving”.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7401600098522571615?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7401600098522571615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7401600098522571615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7401600098522571615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7401600098522571615'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/08/problem-solving-logic-centric-lean.html' title='Problem Solving Logic-Centric Lean Process (PSLCLP)'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-799216615931492215</id><published>2008-08-01T08:21:00.005-07:00</published><updated>2008-08-01T09:34:52.641-07:00</updated><title type='text'>testing, testable, Lean, science, and Occam's razor</title><content type='html'>The effort to apply Lean to software makes me think, very hard.&lt;br /&gt;&lt;br /&gt;It is about the core waterfall, by that I mean: analysis, design, implementation, teat, and deployment.&lt;br /&gt;&lt;br /&gt;I want to eradicate them. To me, those concepts are simply a pretentious way to say that we are working toward a new system.&lt;br /&gt;&lt;br /&gt;TDD is good in the sense that it has already started to break this core waterfall: it says that let’s put aside “analysis, design, coding, and testing”, let’s treat everything as testing – that certainly is disruptive and revolutionary!&lt;br /&gt;&lt;br /&gt;Of course, the problem is that, this revolution concept is mixed and therefore buried or at least eclipsed by other concepts like “stories” -- but that is another story, of course.&lt;br /&gt;&lt;br /&gt;Then, the concept in philosophy of science hits me: “testable".&lt;br /&gt;&lt;br /&gt;Usually we believe software engineering is engineering, and therefore we use metaphors from other engineering. However, perhaps we should think about software more in the terms of science – philosophy of science, logic of science, and logic-psychology of problem solving?&lt;br /&gt;&lt;br /&gt;After all, modern engineering is based on science; and recent science is more and more “big science”, i.e., engineering based science – science of man-made.&lt;br /&gt;&lt;br /&gt;After you cut the fat of the waterfall, we can see some many new things, or, new old things!&lt;br /&gt;&lt;br /&gt;More about why Lean and science: heard about Occam's razor (&lt;a href="http://en.wikipedia.org/wiki/Occam"&gt;http://en.wikipedia.org/wiki/Occam&lt;/a&gt; ). Science is the leanest enterprise by human being!&lt;br /&gt;&lt;br /&gt;some blogs I got when I googled ockham razor and six sigma:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://usercentricea.blogspot.com/2008/05/occams-razor-and-enterprise.html"&gt;http://usercentricea.blogspot.com/2008/05/occams-razor-and-enterprise.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-799216615931492215?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/799216615931492215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=799216615931492215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/799216615931492215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/799216615931492215'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/08/testing-and-testable.html' title='testing, testable, Lean, science, and Occam&apos;s razor'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2722524113639541030</id><published>2008-07-30T11:56:00.003-07:00</published><updated>2008-07-31T09:31:58.718-07:00</updated><title type='text'>How to apply LCLP on Siebel CRM development</title><content type='html'>How to apply LCLP on Siebel CRM development&lt;br /&gt;&lt;br /&gt;It is logic centric; then, what is the logic?&lt;br /&gt;&lt;br /&gt;It is the 8 core techniques, of course – as promised :-) it is all just about re-packaging.&lt;br /&gt;&lt;br /&gt;A little further now though. Because of LCLP, we can justify that we jump on those 8 core techniques directly.&lt;br /&gt;&lt;br /&gt;Because we do it directly, we can immediately split those into a few dozen items.&lt;br /&gt;&lt;br /&gt;Also, “techniques” are too “doer-centric”, so, let’s change it into “special design areas”.&lt;br /&gt;&lt;br /&gt;So, the result of applying LCLP on Siebel CIM development is that we directly jump to a few dozen “special design areas” – the groupings are still those 8 core techniques, of course.&lt;br /&gt;&lt;br /&gt;-----------------examples:&lt;br /&gt;&lt;br /&gt;---- LOV, constrained LOV, static and dynamic, how to make greatParent-parent-child LOV.&lt;br /&gt;&lt;br /&gt;---- State model&lt;br /&gt;&lt;br /&gt;---- ldap/asi adapter: because Siebel does not use a generic database account, so, even we use ldap/asi, we have database accounts. The adapters will help the sync.&lt;br /&gt;&lt;br /&gt;---- …………&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2722524113639541030?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2722524113639541030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2722524113639541030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2722524113639541030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2722524113639541030'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/07/how-to-apply-lclp-on-siebel-cim.html' title='How to apply LCLP on Siebel CRM development'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7489680279826074670</id><published>2008-07-30T11:50:00.003-07:00</published><updated>2008-07-31T09:50:23.240-07:00</updated><title type='text'>LCLP and cheese without fat</title><content type='html'>This is basically a comment I left on:&lt;br /&gt;&lt;a href="http://vikasnetdev.blogspot.com/2008/07/leading-project.html"&gt;http://vikasnetdev.blogspot.com/2008/07/leading-project.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Based on the comments of previous blog, I have to change ALP (architecture-centric Lean Process) to LCLP (Logic-Centric Lean Process, note that I cannot use LLP) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comparing with Lean, I feel TDD or agile is not enough, even I am willing to go along with TDD, since it is the closet we have for now in software industry.&lt;br /&gt;&lt;br /&gt;I would like to remove all the concepts that lead to waterfall. For example, the so called "requirement gathering". It implies a step in the waterfall. Requirement gathering is simply communication with users. I deny the concept of "requirement gathering", because there is no special ways in "requirement gathering" -- comparing with "design" (or, a better wording, "logic"), it is vague, and the faster you can jump on to design, the better. "Requirement gathering" is simply an inefficient or less-than-optimal design. All this means, let's talk about screens flows, screens layout and data entities and related business rules, security, notifications, logging, installation, source control, etc. directly and as technical and specific as users or audience can understand, and with no certain orders other than the necessity of the logic.Cut to the cheese, lean, it is the cheese without fat.&lt;br /&gt;&lt;br /&gt;How do you like that, cheese without fat :-)&lt;br /&gt;&lt;br /&gt;--------------------------A notes on July 31&lt;br /&gt;I know I go to extreme sometimes, that is my weakness – but that is also my strength, by doing that, I get to the bottom of things quickly.&lt;br /&gt;&lt;br /&gt;I am trying to eradicate all waterfall concepts, even just some traces of it. This exposes the needs for order.&lt;br /&gt;&lt;br /&gt;I said that there is “no certain orders other than the necessity of the logic”, the tone is certainly mostly negative. After thinking about it, I know I need to emphasize the positive side of it also.&lt;br /&gt;&lt;br /&gt;The key is, after removing the waterfall, we can see the orders introduced by the “necessity of the logic” more clearly, and therefore, can follow those orders, and do things more efficiently and more effectively.&lt;br /&gt;&lt;br /&gt;Actually, that is the whole point of removing waterfall. Waterfall ordering eclipses the real orders: it oversimplifies things to one dimension.&lt;br /&gt;&lt;br /&gt;This leads to a very counter-intuitive statement: the most harmful situation of waterfall process is actually for large projects, when you cannot simplify things like that, even using many iterations, it simply just does not work.&lt;br /&gt;&lt;br /&gt;Typically, in a mid-to-large sized project, there are a few dozen of “dimensions” (you can “group” them into two or three groups, but those groupings are vague). Experienced team leads or good project managers pick up those dimensions quickly, and follow them up through the whole project.&lt;br /&gt;&lt;br /&gt;Along each dimension, there are pretty clear patterns, and among those dimensions, there are also some vague but useful patterns. Ya, those dimensions and patterns are “technical”, but good leads or project managers do not only know some “project management” terminologies, they are technical enough to know those dimensions and patterns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7489680279826074670?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7489680279826074670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7489680279826074670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7489680279826074670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7489680279826074670'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/07/lclp-and-cheese-without-fat.html' title='LCLP and cheese without fat'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6032656447912744970</id><published>2008-06-22T11:49:00.007-07:00</published><updated>2008-06-22T13:41:55.357-07:00</updated><title type='text'>How to lead a project: the opposite of “waterfall” is “architecture-centric”, not “iterations”</title><content type='html'>How to lead a project&lt;br /&gt;&lt;br /&gt;We must lead a project around the concept of “architecture”: “architecture design”, “high level design”, or “design”. However, note that because “architecture” has too much overloaded meaning, I use the wording “high level design” whenever I can.&lt;br /&gt;&lt;br /&gt;The waterfall concept, that we do software in the order of requirement gathering, analysis, design, coding, testing, deployment, support, is simply wrong. However, the opposite of “waterfall” is “architecture-centric”, not “iterations”. "Iterations" are simply small waterfalls. Many small wrongs do not correct one big wrong. Further, the wrongness about the waterfall concept is not its frigidness; it is its emptiness and pretentiousness – it is its tendency to encourage people to think non-senses – things that cannot add values to the project (its frigidness is actually fine if you can deal with its emptiness and pretentiousness). We need to replace the “waterfall” concept with the concept of the “architecture” and the “dependencies” in the architecture. Note that “architecture” and “dependencies” are very rich concepts.&lt;br /&gt;&lt;br /&gt;1. The project is within a bigger architecture.&lt;br /&gt;2. The project itself has its own internal architecture, or, high level design.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. The high level design of the project has the following parts:&lt;br /&gt;&lt;br /&gt;a. “Functional” (in Siebel, we call it “configuration”). It includes OR mapping and OU mapping (i.e. ORU mapping) and rules. Here we have two important notes:&lt;br /&gt;&lt;br /&gt;(i) functional is part of the architecture. Some people may say that the “functional part” is not part of an architecture design (i.e. high level design). That is not true. OR mapping, OU mapping/binding, and rule engine are certainly parts of an architecture design (high level design); the usage patterns of ORU mapping and rule engine are also part of an architecture design (high level design). It is actually very easy to see -- once we stop seeing things through waterfall glasses, and begin to see things through “architecture-centric” point of view: there is no “requirement gathering” or “analysis”, there are just vague designs, and designs are simply vague or unfinished systems.&lt;br /&gt;&lt;br /&gt;(ii) UI must be easy for automated testing. Some people may say that testing is not part of a high level design. Wrong! Testing is part of the architecture, just as logging is part of the architecture. To ensure that, automated UI testing must be part of the early development.&lt;br /&gt;&lt;br /&gt;b. “Architectural” (in Siebel, we call it “Integration and conversion”). It includes “transaction” (in Siebel, it is BS and WF), “networking (in Siebel, it includes EAI/web service, EIM, offline client, reporting server), logging, and security. Again, an important note here is that automated unit testing is part of a high level design. Here, automated unit testing is included in the concept of “transaction” -- a good high level design should always make it automated unit testable at transaction level.&lt;br /&gt;&lt;br /&gt;c. “Admin”: this can be treated as an extension of b.&lt;br /&gt;&lt;br /&gt;(i) Source control is an extension of automated unit testing; this is because it is through automated unit testing that source control is “attached” to the architecture and therefore must be treated as part of an architecture. Using source control is part of a high level design.&lt;br /&gt;&lt;br /&gt;(ii) In Siebel, when we set up development environment; we need to go through hoops in setting up “offline client”.&lt;br /&gt;&lt;br /&gt;So, here “admin” includes “deployment admin” and “system admin”. Note that by getting into "system admin", I begin to accomplish my new year resolution that I will consolidate my knowledge into a complete vertical stack, bottom up, from hardware, OS, to browser scripting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6032656447912744970?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6032656447912744970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6032656447912744970' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6032656447912744970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6032656447912744970'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/06/how-to-lead-project-opposite-of.html' title='How to lead a project: the opposite of “waterfall” is “architecture-centric”, not “iterations”'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2587564378368560645</id><published>2008-06-12T06:10:00.000-07:00</published><updated>2008-06-12T06:26:33.657-07:00</updated><title type='text'>The differences between ALP and TDD</title><content type='html'>The differences between ALP and TDD&lt;br /&gt;&lt;br /&gt;ALP is architecture-centric. It requires finish architecture design in the first a few days (for most projects), or, a few weeks (for really large projects).&lt;br /&gt;&lt;br /&gt;ALP treats “stories” or “use cases” as vague materials. It directly focuses on three things: (a) the OR mapping -- key concepts (glossary) and (logical) database tables-columns, and (b) the OU mapping (or binding) -- key concepts (glossary) and screens and buttons, and (c) rules – key concepts, screens-buttons, database tables-columns, and business logic, in the contexts of typical scenarios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You may say that TDD can do those things also, or, further, good TDDs do those things also. That is true. The same can be said to RUP. That is why it took me so long to make this explicit. However, I feel it is important to make it explicit, all good processes are alike; however, there are too many bad TDDs and bad RUPs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2587564378368560645?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2587564378368560645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2587564378368560645' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2587564378368560645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2587564378368560645'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/06/differences-between-alp-and-tdd.html' title='The differences between ALP and TDD'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8858462623634957544</id><published>2008-06-06T13:54:00.002-07:00</published><updated>2008-06-06T14:07:11.738-07:00</updated><title type='text'>Architecture-centric Lean Process, ALP</title><content type='html'>The name “Team Capability Model” is not well-known, so, it seems that we have to keep using the word “process” – so, here is a new name for it: Architecture-centric Lean Process, ALP.&lt;br /&gt;&lt;br /&gt;In addition to the content of the concept, I like the name also. It has some tensions built-in (“Lean” usually means less “architecture”), and, it sounds official and formal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8858462623634957544?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8858462623634957544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8858462623634957544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8858462623634957544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8858462623634957544'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/06/architecture-centric-lean-process-alp.html' title='Architecture-centric Lean Process, ALP'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7611381175883969018</id><published>2008-06-01T22:54:00.004-07:00</published><updated>2008-06-06T13:54:33.368-07:00</updated><title type='text'>An Architecture-Driven Team Capability Model</title><content type='html'>After a few years in written form in my notes and in the blog, I believe the “8 core computing techniques” is mature enough to have a more official or formal name, so that it can be used in any documents in the “corporate culture”.&lt;br /&gt;&lt;br /&gt;I put some thought on it; the best way for it to "break in" the corporate culture is to use it as a "capacity model" (note that it is not just a “process” -- it has much more content). Because it is all about architecture, so, it is an architecture-driven capacity model.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. A person’s or a team’s CAPABILITY is determined by its ARCHITECTURE CAPABILITY.&lt;br /&gt;---- I know, this is a peculiar usage of the word “architecture”. Please see below.&lt;br /&gt;&lt;br /&gt;2. A person’s or a team’s ARCHITECTURE CAPABILITY equals:&lt;br /&gt;&lt;br /&gt;“Business knowledge”&lt;br /&gt;+ “Technologies”&lt;br /&gt;+“Processes”&lt;br /&gt;&lt;br /&gt;All of those are elements of architecture:&lt;br /&gt;&lt;br /&gt;(a) “Business Knowledge” simply means (i) OR mapping, (ii) OU mapping, and Rules.&lt;br /&gt;&lt;br /&gt;(b) “Technologies” simply means (i) Transactions (note: capable of unit-testing at this level is like logging, is part of the architecture, it is NOT just a feature of a “process”), (ii) Networks, (iii) Logging, and (iv) Security.&lt;br /&gt;&lt;br /&gt;(c) “Processes” simply means the “order of doing things”, based on the DEPENDENCIES in the architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7611381175883969018?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7611381175883969018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7611381175883969018' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7611381175883969018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7611381175883969018'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/06/architecture-driven-capability-model.html' title='An Architecture-Driven Team Capability Model'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4485980655123639065</id><published>2008-05-13T08:05:00.004-07:00</published><updated>2008-05-13T09:00:49.412-07:00</updated><title type='text'>Lean vs UP or TDD</title><content type='html'>In &lt;a href="http://survic.blogspot.com/2007/12/post-processesontologies-open-eyes-on.html"&gt;http://survic.blogspot.com/2007/12/post-processesontologies-open-eyes-on.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wrote: if you know those (8 core) techniques, you surely already know those "processes". "Processes" is simply experiences you gain when you use those "8 core techniques".&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://survic.blogspot.com/2008/05/use-lean-process-directly-instead-of-up.html"&gt;http://survic.blogspot.com/2008/05/use-lean-process-directly-instead-of-up.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wrote: we should refuse to talk about "software proceess" -- we should use lean process in software directly, instead of UP or even TDD.&lt;br /&gt;&lt;br /&gt;I am now more convinced.&lt;br /&gt;&lt;br /&gt;The key is, being “lean” requires that we must do things as close or direct as possible to where the real values are happening.&lt;br /&gt;&lt;br /&gt;The “8 core techniques” are where the real values are happening.&lt;br /&gt;&lt;br /&gt;So, we should replace all those TDD or UP with 8 core techniques, and call it “lean”.&lt;br /&gt;&lt;br /&gt;You may ask, even we know the content of those 8 core techniques, we need to ask: what category do they belong?&lt;br /&gt;&lt;br /&gt;The answer: they are architecture elements.&lt;br /&gt;&lt;br /&gt;So, a “lean” process means that we deal with architecture elements directly, iteratively and incrementally – which means, as long as you are making progress and you know about it and you can provide hard evidences for it, then, in whatever order, do whatever is necessary.&lt;br /&gt;&lt;br /&gt;Lean process is very different from TDD and UP. Obviously, it is “heavier” then TDD, because it has a “default architecture”, and is totally architecture driven.&lt;br /&gt;&lt;br /&gt;Also, it “includes” or “tolerates” or "consumes" the concepts of “requirements”, “use cases”, etc., because all of those concepts are simply iterations toward “screens and buttons” and “façade methods”. “Testing” is a real concept in “lean”, but that simply because testing is inherently part of the architecture, just like logging is. Note that “lean” is better, because now you always know the context, and know that it can be extremely flexible yet can always focus on the real result. &lt;br /&gt;&lt;br /&gt;It also "includes" or "consumes" DDD – all those mappings (OR and OU) and related rules are DDD, or, you many say that DDD is the iterations toward OR and OU. Again “lean” is better, because you know the context, and you know it can be extremely flexible yet can always focus on the real result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4485980655123639065?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4485980655123639065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4485980655123639065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4485980655123639065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4485980655123639065'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/lean-vs-up-or-tdd.html' title='Lean vs UP or TDD'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8516995122500067022</id><published>2008-05-03T14:41:00.008-07:00</published><updated>2008-05-11T18:00:00.560-07:00</updated><title type='text'>Dynamics and ontology of blogging</title><content type='html'>I use blogging as a notes-taking mechanism. Doing it this way helps me to separate private details from the issues themselves immediately. It makes my thinking more objective; makes me continuously theorizing, and hence think continuously.&lt;br /&gt;&lt;br /&gt;I blog on technical, medicine, business, and culture topics.&lt;br /&gt;&lt;br /&gt;The above line is an example of "immediate theorizing". On the one hand, the above line reminds me that I have a few blogs; so, it serves the function of notes taking. On the other hand, it makes me think about the classification/ontology of blogging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8516995122500067022?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8516995122500067022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8516995122500067022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8516995122500067022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8516995122500067022'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/dynamics-of-blogging-and-handset.html' title='Dynamics and ontology of blogging'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4349650211944459723</id><published>2008-05-03T13:03:00.004-07:00</published><updated>2008-05-11T17:01:08.538-07:00</updated><title type='text'>State of the handhelds</title><content type='html'>1) Why I am interested in it?&lt;br /&gt;&lt;br /&gt;A new wave of computer innovation is coming, and handheld is a key component.&lt;br /&gt;&lt;br /&gt;More specifically, handheld devices have reached to the power that they are more powerful than a PC when PC took off. GPS, mobile email and calendar, phone, camera, instant messaging, mobile web, mobile office productivity -- you think and get feedback and write down anytime and anywhere -- your brain is always active and more importantly, at peak level. Soon voice , handwriting, and imaging processing will enhancing them, then, we will have the equivalent of "office" for "general site automation".&lt;br /&gt;&lt;br /&gt;To maintain a wide perspective, we should keep it in mind that there is an academic field, HCI (human computer interface), for handheld development. Also, there is a few high tech fields related to handheld: "put viewing devices on glasses",&lt;br /&gt;"multi-touch screen", "voice, handwriting, and imaging processing", "natural language processing".&lt;br /&gt;&lt;br /&gt;2) In general, there are two technologies: one is touch screen (palm, apple), one is physical keyboard (blackberry).&lt;br /&gt;&lt;br /&gt;Note that perhaps we should talk about human needs first. However, from HCI point of view, human needs and technologies are a hen-egg relations. You may say that needs are the mother of all innovations. However, do no forget human body and behaviors are themselves "build-in technology systems"!&lt;br /&gt;&lt;br /&gt;We put technologies first here, for a simple "shallow" reason: because there are only two of them for now, it is easier to introduce them, and we can use the concepts in the discussion of human needs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) There are many levels of input need. Depending on the technologies, you can have different separations. For easier thinking and comparison, we always try to force a "canonical" level system.&lt;br /&gt;&lt;br /&gt;Note that we only talk about the "write" side; the "read" side is easy from HCI design perspective.&lt;br /&gt;&lt;br /&gt;A. No-hand (driving on local streets): voice processing is the key here.&lt;br /&gt;&lt;br /&gt;B. One-hand (driving in highway, walking in familiar area; this can further divided into left hand and right hand): I am very surprised that it seems that very few people think about this explicitly. This is a very important category; it should be buried in category C (below) or category A.&lt;br /&gt;&lt;br /&gt;C. Two-hands but in constraint space or other environmental resources, by thumb typing, and handwriting. Note that thumb typing can do a lot – actually the draft of this blog was written by thumb typing. However, handwriting can do even more – it is almost a shame that after more than 30 years large scale use of computers, the main input method is still typewriter technology – the keyboard. It is possible that handwriting and voice processing will make breakthrough via handheld.&lt;br /&gt;&lt;br /&gt;Note that this seems to be the major focus for blackberry. You can make a sub-division by slide-keyboard. For iPhone, it is between B and C.&lt;br /&gt;&lt;br /&gt;D. Two-hands optimal. In this category, flexible or folding keyboard is the way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4349650211944459723?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4349650211944459723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4349650211944459723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4349650211944459723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4349650211944459723'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/state-of-handheld.html' title='State of the handhelds'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3012398363145722188</id><published>2008-05-02T14:34:00.004-07:00</published><updated>2008-05-11T17:14:57.406-07:00</updated><title type='text'>Silverlight, JSON, and Entity Framework and .net Being the Primary Enterprise Platform</title><content type='html'>Silverlight, JSON, and Entity Framework and .net Being the Primary Enterprise Platform&lt;br /&gt;&lt;br /&gt;JSON support is ready.&lt;br /&gt;&lt;br /&gt;Silverligiht is coming.&lt;br /&gt;&lt;br /&gt;Entity Framework: it is more complicated. Perhaps it is not as good as the java-port, nhibernate, just like springframework and other things (for one thing, EF uses code generation approach -- ugly thing, isn't it). However, the key is, the official, recommended architecture on .net is exactly the same as lightweight Java's.&lt;br /&gt;&lt;br /&gt;Soon .Net will surpass Java/javascript.&lt;br /&gt;&lt;br /&gt;However, the power of silverlight is that it is cross platform. I hope Linux world can take advantage of this -- however, regardless Linux/Windows, Java is now officially behind.&lt;br /&gt;&lt;br /&gt;Silverlight marks the start of the end – now, .net can begin to claim that it is a superior platform. We are seeing a historical turning point.&lt;br /&gt;&lt;br /&gt;A dominating platform that is not open-source based, it is very scary – it is not that I am brain-washed by open-source arguments, it is my real world many years experience: companies come and go, if you do not have source code, it is trouble.&lt;br /&gt;&lt;br /&gt;You may say, that is only for application level. For system level, it is OK that you do not have source code. Actually, for many years, java VM is not open source. I have to agree.&lt;br /&gt;&lt;br /&gt;However, I have to say that considering our dependency on computers, it is still scary; too much is at stake. I seriously believe that eventually the governments will do something to guarantee some healthy competition between open source and MS.&lt;br /&gt;&lt;br /&gt;All in all, while I will continue to pay attention to Linux (and Unix in general), open-source C/C++, and Java, I have to say that perhaps we should welcome the fact that .net is going to be better than java (java is going to be the underdog), from now on, especially this accompanies that fact that M$ is adopting, encouraging, and enforcing a more and more non-mort culture.&lt;br /&gt;&lt;br /&gt;I do not regret entering into .net -- after all those years, finally I can brag about it to my Java colleague.&lt;br /&gt;&lt;br /&gt;You may say, is it even possible that M$ is enforcing a non-mort culture? I believe so. It is to the best interest of MS. It is called segmentation of markets. M$ will certainly keep its low end, mort market. However, it will also establish its high end market. The key is that its key selling point is that its high-end market is a continuum of its low end market. Another key point is that high end must lead low end – this is a technical necessity – it seems that M$ finally gets this, just recently: you can simplify a good system to make it easier, but it is a technical impossible that you “complexify” a bad system to make it good. So, more accurately, combining the two key points together: M$’s key selling point is that M$’s low end market is the continuation of its high end market.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3012398363145722188?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3012398363145722188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3012398363145722188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3012398363145722188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3012398363145722188'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/three-marks-that-m-surpasses.html' title='Silverlight, JSON, and Entity Framework and .net Being the Primary Enterprise Platform'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7282724506086876055</id><published>2008-05-02T13:20:00.004-07:00</published><updated>2008-05-11T17:15:46.289-07:00</updated><title type='text'>REST and data</title><content type='html'>Here is my previous blog about REST: http://survic.blogspot.com/2007/08/rest-web-service-is-all-about-data-or.html#links&lt;br /&gt;&lt;br /&gt;I wish I could say that I wrote my blog before all of those:&lt;br /&gt;&lt;br /&gt;http://www.redmonk.com/cote/2007/04/30/microsofts-rest-moves-project-astoria/&lt;br /&gt;http://astoria.mslivelabs.com/Default.aspx&lt;br /&gt;http://blogs.msdn.com/pablo/&lt;br /&gt;http://blogs.msdn.com/astoriateam/archive/2008/04/24/using-rest-services-in-silverlight.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7282724506086876055?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7282724506086876055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7282724506086876055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7282724506086876055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7282724506086876055'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/rest-and-data.html' title='REST and data'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4393308966714680916</id><published>2008-05-01T09:32:00.001-07:00</published><updated>2008-05-01T09:36:48.093-07:00</updated><title type='text'>Use lean process directly, instead of UP or even TDD</title><content type='html'>Vikas's insight on lean process and TDD is wonderful. We need to apply "lean", "6-sigma", etc. to "software process".  &lt;br /&gt;&lt;br /&gt;Further, because there are so much baggage in "software process", I (tentatively) suggest that we should refuse to talk about "software proceess" -- we should use lean process in software directly, instead of UP or even TDD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4393308966714680916?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vikasnetdev.blogspot.com/2008_01_01_archive.html' title='Use lean process directly, instead of UP or even TDD'/><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4393308966714680916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4393308966714680916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4393308966714680916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4393308966714680916'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/use-lean-process-directly-instead-of-up.html' title='Use lean process directly, instead of UP or even TDD'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1292850960427720814</id><published>2008-05-01T08:54:00.009-07:00</published><updated>2008-05-11T17:27:23.226-07:00</updated><title type='text'>MS and Morts: lightweight.java and alt.net</title><content type='html'>My friend Vikas has a good post about a also-very-good-post about an interesting post (click the links, you will know what I am talking about!):&lt;br /&gt;&lt;br /&gt;http://vikasnetdev.blogspot.com/2008/04/is-microsofts-mvc-is-going-to-be.html&lt;br /&gt;&lt;br /&gt;My comments:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. It is indeed a tipping point, historical moment for MS!&lt;br /&gt;Even it is too little too late, especially too late, almost 10 years late, in Internet time.&lt;br /&gt;&lt;br /&gt;I do love silverlight though; it is definitely next-gen-ajax.&lt;br /&gt;&lt;br /&gt;Because we have ajax-and-next-gen-Ajax (silverlight), although you may say MS's ajax is part of asp, but that misses the point: ajax makes traditional asp irrelevant. As a result, asp's MVC is less relevant -- Ajax/silverlight makes the previously-official-asp irrelevant, it gives Alt.net a huge opportunity.&lt;br /&gt;&lt;br /&gt;2. MS is distancing from morts -- for that, I love MS -- it is innovating.&lt;br /&gt;&lt;br /&gt;3. Alt.net is basically following lightweight.java -- I certainly do not mean to insult alt.net people; they are doing creative work now, and will surpass java soon.&lt;br /&gt;&lt;br /&gt;Note that I am using alt.net as a concept, not a community, as a result, Spring.net and NHibernate are certainly part of alt.net -- conceptually speaking -- but I am not sure whether all people in spring.net and nhibernate are in the community of "alt.net".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1292850960427720814?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1292850960427720814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1292850960427720814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1292850960427720814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1292850960427720814'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/05/ms-is-killing-morts-lightweightjava-and.html' title='MS and Morts: lightweight.java and alt.net'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2602526249388415880</id><published>2008-03-15T21:30:00.005-07:00</published><updated>2008-05-11T16:56:08.184-07:00</updated><title type='text'>Expand perspective in two directions: higher level (Siebel/Javascript) and low level (hardware/C/C++)</title><content type='html'>Expand perspective in two directions: higher level (Siebel/Javascript) and low level (hardware/C/C++) and therefore forget about all fat “processes”&lt;br /&gt;&lt;br /&gt;A. I will be in Siebel space for a while, while this is happening, my plan is to have an integrated perspective of enterprise computing, from bottom to up.&lt;br /&gt;&lt;br /&gt;Yes, this means I want to go back to the root of computing: the hardware. I want to pay more attention to handset, games, and, Linux. I want to refresh my Linux C/C++, and system administration and protocols, and then, get a little bit .Net on Linux.&lt;br /&gt;&lt;br /&gt;I will keep using .net, because silverlight is so attractive; but I will pay more attention to Linux-based things, simply because they are open source, and I have an open way to hardware.&lt;br /&gt;&lt;br /&gt;In short, for me, it is time to "merge" C/C++ (shell, perl), java, C# (VB), Javascript (perl) together – they are all C family anyway. Note that Siebel (and Ajax) will improve my javascript to a "serious professional" level. Also note that although I am gradually moving far and far away from perl and VB; however, because javascript is a scripting language (for Siebel, javascript is a server side scripting, exactly like perl!) and perl-like regular expressions are now in all modern languages, I can pickup perl anytime. As for VB -- as long as I keep C#, I can certainly re-pick up VB anytime.&lt;br /&gt;&lt;br /&gt;By doing this, I will feel more “solid” when I do the programming in C#/Java/Javascript.&lt;br /&gt;&lt;br /&gt;B. I will introduce Siebel techniques to spring:&lt;br /&gt;&lt;br /&gt;1. OR mapping extensively: this is already in spring-hibernate, but Siebel's way adds more discipline and systematic taste. This also include OX mapping – xml to object mapping, and web services.&lt;br /&gt;&lt;br /&gt;2. OU mapping -- databinding ideas: Siebel's databinding is strict and thorough.&lt;br /&gt;&lt;br /&gt;3. Extensive use of rule engine. Again, this is not really originated from Siebel, but Siebel 8 makes it happen.&lt;br /&gt;&lt;br /&gt;4. Event, security, transaction, logging etc. I will introduce some good ideas and practices as the usage patterns for spring's AOP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2602526249388415880?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2602526249388415880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2602526249388415880' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2602526249388415880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2602526249388415880'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/03/carrying-out-designplan-of-becoming.html' title='Expand perspective in two directions: higher level (Siebel/Javascript) and low level (hardware/C/C++)'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5417496804644497784</id><published>2008-01-25T10:49:00.002-07:00</published><updated>2008-05-11T17:53:03.511-07:00</updated><title type='text'>new version of 8 core techniques and rules</title><content type='html'>I added marks (******) next to rules and unit testing. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rules are important, and rules are the essence in OR mapping/OU mapping. There are two reasons:&lt;br /&gt;&lt;br /&gt;a. Nowadays mappings are easy. OR/OU mappings are "assumed". They are just the "basics" (so, VB/C# guys, learn OR now! java guys, learn OU now!). As a result, the focus is "rule engine": the extent of "rule engine", and how to use "rule engine with those mappings". In short, nowadays, when you talk about rules, you already assume there they are based on OR/OU mappings.&lt;br /&gt;&lt;br /&gt;b. More importantly, I noticed that users care much less about those "mappings" (a.k.a. "glossary", "domain model") than "rules". As a result, I feel it is better to use "rules" as the subtitle, instead of "mappings". I am effectively using a more "use-case-oriented" item to represent the "domain model" section -- it is not "fair" to the "domain model" section, however, this way is more effective for communications with users. Again, although "rules" has a lot of "use case" characteristics, I put it under "domain model" section, because it also relates to domain model very closely, further, I use it to represent the whole section. The key that I can do this is that modern (i.e. OO based) rule engine usage always has a very strong requirement on a clear OO model, as a result, in real work, you do tend to mix rules with OO domain models.&lt;br /&gt;&lt;br /&gt;-------------------------------------------&lt;br /&gt;-------------------------------------------&lt;br /&gt;(Note: I merged "logging" together with aop logging, and moved it to aop logging)&lt;br /&gt;&lt;br /&gt;1. "OR mapping" (including "UOW", Unit of Work, equiv. to Siebel's BO) &lt;br /&gt;&lt;br /&gt;(Note: I moved UI here; I added two new items to it, to expand the concept of OU mapping: "O", "OUmapping")&lt;br /&gt;&lt;br /&gt;2. ("O") "entity": rules in entities, rules engine(******), scripting in entities&lt;br /&gt;&lt;br /&gt;3. ("U") "Web2 UI": ("ActiveX" and "Ajax")&lt;br /&gt;&lt;br /&gt;4. "Data Binding" ("OU mapping")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. "transaction" (and non-transaction, with "facsades" and "workflows") (business service and workflows, tasks)&lt;br /&gt;----------(I merged "unit testing" (******) together with "transaction")&lt;br /&gt;&lt;br /&gt;6. "networking (at application level, as "connected applications")"&lt;br /&gt;--i. async and sync EAI (background) "messaging" for integration and need "user push notification" (activities? or an area on every screen???)&lt;br /&gt;--ii. batch EIM&lt;br /&gt;--iii. offline web client&lt;br /&gt;--iv. reporting server&lt;br /&gt;&lt;br /&gt;7. "logging (that is runtime-configurable)"&lt;br /&gt;&lt;br /&gt;8. "security"("authorization" and "authentication")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5417496804644497784?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5417496804644497784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5417496804644497784' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5417496804644497784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5417496804644497784'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2008/01/new-version-of-8-core-techniques-and.html' title='new version of 8 core techniques and rules'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5021061479857005815</id><published>2007-12-29T23:49:00.000-07:00</published><updated>2007-12-30T12:21:42.982-07:00</updated><title type='text'>why Android now? 10 million $</title><content type='html'>http://code.google.com/android/adc.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5021061479857005815?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5021061479857005815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5021061479857005815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5021061479857005815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5021061479857005815'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/12/why-android-now-10-million.html' title='why Android now? 10 million $'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2544285405523615115</id><published>2007-12-29T22:24:00.002-07:00</published><updated>2008-05-11T18:04:34.434-07:00</updated><title type='text'>Companies and OS's for handhelds</title><content type='html'>current companies and OS's for handhelds:&lt;br /&gt;&lt;br /&gt;Apple, Microsoft, Nokia, RIM, Palm&lt;br /&gt;OS X, Windows Mobile, Symbian, BlackBerry, Palm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2544285405523615115?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2544285405523615115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2544285405523615115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2544285405523615115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2544285405523615115'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/12/current-companies-and-oss-for-handsets.html' title='Companies and OS&apos;s for handhelds'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7917788197433954197</id><published>2007-12-29T21:49:00.001-07:00</published><updated>2008-05-11T16:44:42.756-07:00</updated><title type='text'>post-processes/ontologies: open eyes on technologies, economies, and politics</title><content type='html'>technologist, technology analyst, economist, and political analyst&lt;br /&gt;&lt;br /&gt;After my previous blogs, I found that I began to see many things differently. It is not easy to summarize all those changes of mind and heart, so, I just put those job titles here.&lt;br /&gt;&lt;br /&gt;Note that it is not just "processes" and "ontology" anymore, it is much "thick" now. I now believe the concept of "processes" misses the point. Ya, "processes" are important, but if you know those (8 core) techniques, you surely already know those "processes". "Processes" is simply experiences you gain when you use those "8 core techniques".&lt;br /&gt;&lt;br /&gt;As for "ontology", they are extremely important; there is another phrase, "methodological analysis". Here, just like the concept of "ontology" in both computer science and philosophy, "methodological" can be interpreted as both the concept of "process" in software engineering, and a concept in philosophy that is in parallel with "metaphysical" and "epistemological". Combining "ontology" and "methodological analysis", you have all the conceptual tools to tackle any issues in our information age.&lt;br /&gt;&lt;br /&gt;I know, all those sounds abstruse and philosophical. That is indeed the exact point I want to make next: they are important, but too abstract, for everyday thinking. To really apply "ontology" and "methodological analysis", we need concrete "examples", hence all those job titles -- we need to open our eyes, on technologies, economies, and politics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7917788197433954197?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7917788197433954197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7917788197433954197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7917788197433954197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7917788197433954197'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/12/post-processesontologies-open-eyes-on.html' title='post-processes/ontologies: open eyes on technologies, economies, and politics'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6109216683449919799</id><published>2007-12-27T16:37:00.001-07:00</published><updated>2008-05-11T16:38:58.200-07:00</updated><title type='text'>it is time for handhelds and games -- Google's Android now and Wii later</title><content type='html'>----------excerpt from http://blogs.sun.com/jag (I hope it is "reasonable use"; also, take a look of the "Cell phones in Japan": it is amazing, but I cannot cut/paste it here, please go to James Gosling's blog!)&lt;br /&gt;&lt;br /&gt;One of the games was a bowling game that you play roughly the same way that you'd use a Nintendo WII: you hold the phone as though it's a bowling ball, and you go through the motions of throwing the ball. You use a button press to release the ball. When this happens, it does the physics. But the phone doesn't have accelerometers to measure how you move the phone. They used one of the most glorious hacks I've seen in years: images are captured by the camera as you swing it in your hand, which are then analysed and correlated and motion vectors are computed from the interframe deltas.&lt;br /&gt;-------------------------&lt;br /&gt;&lt;br /&gt;Note: as you will see in the following, this is not M$ vs Java, it is much broader, although the core is the same, as always.&lt;br /&gt;&lt;br /&gt;It is time to expand software development vision to devices and games, for example blackberry (and other "handhelds") and wii.&lt;br /&gt;&lt;br /&gt;I mentioned blackberry in my previous blog. To reflect the light of holidays, I should have mentioned games also, e.g. wii. Sorry, I do not like Xbox, and I do not like playstation; I feel "pure computer game" is too boring, I like "physical" game.&lt;br /&gt;&lt;br /&gt;My deep believe is that serious computing is enterprise computing, even they look not that exciting or "high tech", in reality, they are the real high tech stuff. However, now I believe it is time to deal with handhelds and games. They are "connected" of course: handhelds need enterprise system, and although/while it is not clear how games can be "incorporated" into the corporate world, there is clearly some effort to integrate wii into the web.&lt;br /&gt;&lt;br /&gt;As I indicated in my previous blog, the keys are (a) they are massive market now; (b) the devices are powerful enough so that we can leverage PC experiences.&lt;br /&gt;&lt;br /&gt;It is interesting to compare iphone (real product now) and gphone (conceptware) and Android (google), you can see the positive and negative sides of Apple and Google.&lt;br /&gt;&lt;br /&gt;I noticed that Apple is also in the process of opening iphone to 3rd party software.&lt;br /&gt;&lt;br /&gt;http://arstechnica.com/news.ars/post/20071105-its-official-google-announces-open-source-mobile-phone-os-android.html&lt;br /&gt;Google is leading its way or catching up (depending your point of view; it is a significant thing regardless which view you take).&lt;br /&gt;&lt;br /&gt;Again, the keys are that (this time I put it in one sentence) the java dream that ubiquitous devices and network applications in the hands of the mass is finally coming; there are killer applications (GPS is one of them, I believe camera/scanner is also one of it, and barcode and RFID technologies).&lt;br /&gt;&lt;br /&gt;What do all those things mean?&lt;br /&gt;&lt;br /&gt;All those things make you think -- we need to broaden our perspective.&lt;br /&gt;&lt;br /&gt;In the past, I did that to my 8 techniques: the first step is to expand the 8 techniques to "business processes", and then, "ontology". They are all fine (but I am now putting less and less emphasis on formal processes -- I am more and more convinced that they are simply flexible applications of 8 techniques, nothing more). However, I did not put the dreams of AI and device network (drones of the borg ;-) in the picture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6109216683449919799?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6109216683449919799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6109216683449919799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6109216683449919799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6109216683449919799'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/12/ubiquitous-devices-and-network.html' title='it is time for handhelds and games -- Google&apos;s Android now and Wii later'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2171692467264537557</id><published>2007-12-22T19:24:00.001-07:00</published><updated>2008-05-11T16:14:46.741-07:00</updated><title type='text'>time to invest in handheld software development?</title><content type='html'>Now, handhelds are inexpensive enough to be interesting to the mass.&lt;br /&gt;Also, they are now powerful enough that they are close to PC (or Apple) computers, so that we can leverage the PC/Apple software experiences.&lt;br /&gt;&lt;br /&gt;I anticipate that within a few years, everyone will have a PDA, with real key board, GPS, camera/scanner, OCR, recorder, voice recognition.&lt;br /&gt;&lt;br /&gt;I will begin to look into handhelds. Basically, they should be just like a PC/Apple 10 or 15 years ago, the only difference is that they are smaller and portable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2171692467264537557?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2171692467264537557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2171692467264537557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2171692467264537557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2171692467264537557'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/12/time-to-invest-in-pda-software.html' title='time to invest in handheld software development?'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2015264027231891573</id><published>2007-11-22T18:41:00.001-07:00</published><updated>2008-05-11T17:41:22.871-07:00</updated><title type='text'>new 8 core concepts, with or without Siebel</title><content type='html'>This is a major update! I changed the order a little, to reflect Siebel thinking, and OR/OU mapping/binding thinking.&lt;br /&gt;-------------------------------------------&lt;br /&gt;-------------------------------------------&lt;br /&gt;&lt;br /&gt;(Note: I merged "logging" together with aop logging, and moved it to aop logging)&lt;br /&gt;1. "OR mapping" (including "UOW", Unit of Work, equiv. to Siebel's BO) &lt;br /&gt;&lt;br /&gt;(Note: I moved UI here; I added two new items to it, to expand the concept of OU mapping: "O", "OUmapping")&lt;br /&gt;2. ("O") "entity": rules in entities, rules engine, scripting in entities&lt;br /&gt;3. ("U") "Web2 UI": ("ActiveX" and "Ajax")&lt;br /&gt;4. "Data Binding" ("OU mapping")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. "transaction" (and non-transaction, with "facsades" and "workflows") (business service and workflows, tasks)&lt;br /&gt;----------(I merged "unit testing" together with "transaction")&lt;br /&gt;&lt;br /&gt;6. "networking (at application level, as "connected applications")"&lt;br /&gt;&lt;br /&gt;--i. async (it uses direct also) EAI (background) "messaging" for integration and need "user push notification" (activities? or an area on every screen???)&lt;br /&gt;&lt;br /&gt;--ii. batch EIM&lt;br /&gt;&lt;br /&gt;--iii. offline web client&lt;br /&gt;&lt;br /&gt;--iv. reporting server&lt;br /&gt;&lt;br /&gt;7. "logging (that is runtime-configurable)"&lt;br /&gt;&lt;br /&gt;8. "security"("authorization" and "authentication")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2015264027231891573?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2015264027231891573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2015264027231891573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2015264027231891573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2015264027231891573'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/11/new-8-core-concepts-for-siebel-and-for.html' title='new 8 core concepts, with or without Siebel'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1150933444338630677</id><published>2007-11-17T23:18:00.000-07:00</published><updated>2007-11-18T01:24:39.338-07:00</updated><title type='text'>Mashing up integration UI, service UI, and application UI -- the final reason why web is better than smart client and hence ajax is the key</title><content type='html'>Mashing up integration UI, service UI, and application UI -- the final reason why web is better than smart client and hence ajax is the key. &lt;br /&gt;&lt;br /&gt;First of all, application UI means application itself!&lt;br /&gt;&lt;br /&gt;As I pointed out in my previous posts, webmethods' philosophy is interesting but perhaps too radical: we should put application UIs in integration platform (e.g. webmethods), instead of application platform (e.g. M$'s Visual Studio). &lt;br /&gt;&lt;br /&gt;I put some thinking about it. Actually, this does not need to be that either/or. As long as you use web, it is just a link away. So, I guess webmethods's philosophy is indeed unnecessarily radical. As long as it is web, who cares. &lt;br /&gt;&lt;br /&gt;However, webmethods's philosophy does make it clear that web is the key; further, in order to make it interactive, you need to use ajax.&lt;br /&gt;&lt;br /&gt;This also means, "service architecture" and "application architecture" are the same thing, exactly identical, synonym.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1150933444338630677?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1150933444338630677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1150933444338630677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1150933444338630677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1150933444338630677'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/11/mashing-up-integration-ui-service-ui.html' title='Mashing up integration UI, service UI, and application UI -- the final reason why web is better than smart client and hence ajax is the key'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7355838505713858074</id><published>2007-11-17T21:51:00.001-07:00</published><updated>2008-05-11T16:05:25.852-07:00</updated><title type='text'>Getting deeper into Siebel while keeping everything in perspective</title><content type='html'>Getting deeper into Siebel while keeping everything in perspective&lt;br /&gt;&lt;br /&gt;I am getting deeper into Siebel.&lt;br /&gt;&lt;br /&gt;My focus is EIM ("Enterprise Integration Manager", Siebel's name for batched based integration, including the launch-eve initial data load) and EAI ("Enterprise Application Integration", for Siebel, it specifically means non-batch based integration).&lt;br /&gt;&lt;br /&gt;This focus is good for me, because I tend to be curious (or ambitious -- or whatever) about the whole thing ("architecture" or whatever name you use to refer the holistic view).&lt;br /&gt;&lt;br /&gt;To avoid getting lost in details, I need to set up the context so that the context will tell me the directions.&lt;br /&gt;&lt;br /&gt;The "context" must be "native" to Siebel, as a result, "spring" is no good: I cannot mention "spring" to Siebel architects, or any Siebel experts in general. In the context of 5th-level-platform, techniques in 4th-level or 3th-level platform are not received.&lt;br /&gt;&lt;br /&gt;However, some abstract concepts can be tolerated. for example, AOP and OR mapping. Also, Siebel experts can certainly tolerate concepts already used in Siebel, for example, UI-O mapping (data binding), rules engine, and workflows.&lt;br /&gt;&lt;br /&gt;So, the rule is: do not use "spring" to talk about Siebel; however, do insist on using abstract concepts to talk about Siebel. I will update those items often, until they are stable -- I believe those are the keys for learning and applying Siebel. They are the base of my contributions to the design and spec of all Siebel activities.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"OR mapping" (including "UOW", Unit of Work, equiv. to Siebel's BO)&lt;br /&gt;"Web2 UI": ("ActiveX" and "Ajax")&lt;br /&gt;"Data Binding" ("OU mapping")&lt;br /&gt;--&lt;br /&gt;"aop entity rules": rules engine and other rules in entities (BC)&lt;br /&gt;"aop scripting" (synonym for AOP in general, both entity and facade -- scripting is injected by AOP)&lt;br /&gt;---------&lt;br /&gt;"aop security"("authorization" and "authentication")&lt;br /&gt;"aop logging"&lt;br /&gt;"aop transaction" (more precisely, non-transaction, workflows)&lt;br /&gt;"aop network" batch EIM and async EAI (background) "messaging" for integration and need "user push notification" (activities? or an area on every screen???)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The key is that for integration purpose, we need a common conceptual ground -- if we cannot even have a common "conceptware", how can we have a common software!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7355838505713858074?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7355838505713858074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7355838505713858074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7355838505713858074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7355838505713858074'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/11/getting-siebegetting-deeper-into-siebel.html' title='Getting deeper into Siebel while keeping everything in perspective'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3391899281468501996</id><published>2007-10-31T13:07:00.000-07:00</published><updated>2007-10-31T13:33:57.239-07:00</updated><title type='text'>EDA/ESB is SOA2: Why fine-grained SOA is good and ESB-based UI is good</title><content type='html'>EDA/ESB is SOA2: Why fine-grained SOA is good and ESB-based UI is good&lt;br /&gt;&lt;br /&gt;------SOA2: As I pointed out in my previous blog, the key of SOA is nothing but EDA/ESB/MOM. As a result, we should say that all those SOA hypes are just "warming-up round, or, round 1" of SOA. The real SOA, i.e., SOA2, is EDA/ESB/MOM.&lt;br /&gt;&lt;br /&gt;ESB is MOM with a "service" interface, instead of "proprietary" interface (e.g. JMS. Note that JMS is a standard; however, it is too narrow, so, it is "proprietary" in the big schema of things). &lt;br /&gt;&lt;br /&gt;------Fine-grained SOA: because at ESB level, we can do so many things, for free. So, we should make service fine-grained, that is, as fine grained as practically possible. Will that slow down things, like early days of COM or EJB? Ya, but that is where "practically possible" counts. &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;------ESB-based UI: Some ESB vendors (e.g. Webmethods) put UI support above ESB. It is a powerful concept; we should discard "proprietary UI" (M$'s VS or Java IDEs; of course, except the ones with ESB-based UI -- e.g., Webmethods uses Eclipse for its ESB-based UI), and replace them with ESB-based UI.&lt;br /&gt;&lt;br /&gt;(a) Advanced web2/Ajax based controls for free (if you buy the product, of course!).&lt;br /&gt;(b) It makes look-and-feel more consistent. &lt;br /&gt;(c) It enforces SOA: you have to use SOA2 now. &lt;br /&gt;&lt;br /&gt;(d) However, note that a good ESB can support using proprietary UI, and still provide all ESB benefits. Actually, it is more an issue of the IDE of the proprietary UI: you can put the service in ESB, and then, in your proprietary UI, you call the API from the ESB. As you can see, there is no reason not using ESB-based UI!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3391899281468501996?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3391899281468501996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3391899281468501996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3391899281468501996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3391899281468501996'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/10/soa2-is-edaesb-why-fine-grained-soa-is.html' title='EDA/ESB is SOA2: Why fine-grained SOA is good and ESB-based UI is good'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1982457110119973796</id><published>2007-10-28T19:08:00.000-07:00</published><updated>2007-10-28T19:59:23.170-07:00</updated><title type='text'>SOA, EDA, JMS, ESB, webmethods</title><content type='html'>SOA, EDA, JMS, ESB, webmethods&lt;br /&gt;&lt;br /&gt;The real deal of SOA is not XML, contracts etc. crap. The real deal of SOA is JMS (MQSeries etc). Messaging is fine, but people say email is messaging, and also all other web service as messaging. You can say async messaging, but in JMS you can use sync. Some new name is EDA (event driven architecture), ESB (enterprise service bus) EMB (enterprise messaging bus). &lt;br /&gt;&lt;br /&gt;WebMethods is the only company that has been working on this and ONLY working on this, as a result, it is a good source for this vision. &lt;br /&gt;&lt;br /&gt;The key, however, is from JMS practices (and in turn, MQSeries practice): if you push, then, you need to consider push failure, so, you need async messaging.&lt;br /&gt;&lt;br /&gt;Just in case, I am not trying to sell webmethods. As a matter of fact, above I just pointed the way to avoid the expensive stuff: as long as you have a simple queue (either database table, a file, or MSMQ) to handle failure, and you have a mechanism to recover the failures (either automatic or manual), then, you are fine. Who needs expensive software packages! -- I study them because they are "free" to me (I mean, the company bought it!), and also, I learn those full-fledged stuff simply to see how I can accomplish the same thing with plain old code, perhaps just 10 lines!!!&lt;br /&gt;&lt;br /&gt;--------------&lt;br /&gt;Great people think alike and the same  time :-) Here is a link to Vikas's blog:&lt;br /&gt;&lt;br /&gt;http://vikasnetdev.blogspot.com/2007/09/soa-and-business-intelligence.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1982457110119973796?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1982457110119973796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1982457110119973796' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1982457110119973796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1982457110119973796'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/10/soa-eda-jms-esb-webmethods.html' title='SOA, EDA, JMS, ESB, webmethods'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6456442294238827468</id><published>2007-10-18T12:34:00.000-07:00</published><updated>2007-10-18T12:38:21.825-07:00</updated><title type='text'>more siebel notes later</title><content type='html'>My previous blogs are just the first round of my Siebel notes.&lt;br /&gt;I will put more siebel notes later. As I explained before, I used spring to see internals of Siebel and to see how siebel can work with other systems; and I use siebel as the source of architecture best practices (like OR mapping, rules engine, etc.).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6456442294238827468?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6456442294238827468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6456442294238827468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6456442294238827468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6456442294238827468'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/10/more-siebel-notes-later.html' title='more siebel notes later'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8701122921656342555</id><published>2007-10-18T10:42:00.000-07:00</published><updated>2007-10-18T10:46:28.045-07:00</updated><title type='text'>siebel internals and integration: spring</title><content type='html'>siebel internals and integration: spring&lt;br /&gt;&lt;br /&gt;This post is really short: why we need to think about spring when we do siebel? because siebel is "third-party", we do not know its internals. Spring can provide insights. &lt;br /&gt;&lt;br /&gt;Spring is the "standard" best-practice framework on both C#/.net and java, so, it is the best reference for integration also.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8701122921656342555?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8701122921656342555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8701122921656342555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8701122921656342555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8701122921656342555'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/10/siebel-internals-and-integration-spring.html' title='siebel internals and integration: spring'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4582016773990070268</id><published>2007-10-18T08:54:00.000-07:00</published><updated>2007-10-18T09:12:20.986-07:00</updated><title type='text'>stored procedures on oracle -- more words</title><content type='html'>stored procedures on oracle -- more words&lt;br /&gt;&lt;br /&gt;-----------------how (this should be a very simple system, because we do not use them that often -- but when we use them, we really need them immediately, so, the how should be lightweight and can be done everywhere! see "when" below)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For Oracle SP, the key is how to debug or test a sp easily: &lt;br /&gt;&lt;br /&gt;1. It is crucial that we develop sp using both sqlplus and other query tools (e.g. toad, even the "simplified" toad). --- More secifically, we need to get used to test-run a sp in "simplified" toad. &lt;br /&gt;&lt;br /&gt;2. It is also crucial to "print out" things, using exception and a adhoc table.   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------------when&lt;br /&gt;1. They should not be used in routine, ordinary, everyday-practice situations.&lt;br /&gt;&lt;br /&gt;2. If you really want them (for consistency sake, or, for people who are used to use sp as a managerial control tool), only use simple CRUD. Do not try to use "data logic" to cover up putting "business logic" in sp. "Data logic" is only an optimization issue; so, there is no such a thing as "data logic". &lt;br /&gt;&lt;br /&gt;3. SP can and should be used to optimize some logic when necessary.&lt;br /&gt;&lt;br /&gt;4. Also, for some aspect of business logic that is already well-isolated (i.e., will not likely to be re-used), and it is pretty low-level, then, we can say they are "data logic" -- but again, there is no such a thing that is wide-spread layer of data-logic!, and we can do it in sp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4582016773990070268?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4582016773990070268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4582016773990070268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4582016773990070268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4582016773990070268'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/10/stored-procedures-on-oracle-more-words.html' title='stored procedures on oracle -- more words'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6814671197593307304</id><published>2007-10-18T08:36:00.000-07:00</published><updated>2007-10-18T08:54:17.640-07:00</updated><title type='text'>A pragmatic piecemeal route towards Ajax and silverlight</title><content type='html'>A pragmatic piecemeal route towards Ajax and silverlight &lt;br /&gt;&lt;br /&gt;1. No third-party controls, e.g. no ComponentOne&lt;br /&gt;--If really need it, just use the a few controls in a limited places that you really need them (e.g. calendar).&lt;br /&gt;&lt;br /&gt;Why? because they simply trouble. Up-front trouble, in development trouble, support trouble, and upgrade trouble. Trouble. &lt;br /&gt;&lt;br /&gt;2. Instead, continue to use M$ "build-in" controls. &lt;br /&gt;(a) However, use more "check boxes" to increase user interactivity features (so that it is obvious that we need ajax! &lt;br /&gt;(b) Also, begin to use javascripts: do not use them all at once; however, use them seriously. Do not just hack them. Before you know it, you will have a lot of javascripts, and people get used to it. &lt;br /&gt;&lt;br /&gt;-------------------&lt;br /&gt;3. Introduce M$ Ajax server controls; however, use them judiciously, not large scale and systematically. Use them only to make people used to ajax. &lt;br /&gt;&lt;br /&gt;4. Use client side library (the best, ext and yahoo), but wrap them using server controls yourself. &lt;br /&gt;&lt;br /&gt;5. If you can use alpha in some environments (i.e. not "mission critical"), use silverlight as the primary technology (hence, javascript is only the glue, not the primary language).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6814671197593307304?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6814671197593307304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6814671197593307304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6814671197593307304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6814671197593307304'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/10/pragmatic-piecemeal-route-towards-ajax.html' title='A pragmatic piecemeal route towards Ajax and silverlight'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2414747163694489856</id><published>2007-09-16T23:38:00.000-07:00</published><updated>2007-09-16T23:49:54.010-07:00</updated><title type='text'>simplified command pattern (non-emit) AOP: anonymous delegate and generics</title><content type='html'>simplified command pattern (non-emit) AOP: anonymous delegate and generics&lt;br /&gt;&lt;br /&gt;In my previous blogs, I mentioned that with C# 2.0, we finally can do similar things like java's anonymous inner class for object-adapter pattern. This will simplify command pattern AOP.&lt;br /&gt;&lt;br /&gt;Basically, it is an easier and better way of  strict inheritance of  template method pattern. &lt;br /&gt;&lt;br /&gt;Generics here is just a helper, it makes the "template" more like, well, a template -- you do not really need it, a lot of times, if your template does not need to be general.&lt;br /&gt;&lt;br /&gt;Note that this is still too expensive, so, it can only be used for facade-level methods; so, it cannot replace real (i.e. emit-based) AOP that can be used for entity get-set methods.&lt;br /&gt;&lt;br /&gt;I know, I used too much "patterns" here, so, here are code -- copied/pasted.&lt;br /&gt;&lt;br /&gt;-----------------------------------------&lt;br /&gt;-----------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public static EmployeeDetails FindEmployee(int empId)&lt;br /&gt;{&lt;br /&gt;  WindowsIdentity id = HttpContext.Current.User.Identity as WindowsIdentity;&lt;br /&gt;  WindowsImpersonationContext wic = id.Impersonate();&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;    BrowseOrganizationServiceWse bosw = new BrowseOrganizationServiceWse();&lt;br /&gt;    bosw.SetPolicy("kerberos");&lt;br /&gt;    FindEmployeeResult fer = bosw.FindEmployee(empId);&lt;br /&gt;    EmployeeDetails ed = fer.Item as EmployeeDetails;&lt;br /&gt;    return ed;&lt;br /&gt;  }&lt;br /&gt;  finally&lt;br /&gt;  {&lt;br /&gt;    wic.Undo();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------------templeate ThreadStart deledagate is simply return void&lt;br /&gt;&lt;br /&gt;private static void RunMethodImpersonating(ThreadStart method)&lt;br /&gt;{&lt;br /&gt;  WindowsIdentity id = HttpContext.Current.User.Identity as WindowsIdentity;&lt;br /&gt;  WindowsImpersonationContext wic = id.Impersonate();&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;    method();&lt;br /&gt;  }&lt;br /&gt;  finally&lt;br /&gt;  {&lt;br /&gt;    wic.Undo();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;&lt;br /&gt;public static EmployeeDetails FindEmployee(int empId)&lt;br /&gt;{&lt;br /&gt;  EmployeeDetails ed = null;&lt;br /&gt;&lt;br /&gt;  RunMethodImpersonating(&lt;br /&gt;    delegate&lt;br /&gt;    {&lt;br /&gt;      BrowseOrganizationServiceWse bosw = new BrowseOrganizationServiceWse();&lt;br /&gt;      bosw.SetPolicy("kerberos");&lt;br /&gt;      FindEmployeeResult fer = bosw.FindEmployee(empId.ToString());&lt;br /&gt;      ed = fer.Item as EmployeeDetails;&lt;br /&gt;    }&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;   return ed;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-----------------------------&lt;br /&gt;-----------------------------&lt;br /&gt;-----------------------------&lt;br /&gt;-----------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;   // cmd is from IDbCommand (SqlCommand, OracleCommand, OleDbCommend etc) type.&lt;br /&gt;   // This is the command which we want to run against our database.&lt;br /&gt;&lt;br /&gt;   using (IDbConnection conn = ProviderFactory.CreateConnection())&lt;br /&gt;   {&lt;br /&gt;      cmd.Connection = conn;&lt;br /&gt;&lt;br /&gt;      conn.Open();&lt;br /&gt;&lt;br /&gt;      // use the cmd object.&lt;br /&gt;&lt;br /&gt;   } //"using" will close the connection even in case of exception.&lt;br /&gt;}&lt;br /&gt;catch (Exception e)&lt;br /&gt;{&lt;br /&gt;   // 1. Trace ?&lt;br /&gt;   // 2. Rollback transaction ?&lt;br /&gt;   // 3. Throw a wrapper exception with some more information ?&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;--------------------------&lt;br /&gt;--------------------------&lt;br /&gt;&lt;br /&gt;public delegate T CommandHandler&lt;t&gt;(IDbCommand cmd);&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;--------------------------template&lt;br /&gt;--------------------------&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Simple command executer "design pattern".&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;typeparam name="T"&gt;The type to return&lt;/typeparam&gt;&lt;br /&gt;/// &lt;param name="cmd"&gt;The command&lt;/param&gt;&lt;br /&gt;/// &lt;param name="handler"&gt;The handler which will receive the open command and handle it (as required)&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;A generic defined result, according to the handler choice&lt;/returns&gt;&lt;br /&gt;public static T ExecuteCommand&lt;t&gt;(IDbCommand cmd, CommandHandler&lt;t&gt; handler) //*1&lt;br /&gt;{&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;      using (IDbConnection conn = ProviderFactory.CreateConnection()) //*2&lt;br /&gt;      {&lt;br /&gt;         cmd.Connection = conn;&lt;br /&gt;&lt;br /&gt;         // Trace the query &amp;amp; parameters.&lt;br /&gt;         DatabaseTracer.WriteToTrace(TraceLevel.Verbose, cmd, "Data Access Layer - Query profiler"); //*3&lt;br /&gt;&lt;br /&gt;         conn.Open();&lt;br /&gt;&lt;br /&gt;         return handler(cmd); //*4&lt;br /&gt;      } //"using" will close the connection even in case of exception.&lt;br /&gt;   }&lt;br /&gt;   catch (Exception e)&lt;br /&gt;   {&lt;br /&gt;      // Trace the exception into the same log.&lt;br /&gt;      Tracer.WriteToTrace(TraceLevel.Error, e, "Data Access Layer - Exception"); //*5&lt;br /&gt;&lt;br /&gt;      throw WrapException(e); //*6&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------&lt;br /&gt;-----------------------------------&lt;br /&gt;public delegate T ReaderHandler&lt;t&gt;(IDataReader reader);&lt;br /&gt;&lt;br /&gt;-----------------------------------&lt;br /&gt;-----------------------------------&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Execute the db command as reader and parse it via the given handler.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;typeparam name="T"&gt;The type to return after parsing the reader.&lt;/typeparam&gt;&lt;br /&gt;/// &lt;param name="cmd"&gt;The command to execute&lt;/param&gt;&lt;br /&gt;/// &lt;param name="handler"&gt;The handler which will parse the reader&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;A generic defined result, according to the handler choice&lt;/returns&gt;&lt;br /&gt;public static T ExecuteReader&lt;t&gt;(IDbCommand cmd, ReaderHandler&lt;t&gt; handler)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand&lt;t&gt;(cmd,&lt;br /&gt;      delegate(IDbCommand liveCommand) //*1&lt;br /&gt;      {&lt;br /&gt;     // This is the anonymous delegate handler.&lt;br /&gt;     // REMINDER: The original template sends the live command as parameter.&lt;br /&gt;         IDataReader r = liveCommand.ExecuteReader();&lt;br /&gt;         return handler(r);&lt;br /&gt;      });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------&lt;br /&gt;-----------------------------------&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Retrieve the persons according to the specified command.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;returns&gt;Typed collection of person.&lt;/returns&gt;&lt;br /&gt;public static List&lt;person&gt; GetPersonsList()&lt;br /&gt;{&lt;br /&gt;   IDbCommand cmd = ProviderFactory.CreateCommand();&lt;br /&gt;   cmd.CommandText = "SELECT Name,Age,Email FROM Persons";&lt;br /&gt;   cmd.CommandType = CommandType.Text;&lt;br /&gt;&lt;br /&gt;   return DalServices.ExecuteReader&lt;list&lt;person&gt;&gt;(cmd,&lt;br /&gt;      delegate(IDataReader r)&lt;br /&gt;      {&lt;br /&gt;         List&lt;person&gt; persons = new List&lt;person&gt;();&lt;br /&gt;        &lt;br /&gt;     while (r.Read())&lt;br /&gt;         {&lt;br /&gt;             // Create a Person object, fill it by the reader and add it to the "persons" list.&lt;br /&gt;                Person person = new Person(r["Name"].ToString(), Convert.ToInt32(r["Age"]), r["Email"].ToString());&lt;br /&gt;                persons.Add(person);&lt;br /&gt;         }&lt;br /&gt;     &lt;br /&gt;         return persons;&lt;br /&gt;      });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------------------------------&lt;br /&gt;----------------------------------&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Retrieve the persons xml according to the specified command.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;returns&gt;Xml representation of the persons.&lt;/returns&gt;&lt;br /&gt;public static string GetPersonsXml()&lt;br /&gt;{&lt;br /&gt;   IDbCommand cmd = ProviderFactory.CreateCommand();&lt;br /&gt;   cmd.CommandText = "SELECT Name,Age,Email FROM Persons";&lt;br /&gt;   cmd.CommandType = CommandType.Text;&lt;br /&gt;&lt;br /&gt;   return DalServices.ExecuteReader&lt;string&gt;(cmd,&lt;br /&gt;      delegate(IDataReader r)&lt;br /&gt;      {&lt;br /&gt;    StringBuilder builder = new StringBuilder(500);&lt;br /&gt;               &lt;br /&gt;    builder.Append("&lt;persons&gt;");&lt;br /&gt;    while (r.Read())&lt;br /&gt;    {&lt;br /&gt;        // Create a Person object, fill it by the reader and add it to the "persons" list.&lt;br /&gt;        Person person = new Person(r["Name"].ToString(), Convert.ToInt32(r["Age"]), r["Email"].ToString());&lt;br /&gt;        builder.Append(person.ToXml());&lt;br /&gt;    }&lt;br /&gt;    builder.Append("&lt;/persons&gt;");&lt;br /&gt;               &lt;br /&gt;    return builder.ToString();        &lt;br /&gt;      });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Execute the db command in "NonQuery mode".&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;param name="cmd"&gt;The command to parse&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;Affected rows number&lt;/returns&gt;&lt;br /&gt;public static int ExecuteNonQuery(IDbCommand cmd)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand&lt;int&gt;(cmd,&lt;br /&gt;      delegate(IDbCommand liveCommand)&lt;br /&gt;      {&lt;br /&gt;         return liveCommand.ExecuteNonQuery();&lt;br /&gt;      });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Execute the db command in "Scalar mode".&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;typeparam name="T"&gt;The type to return after parsing the reader.&lt;/typeparam&gt;&lt;br /&gt;/// &lt;param name="cmd"&gt;The command to execute&lt;/param&gt;&lt;br /&gt;/// &lt;returns&gt;A generic defined result, according to the handler choice&lt;/returns&gt;&lt;br /&gt;public static T ExecuteScalar&lt;t&gt;(IDbCommand cmd)&lt;br /&gt;{&lt;br /&gt;   return ExecuteCommand&lt;t&gt;(cmd,&lt;br /&gt;      delegate(IDbCommand liveCommand)&lt;br /&gt;      {&lt;br /&gt;         return (T)liveCommand.ExecuteScalar();&lt;br /&gt;      });&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2414747163694489856?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2414747163694489856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2414747163694489856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2414747163694489856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2414747163694489856'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/09/simplified-command-pattern-non-emit-aop.html' title='simplified command pattern (non-emit) AOP: anonymous delegate and generics'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1126376876778353801</id><published>2007-09-01T18:22:00.001-07:00</published><updated>2008-05-11T15:50:42.868-07:00</updated><title type='text'>Why and How to use server side ajax – even you do not like it – part 2</title><content type='html'>Why and How to use server side ajax – even you do not like it – part 2&lt;br /&gt;&lt;br /&gt;As my previous blogs show, my basic estimate is that it will take one or two years for Ajax controls to be really mature so that we can safely wrap them on the server side (and still use javascript API). Before that, it is simply not cost-effective; we will spend a lot of time on dealing with bugs, limitations, and covering-ups. You can avoid all those by learning to treat javascript as an engineering language and is required for every developer.&lt;br /&gt;&lt;br /&gt;However, it is not at its prime time, yet; its prime time will be after a few months or half a year after Orcas release; as a compromise, at least before Orcas, I have to use C1WebGrid etc., instead of client side ajax controls (the best is ext, and yahoo is also good).&lt;br /&gt;&lt;br /&gt;As I pointed out in my previous blogs, the key is to pay attention to the javascript API.&lt;br /&gt;&lt;br /&gt;However, the problem is, you cannot find those APIs! Although they are advertised in some fancy wording, the reality is, they are not ready yet! Actually, the reality is even uglier: because the engineering section is not really ready yet, the whole thing is in the hands of marketing people, they do their best to do their spin to make the weakness of the product into features. For example, they turn the fact that there is not client side javascript API into something “you can use ajax automatically” – you would think that since you can do it automatically, so, you certainly can do it manually – no, you cannot! The reality is: the product is not ready for that yet!&lt;br /&gt;&lt;br /&gt;A good example is the C1WebGrid and C1WebDialog. C1WebGrid is not really ajax ready yet (ya, it has canned ajax features; that means almost nothing nowadays!); C1WebDialog is a little better. However, both are marketed as ajax ready. If you believe those marketing hypes for C1WebGrid, then, you will really be disappointed, or, misled, by thinking that “ajax can only so little”. As a result, in such a situation, user developers have to lower their standard, and use postback mostly, and use callback whenever they hit one by chance and luck. Note that some marketing materials lead you believe that update panel does not use postback. That is not true. Update panel uses postback. As a result, if it is not client side API, it uses postback, even it is not the whole page postback. As a result, we need to talk about how to do Postback or updatePanel in a way to limit their damages.&lt;br /&gt;&lt;br /&gt;Updatepanel postback is still bad, comparing with real client side API call back, for two reasons: (a) Postback always invokes the whole machinery of postback, so, it is bad for performance hit. However, this part of it is not big deal for us, because its damage is only performance, as long as it is fast enough for users, we are fine. (b) More importantly, a lot of times, postback has to use a twisted way to do things. For example, the "multi-value selection shuttling grid pairs": you have two grids, the left or top grid, and the right or bottom grid; the left one is for the available, the right one is for the selected; so, you do the selection by move a row from the left to the right. The selection action is a pure client side thing, until you click “submit selections” button. However, postback makes this a server side operation. Worse, sometimes, to make things perform better, you have to create a workaround on the UI: you put a checkbox on each row, and let users select a few rows, then, click a “select” button ( but this select button is not the “submit selections” – the reason is that there is paging on the available grid – that is actually the reason why we need to shuttle the selected one to a new grid) – the whole thing is getting more and more confusing when you try to put more and more workarounds.&lt;br /&gt;&lt;br /&gt;I believe we have a few options: &lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;(i) Find those workarounds;&lt;/p&gt;&lt;p class="MsoNormal"&gt;(ii) Say no to users;&lt;/p&gt;&lt;p class="MsoNormal"&gt;(iii) Buy more new controls, for example, a shuttle control. You will need perhaps a dozen of controls. This has two sides: &lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-LEFT: 0.75in; TEXT-INDENT: -0.5in"&gt;(1) new controls has more canned-ajax (i.e., build-in &lt;?xml:namespace prefix = st1 /&gt;&lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;ajax&lt;/st1:city&gt;&lt;/st1:place&gt; without javascript); &lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-LEFT: 0.75in; TEXT-INDENT: -0.5in"&gt;(2) new controls has more javascript APIs.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Obviously, iii-(2) is our real hope! However, iii-(1) is actually also a good one – once you have a dozen pretty good controls, your javascripting will be very “regularized” – if you need to do any javascripting at all! So, the approach is that we will try to push to buy more new controls. Most of the time, it has to be from the same vendor -- for political reasons; however, sometimes, as long as it is “server side controls”, it is also fine. &lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;In short, here is the summary: &lt;/p&gt;&lt;p class="MsoNormal"&gt;(a) For now, for some old so-called ajax-enabled server side controls, most of the time, we have to use postback/updatePanel, insteald of real callbacks; &lt;/p&gt;&lt;p class="MsoNormal"&gt;(b) We buy most recent server side controls, for both purposes: (i) we can begin to use a little bit javascript API, and (ii) we do not need javascripts directly.&lt;/p&gt;&lt;p class="MsoNormal"&gt;--------------------------------------------&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;Below are the notes that I study the user manual of C1WebGrid.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a href="http://www.componentone.com/Support.aspx?ItemType=2&amp;amp;TabTypeID=2&amp;amp;PanelIndex=2&amp;amp;TabMapID=144&amp;amp;Itemid=0&amp;amp;Tabid=171&amp;amp;SubCategoryTypeID=0"&gt;http://www.componentone.com/Support.aspx?ItemType=2&amp;amp;TabTypeID=2&amp;amp;PanelIndex=2&amp;amp;TabMapID=144&amp;amp;Itemid=0&amp;amp;Tabid=171&amp;amp;SubCategoryTypeID=0&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a href="http://helpcentral.componentone.com/"&gt;http://helpcentral.componentone.com/&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a href="http://helpcentral.componentone.com/Article.aspx?ID=71"&gt;http://helpcentral.componentone.com/Article.aspx?ID=71&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalisMTBol;font-size:9;"&gt;Note: &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:9;"&gt;You must create a ComponentOne Account and register your product with a valid serial number to obtain&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:9;"&gt;support using some of the above methods.&lt;/span&gt;&lt;br /&gt;-----------------------&lt;br /&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;The ComponentOne Studio for ASP.NET 2.0 installation program will create the directory C:\Program&lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:9;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Files\ComponentOne Studio.NET 2.0. This directory contains the following subdirectories:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;bin Contains copies of all ComponentOne binaries (DLLs, EXEs).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Common Contains support and data files that are used by many of the demo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;programs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Help Contains online documentation for all Studio components.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;C1WebGrid Contains samples for C1WebGrid.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="font-family:CalistoMT;font-size:10;color:blue;"&gt;&lt;a href="http://helpcentral.componentone.com/ProductResources.aspx"&gt;http://helpcentral.componentone.com/ProductResources.aspx&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;color:black;"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-INDENT: 0.5in"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;-----------------------&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Select the &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;ComponentOne C1WebGrid &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;assembly from the list on the &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;.NET &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;tab or browse to find the&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;C1.Web.C1WebGrid.2.dll file and click &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;OK&lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;-----------------------&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:SymbolMT;font-size:10;"&gt;• &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;an assembly resource file which contains the actual run-time license (host dll or for asp 2.0 App_Licenses.dll assembly)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:SymbolMT;font-size:10;"&gt;• &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;a "licenses.licx" file that contains the licensed component strong name and version information (&lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Show All Files &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;on the &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Project &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;menu) ---- to add the file, add the control to the form (then, can delete the control)&lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:9;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:9;"&gt;----------------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Right-click &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;C1WebGrid &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;and select &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Show Smart Tag &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;from the context menu. Select &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Property builder &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;from&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;the &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;C1WebGrid Tasks &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;menu.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Or, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;1. Select the &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;C1WebGrid &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;component.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;2. Select &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Properties Window &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;from the &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;View &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;menu on the Visual Studio toolbar.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;Or, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;1. Right-click &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;C1WebGrid &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;and select &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Auto Format &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;from the context menu. The &lt;/span&gt;&lt;span style="font-family:CalisMTBol;font-size:10;"&gt;Auto Format &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;dialog box &lt;/span&gt;&lt;span style="font-family:CalistoMT;font-size:10;"&gt;opens.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1126376876778353801?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1126376876778353801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1126376876778353801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1126376876778353801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1126376876778353801'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/09/why-and-how-to-use-server-side-ajax.html' title='Why and How to use server side ajax – even you do not like it – part 2'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8722479579501277240</id><published>2007-08-30T20:15:00.000-07:00</published><updated>2007-09-01T14:21:45.086-07:00</updated><title type='text'>The reverse angle of "Siebel and spring.net" and the steps of using Siebel</title><content type='html'>The reverse angle of "Siebel and spring.net" and the steps of using Siebel&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When I say "Siebel and spring.net", I mostly mean to use spring.net to mimic Siebel. Here, Siebel is the "big brother", the "role model".&lt;br /&gt;&lt;br /&gt;However, it is not that simple. I  do not want to lose my C# or Java or VB skills.&lt;br /&gt;&lt;br /&gt;In a sense, it is similar as I keep refreshing my C/C++ skills, periodically.&lt;br /&gt;&lt;br /&gt;However, it is also very different, quantitative difference: C#, java, VB are still extremely useful for application development, while C/C++ are less useful for direct applications nowadays; however, they are useful, for understanding OS, and systems like Siebel  (you may say an application level OS).&lt;br /&gt;&lt;br /&gt;Without spring level of C# or java understanding, or directly C/C++ level -- they call it engineering level -- of understanding of Siebel itself, you will never really understand Siebel.&lt;br /&gt;&lt;br /&gt;This is not just a theoretical bias: Siebel will be merged with/into Fusion -- without knowing Fusion or spring.net-like frameworks, you simply cannot understand new versions of Siebel easily and quickly.&lt;br /&gt;&lt;br /&gt;Conclusion: you need to know spring.net (or spring itself, and OR mapping, and Ajax), in order to understand Siebel quickly and thoroughly.&lt;br /&gt;&lt;br /&gt;It is important to note that plain C#/Java/VB simply does not cut it. You must know frameworks, OR mappings, AOP, databinding, Ajax. etc.&lt;br /&gt;&lt;br /&gt;Hence, "Siebel and Spring.net", two sides, both are crucial.&lt;br /&gt;&lt;br /&gt;A conclusion for practice: to use Siebel, there are three steps:&lt;br /&gt;(i) immediately set up a usable system, using out-of-box features;&lt;br /&gt;&lt;br /&gt;(ii) while (power) users are experimenting the system, you must do some second round of "requirement discovery and design". Because you need to find the features within Siebel, so, when use Siebel, at this stage, the key is NOT talking to users, it is letting users to experiment with Siebel, and you experiment it also, and read all documents, and and try to create a small (a few screens) but "deep" configured module. "Deep" does not mean heavy scripting, it means it includes all key powerful features (including scripting, but again, it does not need to be scripting heavy; but it should include using export to copy/paste some work!) .  Again, the key is to get a small but "deeply configured" model done, while users are experimenting.&lt;br /&gt;&lt;br /&gt;(iii) users are asking for some features that can be easily done; users also ask for some features that need "deep configuration". Negotiate a little (because Siebel must have a reason not doing that way! Perhaps the business process that Siebel suggests is a better way!). Then, prioritize, and use the deeply configured one as an example, implement more modules.&lt;br /&gt;&lt;br /&gt;Obviously, step (ii) is crucial; and to do it right and quick, you need to know spring.net ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8722479579501277240?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8722479579501277240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8722479579501277240' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8722479579501277240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8722479579501277240'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/reverse-angle-of-siebel-and-springnet.html' title='The reverse angle of &quot;Siebel and spring.net&quot; and the steps of using Siebel'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5945031424969561913</id><published>2007-08-30T15:05:00.000-07:00</published><updated>2007-08-30T18:53:27.195-07:00</updated><title type='text'>Siebel (offline) client and need a toad-like tool for sybase anywhere</title><content type='html'>Siebel (offline) client -- talking about offline -- Siebel has been doing for a long time! Sometimes it is called thick client, or simply, client, confusing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The offline client is also used for development environment. It uses sybase. Its build tool is like sqlplus -- we need a toad-like tool for sybase anywhere. Perhaps oledb connection can be fine, even use access -- I do not like access though; too much clicking, awkward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5945031424969561913?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5945031424969561913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5945031424969561913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5945031424969561913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5945031424969561913'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/siebel-thick-client-and-need-toad-like.html' title='Siebel (offline) client and need a toad-like tool for sybase anywhere'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-9002008423309391221</id><published>2007-08-30T14:59:00.000-07:00</published><updated>2007-08-30T20:09:35.580-07:00</updated><title type='text'>BO-scoped workflow/EAI (and service), and BO-scoped rule engine</title><content type='html'>BO-scoped workflow/EAI (and service), and BO-scoped rule engine&lt;br /&gt;&lt;br /&gt;A. BO scoped workflow, service, and EAI.&lt;br /&gt;&lt;br /&gt;(i) workflow/task: you can always call workflow as a service -- workflow is executed within a service (the workflow engine). In other words, service is the underlining mechanism. If  a  scope is not enough, then, you can create another subworkflow.&lt;br /&gt;&lt;br /&gt;(ii)  service: you need service, because service can handle transaction, workflows cannot. BO can have a default scope of transaction. Just a note here, the Siebel server has some internal component. If you need to use it directly from client, then, you need to use "server request broker" -- a service interface.&lt;br /&gt;&lt;br /&gt;(iii) EAI: service needs scripting, and we prefer declarative programming (to avoid clicking, we must learn to hack sif/xml exports), so, we want to avoid service per se. Also, service cannot use objects as parameters. So, we use EAI that can handle both transactions and object parameters.&lt;br /&gt;&lt;br /&gt;B. BO-scoped rule engine&lt;br /&gt;&lt;br /&gt;I used rule engine before, in a large project in java. We experimented it in many ways, and finally we concluded that it is not as powerful as it sounds. Inferences are not really that useful, for two reasons: (i) machine performance:  we cannot load all the rules and (more importantly) and all those objects needed for those those rules in memory! (ii)  human accountability: when something is not right, we cannot say that it is AI -- we are accountable! Basically this means we do not want it to be that powerful! We want predictability! -- As a result, perhaps M$'s no-inference rule engine approach is correct! Wait a minute, perhaps M$ only sees the part of it -- the real thing about rule engine is that it eliminates the effect of the order of rules.  This is  very important, because by a strong inference engine, we do not need to worry about the order anymore; in other words, this means (i) we need to be careful to specify the rules  in such a way that they are order-independent. (ii) the string inference engine can help us to do that.&lt;br /&gt;&lt;br /&gt;Anyway, because of the concept of "scope", rules engine is just a glorified "(intra and inter-) entity validation/logic" mechanism -- yes, this is the reason that I have not blog rule engine per se that much -- it is already covered by entity validation/logic (note:  rules can change  values also,  so, it is  not just "validation" per se). Rules are grouped special kind of fine-grained AOP. &lt;br /&gt;&lt;br /&gt;In Siebel, BO scoped can help the system to help us also, by providing smaller number of options. Note that currently, Siebel cannot provide help for lookup values. It should; I guess, it will be in next version.&lt;br /&gt;  &lt;br /&gt;C. Why BO is so important? As indicated in my previous blogs, BO is UnitOfWork. For web or SOA, it is the request (or conversation, if we relax it a little bit). It ties OR mapping, facade, valiation/entity logic, and UI-view all together. If you really push it, asking what exactly is it? I would answer it is OR mapping with a context of AOP (coarse-grained facade and fine-grained  entity).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-9002008423309391221?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/9002008423309391221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=9002008423309391221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/9002008423309391221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/9002008423309391221'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/siebel-pass-objects-to-service-via-bo.html' title='BO-scoped workflow/EAI (and service), and BO-scoped rule engine'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5630955536598917891</id><published>2007-08-30T09:13:00.000-07:00</published><updated>2007-08-30T18:59:41.043-07:00</updated><title type='text'>Siebel Scripting: third party tool and future of scripting</title><content type='html'>Siebel Scripting&lt;br /&gt;&lt;br /&gt;http://www.toolsandmethods.com/wordpress/?p=3&lt;br /&gt;http://www.toolsandmethods.com/wordpress/?p=9&lt;br /&gt;&lt;br /&gt;I will try the tool, as a learning tool. I am not sure I will ask the company to buy it, though.&lt;br /&gt;&lt;br /&gt;To balance it, I want to say that when Oracle tries to merge Siebel into its Fusion architecture, it could "upgrade" eScript to java. I am not saying it will, but a possibility.&lt;br /&gt;&lt;br /&gt;However, it is unlikely, because this will make M$ upset. Technically, java is better than eScript (even you add type and do some compiling -- treating it as if it were java -- another way to "handle" or "deal with" javascript -- remember google did it by compiling Java into javascript.). However, M$ shop is a big market.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5630955536598917891?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5630955536598917891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5630955536598917891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5630955536598917891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5630955536598917891'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/siebel-scripting.html' title='Siebel Scripting: third party tool and future of scripting'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6097198002117806411</id><published>2007-08-29T18:43:00.000-07:00</published><updated>2007-08-29T19:43:41.540-07:00</updated><title type='text'>More about Siebel BO, unit of work, service, workflow/task, escript and hacking sif/xml export</title><content type='html'>More about Siebel BO/unitOfWork, service, workflow/task, less escript by editing sif/xml export&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Siebel BO and Hibernate unit of work&lt;br /&gt;&lt;br /&gt;They are equivalent.&lt;br /&gt;&lt;br /&gt;Note: A unitOfWork usually lasts longer (or, a lot of times the same) than a web-request but shorter than a web-session. This is what's called the session-per-"conversation" (for shopping carts or wizards) pattern by the hibernate-guys. If you use session-per-request, then, it is the idea of "view-BO" pair in Siebel -- told you!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. A way to do minimum scripting&lt;br /&gt;&lt;br /&gt;Workflow is good for making business rules explicit for power users. So, even it is now clumsy (not easy to test, drag and drop is much slower than typing in IDE etc), it is good that we keep using it.&lt;br /&gt;&lt;br /&gt;So, we only need some "util" services from scripting -- at this level, it should be pure javascript. Not data.&lt;br /&gt;&lt;br /&gt;All the logic outside validation and rules should be in workflow units that has low-level workflow logic. Usually this is necessary, because we need transactions (see below).&lt;br /&gt;&lt;br /&gt;If we need explicit transaction, then, we use scripting to organize workflow units into a service.&lt;br /&gt;&lt;br /&gt;Then, we use a workflow (or a task) to wire those workflow units, connect it to a big button or a web service.     &lt;br /&gt;&lt;br /&gt;3. I agree with the philosophy of less eScript, declarative programming is good. However, declarative does not mean "clicking": I believe Siebel is evil in this regard. There is a loophole here, I am going to hack it -- we can edit the sif/xml export files!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6097198002117806411?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6097198002117806411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6097198002117806411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6097198002117806411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6097198002117806411'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/more-about-siebel-bo-unit-of-work.html' title='More about Siebel BO, unit of work, service, workflow/task, escript and hacking sif/xml export'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7413690702843041224</id><published>2007-08-28T18:34:00.000-07:00</published><updated>2007-09-02T11:35:21.498-07:00</updated><title type='text'>A minor but crucial correction about BO in Siebel</title><content type='html'>A minor but crucial correction about BO in Siebel&lt;br /&gt;&lt;br /&gt;A BO by itself is still an entity, just a composite entity.&lt;br /&gt;I mis-identified it with a facade, because it is almost the return value of a facade.&lt;br /&gt;&lt;br /&gt;Another reason is that in "configuration", Siebel does not  expose "facades"; yet, we still need a concept for facade, and BO is the closest thing we can get.&lt;br /&gt;&lt;br /&gt;However, in workflow, scripting (eScript, i.e., javascript), and integration, the real 'facades" are exposed, they are, well, "business services", or "service mode workflows" -- all those are so "obvious", of course.&lt;br /&gt;&lt;br /&gt;Again, my new "default architecture" is Siebel plus (i.e. in the "integration") Spring.net (or Spring itself, we do not care whether it is C# or java -- esp. when you use spring) that leads to OR mapping and Ajax that "mimic" Siebel.&lt;br /&gt;&lt;br /&gt;Note that Siebel is not just a CRM software. It is a platform -- a small one, but nevertheless a general-purpose one -- it can be everything and anything. To me, it is a system for centralized security and logging, and it is an  OR mapping  system,  validation system, and UI  framework with excellent databinding and Ajax-like feature (mostly via ActiveX -- hey, nobody is perfect). The only downside is that it is expensive, and proprietary; to "correct" the problem, we have spring (+ OR + pure Ajax).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7413690702843041224?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7413690702843041224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7413690702843041224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7413690702843041224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7413690702843041224'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/minor-but-crucial-correction-about-bo.html' title='A minor but crucial correction about BO in Siebel'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8791119301605670892</id><published>2007-08-27T20:10:00.000-07:00</published><updated>2007-09-02T11:53:21.883-07:00</updated><title type='text'>My new "default architecture": Siebel and Spring.net (and spring.net will lead to OR mapping and Ajax, via custom classes)</title><content type='html'>Finally, I find my new "default architecture": Siebel and Spring.net (and spring.net will lead to lower layer -- OR mapping and higher layer -- Ajax, via custom entity classes)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Siebel is already done, and it is beautifully done -- nobody can argue against that!&lt;br /&gt;&lt;br /&gt;Spring.net has everything or at least can lead us to find everything that Siebel has.&lt;br /&gt;-- spring.net itself is in the "middle"; however, it will lead to OR mapping (i.e. end of stored procedures) and pure ajax (i.e. end of server side ajax).&lt;br /&gt;&lt;br /&gt;------------------details:&lt;br /&gt;&lt;br /&gt;"Weak" but clear technical reasons (those reasons are implied in Java culture) that spring.net leads to OR mapping and Ajax.&lt;br /&gt;&lt;br /&gt;(a) AOP leads to fine-tuned validation logic that needs custom classes; AOP also leads to non-code generation approach. Both lead to OR mapping. Note that if there are too much resistance on OR mapping, then, we can use code generation as an intermediate step. The key down side of OR mapping is that OR mapping software is too big to be maintainable, even you have all its source code.&lt;br /&gt;&lt;br /&gt;(b) Fine-tuned validation logic also encourages high-interactive client. Windows is not an option. Silverlight is still one or two years away; so, pure ajax is the way to go. Note that the argument is that ajax not just makes user happy; pure ajax also makes development cleaner.&lt;br /&gt;&lt;br /&gt;A recent note/modification: siverlight is the key here -- on the one hand, it will set the new standard here and therefore push ajax forward; on the other hand, it will compete with ajax, and win. So, it is possible that we will never use heavy javascript -- we use a dozen of new ajax third party controls, then, we switch to silverlight. So, the key of ajax is "new third party controls" (because we cannot wait for M$ for this!) -- client side or server side does not really matter; as long as it is "new", because new server side controls will always have client side API anyway (but we must discipline ourselves to use javascript minimum, because silverlight is already on the horizon, no need to use heavy javascript).&lt;br /&gt;&lt;br /&gt;In short, strong "custom class" approach needs AOP; strong "custom class" approach  will  lead both OR mapping and ajax (or/and silverlight). As a result, AOP will lead OR mapping and pure ajax. Spring.net is AOP, so, spring.net will lead to OR mapping and pure ajax.&lt;br /&gt;&lt;br /&gt;---------------new insights on CSLA and Castle:&lt;br /&gt;You talk about "custom class", then, you need to talk about CSLA. It is really necessary to re-realize all CSLA via spring.net AOP.&lt;br /&gt;&lt;br /&gt;pure ajax and Castle: Castle is right, if you use pure ajax, why bother asp?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8791119301605670892?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8791119301605670892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8791119301605670892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8791119301605670892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8791119301605670892'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/my-new-default-architecture-siebel-and.html' title='My new &quot;default architecture&quot;: Siebel and Spring.net (and spring.net will lead to OR mapping and Ajax, via custom classes)'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8727430238714607285</id><published>2007-08-27T19:38:00.000-07:00</published><updated>2007-08-27T20:09:19.822-07:00</updated><title type='text'>Use Siebel as the core, integrated it with other similar web-based software, and customize it with in-house modules that use spring.net and ajax</title><content type='html'>Use Siebel as the core, integrated it with other similar web-based software, and customize it with in-house modules that use spring.net and ajax&lt;br /&gt;&lt;br /&gt;By doing this, users immediately have something to experiment with. Also, Siebel will determine the architecture as web-based (since it is highly interactive, even it is via ActiveX, so, it also determines Ajax), and ubiquitously using web services (because of Siebel's EAI methods).&lt;br /&gt;&lt;br /&gt;Further (I know I repeated this a lot in my recent blogs -- I am trying to rationalize a new mode of development), after a team working with Siebel's configuration and customization, the team then can really understand what "enterprise application" mean, and will totally give up those VB6 mindsets, and accept Java mindset -- I know Siebel is in C++; but C++ and Java are close enough. In enterprise development, you strive to make all things just like Siebel: every enterprise development is to make a general configurable system; also, every application development is API development.&lt;br /&gt;&lt;br /&gt;More specifically, Siebel will lead to the adoption of centralized security and logging, generalized validation, OR mapping, and UI regularity as easy as  "let's do something to make the work like working on Siebel"  --  Siebel is so good, you cannot argue against that!&lt;br /&gt;&lt;br /&gt;Another justification of this Siebel-first approach is that we start from CRM, then, ERP -- this is a micro-relive of the e-business IT revolution.  That is  actually how Siebel  has been growing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8727430238714607285?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8727430238714607285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8727430238714607285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8727430238714607285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8727430238714607285'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/use-siebel-as-core-integrated-it-with.html' title='Use Siebel as the core, integrated it with other similar web-based software, and customize it with in-house modules that use spring.net and ajax'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8440923735138003404</id><published>2007-08-27T15:24:00.000-07:00</published><updated>2007-08-27T17:11:26.325-07:00</updated><title type='text'>siebel links</title><content type='html'>edelivery.oracle.com&lt;br /&gt;license.keys.oracle.com (1 month)&lt;br /&gt;8.0.0.0.media pack (40G)&lt;br /&gt;8.0.0.1. patch&lt;br /&gt;&lt;br /&gt;supportweb.siebel.com bookshelf&lt;br /&gt;--  installation guide&lt;br /&gt;-- deployment planning guide&lt;br /&gt;-- performance &amp; scalability guide&lt;br /&gt;-------&lt;br /&gt;-- release notes&lt;br /&gt;-- maintenance release guide&lt;br /&gt;-- system requirements &amp;amp; supported platforms&lt;br /&gt;-- tech notes&lt;br /&gt;-- siebel alerts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;siebel data model reference (it has FK, but note that the FKs are not enforced in database).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8440923735138003404?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8440923735138003404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8440923735138003404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8440923735138003404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8440923735138003404'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/siebel-links.html' title='siebel links'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7972201197245400800</id><published>2007-08-27T14:21:00.000-07:00</published><updated>2007-08-27T15:23:08.210-07:00</updated><title type='text'>OR mapping in Siebel</title><content type='html'>OR mapping in Siebel&lt;br /&gt;&lt;br /&gt;OK, I lied, I am not sure whether Siebel really has OR mapping internally.&lt;br /&gt;&lt;br /&gt;However, to understand it for configuring and customizing it, you should know OR mapping concept: in configuring it, you are effectively configuring the OR mapping; further, it is UI-O-R mapping -- i.e., Siebel makes the UI highly regular, as a result, the mapping is three way, and this three way mapping is actually the core for Siebel.&lt;br /&gt;&lt;br /&gt;Once you make the UI highly regular, then, UI-O is really easy. So, the core of the core is back to OR mapping.&lt;br /&gt;&lt;br /&gt;As a result, it has all those interesting stuff when you talk about OR mapping. For example, "party" is basically a parent class. It has 1-1 extensions. It also has 1-m relations.&lt;br /&gt;&lt;br /&gt;It also has all those concepts such as lookup-table ("master data") and transaction-table ("customer data"). For security, you have user-position-organization-division. Also, those "user keys" concept for non-surrogate composite keys.&lt;br /&gt;&lt;br /&gt;Note that the starting point of all those is that you do not think the so-called "behavior". Data, data, data, that is all it is about, just different layers.&lt;br /&gt;&lt;br /&gt;There are behaviors, in entities and in facades; however, they are secondary -- SOA, REST, "configuration", OR mapping, all point to the same direction: pay attention to data, not behaviors -- antique OO is more and more irrelevant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7972201197245400800?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7972201197245400800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7972201197245400800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7972201197245400800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7972201197245400800'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/or-mapping-in-siebel.html' title='OR mapping in Siebel'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4675477179190464072</id><published>2007-08-27T14:17:00.000-07:00</published><updated>2007-08-27T14:20:58.317-07:00</updated><title type='text'>Siebel development environment</title><content type='html'>Siebel development environment&lt;br /&gt;&lt;br /&gt;It is an odd thing: Siebel development environment is similar to its offline mode. It uses a local database.&lt;br /&gt;&lt;br /&gt;You could set up a server on your development machine. However, that machine must be a window 2003 server. You can hack it on XP, but it is hack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4675477179190464072?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4675477179190464072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4675477179190464072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4675477179190464072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4675477179190464072'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/siebel-development-environment.html' title='Siebel development environment'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4143328053850977374</id><published>2007-08-27T13:36:00.000-07:00</published><updated>2007-08-27T14:16:52.273-07:00</updated><title type='text'>html editors for Siebel</title><content type='html'>Believe it or not, you need an external editor for Siebel development/configuration/customization.&lt;br /&gt;Of course, Vim is good, notepad2, notepad++ are good.&lt;br /&gt;&lt;br /&gt;The best? NVU.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4143328053850977374?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4143328053850977374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4143328053850977374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4143328053850977374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4143328053850977374'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/html-editors-for-siebel.html' title='html editors for Siebel'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4886601180425408982</id><published>2007-08-27T13:23:00.000-07:00</published><updated>2007-08-27T13:26:34.427-07:00</updated><title type='text'>a bug in siebel tool and the work around</title><content type='html'>If you drag a text field from toolbar, it cannot align correctly.&lt;br /&gt;Work around: do not use toolbar, just copy another one on the screen.&lt;br /&gt;or, create another control, then, use that control, instead of text field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4886601180425408982?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4886601180425408982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4886601180425408982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4886601180425408982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4886601180425408982'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/bug-in-siebel-tool-and-work-around.html' title='a bug in siebel tool and the work around'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-90503568785179707</id><published>2007-08-27T10:03:00.000-07:00</published><updated>2007-08-27T10:22:15.618-07:00</updated><title type='text'>Use Siebel as part of the source of your architecture ideas and spring.net and ajax</title><content type='html'>Use Siebel as part of the source of your architecture ideas&lt;br /&gt;&lt;br /&gt;1. As explained in my previous blog, Siebel is pretty good -- even it has its "weirdness".&lt;br /&gt;2. The special thing about Siebel is that its UI has strict rules corresponding to its entities and facades. It can do that because its UIs have strict rules -- sometimes counter-intuitive, but general and powerful.&lt;br /&gt;3. Other than that, Siebel is basically a proprietary "close-to-best-practices" for all other things ("8 core techniques"), including centralized security, logging, validation, and even OR mapping, and it does not use stored procedures (and even not FKs! -- that is too extreme though).&lt;br /&gt;4. As a result, Siebel is worth it to be a source of your architecture.&lt;br /&gt;5. Further, once you use Siebel, it is inevitable that it will influence your architecture. You have to build other things to inter-operate with it.&lt;br /&gt;6. The key of using Siebel as the source of your architecture, but not just "copy" it,  is to abstract it into "8 core techniques" -- then, it is obvious that we should use spring.net and ajax.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-90503568785179707?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/90503568785179707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=90503568785179707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/90503568785179707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/90503568785179707'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/use-siebel-as-part-of-source-of-your.html' title='Use Siebel as part of the source of your architecture ideas and spring.net and ajax'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8843827314438011016</id><published>2007-08-26T12:11:00.000-07:00</published><updated>2007-08-26T21:43:06.980-07:00</updated><title type='text'>Oracle Stored Procedures examples and notes</title><content type='html'>Oracle Stored Procedures examples and notes&lt;br /&gt;&lt;br /&gt;I used SP for a long time; then, stopped using it; then, used it again, then, stopped, then, again ... you got the idea. It seems that it will be a while that we can say we will never use it for ordinary development, and it will certainly be here "forever" for special situations. So, here are the minimalist examples and notes.&lt;br /&gt;&lt;br /&gt;My stand of using SP? Do not use it if you can use OR mapping, or, if it is a new project (even you do not use OR mapping -- and in that case, non-parameterized sqls are also fine -- as long as you parse the sql to prevent sql injection -- you need to parse it for the single quote anyway. Remember, developer productivity is number one, everything else should be treated as explicit feature request); however, it does not hurt that much, just a little bit waste.&lt;br /&gt;&lt;br /&gt;The key to prevent SP from being harmful is to keep it super simple.  It  should be purely a pure thin wrapper of CRUD sqls.&lt;br /&gt;&lt;br /&gt;The following has more info than necessary; however, it is clear that the following shows the minimalist CRUD approach.&lt;br /&gt;&lt;br /&gt;-------------------------------CRUD examples&lt;br /&gt;-------------------------------&lt;br /&gt;-------------------------------&lt;br /&gt;http://www.devshed.com/c/a/Oracle/Developing-Simple-PL-SQL-Stored-Procedures-for-CRUD-Operations/1/&lt;br /&gt;http://www.c-sharpcorner.com/UploadFile/john_charles/CallingOraclestoredproceduresfromMicrosoftdotNET06222007142805PM/CallingOraclestoredproceduresfromMicrosoftdotNET.aspx&lt;br /&gt;&lt;br /&gt;---------------insert&lt;br /&gt;&lt;br /&gt;create or replace procedure p_emp_insert (p_empno emp.empno%type,&lt;br /&gt;p_ename emp.ename%type, p_sal emp.sal%type, p_deptno emp.deptno%&lt;br /&gt;type) as&lt;br /&gt;begin&lt;br /&gt;    insert into emp&lt;br /&gt;    (&lt;br /&gt;          empno,&lt;br /&gt;          ename,&lt;br /&gt;          sal,&lt;br /&gt;          deptno&lt;br /&gt;    )&lt;br /&gt;    values&lt;br /&gt;    (&lt;br /&gt;          p_empno,&lt;br /&gt;          p_ename,&lt;br /&gt;          p_sal,&lt;br /&gt;          p_deptno &lt;br /&gt;    );&lt;br /&gt;    Commit;&lt;br /&gt;exception&lt;br /&gt;    when dup_val_on_index then&lt;br /&gt;          raise_application_error(-20001, 'Employee already&lt;br /&gt;exists');&lt;br /&gt;    when others then&lt;br /&gt;          raise_application_error(-20011, sqlerrm);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;---------------we could add validation in the above SP, but do we really want to do that? My vote is no. We do not want that! validation should be the responsibility of facade and entity.&lt;br /&gt;&lt;br /&gt;create or replace procedure p_emp_insert (p_empno emp.empno%type,&lt;br /&gt;p_ename emp.ename%type, p_sal emp.sal%type, p_deptno emp.deptno%&lt;br /&gt;type) as&lt;br /&gt;    Invalid_sal exception;&lt;br /&gt;    Invalid_deptno    exception;&lt;br /&gt;begin&lt;br /&gt;    if p_sal&lt;100&gt;10000 then&lt;br /&gt;          raise invalid_sal;&lt;br /&gt;    end if;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    declare&lt;br /&gt;          dummy_var   varchar(10);&lt;br /&gt;    begin&lt;br /&gt;          select 'exists' into dummy_var&lt;br /&gt;          from dept&lt;br /&gt;          where deptno = p_deptno;&lt;br /&gt;    exception&lt;br /&gt;          when no_data_found then&lt;br /&gt;                raise Invalid_deptno;&lt;br /&gt;          when others then&lt;br /&gt;                raise_application_error(-20011, sqlerrm);&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    insert into emp&lt;br /&gt;    (&lt;br /&gt;          empno,&lt;br /&gt;          ename,&lt;br /&gt;          sal,&lt;br /&gt;          deptno&lt;br /&gt;    )&lt;br /&gt;    values&lt;br /&gt;    (&lt;br /&gt;          p_empno,&lt;br /&gt;          p_ename,&lt;br /&gt;          p_sal,&lt;br /&gt;          p_deptno&lt;br /&gt;    );&lt;br /&gt;    Commit;&lt;br /&gt;exception&lt;br /&gt;    when invalid_sal then&lt;br /&gt;          raise_application_error(-20001, 'Salary must be in&lt;br /&gt;between 100 and 10000');&lt;br /&gt;    when invalid_deptno then&lt;br /&gt;          raise_application_error(-20001, 'Department doesn't&lt;br /&gt;exist');&lt;br /&gt;    when dup_val_on_index then&lt;br /&gt;          raise_application_error(-20001, 'Employee already&lt;br /&gt;exists');&lt;br /&gt;    when others then&lt;br /&gt;          raise_application_error(-20011, sqlerrm);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;---------------update&lt;br /&gt;&lt;br /&gt;create or replace procedure p_emp_update (p_empno emp.empno%type,&lt;br /&gt;p_ename emp.ename%type, p_sal emp.sal%type, p_deptno emp.deptno%&lt;br /&gt;type) as&lt;br /&gt;    Invalid_sal exception;&lt;br /&gt;    Invalid_deptno    exception;&lt;br /&gt;    Invalid_empno exception;&lt;br /&gt;begin&lt;br /&gt;    if p_sal&lt;100&gt;10000 then&lt;br /&gt;          raise invalid_sal;&lt;br /&gt;    end if;&lt;br /&gt;    declare&lt;br /&gt;          dummy_var   varchar(10);&lt;br /&gt;    begin&lt;br /&gt;          select 'exists' into dummy_var&lt;br /&gt;          from dept&lt;br /&gt;          where deptno = p_deptno;&lt;br /&gt;    exception&lt;br /&gt;          when no_data_found then&lt;br /&gt;                raise Invalid_deptno;&lt;br /&gt;          when others then&lt;br /&gt;                raise_application_error(-20011, sqlerrm);&lt;br /&gt;    end;&lt;br /&gt;    update emp set&lt;br /&gt;          ename=p_ename,&lt;br /&gt;          sal=p_sal,&lt;br /&gt;          deptno=p_deptno&lt;br /&gt;    where empno=p_empno;&lt;br /&gt;    if sql%notfound or sql%rowcount=0 then&lt;br /&gt;          rollback;&lt;br /&gt;          raise Invalid_empno;&lt;br /&gt;    end if;&lt;br /&gt;    commit;&lt;br /&gt;exception&lt;br /&gt;    when invalid_sal then&lt;br /&gt;          raise_application_error(-20001, 'Salary must be in&lt;br /&gt;between 100 and 10000');&lt;br /&gt;    when invalid_deptno then&lt;br /&gt;          raise_application_error(-20001, 'Department doesn't&lt;br /&gt;exist');&lt;br /&gt;    when invalid_empno then&lt;br /&gt;          raise_application_error(-20001, 'Employee does not&lt;br /&gt;exist');&lt;br /&gt;    when others then&lt;br /&gt;          raise_application_error(-20011, sqlerrm);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;---------------delete&lt;br /&gt;&lt;br /&gt;create or replace procedure p_emp_delete (p_empno emp.empno%type) as&lt;br /&gt;    Invalid_empno exception;&lt;br /&gt;begin&lt;br /&gt;    delete from emp&lt;br /&gt;    where empno=p_empno;&lt;br /&gt;    if sql%notfound or sql%rowcount=0 then&lt;br /&gt;          rollback;&lt;br /&gt;          raise Invalid_empno;&lt;br /&gt;    end if;&lt;br /&gt;    commit;&lt;br /&gt;exception&lt;br /&gt;    when invalid_empno then&lt;br /&gt;          raise_application_error(-20001, 'Employee does not&lt;br /&gt;exist');&lt;br /&gt;    when others then&lt;br /&gt;          raise_application_error(-20011, sqlerrm);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;---------------select without ref cursors&lt;br /&gt;&lt;br /&gt;create or replace procedure p_emp_details(p_empno emp.empno%type,&lt;br /&gt;&lt;br /&gt;p_ename OUT emp.ename%type, p_sal OUT emp.sal%type, p_deptno OUT&lt;br /&gt;emp.deptno%type)&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;    select ename, sal, deptno&lt;br /&gt;    into p_ename, p_sal, p_deptno&lt;br /&gt;    from emp&lt;br /&gt;    where empno = p_empno;&lt;br /&gt;exception&lt;br /&gt;    when no_data_found then&lt;br /&gt;          raise_application_error(-20001, 'Employee not&lt;br /&gt;found');&lt;br /&gt;    when too_many_rows then&lt;br /&gt;          /* this would not happen generally */&lt;br /&gt;          raise_application_error(-20002, 'More employees exist&lt;br /&gt;with the same number');&lt;br /&gt;    when others then&lt;br /&gt;          raise_application_error(-20003, SQLERRM);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;----------driver of the above sp:&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;    s     emp.sal%type;&lt;br /&gt;    en    emp.ename%type;&lt;br /&gt;    d     emp.deptno%type;&lt;br /&gt;begin&lt;br /&gt;    p_emp_details(7369, en,s,d);&lt;br /&gt;    dbms_output.put_line('name of employee: ' || en);&lt;br /&gt;    dbms_output.put_line('Salary: ' || s);&lt;br /&gt;    dbms_output.put_line('Deptno: '||d);&lt;br /&gt;end;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------example of select without ref cursors&lt;br /&gt;&lt;br /&gt;create or replace procedure count_emp_by_dept(pin_deptno number, pout_count out number)&lt;br /&gt;is&lt;br /&gt;begin&lt;br /&gt;select count(*) into pout_count&lt;br /&gt;from scott.emp&lt;br /&gt;where deptno=pin_deptno;&lt;br /&gt;end count_emp_by_dept;&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;&lt;br /&gt;Using System;&lt;br /&gt;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;using System.Data.OracleClient;&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace CallingOracleStoredProc&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;  class Program&lt;br /&gt;&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;      static void Main(string[] args)&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;          using (OracleConnection objConn = new OracleConnection("Data Source=ORCL; User ID=scott; Password=tiger"))&lt;br /&gt;&lt;br /&gt;          {&lt;br /&gt;&lt;br /&gt;              OracleCommand objCmd = new OracleCommand();&lt;br /&gt;&lt;br /&gt;              objCmd.Connection = objConn;&lt;br /&gt;&lt;br /&gt;              objCmd.CommandText = "count_emp_by_dept";&lt;br /&gt;&lt;br /&gt;              objCmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&lt;br /&gt;              objCmd.Parameters.Add("pin_deptno", OracleType.Number).Value = 20;&lt;br /&gt;&lt;br /&gt;              objCmd.Parameters.Add("pout_count", OracleType.Number).Direction = ParameterDirection.Output;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;              try&lt;br /&gt;&lt;br /&gt;              {&lt;br /&gt;&lt;br /&gt;                  objConn.Open();&lt;br /&gt;&lt;br /&gt;                  objCmd.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;                  System.Console.WriteLine("Number of employees in department 20 is {0}", objCmd.Parameters["pout_count"].Value);&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;              catch (Exception ex)&lt;br /&gt;&lt;br /&gt;              {&lt;br /&gt;&lt;br /&gt;                  System.Console.WriteLine("Exception: {0}",ex.ToString());&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;              objConn.Close();&lt;br /&gt;&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------another example select without ref cursors, with a function&lt;br /&gt;&lt;br /&gt;create or replace function get_count_emp_by_dept(pin_deptno number)&lt;br /&gt;return number&lt;br /&gt;is&lt;br /&gt;var_count number;&lt;br /&gt;begin&lt;br /&gt;select count(*) into var_count&lt;br /&gt;from scott.emp&lt;br /&gt;where deptno=pin_deptno;&lt;br /&gt;return var_count;&lt;br /&gt;end get_count_emp_by_dept;&lt;br /&gt;&lt;br /&gt;---------note it uses "return_value" as the parameter name&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;using System.Data.OracleClient;&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace CallingOracleStoredProc&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;  class Program&lt;br /&gt;&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;      static void Main(string[] args)&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;          using (OracleConnection objConn = new OracleConnection("Data Source=ORCL; User ID=scott; Password=tiger"))&lt;br /&gt;&lt;br /&gt;          {&lt;br /&gt;&lt;br /&gt;              OracleCommand objCmd = new OracleCommand();&lt;br /&gt;&lt;br /&gt;              objCmd.Connection = objConn;&lt;br /&gt;&lt;br /&gt;              objCmd.CommandText = "get_count_emp_by_dept";&lt;br /&gt;&lt;br /&gt;              objCmd.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&lt;br /&gt;              objCmd.Parameters.Add("pin_deptno", OracleType.Number).Value = 20;&lt;br /&gt;&lt;br /&gt;              objCmd.Parameters.Add("return_value", OracleType.Number).Direction = ParameterDirection.ReturnValue;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;              try&lt;br /&gt;&lt;br /&gt;              {&lt;br /&gt;&lt;br /&gt;                  objConn.Open();&lt;br /&gt;&lt;br /&gt;                  objCmd.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;                  System.Console.WriteLine("Number of employees in department 20 is {0}", objCmd.Parameters["return_value"].Value);&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;              catch (Exception ex)&lt;br /&gt;&lt;br /&gt;              {&lt;br /&gt;&lt;br /&gt;                  System.Console.WriteLine("Exception: {0}",ex.ToString());&lt;br /&gt;&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;              objConn.Close();&lt;br /&gt;&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;---------------use select with ref cursors&lt;br /&gt;&lt;br /&gt;create or replace package human_resources&lt;br /&gt;as&lt;br /&gt;type t_cursor is ref cursor;&lt;br /&gt;procedure get_employee(cur_employees out t_cursor);&lt;br /&gt;end human_resources;&lt;br /&gt;&lt;br /&gt;-------&lt;br /&gt;create or replace package body human_resources&lt;br /&gt;as&lt;br /&gt;procedure get_employee(cur_employees out t_cursor)&lt;br /&gt;is&lt;br /&gt;begin&lt;br /&gt;open cur_employees for select * from emp;&lt;br /&gt;end get_employee;&lt;br /&gt;end human_resources;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;Using System;&lt;br /&gt;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;using System.Data.OracleClient;&lt;br /&gt;&lt;br /&gt;using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace CallingOracleStoredProc&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;  class Program&lt;br /&gt;&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;      private static void prvPrintReader(OracleDataReader objReader)&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;          for (int i = 0; i &lt; i =" 0;" objconn =" new" source="ORCL;" id="scott;" password="tiger" objcmd =" new" connection =" objConn;" commandtext = "human_resources.get_employee" commandtype =" CommandType.StoredProcedure;" direction =" ParameterDirection.Output;" objreader =" objCmd.ExecuteReader();" i =" 0;" i =" 0;" objconn =" new" source="ORCL;" id="scott;" password="tiger" objcmd =" new" connection =" objConn;" commandtext = "human_resources.get_employee_department" commandtype =" CommandType.StoredProcedure;" direction =" ParameterDirection.Output;" direction =" ParameterDirection.Output;" objreader =" objCmd.ExecuteReader();" ename="p_ename," job="p_job," mgr="p_mgr," hiredate="p_hiredate," sal="p_sal," comm="p_comm," deptno="p_deptno" empno="p_empno;" empno="p_empno;" objconn =" new" source="ORCL;" id="scott;" password="tiger" objadapter =" new" objselectcmd =" new" connection =" objConn;" commandtext = "human_resources.select_employee" commandtype =" CommandType.StoredProcedure;" direction =" ParameterDirection.Output;" selectcommand =" objSelectCmd;" objinsertcmd =" new" connection =" objConn;" commandtext = "human_resources.insert_employee" commandtype =" CommandType.StoredProcedure;" insertcommand =" objInsertCmd;" objupdatecmd =" new" connection =" objConn;" commandtext = "human_resources.update_employee" commandtype =" CommandType.StoredProcedure;" updatecommand =" objUpdateCmd;" objdeletecmd =" new" connection =" objConn;" commandtext = "human_resources.delete_employee" commandtype =" CommandType.StoredProcedure;" deletecommand =" objDeleteCmd;" dtemp =" new" count =" {0}" deptno =" p_deptno" p_deptno    =""&gt; 30,&lt;br /&gt;          p_recordset =&gt; v_cursor);&lt;br /&gt;       &lt;br /&gt;LOOP&lt;br /&gt;  FETCH v_cursor&lt;br /&gt;  INTO  v_ename, v_empno, v_deptno;&lt;br /&gt;  EXIT WHEN v_cursor%NOTFOUND;&lt;br /&gt;  DBMS_OUTPUT.PUT_LINE(v_ename || ' | ' || v_empno || ' | ' || v_deptno);&lt;br /&gt;END LOOP;&lt;br /&gt;CLOSE v_cursor;&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;-------vb.net&lt;br /&gt;&lt;br /&gt;Dim conn, cmd, rs&lt;br /&gt;&lt;br /&gt;Set conn = Server.CreateObject("adodb.connection")&lt;br /&gt;conn.Open "DSN=TSH1;UID=scott;PWD=tiger"&lt;br /&gt;&lt;br /&gt;Set cmd = Server.CreateObject ("ADODB.Command")&lt;br /&gt;Set cmd.ActiveConnection = conn&lt;br /&gt;cmd.CommandText = "GetEmpRS"&lt;br /&gt;cmd.CommandType = 4 'adCmdStoredProc&lt;br /&gt;&lt;br /&gt;Dim param1&lt;br /&gt;Set param1 = cmd.CreateParameter ("deptno", adInteger, adParamInput)&lt;br /&gt;cmd.Parameters.Append param1&lt;br /&gt;param1.Value = 30&lt;br /&gt;&lt;br /&gt;Set rs = cmd.Execute&lt;br /&gt;&lt;br /&gt;Do Until rs.BOF Or rs.EOF&lt;br /&gt;-- Do something&lt;br /&gt;rs.MoveNext&lt;br /&gt;Loop&lt;br /&gt;&lt;br /&gt;rs.Close&lt;br /&gt;conn.Close&lt;br /&gt;Set rs     = nothing&lt;br /&gt;Set param1 = nothing&lt;br /&gt;Set cmd    = nothing&lt;br /&gt;&lt;br /&gt;Set conn   = nothing&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------strong typed ref cursor&lt;br /&gt;&lt;br /&gt;create or replace package REFCURSOR_PKG as&lt;br /&gt;TYPE WEAK8i_REF_CURSOR IS REF CURSOR;&lt;br /&gt;TYPE STRONG REF_CURSOR IS REF CURSOR RETURN EMP%ROWTYPE;&lt;br /&gt;end REFCURSOR_PKG;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------another example with VB.net code&lt;br /&gt;CREATE OR REPLACE PACKAGE curspkg_join AS&lt;br /&gt;      TYPE t_cursor IS REF CURSOR ;&lt;br /&gt;      Procedure open_join_cursor1 (n_EMPNO IN NUMBER, io_cursor IN OUT t_cursor);&lt;br /&gt; END curspkg_join;&lt;br /&gt; /&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PACKAGE BODY curspkg_join AS&lt;br /&gt; Procedure open_join_cursor1 (n_EMPNO IN NUMBER, io_cursor IN OUT t_cursor)&lt;br /&gt; IS&lt;br /&gt;      v_cursor t_cursor;&lt;br /&gt; BEGIN&lt;br /&gt;      IF n_EMPNO &lt;&gt; 0&lt;br /&gt;      THEN&lt;br /&gt;           OPEN v_cursor FOR&lt;br /&gt;           SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME&lt;br /&gt;                FROM EMP, DEPT&lt;br /&gt;                WHERE EMP.DEPTNO = DEPT.DEPTNO&lt;br /&gt;                AND EMP.EMPNO = n_EMPNO;&lt;br /&gt;&lt;br /&gt;      ELSE&lt;br /&gt;           OPEN v_cursor FOR&lt;br /&gt;           SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME&lt;br /&gt;                FROM EMP, DEPT&lt;br /&gt;                WHERE EMP.DEPTNO = DEPT.DEPTNO;&lt;br /&gt;&lt;br /&gt;      END IF;&lt;br /&gt;      io_cursor := v_cursor;&lt;br /&gt; END open_join_cursor1;&lt;br /&gt; END curspkg_join;&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;Imports System.Data.OracleClient&lt;br /&gt;&lt;br /&gt;     Dim Oraclecon As New OracleConnection("Password=pwd;" &amp; _&lt;br /&gt;                                              "User ID=uid;Data Source=MyOracle;")&lt;br /&gt;      Oraclecon.Open()&lt;br /&gt;&lt;br /&gt;      Dim myCMD As New OracleCommand()&lt;br /&gt;      myCMD.Connection = Oraclecon&lt;br /&gt;      myCMD.CommandText = "curspkg_join.open_join_cursor1"&lt;br /&gt;      myCMD.CommandType = CommandType.StoredProcedure&lt;br /&gt;      myCMD.Parameters.Add(New OracleParameter("io_cursor", OracleType.Cursor)).Direction = ParameterDirection.Output&lt;br /&gt;      myCMD.Parameters.Add("n_Empno", OracleType.Number, 4).Value = 123&lt;br /&gt;      Dim myReader As OracleDataReader&lt;br /&gt;      Try&lt;br /&gt;          myCMD.ExecuteNonQuery()&lt;br /&gt;      Catch myex As Exception&lt;br /&gt;          MsgBox(myex.Message)&lt;br /&gt;      End Try&lt;br /&gt;&lt;br /&gt;      myReader = myCMD.Parameters("io_cursor").Value&lt;br /&gt;&lt;br /&gt;      Dim x, count As Integer&lt;br /&gt;&lt;br /&gt;      count = 0&lt;br /&gt;&lt;br /&gt;      Do While myReader.Read()&lt;br /&gt;          For x = 0 To myReader.FieldCount - 1&lt;br /&gt;              Console.Write(myReader(x) &amp; " ")&lt;br /&gt;          Next&lt;br /&gt;          Console.WriteLine()&lt;br /&gt;          count += 1&lt;br /&gt;      Loop&lt;br /&gt;&lt;br /&gt;      MsgBox(count &amp;amp; " Rows Returned.")&lt;br /&gt;&lt;br /&gt;      myReader.Close()&lt;br /&gt;      Oraclecon.Close()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; /&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------rowtype&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;type r_cursor is REF CURSOR;&lt;br /&gt;c_emp r_cursor;&lt;br /&gt;er emp%rowtype;&lt;br /&gt;begin&lt;br /&gt;open c_emp for select * from emp;&lt;br /&gt;loop&lt;br /&gt;    fetch c_emp into er;&lt;br /&gt;    exit when c_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.ename || ' - ' || er.sal);&lt;br /&gt;end loop;&lt;br /&gt;close c_emp;&lt;br /&gt;end;&lt;br /&gt;---------- "record"&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;type r_cursor is REF CURSOR;&lt;br /&gt;c_emp r_cursor;&lt;br /&gt;type rec_emp is record&lt;br /&gt;(&lt;br /&gt;  name  varchar2(20),&lt;br /&gt;  sal   number(6)&lt;br /&gt;);&lt;br /&gt;er rec_emp;&lt;br /&gt;begin&lt;br /&gt;open c_emp for select ename,sal from emp;&lt;br /&gt;loop&lt;br /&gt;    fetch c_emp into er;&lt;br /&gt;    exit when c_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.name || ' - ' || er.sal);&lt;br /&gt;end loop;&lt;br /&gt;close c_emp;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;------------ref cursor is dynamic&lt;br /&gt;&lt;br /&gt;------------(this is crucial for practical use in SP)&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;type r_cursor is REF CURSOR;&lt;br /&gt;c_emp r_cursor;&lt;br /&gt;type rec_emp is record&lt;br /&gt;(&lt;br /&gt;  name  varchar2(20),&lt;br /&gt;  sal   number(6)&lt;br /&gt;);&lt;br /&gt;er rec_emp;&lt;br /&gt;begin&lt;br /&gt;open c_emp for select ename,sal from emp where deptno = 10;&lt;br /&gt;dbms_output.put_line('Department: 10');&lt;br /&gt;dbms_output.put_line('--------------');&lt;br /&gt;loop&lt;br /&gt;    fetch c_emp into er;&lt;br /&gt;    exit when c_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.name || ' - ' || er.sal);&lt;br /&gt;end loop;&lt;br /&gt;close c_emp;&lt;br /&gt;open c_emp for select ename,sal from emp where deptno = 20;&lt;br /&gt;dbms_output.put_line('Department: 20');&lt;br /&gt;dbms_output.put_line('--------------');&lt;br /&gt;loop&lt;br /&gt;    fetch c_emp into er;&lt;br /&gt;    exit when c_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.name || ' - ' || er.sal);&lt;br /&gt;end loop;&lt;br /&gt;close c_emp;&lt;br /&gt;end;&lt;br /&gt;--------------ref cursor within a loop&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;type r_cursor is REF CURSOR;&lt;br /&gt;c_emp r_cursor;&lt;br /&gt;type rec_emp is record&lt;br /&gt;(&lt;br /&gt;  name  varchar2(20),&lt;br /&gt;  sal   number(6)&lt;br /&gt;);&lt;br /&gt;er rec_emp;&lt;br /&gt;begin&lt;br /&gt;for i in (select deptno,dname from dept)&lt;br /&gt;loop&lt;br /&gt;  open c_emp for select ename,sal from emp where deptno = i.deptno;&lt;br /&gt;  dbms_output.put_line(i.dname);&lt;br /&gt;  dbms_output.put_line('--------------');&lt;br /&gt;  loop&lt;br /&gt;    fetch c_emp into er;&lt;br /&gt;    exit when c_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.name || ' - ' || er.sal);&lt;br /&gt;  end loop;&lt;br /&gt;  close c_emp;&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;-----------------nested proc (it is like class's static method. it is just like package)&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;type r_cursor is REF CURSOR;&lt;br /&gt;c_emp r_cursor;&lt;br /&gt;type rec_emp is record&lt;br /&gt;(&lt;br /&gt;  name  varchar2(20),&lt;br /&gt;  sal   number(6)&lt;br /&gt;);&lt;br /&gt;er rec_emp;&lt;br /&gt;procedure PrintEmployeeDetails is&lt;br /&gt;begin&lt;br /&gt;  loop&lt;br /&gt;    fetch c_emp into er;&lt;br /&gt;    exit when c_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.name || ' - ' || er.sal);&lt;br /&gt;  end loop;&lt;br /&gt;end;&lt;br /&gt;begin&lt;br /&gt;for i in (select deptno,dname from dept)&lt;br /&gt;loop&lt;br /&gt;  open c_emp for select ename,sal from emp where deptno = i.deptno;&lt;br /&gt;  dbms_output.put_line(i.dname);&lt;br /&gt;  dbms_output.put_line('--------------');&lt;br /&gt;  PrintEmployeeDetails;&lt;br /&gt;  close c_emp;&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;------------------by passing parameters, we can move the print proc outside&lt;br /&gt;&lt;br /&gt;declare&lt;br /&gt;type r_cursor is REF CURSOR;&lt;br /&gt;c_emp r_cursor;&lt;br /&gt;type rec_emp is record&lt;br /&gt;(&lt;br /&gt;  name  varchar2(20),&lt;br /&gt;  sal   number(6)&lt;br /&gt;);&lt;br /&gt;procedure PrintEmployeeDetails(p_emp r_cursor) is&lt;br /&gt;  er rec_emp;&lt;br /&gt;begin&lt;br /&gt;  loop&lt;br /&gt;    fetch p_emp into er;&lt;br /&gt;    exit when p_emp%notfound;&lt;br /&gt;    dbms_output.put_line(er.name || ' - ' || er.sal);&lt;br /&gt;  end loop;&lt;br /&gt;end;&lt;br /&gt;begin&lt;br /&gt;for i in (select deptno,dname from dept)&lt;br /&gt;loop&lt;br /&gt;  open c_emp for select ename,sal from emp where deptno = i.deptno;&lt;br /&gt;  dbms_output.put_line(i.dname);&lt;br /&gt;  dbms_output.put_line('--------------');&lt;br /&gt;  PrintEmployeeDetails(c_emp);&lt;br /&gt;  close c_emp;&lt;br /&gt;end loop;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------------------------notes&lt;br /&gt;-------------------------------&lt;br /&gt;-------------------------------&lt;br /&gt;-------------------------------&lt;br /&gt;&lt;br /&gt;A. Environment&lt;br /&gt;&lt;br /&gt;1. create or replace will keep all grants, so use it, instead of drop then create again&lt;br /&gt;2. execute PPP.XXXX('para1'); or BEGIN addtuple1(99); END; . then \&lt;br /&gt;3. errors is in user_errors&lt;br /&gt;&lt;br /&gt;(in sqlplus: show errors procedure &lt;procedure_name&gt;;&lt;br /&gt;&lt;br /&gt;4. source is in all_source (or dba_source), user_objects&lt;br /&gt;&lt;br /&gt;5. sometimes need to recompile: alter procedure/package XXXX compile&lt;br /&gt;&lt;br /&gt;6. sqlplus: "." (period) means the end&lt;br /&gt;7. sqlplus: "/" means "run;"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B. Package, Procedures&lt;br /&gt;1. always use package to organize procedures, as namespace.&lt;br /&gt;2. also, package has an extra feature: it is like static class, its static initializer is at the bottom of the body: immediately before the end, you add a begin block for package initializer.&lt;br /&gt;3. note that "package body" is the meat; package itself is just a useless trace of C++ heritage.&lt;br /&gt;4. in package body, you put pl/sql block. A block always has: declare (optional), begin, exception (optional), end.&lt;br /&gt;5. in exception section: you use "when ZERO_DIVIDE, then", you can use "when others". To raise exception, you can use "RAISE" (typically used outside exception section, to handle it yourself in the SP's exception section later), or (to let it bubble up by the system), RAISE_APPLICATION_ERROR (from -20001 to -20999)&lt;br /&gt;6. in command section: you can use if-then-elsif-then-else, and loop (exit when, or, while XXX, or, for-XXX-in).&lt;br /&gt;7. The most interesting thing is its cursor related stuff: &lt;=======================  (a) a cursor is just like a "reader" in ADO. For example, we can declare: "cursor rad_cursor is select * from RADIUS_VALS". &lt;========================================  (b) note that rad_cursor is an instance (not a type); however, we can have a type based on the instance: ----(i) rad_val rad_cursor%ROWTYPE; ----(ii) radius rad_val.Radius%TYPE; (c) to loop through a cursor, we can use simplified syntax, so that we do not need to write open, fetch-XX-into-YY, and close, or test rad_cursor%NOTFOUND (or rad_cursor%ROWCOUNT), we simply say: "for rad_val in rad_cursor". (d) in the loop, we can have some pl/sql's special sqls. For example: ----SELECT e,f INTO a,b FROM T1 WHERE e&gt;1;&lt;br /&gt;----DELETE FROM T1 WHERE CURRENT OF T1Cursor;&lt;br /&gt;&lt;br /&gt;(e) note: (b)(c)(d) are not really necessary if you do things right. All we really need is to wrap basic CRUD sqls with SPs, with absolutely no processing (i.e. logic) at all (the so-called "data logic" is really just performance optimization -- as a result, in normal development, we do not even think about it -- we deal with it with systematic measurement etc. In general, in almost all projects, if you do it right, you do not need to do any "data logic" optimizations).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C. Other things like Functions, Triggers, etc.&lt;br /&gt;----. comment /* */&lt;br /&gt;----. usually we use procedures (use out parameter for return values), not functions. However, function can return a value. Function can be used in sql (it should well-behaved, i.e., no out parameter, it should not change things).&lt;br /&gt;----. trigger naming convention: BU_ROW_XXXXXX, "B" means before, "U" means update, "ROW" means row-level, XXXX for table name. We can combine I and U etc, in the body, we can use "if inserting than" to differentiate them.&lt;br /&gt;----. trigger can be triggered by a column; further, we use "when" to add extra conditions to be triggered.&lt;br /&gt;----. in trigger, we can use :new.YYY, :old.XXX to get the column values.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/procedure_name&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8843827314438011016?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8843827314438011016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8843827314438011016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8843827314438011016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8843827314438011016'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/oracle-stored-procedures-notes.html' title='Oracle Stored Procedures examples and notes'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1173095420095448562</id><published>2007-08-25T18:30:00.000-07:00</published><updated>2007-08-25T20:57:13.659-07:00</updated><title type='text'>Siebel CRM: technical and process</title><content type='html'>Siebel CRM: technical and process&lt;br /&gt;&lt;br /&gt;A. Technical:&lt;br /&gt;&lt;br /&gt;1. ActiveX, instead of Ajax: Siebel CRM (8.0) is web based. It does not use Ajax, instead, it uses two modes, one is "high interactive" mode, which uses ActiveX; another one is for non-IE clients, uses "standard mode", which uses pre-ajax stuff. It is said that it used java applet before activeX (that is why those ActiveXs are still called "applet" in Siebel), then, because java was too slow, so,  java was replaced by ActiveX. Obviously, it is a wrong decision that ajax is not used.&lt;br /&gt;&lt;br /&gt;2. Siebel UI is a little bit less intuitive than ordinary web or window applications. However, by doing this, it enables its UIs to be generic enough to handle complex situations systematically.&lt;br /&gt;(i) For example, it uses command menus, instead of command buttons.&lt;br /&gt;(ii) Also, it uses a pattern: select a node on the left-side-tree-view, to get the right-side-list-view, then, select a row on the right-side-list, then, select a child node on the left-side-tree (usually, this step should happen on the right-side, by a child list), then, the right-side will have a child list to show the content of the child node.&lt;br /&gt;(iii) Another example is that all UIs are always made of two "applets" (that is, in addition to the tree): "list" (i.e., grid), "form" (many label+text boxes/drop down menus) , plus some tabs or links (category tabs, view tabs, and screen tabs) -- you can put the list "applet" on top, then, this is the "aggregate view" style (users are familiar with this view; because they are used in all ordinary web sites); you can also put the form "applet" on top, then, it is the "detailed  view" -- however, in this situation, this view is counter-intuitive, because most users expect to see a three-tier view: the grand-parent at the top, then, the parent, then, the grand-children.&lt;br /&gt;(iv) Also, in the "high interactive" mode, it uses in-place editing, and uses in-place editing-like style to do searching. In ordinary web application, editing uses the form "applet"; further, searching also uses the form "applet".&lt;br /&gt;&lt;br /&gt;Those things are not intuitive, further, some are not necessary -- not using them can make Siebel UIs more intuitive and still be generic -- however, as a whole, they are good enough, and they make the following "mapping" possible:&lt;br /&gt;&lt;br /&gt;"applet" -- entity objects (in Siebel, entities are called "business components")&lt;br /&gt;"view"    -- facade objects (in Siebel, facades are called "business objects")&lt;br /&gt;&lt;br /&gt;3.  Siebel facades are in a proprietary application server.  Actually, its UIs are also in the app server. The generic "web server" is  still used though, mostly for load balancing. As a result, for integration, web service is used to get data from those facades.&lt;br /&gt;&lt;br /&gt;4. Another surprise about Siebel is that its database does not even enforce FKs. FK are enforced in its facades and entities.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some thoughts:&lt;br /&gt;&lt;br /&gt;On the one hand, after understanding the details of Siebel, I appreciate more about the statement that in the world of lightweight (i.e., no entity bean, but OR mapping) java and .net, Siebel is too expensive for its value.  As long as you have an experienced team lead (or architect) so that you know how to say no to unreasonable non-essential UI features and know how to use OR mapping, systematic Ajax with databinding, centralized security and logging (and transaction and networking), and validation, then, the difference between creating your own application and configuring Siebel is not that big.&lt;br /&gt;&lt;br /&gt;On the other hand, I do see the value of saying no to unreasonable non-essential UI features, and OR mapping, systematic Ajax with databinding, centralized security  and logging (and transaction and networking),  and validation.  If you can do those things right and fast, then, it  is worth millions!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B. Process:&lt;br /&gt;&lt;br /&gt;Siebel 's success also points out that it is important to have a working prototype. This is the major advantage of on-shelf software. For an enterprise level  application that usually will take two or three years,  you can demo a prototype immediately, and then put it to user's hands within a few weeks or a few months.&lt;br /&gt;&lt;br /&gt;However, it is amazing to hear that you need produce large  amount of documents before implementing  Siebel. I do not believe it. I believe it is crap. The key of using Siebel is to do some preliminary research (and "requirement gathering) to decide to use Siebel, then,  use a few weeks to set it up and use it. Then, fine tune it, configure it, and even customized it. Of course, we need to document along the process; however, heavy weight upfront documentation without letting users try Siebel out is simply wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1173095420095448562?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1173095420095448562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1173095420095448562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1173095420095448562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1173095420095448562'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/siebel-crm-technical-and-process.html' title='Siebel CRM: technical and process'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3278456100209930961</id><published>2007-08-25T12:47:00.000-07:00</published><updated>2007-08-25T16:27:29.951-07:00</updated><title type='text'>domain modeling, concept analysis, knowledge structure, ontology, "applying" knowledge and faith</title><content type='html'>domain modeling, concept analysis, knowledge structure, ontology, "applying" knowledge and faith&lt;br /&gt;&lt;br /&gt;This blog is try to expand the perspective of "8 core techniques" + "3 questions" (high-level use cases, uses cases, domain model).  More accurately, it is to expand "3 questions", because it is "3 questions" that expands "8 core techniques" into business process perspective.  In this blog, I  will continue to expand that into everyday life.&lt;br /&gt;&lt;br /&gt;There are two questions: (a) can domain modeling be used  as a general concept analysis tool? -- perhaps we need a concept of "knowledge structure"; (b) everything is knowledge, is that really true?&lt;br /&gt;&lt;br /&gt;(a) Let's say, can we apply domain modeling in physics study? Putting it that way, to be frank, I doubt it. However, how about computational  physics?  Then, the difference between "ordinary" physics and computational physics? I believe there are three elements here.&lt;br /&gt;(i) In domain modeling, the key is the multiplicity. Is multiplicity the key for other concept analysis? I really doubt it. However, is multiplicity really the whole story of domain analysis? No. Further, having a sense of multiplicity will help qualitative analysis.&lt;br /&gt;(ii) It seems that when we do "ordinary" concept analysis, we tend to blur the border between the reality and the concept, i.e., the representation of the reality. It is not a good habit. When we do "domain modeling", we know the difference, because we know we are doing data modeling or in-memory-object modeling. However, "data" or "in-memory-object" are obvious too nerdy, too computer/software-centric. So, I believe "knowledge structure" (or, "ontology") is a good concept. It is more tangible than "concept analysis", and therefore can remind us the border between reality and the representation of reality, while it can be applied to "wet" brain, and used naturally everywhere and not (too) nerdy.&lt;br /&gt;(iii) From academic point of view, "knowledge structure" should be a important concept in philosophy, more specifically, ontology, philosophy of language, philosophy of science,  metaphysics, epistemology, and, my favorite (seriously, perhaps someday I will go back to study of psychology) psychology of sleep: http://pespmc1.vub.ac.be/KNOWSTRUC.html (the result of the googling after I wrote this blog).&lt;br /&gt;&lt;br /&gt;more links from googling "ontology"&lt;br /&gt;&lt;br /&gt;http://en.wikipedia.org/wiki/Ontology&lt;br /&gt;http://ontology.buffalo.edu/&lt;br /&gt;http://www-ksl.stanford.edu/kst/what-is-an-ontology.html&lt;br /&gt;http://www.jfsowa.com/ontology/&lt;br /&gt;&lt;br /&gt;---------------- a quote from wikipedia about the differences between the ontology studies of computer science and philosophy&lt;br /&gt;&lt;br /&gt;&lt;p&gt;What ontology has in common in both computer science and philosophy is the representation of entities, ideas, and events, along with their properties and relations, according to a system of categories. In both fields, one finds considerable work on problems of ontological relativity (e.g. Quine and Kripke in philosophy, Sowa and Guarino in computer science (Top-level ontological categories. By: Sowa, John F. In International Journal of Human-Computer Studies, v. 43 (November/December 1995) p. 669-85.), and debates concerning whether a normative ontology is viable (e.g. debates over foundationalism in philosophy, debates over the &lt;a href="http://en.wikipedia.org/wiki/Cyc" title="Cyc"&gt;Cyc&lt;/a&gt; project in AI).&lt;/p&gt; &lt;p&gt;Differences between the two are largely matters of focus. Philosophers are less concerned with establishing fixed, controlled vocabularies than are researchers in computer science, while computer scientists are less involved in discussions of first principles (such as debating whether there are such things as fixed essences, or whether entities must be ontologically more primary than processes). During the second half of the 20th century, philosophers extensively debated the possible methods or approaches to building ontologies, without actually &lt;i&gt;building&lt;/i&gt; any very elaborate ontologies themselves. By contrast, computer scientists were building some large and robust ontologies (such as &lt;a href="http://en.wikipedia.org/wiki/WordNet" title="WordNet"&gt;WordNet&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Cyc" title="Cyc"&gt;Cyc&lt;/a&gt;) with comparatively little debate over &lt;i&gt;how&lt;/i&gt; they were built.&lt;/p&gt;--------------------------&lt;br /&gt;&lt;p&gt;(b) Let's say that we use "knowledge structure" (ontology) everywhere, but can we really do it in art experience, or, even better, religious experiences? Note that I am referencing to "experiences", not art theory/aesthetics or theology -- they can be treated as knowledge, obviously. This is just another form of the difference between reality and the representation of reality -- but more directly, and cannot be  "postponed" anymore. By "postponed" I mean, in other places, for example, in technology or engineering or mathematics, or even business, we can "postpone" the differences between "reality" and "knowledge of reality" by "transforming" ("learning") "reality" to "knowledge of reality" -- it seems that it is OK that we do that -- actually, most of the time, in our more and more sophisticated world, it seems that it is the preferred way to do that -- when you do something, you must know what you are doing, do not "just do it".&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;However, in art it is not the case; it it even more "not the case" in the faith life (or "religious life" -- but it seems that "faith life" has a more positive tone).&lt;br /&gt;&lt;br /&gt;It seems that knowledge and faith are not symmetric. Knowledge is a space-like, while faith is a singularity -- when you begin to talk about faith, then, the content of your talk is transformed into knowledge!&lt;br /&gt;&lt;br /&gt;However, the singularity is the most active part of our life. Put it in another way, it is the "engine" of the "learning", and more importantly, "applying", of the huge space of knowledge -- obviously, you'd better "oil" the engine nicely!&lt;br /&gt;&lt;br /&gt;OK, this blog is (still) a technical one, as result (and purely so), the point I am trying to make here is not about the faith life -- that is personal -- it is about "knowledge structure": except one and only one singularity that we cannot really talk (whenever we talk, it is changed into knowledge), everything is knowledge; consequently, everything can be covered by the concept of "knowledge structure". As a result, let's use "ontology" more often.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3278456100209930961?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3278456100209930961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3278456100209930961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3278456100209930961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3278456100209930961'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/domain-modeling-concept-analysis.html' title='domain modeling, concept analysis, knowledge structure, ontology, &quot;applying&quot; knowledge and faith'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4035001987630939137</id><published>2007-08-18T16:29:00.000-07:00</published><updated>2007-08-18T17:13:48.503-07:00</updated><title type='text'>Why and How to use server side ajax -- even you do not like it</title><content type='html'>Why and How to use server side ajax -- even you do not like it&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Think about it, SP now is not that harmful,  because we all accept the statement "never put (business) logic in SP" -- this is  the way to "neutralize" SP (if you realize that all "data logic" belongs to "business logic" -- other than performance optimization -- then, you basically have nailed SP to nothing!) . We need to find the equivalent thing in server side ajax.&lt;br /&gt;&lt;br /&gt;The key of using server side ajax is to understand the two sides:&lt;br /&gt;&lt;br /&gt;1. "Configuring" via XML is not necessary, but for now (pre-Orcas) it is indeed a little bit simpler than javascript.&lt;br /&gt;&lt;br /&gt;2. The harm is that you do not know when to stop, and continue to hack features on the server side, while it is really easy to do it via javascript API of those server side controls.&lt;br /&gt;&lt;br /&gt;So, the key is to remember the javascript API of those server side controls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4035001987630939137?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4035001987630939137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4035001987630939137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4035001987630939137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4035001987630939137'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/why-and-how-to-use-server-side-ajax.html' title='Why and How to use server side ajax -- even you do not like it'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5172819175438190997</id><published>2007-08-18T15:56:00.000-07:00</published><updated>2007-08-18T16:29:31.150-07:00</updated><title type='text'>Why and How to use stored procedures -- even you do not like them</title><content type='html'>Why and How to use stored procedures -- even you do not like them&lt;br /&gt;&lt;br /&gt;1. Stored procedures certainly have their values. For example, when you do not use web services, and you have multiple-platforms, stored procedures provide all the benefits of web services. As a matter of fact, web services (or application servers) are simply stored-procedures-moved-out-from-databases.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. However, in everyday development, it is antique practice to do stored procedures. I know, M$ marketing and some tutorial demo people are still recommending it; but if you take the words from marketing people or tutorial people as your engineering guidelines, then, you are kidding yourself!&lt;br /&gt;&lt;br /&gt;3. The real valid reason of using stored procedures is consistency. If you are in a M$ shop, and if there are a lot of code using SP, and people are used to using SP, then, you have to use it -- until there is a big project that you can break the obsolete tradition (I will explain when next).&lt;br /&gt;&lt;br /&gt;4. The above reason also implies that SP does not really hurt that much, it is just a little bit waste. As a result, you should not be too enthusiastic about removing SP. You must choose your battle, concentrate on making productive changes that really benefit the team, not making those purposeless changes.&lt;br /&gt;&lt;br /&gt;5.  Then, when should you push really hard to eliminate the SP practice? When you use OR mapping! Until then, keep using SP -- it is harmless for now.&lt;br /&gt;&lt;br /&gt;6. Of course, you should not put logic in SP; or, relaxing it a little bit, you can put "data logic" in SP -- frankly, it is really a political compromise; for my taste, absolutely no logic at all -- the whole SP will go away, why bother to think about where to draw the line between "data logic" and "business logic", crazy. If you think about it, "data logic" is really just a performance optimization concept. As a result, using it as everyday practice guideline is really counterproductive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5172819175438190997?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5172819175438190997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5172819175438190997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5172819175438190997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5172819175438190997'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/why-and-how-to-use-stored-procedures.html' title='Why and How to use stored procedures -- even you do not like them'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4340471478117216022</id><published>2007-08-18T09:46:00.000-07:00</published><updated>2007-08-18T11:49:11.005-07:00</updated><title type='text'>Too many technologies, framework or not  and aop, and spring.net</title><content type='html'>Too many technologies, framework or not  and aop, and spring.net&lt;br /&gt;&lt;br /&gt;A. It is a common feeling that M$ offers too many technologies. This is especially troublesome for team leadership -- some "new" developers keep introducing stuff, all M$ "recommended".&lt;br /&gt;&lt;br /&gt;To deal with it, we have to say: you cannot use new technologies, just because you can and they are new. They must be relevant and make sense.&lt;br /&gt;&lt;br /&gt;I go further. Using new technologies must fit into two categories: it directly meet users' needs of certain features, or, it solves the issues that the "8 core techniques" try to solve.&lt;br /&gt;&lt;br /&gt;(1) The core of the core? coarse-grained AOP, of course:  centralized security, logging, transaction, and networking.&lt;br /&gt;&lt;br /&gt;(2) Below it, the logging (implementation) and database acess.&lt;br /&gt;&lt;br /&gt;(3) Above it, fine-grained AOP (entity logic-validation), and MVC (or, MVPC) -- i.e., databinding.&lt;br /&gt;&lt;br /&gt;If a new technology does not help solving those problems (and not directly address a feature needed by users), then, forget about it.&lt;br /&gt;&lt;br /&gt;B. Framework or not&lt;br /&gt;&lt;br /&gt;(1) The key is how effective a coding guideline or an architecture guideline can be.  My bet is that they rarely work! You cannot solve an engineering issue by using pure managerial techniques. You must "automate" the "guidelines", which is a framework!&lt;br /&gt;&lt;br /&gt;-- The only real effective guidelines  are  those that enforced by a framework.&lt;br /&gt;&lt;br /&gt;(2) Another key is how fast you can get implement features in security, logging,  transaction, networking (and validation), with reasonable (acceptable) quality. My experience is that you rarely can, without a framework.&lt;br /&gt;&lt;br /&gt;-- The only fast and easy way to implement reliable security, logging,  transaction, networking (and validation) is to use a good (and easy) framework. -- note that here, a framework helps you get things done faster, not slower!&lt;br /&gt;&lt;br /&gt;Note that I backed off from spring.net, because I cannot convince people about this, and I have to accept the consensus at that time. However, it turns out that it all depends on the size of your vision and perspective. If it is large enough (e.g. anything &gt; 7 person-year, no mention a whole enterprise system), then, it should be spring.net.&lt;br /&gt;&lt;br /&gt;Also note that I am more and more convinced that AOP is the center here, not IOC or TDD. The key is that AOP is inherently feature-oriented -- you need those security features!&lt;br /&gt;&lt;br /&gt;C. choice among Spring.net, castle, M$ entlib 3.0: &lt;br /&gt;&lt;br /&gt;(1)  needs politically correctness for a M$-only shop: M$ entlib 3.0&lt;br /&gt;(2) likes dynamic new challenges: castle&lt;br /&gt;(3) is pragmatic, mature: spring.net (plus log4net, no need to use M$'s logging)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4340471478117216022?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4340471478117216022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4340471478117216022' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4340471478117216022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4340471478117216022'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/too-many-technologies-framework-or-not.html' title='Too many technologies, framework or not  and aop, and spring.net'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3551919795406180349</id><published>2007-08-18T09:40:00.000-07:00</published><updated>2007-08-18T09:45:15.412-07:00</updated><title type='text'>another set of wording about layering from SOA</title><content type='html'>UI or service&lt;br /&gt;facade -- processor&lt;br /&gt;dao -- connector&lt;br /&gt;db -- resources  ----- I like "resources", it connect to REST: the key concept of REST is that service expose resource directly, "antique OO encapsulation" is not true after all, at least not totally true.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3551919795406180349?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3551919795406180349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3551919795406180349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3551919795406180349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3551919795406180349'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/another-set-of-wording-about-layering.html' title='another set of wording about layering from SOA'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4071021897308644264</id><published>2007-08-04T12:37:00.000-07:00</published><updated>2007-08-04T12:54:07.592-07:00</updated><title type='text'>How to use and participate Open Source</title><content type='html'>How to use and participate Open Source&lt;br /&gt;&lt;br /&gt;For thin frameworks, you must learn to tear them apart; for frameworks that are absolutely necessary, you cannot really tear them apart. However, you can do something close to tearing it part – only use its core, never cut/paste big examples, or, “user extensions”. Gradually, by combining those libraries, you effectively, well tearing them apart.&lt;br /&gt;&lt;br /&gt;Yes, I am talking about javascript libraries – they are absolutely necessary, so, you cannot simply tear them apart.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The key is that do not try to cut/paste everything. Once you have a key feature (e.g., a grid in ext), you should stop paying attention to big examples.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------more elaborations&lt;br /&gt;Must: go through all other small tutorial examples, so that you have the ability to search/ask the forum for small pieces of code (not even examples, just a few lines code or even just ideas)&lt;br /&gt;&lt;br /&gt;Must NOT: continue looking for/at big examples (you need to do that in the very beginning, to make sure that the whole thing is capable), but you must not try to use it immediately. You must build from scratch at the core-grid level -- prematurely trying to use "user extensions" or "big examples" will actually slow you down.&lt;br /&gt;&lt;br /&gt;   --------in short: big examples are only for evaluation&lt;br /&gt;   --------when development, make sure start from core of the framework!!!&lt;br /&gt;&lt;br /&gt;---------------------even more elaboration&lt;br /&gt;I understand the pressure to get something done -- you need cut/past things. However, that kind of pressure will only slow down you, unless what you really need is just some superficial demo (actually, this is a technique to reduce pressure -- offer managers some superficial demos, i.e. download something, make it run, change UI wording by hard-coding the working in UI to make it looks like relevant to what you are doing.&lt;br /&gt;&lt;br /&gt;Those demos can be treated as evaluation task. For real development, you need to fine-tune thing, so, you need all details! So, sooner or later, you have to do it. If you do it in the beginning, it is streamlined, much more efficient, and must fewer crises.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;By doing the above, even if you "just" use it, you are participating the open source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4071021897308644264?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4071021897308644264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4071021897308644264' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4071021897308644264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4071021897308644264'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/how-to-use-and-participate-open-source.html' title='How to use and participate Open Source'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-4109079497858411151</id><published>2007-08-02T19:18:00.000-07:00</published><updated>2007-08-02T19:26:17.438-07:00</updated><title type='text'>REST -- web service is all about data (or "resource")</title><content type='html'>REST -- web service is all about data (or "resource")&lt;br /&gt;---- REST and “domain model must follow data model” again, CSLA again, and FIT again&lt;br /&gt;&lt;br /&gt;1. Theory or perspective -- REST and data warehouse: REST is just a completion of the data-warehouse vision: it is totally OO crap saying that data should be wrapped. At higher level, data is visible by users – actually, at that level, data is all users cares. Business logic is just a means to reach the data (‘state”).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;“Completion”, because data-warehouse only point out the “GET” (or “R” in CRUD”) – via dimensions – users know dimensions.&lt;br /&gt;&lt;br /&gt;REST now put all CRUD (“GET”, “POST”, “PUT”, “DELETE”) in the picture. The key is the idempotent feature: GET is automatically that way, DELETE and PUT also, but is tricky, POST you need to do something.&lt;br /&gt;&lt;br /&gt;Note you may simply say REST (“resource”) is closer to “document” point of view, and SOAP is closer to “procedure” point of view. However, for most real programmers, “document” is nobody, nothing, null – it cannot invoke any associations and thinking! The only powerful concept here is “data”. We must understand that from a high level point of view, “data” and “document” are the same thing. SOAP wants to hide data; REST want to expose data. Note that the data is not tiny details, but things like “dimensions”!&lt;br /&gt;&lt;br /&gt;This is consistent with other data-centric point of views: for high level analysis, talk data. Do not say users do not know data, they know, and data are all they really care!&lt;br /&gt;&lt;br /&gt;Also, saying that you cannot create domain model by data model – again, antique OO crap. The opposite is true: the backbone of the domain model must be data model – if not, then, domain model is wrong.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Practice -- REST and client-server: REST makes things simpler for client (with JSON, even vb3 and javascript can do it!), but-and-so, it requires more from the servers (so, regular SOAP must be enhanced-i.e.-wrapped, to deal with issues like e.g. the idempotent issue. Note that if idempotent issue only happens if you think data.&lt;br /&gt;&lt;br /&gt;3. Summary: Web Service is at higher level than facade. So, it cannot be procedural anymore, it must be resourceful or restful -- it must be like data warehouse's dimensional. &lt;br /&gt;&lt;br /&gt;4. It is funny that CSLA has CRUD everywhere, yet most people cannot see that it begs for REST point of view (its mantra is so-called "a class is determined by its behavior" -- antique OO crap!). Also, it has cross-concern regularity everywhere, yet the most people cannot see (or do not want to mention) AOP! CSLA always surprises me.&lt;br /&gt;&lt;br /&gt;5. Also, REST makes more sense to FIT – you shall pay attention to data! FIT is all about data, isn’t it?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-4109079497858411151?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/4109079497858411151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=4109079497858411151' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4109079497858411151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/4109079497858411151'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/rest-web-service-is-all-about-data-or.html' title='REST -- web service is all about data (or &quot;resource&quot;)'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7225519091341217734</id><published>2007-08-02T10:40:00.000-07:00</published><updated>2007-08-02T11:24:52.720-07:00</updated><title type='text'>the open source way: there are many ways -- at least three -- to do it; be aware</title><content type='html'>There is a minor issue with ext -- when turning the autosize on, it is slow when there are many -- e.g. &gt; 10 -- columns. So, I will not turn it on.  Not  a big deal.&lt;br /&gt;&lt;br /&gt;However, this reminded me a thing: even it is the best, ext is NOT the only one. Rico is good to get ideas, and YUI is good to get javascript engineering ideas and good documentation about it -- this is because YUI  is from Yahoo, and only Yahoo knows how to do javascript engineering; this is especially true for ext, because ext grew out of YUI, so, all Yahoo doc applies to ext almost directly.&lt;br /&gt;&lt;br /&gt;So, the following should always be there:&lt;br /&gt;&lt;br /&gt;--------------&lt;br /&gt;http://localhost/rico2/rico/examples/asp/ex8.asp&lt;br /&gt;   download it, on the example index.html,&lt;br /&gt;   and click the online http://dowdybrown.com/dbprod/rico2/examples/php/ex6.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;YUI and jackslocum's old posting when it is YUI-ext and other's posts, e.g.&lt;br /&gt;http://www.rodrigodiniz.qsh.eu/YahooGrid.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7225519091341217734?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7225519091341217734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7225519091341217734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7225519091341217734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7225519091341217734'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/open-source-way-there-are-many-ways-at.html' title='the open source way: there are many ways -- at least three -- to do it; be aware'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6959392251981190670</id><published>2007-08-01T19:50:00.000-07:00</published><updated>2007-08-01T20:05:42.184-07:00</updated><title type='text'>aptana is crap. Use vim or notepad2, before orcas</title><content type='html'>Just to be fair, I have to tell the truth: aptana is crap, at least for now.&lt;br /&gt;&lt;br /&gt;For now, use Vim (my choice), or, if you are not capable of using vim ;-), use notepad2.&lt;br /&gt;When Orcas comes out, use it.&lt;br /&gt;&lt;br /&gt;My guess aptana is targeting poor java programmers, or flash/air programmers: they do not have Oracas ;-)&lt;br /&gt;&lt;br /&gt;a. Aptana cannot handle debugging -- you need firebug (or, script debugger if you really hate firefox AND yourself! -- but script debugger does work though, after you configure it right -- just weaker than firebug!).&lt;br /&gt;&lt;br /&gt;b. Aptana cannot handle intellisense -- your need your brain for that.&lt;br /&gt;&lt;br /&gt;c. Aptana cannot even handle block comment -- you need VS2005.&lt;br /&gt;&lt;br /&gt;d. Aptaqn cannot even handle paring braces, brackets, parenthesis (very important for javascript), VS2005 cannot handle them either; but both vim and notepad2 can!&lt;br /&gt;&lt;br /&gt;Note: when you do web or other server intensive development, it is very important that you MUST be able to use notepad(2) or vim to do development, at least once for a while (i.e., every time you need to introduce a new thing, set up new stuff, you MUST start from notepad, if you do not, it means you are just a VB6-like clicker, not a programmer), otherwise, you have no way to really understand things -- this is a good interview question for web developer: Do you use a notepad or notepad-like editor other than visual studio, how often? -- of course, most VB6-turned developers fail this question -- believe it or not, they are incapable of using notepad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6959392251981190670?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6959392251981190670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6959392251981190670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6959392251981190670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6959392251981190670'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/aptana-is-crap-use-vim-or-notepad2.html' title='aptana is crap. Use vim or notepad2, before orcas'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-289156392535113771</id><published>2007-08-01T14:05:00.000-07:00</published><updated>2007-08-04T12:37:26.483-07:00</updated><title type='text'>summary or simplification of javascript coding style</title><content type='html'>&lt;a href="http://javascript.crockford.com/code.html"&gt;http://javascript.crockford.com/code.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;summary or simplification of javascript coding style:&lt;br /&gt;&lt;br /&gt;1. keys of keys:&lt;br /&gt;&lt;br /&gt;a. declare variables in the beginning of the function (like old C style)&lt;br /&gt;(i) this can be important to avoid confusion. Javascript variable has no block scope&lt;br /&gt;---------however, I must add that this is a uphill battle with Java (and now some C# people who have really reinvented themselves from VB6 -- this is a very good interview question for C# people -- if they worked in C# for a while, then, they know; otherwise, they will still use VB6 style) guys. I myself cannot do it. So, I will not do it. I will keep it in mind, but I will do it java style (and modern C++ style also)-- i.e., when I use it, I declare it. I do not declare it before I use it. ---- this actually can help prevent from declaring a variable -- now, it is easy, I always var it; otherwise, I have to check whether I var-ed it or not in the beginning of the function.&lt;br /&gt;&lt;br /&gt;b. First line does not start from a new line&lt;br /&gt;(i) this is to avoid semicolon insertion&lt;br /&gt;(ii) which can create the "return null problem" (return null when the value is not the same line with "return")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;c.&lt;br /&gt;update: I found another good one: always put "," at the beginning of the line for array elements. This way, you will not forget to add it or remove it when cut/paste. Forget removing ',' is especially bad, becuase firefox is fine, but IE will freak out -- long after you have done the coding!&lt;br /&gt;&lt;br /&gt;2. Keys:&lt;br /&gt;&lt;br /&gt;a. === and !==: use them most of the time, instead of == and != (also: use the old c trick, 3 === myVarv ------ update: forget about it; does not work! Also, it seems that it is not intuitive, against rule of literate programming. Further, the "===" has a strong psychological effect, you will not use "=" within if anymore! ---- also, within if etc, there should never be valid "=". All those can eliminate the problem -- hepefully).&lt;br /&gt;&lt;br /&gt;(i) It is almost always better to use the === and !== operators. The == and != operators do type coercion. In particular, do not use == to compare against falsy values.&lt;br /&gt;(ii) note: if you use ==, if one of them is a number, then, if the other is a string, the string will be changed to a number.&lt;br /&gt;&lt;br /&gt;b. + sign as parseInt (+ is necessary because other wise it will be a string if one of them is string!)&lt;br /&gt;total = subtotal + +myInput.value;&lt;br /&gt;is better written as&lt;br /&gt;total = subtotal + (+myInput.value);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. You must do, but you will remember when you need them:&lt;br /&gt;&lt;br /&gt;a. use object.hasOwnProperty(variable) to get the "true members"&lt;br /&gt;&lt;br /&gt;for (variable in object) { if (object.hasOwnProperty(variable)) { statements; } }&lt;br /&gt;&lt;br /&gt;b. "do" block: it needs ";" (unlike while or for)&lt;br /&gt;(this is important only because we must not forget the ;&lt;br /&gt;because inserting ; by compliler is bad thing -- see above return null issue)&lt;br /&gt;&lt;br /&gt;do { statements; } while (condition);&lt;br /&gt;&lt;br /&gt;c. "with Statement" -- never use it!&lt;br /&gt;&lt;br /&gt;The with statement should not be used.&lt;br /&gt;use a variable, and assign the namespace/class name to the variable:&lt;br /&gt;&lt;br /&gt;var o = ooo.eee.oo.ah_ah.ting.tang.walla.walla;&lt;br /&gt;o.bing = true;&lt;br /&gt;o.bang = true;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Nice to do:&lt;br /&gt;&lt;br /&gt;a. No m_ or _ etc. for private members&lt;br /&gt;---- because javascript has no such concept.&lt;br /&gt;---- sse the right provate mechanism, so that all are provate except the "returned".&lt;br /&gt;&lt;br /&gt;b. Braces should be used around all statements as long as it is a compound statement, do not use the one-line version (i.e. no brace version), even for single statements, when they are part of a control structure, such as an if or for statement. This makes it easier to add statements without accidentally introducing bugs.&lt;br /&gt;&lt;br /&gt;c. indent 4 spaces, do not use tab.&lt;br /&gt;&lt;br /&gt;d. do not use "continue Statement" because it tends to obscure the control flow of the function.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-289156392535113771?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/289156392535113771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=289156392535113771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/289156392535113771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/289156392535113771'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/httpjavascript.html' title='summary or simplification of javascript coding style'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5585803880746873136</id><published>2007-08-01T13:06:00.000-07:00</published><updated>2007-08-01T13:08:37.618-07:00</updated><title type='text'>official reasons for using ajax client model -- even in a MS shop</title><content type='html'>Official reasons for using ajax client model -- even in a MS shop&lt;br /&gt;&lt;br /&gt;1. sufficient: Orcas has superb support of javascript; so, soon javascript will be more important than C# !&lt;br /&gt;&lt;br /&gt;2. necessary: We can wrap it in server side dlls (i.e. the “server side model”) – some people is doing that. However, whenever there is an even tiny issue, you have to jump many hoops to get there – and there are going to be many issues in the coming one or two years (early days for ajax-stage-2 – MS’s asp ajax and orcas marks the beginning of mass-and-better-ajax, hence, ajax-stage-2). So, for at least one or two years, the client side model is the less-pain approach&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5585803880746873136?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5585803880746873136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5585803880746873136' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5585803880746873136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5585803880746873136'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/08/official-reasons-for-using-ajax-client.html' title='official reasons for using ajax client model -- even in a MS shop'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7954721479794422274</id><published>2007-07-31T01:08:00.000-07:00</published><updated>2007-07-31T08:24:30.037-07:00</updated><title type='text'>REST, JSON, SOAP, integration, and migration</title><content type='html'>Rest, JSON, SOAP, integration, and migration&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REST -- I read the paper. The real thing is what I already know, cgi is the best. Do not try to "improve" it, keep it simple; and make it simpler (not more complex!) by introducing some simple regularity.&lt;br /&gt;&lt;br /&gt;XML is not the way to go. It is not simple; so, it must go! JSON is simple, so, it will stay.&lt;br /&gt;&lt;br /&gt;With JSON, with simple http (based on tcp/ip) protocol support of get and post, with simple convention (e.g. everything goes into JSON, no need of separate parameters. Just one string for JSON), and JSON parsing (~100 lines simple code -- it can be done and is already done in any and every language easily), then, we have a distributed computing system!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a result, I do not like SOAP. Yes, it can support JSON. However, you have to handle SOAP. Too complicated.&lt;br /&gt;&lt;br /&gt;However, for political reasons, I have to use SOAP, sometimes.&lt;br /&gt;&lt;br /&gt;So, I will use both. However, I will use asp's page to implement REST, and the primary work horse.&lt;br /&gt;&lt;br /&gt;Direct reasons:&lt;br /&gt;&lt;br /&gt;(a) It is much easier to handle the cross-domain thing. M$ insists on no-cross domain. The only way to support it is to use scripttag-callback. M$ web service does not support it.&lt;br /&gt;&lt;br /&gt;(b) It also makes using Ext easier.&lt;br /&gt;&lt;br /&gt;(c) I can use it in VB3 code (ya, go nuts!), after I use a plain dll that support http and cut/paste json code!!&lt;br /&gt;&lt;br /&gt;All three examples shows that REST is so flexible, because it is so simple!!!&lt;br /&gt;&lt;br /&gt;Note: cut/paste http calls and Json code is OK, it is not duplicate business logic. This is important, because the same mechanism is for VB6 -- by doing this, we can take out VB3/VB6 code piece by piece. Some people argue that for VB6, you should use a dll. That creates dll registering issue, and unnecessarily makes thing complicated. Non-business logic code duplication is fine. Give me a break -- we need to get things done, while remove old code -- this is the only way!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Long live Json+rest! Cgi forever -- my insight and experience from perl cgi and javascript more than ten years ago are still extremely relevant -- it is amazing, especially in Internet time.&lt;br /&gt;&lt;br /&gt;Note that cgi philosophy is directly form unix philosophy: text based, small programs glued with scripting ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7954721479794422274?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7954721479794422274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7954721479794422274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7954721479794422274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7954721479794422274'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/rest-json-soap-integration-and.html' title='REST, JSON, SOAP, integration, and migration'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5787349260757232982</id><published>2007-07-24T22:03:00.000-07:00</published><updated>2007-07-25T02:29:49.561-07:00</updated><title type='text'>thought leader: the reason why YUI is the best architected javascript</title><content type='html'>&lt;p&gt;It is because of this great man: http://www.crockford.com/&lt;/p&gt;&lt;br /&gt;http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.1710507&lt;br /&gt;http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.1027823&lt;br /&gt;http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.992708&lt;br /&gt;http://video.yahoo.com/video/play?vid=630959&lt;br /&gt;http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.2006940&lt;br /&gt;http://developer.yahoo.com/yui/theater/&lt;br /&gt;&lt;br /&gt;If you do not read and watch those, you are not doing any serious javascript programming.&lt;br /&gt;------------------------&lt;br /&gt;&lt;br /&gt;I obviously underestimated YUI -- its good design is not from Java, but directly from Java's parents -- lisp and C++ communities.&lt;br /&gt;&lt;br /&gt;He is obviously a thought leader!&lt;br /&gt;&lt;br /&gt;I feel very good about the  site,  because it says there is only one javascript book, and that is the O'reilly definitive book -- and I read it many years ago, and I believed that that is the only good book for javascript!&lt;br /&gt;&lt;br /&gt;Also, now I know, I can follow YUI, because the Java style is just a disguise, I trust YUI will use Ruby style, because  crockford definitly knows the essence of Ruby.&lt;br /&gt;&lt;br /&gt;http://javascript.crockford.com/tdop/tdop.html  -- I do not believe Ruby has this! I would say, who needs Ruby, javascript is the coolest thing! -- at least its JSLINT part of it.&lt;br /&gt;&lt;br /&gt;BTW, I am now using firefox as my everyday browser. When I do blog, it gives me spell checking. Very nice. Who needs M$! -- now, I understand the statement, M$ as we know it is already dead! its FUD has no use now.  No  real adventure investor needs to pay attention to M$ anymore. Ya, it still alive, just like IBM, who cares. M$ is quickly a IBM-2nd.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;-------------he pays attention to details also:&lt;/p&gt;&lt;p&gt;All variables should be declared before used. JavaScript does not require this, but doing so makes the program easier to read and makes it easier to detect undeclared variables that may become implied &lt;a href="http://yuiblog.com/blog/2006/06/01/global-domination/" target="_blank"&gt;globals&lt;/a&gt;. &lt;/p&gt; &lt;p&gt; The &lt;code&gt;var&lt;/code&gt; statements should be the first statements in the    function body. &lt;/p&gt; &lt;p&gt; It is preferred that each variable be given its own line and comment. They should be listed in alphabetical order. &lt;/p&gt; &lt;pre&gt;    var currentEntry; // currently selected table entry&lt;br /&gt;var level;        // indentation level&lt;br /&gt;var size;         // size of table&lt;br /&gt;&lt;/pre&gt; &lt;p&gt; JavaScript does not have block scope, so defining variables in blocks    can confuse programmers who are experienced with other C family languages.    Define all variables at the top of the function. &lt;/p&gt; &lt;p&gt;Use of global variables should be minimized. Implied global variables    should never be used.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5787349260757232982?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5787349260757232982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5787349260757232982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5787349260757232982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5787349260757232982'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/reason-why-yui-is-best-architected.html' title='thought leader: the reason why YUI is the best architected javascript'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7718703958317698670</id><published>2007-07-24T09:28:00.000-07:00</published><updated>2007-07-24T09:37:54.726-07:00</updated><title type='text'>Using Extjs Grids; YUI: separation of UI and Entity/Facade by using JSON, separation of HTML, CSS, and Javascripts; JQuery: chaining sugar coating</title><content type='html'>1. The three screencasts are the best (the screen is not clear, and seems that when I play them, they stopped about 80% -- enough though). You can download the source code for the 2nd and 3rd.&lt;br /&gt;&lt;br /&gt;http://extjs.com/learn/Screencasts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. only one written tutorial worth reading:&lt;br /&gt;&lt;br /&gt;http://extjs.com/learn/Tutorial:Using_Ext_grid_form_dialog_to_achieve_paging_list%2C_create%2C_edit%2C_delete_function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. The community is very active. It also has google search with it, very convenient.&lt;br /&gt;&lt;br /&gt;At the bottom of the page: http://extjs.com/learn/&lt;br /&gt;&lt;br /&gt;I used it to get the info for using it with asp.net ajax extension. Excellent.&lt;br /&gt;&lt;br /&gt;4. The time on YUI is definitely worth it – it has similar style with YUI (it grew out of it, so no surprise there). Any deep (architecture ideas etc.) stuff, we need go back to YUI. Among all those javascripts, only YUI has an easy and yet very good structure (because of its java heritage, obviously---- what is it? ---- separation of UI and Entity/Facade by using JSON, separation of HTML, CSS, and Javascripts).&lt;br /&gt;----(also because of its java heritage! -- the dark side of it!) YUI only misses the syntax sugar coating of chaining that JQuery does best; however, Ext has some of it.  &lt;br /&gt;----with aptana's intellisense, the long names are fine  actually!&lt;br /&gt;&lt;br /&gt;5. I am coding my code based on the three examples on 1 and 2 now. The fun begins ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7718703958317698670?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7718703958317698670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7718703958317698670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7718703958317698670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7718703958317698670'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/1.html' title='Using Extjs Grids; YUI: separation of UI and Entity/Facade by using JSON, separation of HTML, CSS, and Javascripts; JQuery: chaining sugar coating'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7864952704016697419</id><published>2007-07-23T11:39:00.001-07:00</published><updated>2007-07-23T11:46:26.151-07:00</updated><title type='text'>Dump Rico and prototype, use YUI and EXT</title><content type='html'>Dump Rico and prototype, use YUI and EXT&lt;br /&gt;&lt;br /&gt;Rico code base is bad.&lt;br /&gt;Prototype is not as good as JQuery anyway; also, the coding style is really not that important – once you get the JQuery idea.&lt;br /&gt;&lt;br /&gt;EXT roots from YUI, but now is independent lib. It has LGPL, which makes it OK for commercial uses. Also, EXT has JQuery style also.&lt;br /&gt;&lt;br /&gt;So, the best way? EXT and YUI. Also, YUI can lead you to EXT via the YUI-EXT trail!&lt;br /&gt;&lt;br /&gt;EXT has close relation with AIR, which is good for offline etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7864952704016697419?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7864952704016697419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7864952704016697419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7864952704016697419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7864952704016697419'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/dump-rico-and-prototype-use-yui-and-ext.html' title='Dump Rico and prototype, use YUI and EXT'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6565096107740932466</id><published>2007-07-20T07:14:00.000-07:00</published><updated>2007-07-20T07:40:58.813-07:00</updated><title type='text'>sites that help you to refresh css and html</title><content type='html'>I am digging into the YUI and prototype-rico. &lt;br /&gt;It is time to give html/css a systematic (re)treatment. &lt;br /&gt;Here a site: &lt;br /&gt;&lt;br /&gt;http://www.w3schools.com/css/showit.asp?filename=ex1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I know, there are so many there, and books. However, I do not believe we need books here. Come on, you are a programmer, and it is just html/css! Seriously, books are no good here for the following reasons: &lt;br /&gt;(a) Most books on this are for dummies, or, for academics, either way, bad for programmers.&lt;br /&gt;(b) Online resources are very good – inherently -- you can see it in action.&lt;br /&gt;&lt;br /&gt;This site is good, because it is to-the-point (O'Reilly style, if you may).&lt;br /&gt;&lt;br /&gt;Other sites (google css reference or css tutorial)&lt;br /&gt;&lt;br /&gt;http://htmlhelp.com/reference/css/quick-tutorial.html&lt;br /&gt;http://htmlhelp.com/reference/css/&lt;br /&gt;http://www.css-ref.com/&lt;br /&gt;http://www.html.net/tutorials/css/&lt;br /&gt;http://www.westciv.com/style_master/academy/css_tutorial/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6565096107740932466?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6565096107740932466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6565096107740932466' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6565096107740932466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6565096107740932466'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/sites-that-help-you-to-refresh-css-and.html' title='sites that help you to refresh css and html'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7722848401211528335</id><published>2007-07-19T17:50:00.000-07:00</published><updated>2007-07-19T17:59:19.382-07:00</updated><title type='text'>Stop investing the so-called server side model of Ajax -- when Orcas comes out, even dummies in asp.net world will use javascripts directly</title><content type='html'>The title explains itself. We all believe that .net stretched VB6-ers. However, nobody notices that asp.net actually created a new low of M$ -- yes, it is even lower than VB6. Think about it, javascript is a designer’s language, now, it is treated as an assembly language. &lt;br /&gt;&lt;br /&gt;You may say, GWT is the same thing. Yes, but that is different – it is direct, head on. The “server side ajax” model is not that – it is simply an even-lower-than-VB6 approach. &lt;br /&gt;&lt;br /&gt;Again, you may say this is a FUD, or, reversed FUD (since it is used against M$!): do not invest in the server side model of Ajax, when Orcas comes out, you will be nobody other than a dummy-worse-than-vb6er.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7722848401211528335?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7722848401211528335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7722848401211528335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7722848401211528335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7722848401211528335'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/stop-investing-so-called-server-side.html' title='Stop investing the so-called server side model of Ajax -- when Orcas comes out, even dummies in asp.net world will use javascripts directly'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-8031961128539604548</id><published>2007-07-19T14:47:00.000-07:00</published><updated>2007-07-19T15:09:34.860-07:00</updated><title type='text'>a big mistake -- well, IMHO -- on YUI site</title><content type='html'>On http://developer.yahoo.com/yui/, the "Getting Started" is really confusing. &lt;br /&gt;&lt;br /&gt;However, after you download it, and set up the download as a local site, then, in the root index.html, there is this: &lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt;&gt;&gt;Check out the examples of YUI in action. We recommend starting with the Event Utility and Dom Collection examples; Event and Dom provide an important foundation for JavaScript developers using YUI. Once you've reviewed those two foundational pieces, go on to explore utilities like Drag and Drop and Animation or UI controls like Button, Calendar and TabView. If you're interested in YUI's CSS components, read through the examples for Reset, Base, Fonts, and Grids in that order. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------IMHO, this is gold, why they do not use this in the top level "Getting Started"? ---- big mistake, I would say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-8031961128539604548?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/8031961128539604548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=8031961128539604548' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8031961128539604548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/8031961128539604548'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/big-mistake-well-imho-on-yui-site.html' title='a big mistake -- well, IMHO -- on YUI site'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2325251893617177715</id><published>2007-07-18T21:20:00.000-07:00</published><updated>2007-07-18T21:27:00.951-07:00</updated><title type='text'>JSON and Oracle: who saide javascript is not typed?!</title><content type='html'>For oracle, you only use four types: varchar2, number, char (because of the padding, it should only be used for "Y" and "N"), and date&lt;br /&gt;&lt;br /&gt;JSON make it shorter: string (with""), number (no ""), false and true, no date! &lt;br /&gt;&lt;br /&gt;For date, M$ has a cleaver convention: /\Date(12341324)\/  because \/ is not necesasry to escape \, so, it is used here to signal date!&lt;br /&gt;Another way is to use military format (or other ISO format) 2007/07/18. The thing is, there is no way to signal that it is indeed a date, not an ordinary string field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2325251893617177715?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2325251893617177715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2325251893617177715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2325251893617177715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2325251893617177715'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/json-and-oracle-who-saide-javascript-is.html' title='JSON and Oracle: who saide javascript is not typed?!'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5972866693369120778</id><published>2007-07-17T18:45:00.000-07:00</published><updated>2007-07-17T18:53:50.575-07:00</updated><title type='text'>javascript IDE</title><content type='html'>A logical step of pure ajax: it is time to get a javascript IDE&lt;br /&gt;&lt;br /&gt;http://www.aptana.com/&lt;br /&gt;firefox and firebug&lt;br /&gt;&lt;br /&gt;Why? it is too awkward to do it in VS. &lt;br /&gt;&lt;br /&gt;This is a huge step; but also anticipated: what good can come from M$?!&lt;br /&gt;&lt;br /&gt;It has build-in support for all popular Ajax client side javascript frameworks!&lt;br /&gt;&lt;br /&gt;Best of all, it is a java app!&lt;br /&gt;&lt;br /&gt;By the  way, I really enjoy prototype -- its Ruby influence (M$ try to make javascript like a C#, prototype makes it like a Ruby -- way to go!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5972866693369120778?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5972866693369120778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5972866693369120778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5972866693369120778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5972866693369120778'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/javascript-ide.html' title='javascript IDE'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5424248340493093084</id><published>2007-07-15T17:31:00.000-07:00</published><updated>2007-07-17T20:54:03.326-07:00</updated><title type='text'>the real business: prototype+rico and Script.aculo.us+behavior+eventselectors</title><content type='html'>dojo, prototype, Mochikit, Yahoo UI (YUI), or, my own 2K library (from my old O'reilly's javascript cookbook!) and plus web service.&lt;br /&gt;&lt;br /&gt;Everything else, e.g., controls, server or client, are just so-called "convenience tools" -- actually, inconvenient tools – I am now even against http://dotnetslackers.com/articles/ajax/ASPNETAjaxGridAndPager.aspx&lt;br /&gt;&lt;br /&gt;I know, in the past weeks, I stepped through many things, silverlight, spring.net, etc. Now, I am only for javascript + webservice + activeX for client-side-printing-serial-port-comm. I am against everything else, including asp.net per se -- who need asp.net anymore!&lt;br /&gt;&lt;br /&gt;It does not make sense to use small ad hoc javascripts anymore. It is time to use javascript frameworks/libraries.&lt;br /&gt;&lt;br /&gt;After reading http://www.sitepoint.com/article/javascript-library/2&lt;br /&gt;and some research, prototype is the one, because I want some powerful yet simple (once I know the framework) grids!&lt;br /&gt;&lt;br /&gt;Another reason: funny thing -- prototype is the ajax choice for Ruby on Rails -- we cannot avoid RR, it is everywhere! &lt;br /&gt;&lt;br /&gt;http://www.brandonquintana.com/index.bcq?id=13&amp;page=blog&amp;title=prototype+behaviour+rico+and+scriptaculous&lt;br /&gt;&lt;br /&gt;so, prototype+rico+Script.aculo.us+behavior+eventselectors, of course, we need to know how to make it work with the web service support from "asp.net ajax".&lt;br /&gt;&lt;br /&gt;http://64bytes.com/archive/2007/05/10/ASP.NET-Web-services--AJAX--prototype.js.aspx -----&lt;br /&gt;http://www.wtfdeveloper.com/Default13.aspx  ----------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://www.sitepoint.com/article/painless-javascript-prototype/&lt;br /&gt;http://www.prototypejs.org/&lt;br /&gt;http://prototypedoc.com/&lt;br /&gt;http://www.sergiopereira.com/articles/prototype.js.html#Reference&lt;br /&gt;&lt;br /&gt;http://script.aculo.us/&lt;br /&gt;http://openrico.org/downloads  -----------------------&lt;br /&gt;http://borkweb.com/story/prototype-makes-javascript-painless&lt;br /&gt;http://borkweb.com/story/oooo-eventselectors-for-prototype&lt;br /&gt;http://www.snook.ca/archives/javascript/prototype_disse/&lt;br /&gt;&lt;br /&gt;------------------------prototype+rico is large. However, javascript can be cached and compressed. So, I do not believe it is a problem. If you are really concerned, use YUI (there is a new kid, JQuery, however, it does not have grid, you have to use ext; but ext has intentionally ambiguous license for commercial use for in-house development -- for web, in-house-intranet and internet is a thin line anyway). &lt;br /&gt;&lt;br /&gt;-----------------------so, YUI is also a choice, worth to explore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5424248340493093084?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5424248340493093084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5424248340493093084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5424248340493093084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5424248340493093084'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/javascript-framework-javascript-library.html' title='the real business: prototype+rico and Script.aculo.us+behavior+eventselectors'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-2782231898931253243</id><published>2007-07-15T10:03:00.000-07:00</published><updated>2007-07-15T10:13:43.209-07:00</updated><title type='text'>the bread and breath of Ajax -- when with asp.net, of course</title><content type='html'>ScottGu's blog:&lt;br /&gt;&lt;br /&gt;http://weblogs.asp.net/scottgu/archive/2007/07/04/july-4th-links-asp-net-asp-net-ajax-visual-studio-silverlight-and-iis7.aspx&lt;br /&gt; &lt;br /&gt;It has link to this ---- this is a wonderful one -- if you use ajax, it is your bread and breath! Hey, this is not my idea, it is directly derived from ScottGu's!&lt;br /&gt;&lt;br /&gt;http://dotnetslackers.com/articles/ajax/ASPNETAjaxGridAndPager.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-2782231898931253243?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/2782231898931253243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=2782231898931253243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2782231898931253243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/2782231898931253243'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/bread-and-breath-of-ajax-when-with.html' title='the bread and breath of Ajax -- when with asp.net, of course'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6754821614750340273</id><published>2007-07-15T08:44:00.000-07:00</published><updated>2007-07-15T09:17:14.152-07:00</updated><title type='text'>I wasted $40+ -- more about asp.net ajax books</title><content type='html'>I wasted $40+ &lt;br /&gt;&lt;br /&gt;I am pragmatic, and I get into action immediately. However, deep in my brain, I am an holistic thinker/learner. As a result, I need books, I am a book worm.&lt;br /&gt;&lt;br /&gt;I am a member of Safari. However, they do not have “professional asp.net 2.0 Ajax”. So, I went to Border, and bought one. &lt;br /&gt;&lt;br /&gt;It is a waste – I guess, I can count that as a donation to Border – I go there a lot, but not buying enough.&lt;br /&gt;&lt;br /&gt;The best: the online doc (and videos, from the official site and the “interface training”, and also, the ScottGu’s blog – he is the man!!, and the forum – however, I am talking about things close to a book, so, let’s be back to the books) – you definitely should not need other books.&lt;br /&gt;&lt;br /&gt;However, if you like me, a book worm who cannot have a peace of mind without reading “real books”, then, get O’Reilly’s Programming ASP.NET AJAX. &lt;br /&gt;&lt;br /&gt;I learn my lesson, again: you can use M$ technologies, but at least, get books from O’Reilly -- at least some of your book must be from O’Reilly: you need some fresh air!&lt;br /&gt;&lt;br /&gt;The book is very good, very hand-on, and it has references of other O’Reilly books – only for this purpose, it is not waste – the online doc does not have that. &lt;br /&gt;&lt;br /&gt;The only downside is, it is still a “rough cut”; so, if you are not a member of Safari, perhaps it is not for you yet; or, perhaps there is another way to get it.&lt;br /&gt;&lt;br /&gt;I am not a sales person from O’Reilly! To prove it, I will make a complaint: for “rough cut”, you have to pay case by case, book by book (i.e., “rough cut” is not included in the monthly pay), which is fine and fair. As a result, you can get pdf file, instead of being forced to read it online. &lt;br /&gt;&lt;br /&gt;Now, I just do not understand what hack it takes so long for them to generate a pdf file – even we assume that I am the first one to order it after it is updated and they do not have a cache. It has been a week now! Then, I tried to find an email address to complain, I cannot find one. I do not like it a single bit! Imperfect world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6754821614750340273?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6754821614750340273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6754821614750340273' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6754821614750340273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6754821614750340273'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/i-wasted-40-more-about-aspnet-ajax.html' title='I wasted $40+ -- more about asp.net ajax books'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1017680081483448665</id><published>2007-07-14T13:28:00.000-07:00</published><updated>2007-07-17T07:20:35.211-07:00</updated><title type='text'>silverlight or ScriptSharp, or both, or, just javascript</title><content type='html'>The reason I like silverlight is to avoid entity logic (e.g. entity validation). However, it seems scriptsharp can do that also -- it is exactly what I wished about a year ago! Of course, I cannot take the credit at all; it is just very encouraging that you can wish, somebody will realize that for you ;-) &lt;br /&gt;&lt;br /&gt;http://www.nikhilk.net/Project.ScriptSharp.aspx&lt;br /&gt;&lt;br /&gt;of course, it is even before silverlight, so, I guess we do not have too much hope for that. &lt;br /&gt;&lt;br /&gt;The pragmatic approach for me is: (a) No client side logic! Educate users, "deal with it!" (b) if users push back, for those minimum cases, translate C# into validator or directly javascripts. &lt;br /&gt;&lt;br /&gt;Rick client? Ya, potentially, and case by case!&lt;br /&gt;&lt;br /&gt;---- By the way, I recently found Google Web Toolkit (GWT) uses the same technique, but it is java, of course. However, there is no mentioning of GWT in ScriptSharp, as usual. It is a shame -- nothing new from M$ -- I thought it is too good to be true, some creative ideas from M$, ha!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1017680081483448665?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1017680081483448665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1017680081483448665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1017680081483448665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1017680081483448665'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/silverlight-or-scriptsharp-or-both.html' title='silverlight or ScriptSharp, or both, or, just javascript'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3583397501861269228</id><published>2007-07-09T17:36:00.000-07:00</published><updated>2007-07-15T10:48:24.516-07:00</updated><title type='text'>"Server side Ajax" is just equivalent to dataset (or, stored procedure), they are all dirty words from M$</title><content type='html'>I suddenly realize that Javascript is literally the java within M$. As a result, typical M$ developers are not good at it; and further, they are not prepared for it. &lt;br /&gt;&lt;br /&gt;It is amazing. A few years ago, “do you do some javascript” is a tricky interview question – it is tricky, because if your answer  is too good, then, you will not be recruited, because that means you are not a serious programmer, just a javascript web designer. Now, “do you do some javascript” is a real question, it points out whether the asp developer is just yet-another-VB-type, or, a serious programmer. If you know some javascript, it means you know some “low level stuff” – my goodness, asp turns javascript into low level stuff!!&lt;br /&gt;&lt;br /&gt;Browsers are OS, ActiveX are device drivers, Javascript is perl: if you do not know javascript, you are nobody in web2 world.       &lt;br /&gt;&lt;br /&gt;Flash/flex proved that javascript is powerful. The server side approach of Asp Ajax tries to hid it; it is very bad. I hope the client side approach will take off soon. Client side Asp Ajax (i.e., “pure ajax”) plus silverlight – that is the way to go. &lt;br /&gt;&lt;br /&gt;This leads to another issue. I believe some M$ people know this also. However, they always have some party line, saying "each way has its niche, bla bla", even some very smart people. So, it is very crucial you know that server side Ajax is just equivalent to dataset (or, stored procedure), they are all dirty words from M$.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3583397501861269228?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3583397501861269228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3583397501861269228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3583397501861269228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3583397501861269228'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/server-side-ajax-is-just-equivalent-to.html' title='&quot;Server side Ajax&quot; is just equivalent to dataset (or, stored procedure), they are all dirty words from M$'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-911705033432521776</id><published>2007-07-07T17:03:00.001-07:00</published><updated>2007-07-07T17:20:49.655-07:00</updated><title type='text'>javascript and aop, orcas</title><content type='html'>http://calculist.blogspot.com/2005/07/aop-in-javascript.html&lt;br /&gt;&lt;br /&gt;and: &lt;br /&gt;&lt;br /&gt;http://weblogs.asp.net/scottgu/archive/2007/04/24/javascript-intellisense-in-visual-studio-orcas.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-911705033432521776?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/911705033432521776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=911705033432521776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/911705033432521776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/911705033432521776'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/javascript-and-aop.html' title='javascript and aop, orcas'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-3927374438024824289</id><published>2007-07-06T21:29:00.000-07:00</published><updated>2007-07-07T16:28:57.251-07:00</updated><title type='text'>Minimum for 8 techniques (i.e., totally bottom-up)</title><content type='html'>Minimum for the 8 techniques (i.e., if/when it is really a small project) &lt;br /&gt;&lt;br /&gt;1. Ad hoc ado wrapper: for logging database access&lt;br /&gt;2. Just use trace or debug, not log4net&lt;br /&gt;3. Just Façade: this is crucial for later anonymous delegate&lt;br /&gt;4. Entity (no dataset): this is crucial.&lt;br /&gt;5. Use "pure Ajax" or "native Ajax" (i.e., use webservice; the page is really just a skeleton -- note: this style makes wpf/silverlight and "native ajax" almost the same!)   &lt;br /&gt;---- It is not just web, it is web2!!!!!!!, it is RIA!!!!!&lt;br /&gt;---- Ya, since silverlight is still alpha, most of the time, we cannot affort to go through silverlight-ajax-wpf cycles. Sometimes, I like Ajax more than Silverlight, because Ajax is closer to flash -- it is javascript based. Ya, the real difference between silverlight and ajax is C# and java ;-) –---------- OK, seriously, it is javascript replication of the C# entity classes. Now, it can do the data part automatically (databinding!); for logic (methods) we have to do it manually. As a result, before silverlight, we should keep the logic part minimum: let’s do most of the validation at the façade level, what the hack, users sometimes do not like validate two times, they want it one time! (if we do client side validation, we have to do it more than one time, because client side validation is inevitably not sufficient) – it is a trade-off for users also, why we make it more difficult than necessary!&lt;br /&gt;&lt;br /&gt;6. Always very short eventhandlers&lt;br /&gt;7. Standardize page flow calls&lt;br /&gt;8. Wrap new and always virtual&lt;br /&gt;&lt;br /&gt;-----------Update: you may say, not big deal. It is a big deal! Now, I cannot use the asp.net 2.0 build in objectdatasource anymore, because of “always new”!&lt;br /&gt;&lt;br /&gt;the build-in objectdatasource is a typical M$ brain-dead joke and not really usable anyway, see: &lt;br /&gt;&lt;br /&gt;http://vaultofthoughts.net/ObjectDataSourceAWorkingAlternative.aspx&lt;br /&gt;&lt;br /&gt;-----------Just to clarify. It seems that we should not do build-in datdabinding for both WPF and ASP, we need to use databinding for silverlight and ajax.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-3927374438024824289?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/3927374438024824289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=3927374438024824289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3927374438024824289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/3927374438024824289'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/minimum-7-techniques-ie-totally-bottom.html' title='Minimum for 8 techniques (i.e., totally bottom-up)'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-380777582030258774</id><published>2007-07-05T17:43:00.000-07:00</published><updated>2007-07-05T18:08:00.383-07:00</updated><title type='text'>silverlight databinding</title><content type='html'>I googled "silverlight databinding", and I found those, amazing: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://www.netcrucible.com/blog/2007/06/24/streamed-template-processing-for-data-binding-in-silverlight/&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/webnext/archive/2007/07/03/silverlight-data-binding-with-xml.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-380777582030258774?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/380777582030258774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=380777582030258774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/380777582030258774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/380777582030258774'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/silverlight-databinding.html' title='silverlight databinding'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6353343151207697790</id><published>2007-07-04T14:23:00.001-07:00</published><updated>2007-07-05T17:43:41.112-07:00</updated><title type='text'>three analysis questions and eight programming techniques</title><content type='html'>OK, enough for technology craziness. My pragmatic attitude and “tearing things apart” attitude is taking over now. As I said, I want this blog to be an honest trace record of the journey. The reality is always a result of many forces. &lt;br /&gt;&lt;br /&gt;I am backing off from spring-everywhere stand – however, I still believe it could be done; it is just not that, well, pragmatic, that it is everywhere and all the time. Because it could be done, so, from now on, spring will always be my “reference” architecture. ------ a second thought: other than the last one (all virtual), and the wrapping "new" is to prepare the wrapper for Castle or Spring.net, the whole thing is perfect for absorbing CSLA also -- each item can benefit from CSLA, especially I would like to see how CSLA deal with silverlight's databinding (or not, I've just found a link -- I will put it in my next blog). Ya, both CSLA and spring have validation. I know, I am riding the fence now. As I said, I like CSLA a lot -- once it is simplified.  &lt;br /&gt;&lt;br /&gt;The key for backing off the extreme stand is that it is not about whether it could be done or not, it is about ("cooperative" and "friendly") competition for delivering client-visible business values. Another way to put it, I see those “values” as territories. You must cover the territories as fast as you can. If you do not, somebody else will. Once you put it this way, it is really very clear that it is to both our clients’ and ourselves’ best interests to deliver business values, instead of “architectures”. This is XP tradition also, by the way.  &lt;br /&gt;&lt;br /&gt;Let’s be back to the reality; let’s reiterate the forest view, the big picture: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A. Process -- always ask three questions: &lt;br /&gt;&lt;br /&gt;(1) Application level use cases (or, stories)&lt;br /&gt;(2) Screen level use cases (or, stories)&lt;br /&gt;(3) Ubiquitous glossary, i.e., data schema with example data. Note example data are crucial&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B. Technology -- always pragmatic AOP. The bottom line is the AOP rule -- “separation of concerns” (you may say it is also an OOP rule; however, OOP never directly and intuitively says it; also, OOP cannot really do it anyway!). There are several core concerns (not surprisingly, they correspond to my “eight core techniques”; however, I “collapsed” the façade items, and “expanded” entity times – it is understandable, I am now paying more attention to fine-grained AOP – even now, in this blog, I am withdrawing a little bit from an extreme stand I posted in my previous blogs – I know, back and forth, it is me – I want to explore all the extremes), and we must always separate them. Before I list them, you may say that since fine-grained (i.e., entity property level) AOP is so powerful, we can do everything dynamically; why bother those static “separations”. The answer: (i) so that we do not need to use fine-grained AOP everywhere and all the time where/when it is not absolutely necessary; (ii) for fewer bugs. Bugs are done by human minds; human minds can deal with linear and static things with fewer bugs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(1) adowrapper (can be simple and ad hoc ones, so that we can log data access easily)&lt;br /&gt;(2) log4net logging (wrap it or not; not important; log4net is a small dll)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(3) façade&lt;br /&gt;--Dao: it includes dao, i.e., a dao can be called directly as a façade; as long as more complex logic are in façades, there is no need to separate dao from  façade – some may say that it is needed for transaction handling; but the system should be smart enough to figure that out&lt;br /&gt;--command desing pattern: we could use command as façade. However, I tend to use anonymous delegate within façade; as a result, explicit command is  not necessary. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(4) entity (M)  -------I use MVPC -- I use both P and C: P is for fake C from M$ ;-)&lt;br /&gt;--dataset: note that this entity is the real one, not dataset; actually, dataset should be forever forbidden, except in some extremely isolated, rare, and well-justifiable contexts). &lt;br /&gt;--validation: a simple, almost “ad hoc” validation mechanism (ad hoc “framework”) can be used here.  &lt;br /&gt;&lt;br /&gt;(5) view (V) Always use silverlight.&lt;br /&gt;--fallback to ajax. Silverlight is good because all entity logic can be done without tranlating into javascript, while for ajax, it is already a headache just for validation logic (only part of entity logic). ------need activeX-javascript to make ajax model closer to desktop's power.  &lt;br /&gt;--fallback to WPF when it is really necessary. ClickOnce is not enough. The so-called “30 min. download” is not as easy as it sounds. It is a huge technology tumbling stone. Do whatever is necessary to avoid fat clients. Period.   &lt;br /&gt;&lt;br /&gt;(6) presenter-in-view’s-code-behind&lt;br /&gt;--databinding is good: it can be thinner with databinding;&lt;br /&gt;--but more difficult: because entity is not dataset, so, databinding must be “custom-class databinding”; &lt;br /&gt;--silverlight needs "manual" databinding: silverlight does not support it; we need to do it by ourselves -- http://www.lhotka.net/weblog/WindowsFormsDataBindingIssueConclusion.aspx , or/and, spring’s web databinding) ----------I've just found a blog, very nice one (see my next blog) (P) &lt;br /&gt;&lt;br /&gt;(7) view flow: user control -- always to use user control to wrap the whole page, and a page is used only for flow; at least it should have a standard method call so that it can be easily searchable. (C).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(8) Unit testing everywhere all the time – OK, this is a lie (I am pragmatic; what I really care is that it is doable that it is everywhere and all the time -- as long as we put all logic outside UI, this is done automatically; however, I do not care about actually doing unit testing all the time – give me a break: if it is not likely that it will break, why bother, let QA department deal with it – I am busy to deliver business values!). However, I added one important thing that I obtained from recent technology craziness (the irony is that I put this in my blog long time ago, but I did not really do it systematically):&lt;br /&gt; &lt;br /&gt;--Always wrap all “new”: no need for a full fledged abstract factory, just put all those ceateXXX in a class, all createXXX are static. We do not need to switch the kit at runtime. Compile time switching (for testing), we just switch the class. As a result, we can do this in a very simple and ad hoc style. Who said AOP is difficult? Who needs those abstract classes or interfaces! ------For added flexibility (“configure the class” based on where is it!), we want to enter calling class also. We do not enter method name and variable name, we could, but it is too much trouble, and who needs that kind of flexibility anyway (you rewrite the code!) Note that we add class name very easily, we need to do it anyway for logging! -----note that using this approach, we do not need to add the called class in the data member of the calling class. Spring encourages us to do that, so, let’s do it; it does not hurt anything.&lt;br /&gt; &lt;br /&gt;--Always use “virtual”: for all methods/properties, unless you really know you want it non-virtual (just like in java, virtual is the default, unless you really need to mark it “final”)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6353343151207697790?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6353343151207697790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6353343151207697790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6353343151207697790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6353343151207697790'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/three-analysis-questions-and-eight.html' title='three analysis questions and eight programming techniques'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5073121541162787927</id><published>2007-07-03T23:42:00.000-07:00</published><updated>2007-07-03T23:48:08.944-07:00</updated><title type='text'>The key of silverlight is to enable it to be able to use serial ports, using ActiveX</title><content type='html'>The key of silverlight is to enable it to be able to use serial ports, using ActiveX.&lt;br /&gt;Note that we also need it to work on ajax without silverlight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5073121541162787927?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5073121541162787927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5073121541162787927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5073121541162787927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5073121541162787927'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/key-of-silverlight-is-to-enable-it-to.html' title='The key of silverlight is to enable it to be able to use serial ports, using ActiveX'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-6278724930240125541</id><published>2007-07-01T22:10:00.000-07:00</published><updated>2007-07-01T22:19:09.669-07:00</updated><title type='text'>spring has command pattern based aop also</title><content type='html'>It is not easy to say it is a good thing or a bad thing, just a note here: spring.net’s DAO stuff is not emit-based (i.e., fine-grained) aop, it is not even IoC based. They are command pattern based. &lt;br /&gt;&lt;br /&gt;It is good, because you have all the skill set in case you have to do aop without emit; it is bad, because it is not elegant – emit-aop can handle it much cleaner. &lt;br /&gt;&lt;br /&gt;It is inherited from Java spring, which was pre-aop-is-in-age.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-6278724930240125541?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/6278724930240125541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=6278724930240125541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6278724930240125541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/6278724930240125541'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/spring-has-command-pattern-based-aop.html' title='spring has command pattern based aop also'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7450056447458660394</id><published>2007-07-01T10:53:00.000-07:00</published><updated>2007-07-01T14:51:17.744-07:00</updated><title type='text'>XML parsing code runtime step through</title><content type='html'>We need to be serious about XML. It is part of the sql-code-xml triad.  &lt;br /&gt;&lt;br /&gt;To deal with XML, “compile time” validation is not enough. You need runtime step through: you need locate the XML parsing code, and when necessary, step through it. &lt;br /&gt;&lt;br /&gt;For streaming style, search for XmlReader, reader.Read(),ReadStartElement, reader.NodeType, ReadInt16, ReadInt32, ReadDouble, ReadString, reader.AttributeCount, reader.GetAttribute, XmlNodeType.EntityReference, reader.ResolveEntity();,XmlNodeType.EndEntity, MoveToAttribute, MoveToFirstAttribute, and MoveToNextAttribute, MoveToElement MoveToContent, XmlTextReader, tr.Validation, ValidationEventHandler(ValidationCallback). Note that streaming is not SAX’s push, it is ADO-reader-like pull. The order of the pulling is depth-first (it makes sense; if it were width first, then it is more like XPath/DOM). &lt;br /&gt;&lt;br /&gt;For XPath/DOM level, XmlDocument, .Load(, .Compile(, Select(, MoveToNextSelected, .CopySelected(,.Evaluate("sum(&lt;br /&gt;&lt;br /&gt;Needless to say, it is important that you need to understand the mapping of the XML and C# code objects; the key is the naming convention.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7450056447458660394?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7450056447458660394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7450056447458660394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7450056447458660394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7450056447458660394'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/07/xml-parsing-code-runtime-step-through.html' title='XML parsing code runtime step through'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-5824248239902078671</id><published>2007-06-30T20:02:00.001-07:00</published><updated>2008-05-11T00:19:32.787-07:00</updated><title type='text'>Another way to start silverlight now</title><content type='html'>Anotehr way to start silverlight now: &lt;br /&gt;&lt;br /&gt;Port Silverlight to plain WPF when porting to ajax takes too long!&lt;br /&gt;(see my previous blog)&lt;br /&gt;&lt;br /&gt;Because it easier to develop WPF in VS 2005, so, in practice, it is more likely the following: &lt;br /&gt;(a) Develop WPF with silverlight in mind (it is a learning curve, the first step is to avoid using build-in databinding and grid – I know, it is pain, but it is worth it!), &lt;br /&gt;(b) Then, port the WPF to silverlight (takes some time), &lt;br /&gt;(c) Then, port it back to WPF (a few minutes).&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/usisvde/archive/2007/05/16/porting-wpf-to-silverlight-1-1-1st-of-a-series.aspx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/usisvde/archive/2007/05/19/porting-wpf-to-silverlight-1-1-2nd-of-a-series.aspx&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/usisvde/archive/2007/05/19/porting-wpf-to-silverlight-3rd-of-a-series.aspx&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/usisvde/archive/2007/05/20/porting-wpf-to-silverlight-4th-of-a-series.aspx&lt;br /&gt;&lt;br /&gt;http://blogs.msdn.com/usisvde/archive/2007/05/22/porting-wpf-to-silverlight-5th-of-a-series.aspx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;http://blogs.msdn.com/ebooth/archive/2007/05/19/view-source-reflector-tool-for-net-silverlight-sites.aspx&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Why silverlight now? Now download of the runtime! So, first demo the silverelight, users will want it, and then, say, OK, either we use alpha version, or, we need to download the runtime. &lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Finally we can do web with similar productivity and features as winform. Also, finally, we .Net developer can do Linux programming now … As a matter of fact, it is very likely that silverlight can be outside the browser, and it will take over Linux desktop very quickly – .Net will beat Java on Linux just like that!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-5824248239902078671?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/5824248239902078671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=5824248239902078671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5824248239902078671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/5824248239902078671'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/06/anotehr-way-to-start-silverlight-now.html' title='Another way to start silverlight now'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-1981567551836593297</id><published>2007-06-30T17:15:00.000-07:00</published><updated>2007-06-30T17:40:12.973-07:00</updated><title type='text'>Use silverlight1.1 as a prototype version for ajax</title><content type='html'>Use silverlight1.1 as a prototype version for ajax&lt;br /&gt;&lt;br /&gt;I cannot wait for using silverlight, a way to use silverlight1.1 now is to use it as a prototype tool for ajax, because silverlight can be faster to development, because all validation is in C#. &lt;br /&gt;&lt;br /&gt;It is true that silverlight controls are still primitive; however, prototype does not need to be that fancy. &lt;br /&gt;&lt;br /&gt;In fact, the core of silverlight is very mature (it is .Net 3.0!); so, it is NOT like other alpha stuff. As a result, if it acceptable (big if, of course), we can borrow the “internet tradition”, use alpha in production! At least, when it is beta, we definitely can use it in production. &lt;br /&gt;&lt;br /&gt;I bet this will be a strategic technique for all “progressive” or “cutting edge” shops or development teams.  &lt;br /&gt;&lt;br /&gt;----On the one hand, I bet this will be a strategic technique for all “progressive” or “cutting edge” shops or development teams.  &lt;br /&gt;&lt;br /&gt;----On the other hand, I believe not that many teams can use this technique. For two reasons: (a) most winform based teams are not “progressive”, they are basically still in VB6 world; (b) most web teams are still busy with Ajax, they already accepted that fact that they have to duplicate validation-entity logic in javascript --  I always hear that life is not perfect, just deal with it. To come up with this simple technique, you must do both winform and web, and refuse to compartmentalize them and refuse to accept the “fact’ – the everlasting truth of AOP is more powerful than the ugly, temporary “fact”.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A note: as I indicated in my previous blog, silverlight is in the sandbox, so, we must use javascript and very-thin-activeX-communication-ports to glue things together. Right, life is not perfect, after all. &lt;br /&gt;&lt;br /&gt;You may say, why not WPF? Downloads – it is not just downloads; it means all those bureaucratic processes. Note that it is not just 3.0; 3.5 is coming; and who knows what is after that! I want to be always on the cutting-edge, automatically – the key word is “automatically”: I just begin to use the new technology, no paperwork is needed, no manager talk is needed -- even I love our managers!&lt;br /&gt;&lt;br /&gt;I want to emphasize it again, it is crucial that it is a “automatic” process. Even it is “just” a little bit “manual”, then, the spirit of internet “continuous beta forever” (i.e.,  “continuous innovation forever”!) is gone forever. You cannot blame managers – in a sense, sometimes it is part of managers’ job to cool things down …&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-1981567551836593297?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/1981567551836593297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=1981567551836593297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1981567551836593297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/1981567551836593297'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/06/use-silverlight11-as-prototype-version.html' title='Use silverlight1.1 as a prototype version for ajax'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26752431.post-7014497676247282799</id><published>2007-06-30T13:03:00.000-07:00</published><updated>2007-06-30T13:04:32.667-07:00</updated><title type='text'>Is Spring.net too complex for small projects?</title><content type='html'>Is Spring.net too complex for small projects?&lt;br /&gt;&lt;br /&gt;My answer is: No! It is good for every project. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(a) On the one hand, “small projects” are not THAT innocent at all! Any small projects are part of bigger system. To be a good citizen, you got to be reliable for those “cross-cut concerns”, and to be reliable means you got to do it AOP way – everybody makes mistakes, doing it manually is simply not acceptable!&lt;br /&gt;(b) On the other hand, Spring.net is not THAT complex at all. Yes, its concepts are counter-intuitive for beginners. That is especially true because even the inventors do not really know how to categorize its essence (OK, here is the shameless self-promotion: that is why my blog is valuable – I know its essence – it is AOP, not IoC. IoC really is just a simple technique to centralize all those factories for AOP -- yes, by categorizing it this way, it means you always, at least potentially, want to use AOP everywhere – which is indeed very true!). However, the code is really lightweight. A decently experienced programmer can maintain it for sure – I am not crazy, I am serious and telling the truth, notice that I am saying “maintain”, not “develop it from scratch” (the reason? Because spring.net is designed this way; it is a beauty; a beauty is always easy to maintain!). Also, I do not want to warrantee that for Nhibernate – so, ya, you could say Nhibernate is a potential maintenance risk, and I would agree to a certain degree (but if it is extremely popular, and it is easy to switch to another package, then, I would say that the potential risk is limited, and it is worth it – it is – then, we should do it). However, the point here is that for Nhibernate, it is an argument about quantity; for spring.net, it is an argument about quality – there is absolutely no risk at all. The key is, of course, to understand AOP; once you understand AOP and accept it as the new pivotal concept of the new paradigm (ya, I know, it sounds like converting to a cult; but it is actually converting to the beginning of a new mainstream), you will see how simple, easy, elegant, and beautiful spring.net is. I am regret that I did not get that a while ago, because I dislike XML, until asp 2.0 makes me -- with harsh force -- to get used to it – sometimes being too pragmatic is not good, you got to have an open and soft mind, to give something beautiful a chance to steal your heart. I know it is still not too late – partially because I have a relatively open mind  but lesson learned, I will be more open-minded in the future … wait, with one exception, not to M$ -- I am too gullible to their propaganda! I know I may miss something beautiful from M$ -- sigh, not easy to do … “experiences” or “bias”, it is a fine line …&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26752431-7014497676247282799?l=survic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://survic.blogspot.com/feeds/7014497676247282799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26752431&amp;postID=7014497676247282799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7014497676247282799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26752431/posts/default/7014497676247282799'/><link rel='alternate' type='text/html' href='http://survic.blogspot.com/2007/06/is-springnet-too-complex-for-small.html' title='Is Spring.net too complex for small projects?'/><author><name>survic</name><uri>http://www.blogger.com/profile/05621218802357307115</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
