tag:blogger.com,1999:blog-11320499886673873172009-07-12T16:33:37.331-04:00softHARDsoftRoberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-1132049988667387317.post-28416635622784083122009-07-12T15:50:00.002-04:002009-07-12T16:33:37.341-04:00The Machine That Changed the WorldAnother detour from the creation of our virtual computer:<br /><br />On waxy.com, Andy Baio has uploaded the series <a href="http://waxy.org/2008/06/the_machine_that_changed_the_world/">The Machine That Changed the World</a>. This 5 part miniseries from 1992 feels dated for obvious reasons but the history is as relevant as ever. The making of this documentary was particularly well timed -- there are interviews with several computer pioneers -- many of whom passed away within a few years of its filming.<br /><br />It was digitized from VHS so the image quality leaves something to be desired. However, this is the first time this classic series has been digitized at all and Waxy.com was kind enough to put it online so we can all enjoy it. You can stream the videos online as flash or download the high-quality MP4 files via BitTorrent.<br /><br />Much thanks to Waxy.com for making this gem accessible to all!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-2841663562278408312?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-28650148819056811972009-07-09T15:08:00.002-04:002009-07-09T15:54:46.971-04:00ReckonersWe're examining the base elements of a computer to build a conceptual one of our own. In the post <a href="http://softhardsoft.com/2008/07/how-to-make-machine-think.html">How to make a machine "think"</a> we settled rather easily (too easily?) on the idea of using binary for the basis for our computer's anatomy. There are very good reasons for this but the main one is that we're constructing a modern styled computer and are thus doing stuff like they do it. Is this the only way? Have computers always been this way?<br /><br />The answer to both questions is a resounding <span style="font-weight: bold;">NO</span>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ed-thelen.org/comp-hist/Reckoners-050.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 236px; height: 182px;" src="http://ed-thelen.org/comp-hist/Reckoners-050.jpg" alt="" border="0" /></a>To see how we got where we are, we simply have to look to our history. The era of the very first digital computers is one place to look. By definition, these machines were built before computer science or such theory. The pioneers had no roadmap to follow. Great ideas, trial and error, and creative minds had to fill in all the gaps without <a href="http://www.amazon.com/dp/0735611319?tag=mcra-20">Charles Petzold</a> to be their muse!<br /><br />Would the pioneers have chosen to use binary? Did the first general purpose computers have memory parts separate from arithmetic parts? Why did some choose binary and some choose decimal? These are not trivial questions. The answers show us where we started, how we got where we are, and <span style="font-style: italic;">why</span>.<br /><br />Maybe we should totally stop designing a computer for a while and review these innovative decisions. Maybe we should, but we won't. We've had quite enough detours for a while. However, I <span style="font-style: italic;">highly</span> encourage you to read up on the matter.<br /><br />One excellent (and free) resource is <a href="http://ed-thelen.org/comp-hist/Reckoners.html"><span style="font-style: italic;">Reckoners</span></a> by Paul E. Ceruzzi and it's free online. <span style="font-style: italic;">Reckoners</span> looks at the creation and anatomy of some of the worlds first general purpose digital computers. It can be a bit dry at times when it delves into too much detail, but overall it is a fantastic book. If nothing else, it's absolutely worth reading the chapter on the very first completed digital computer. Only a German engineer could possibly have conceived of and then built computer memory units using moving parts -- no transistors (they didn't exist yet), no relays, just machine!<br /><br />The ancient history of computers is absolutely fascinating. Anyone interested in a grassroots project like softHARDsoft will love reading about the original beasts.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-2865014881905681197?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-5249996188258367762009-03-26T20:31:00.002-04:002009-03-26T20:40:53.556-04:00Inputs and Outputs 4: output limitationsWe're now clear on the <a href="http://softhardsoft.com/2009/03/inputs-and-outputs-2-input-limitations.html">limitations of inputs</a>. What about limitations on outputs?<br /><br />We actually kinda covered this in the bottom diagram back in <a href="http://softhardsoft.com/2008/09/art-imitating-life.html">Art Imitating Life</a>. This was a diagram of sequential logic.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SMhrUx3PFiI/AAAAAAAAAqk/_y4Ar8WVgbw/s1600-h/logic.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 136px; height: 58px;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SMhrUx3PFiI/AAAAAAAAAqk/_y4Ar8WVgbw/s320/logic.png" alt="" id="BLOGGER_PHOTO_ID_5244559770799511074" border="0" /></a>Notice the output of the left-most element. It splits and gives its value to the inputs of multiple other elements. One could argue that the node where the split occurs is its own element, but I think that's overkill. For our design purposes, let's just say that an output can give its value to any number of inputs. Or to use our new terminology about the <a href="http://en.wikipedia.org/wiki/Observer_pattern">observer pattern</a>: a subject (i.e.: an <span style="font-style: italic;">output</span>) can notify any number of subscribed observers (<span style="font-style: italic;">inputs</span>).<br /><br />Short post this time. Not much to say about this topic but it still needed to be said.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-524999618825836776?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-72977580679976668712009-03-25T15:53:00.004-04:002009-03-25T16:07:23.756-04:00Inputs and Outputs 3: subscriptionsThere was a major to-do item from our last code post (<a href="http://downloads.softhardsoft.com/">9-11-08</a>): how does the input find out about the value of the output? We know from the "<a href="http://softhardsoft.com/2009/03/inputs-and-outputs-1-push-or-pul.html">push or pull?</a>" post that the outputs will push their value to the inputs -- but how? Whenever an output changes it needs to know who to tell. The input that wants this information needs to tell the output: as soon as you change, tell me. This relationship (as implied by the title of the post) is that of a subscription service (outputs) and subscribers (inputs).<br /><br />An output needs to provide a way to:<br /><ul><li>add a new subscriber</li><li>unsubscribe a current subscriber</li><li>notify subscribers</li><li>make its state known</li></ul>An input needs to:<br /><ul><li>be updated when a change occurs</li></ul><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tLgr5mTmWvc/ScqOnt5lTsI/AAAAAAAABIg/RSA6E7E0wJY/s1600-h/observe.jpg"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 96px; height: 96px;" src="http://4.bp.blogspot.com/_tLgr5mTmWvc/ScqOnt5lTsI/AAAAAAAABIg/RSA6E7E0wJY/s320/observe.jpg" alt="" id="BLOGGER_PHOTO_ID_5317219123051450050" border="0" /></a>In the programming world, this is not a new problem. There is a time-honored solution to this called the "<a href="http://en.wikipedia.org/wiki/Observer_pattern">observer pattern</a>." The pattern describes Subjects and Observers which correlate exactly to our Outputs and Inputs. This problem is so common that in .NET they built in a way to do most of this work for you: .NET, "Events" will give you all of this. Since we're doing this in C# anyway, I'm opting for events. Events have added benefits which we may also take advantage of later.<br /><br /><span style="font-weight: bold;">CODE: </span><a href="http://downloads.softhardsoft.com/2009-03-25.zip">http://downloads.softhardsoft.com/2009-03-25.zip</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-7297758067997666871?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-57630478714871968902009-03-21T13:20:00.007-04:002009-03-21T14:05:04.088-04:00Inputs and Outputs 2: input limitationsIt seems obvious that an output can push its charge to any number of inputs. What's less obvious is whether multiple outputs can feed into a single input.<br /><br />Expanding on our trusty light bulb setup from <a href="http://softhardsoft.com/2009/03/inputs-and-outputs-1-push-or-pul.html">last time</a>: instead of having 1 power source + switch before the bulb, lets have 2 sets like this in parallel. Now if either switch (or both) are closed then the bulb lights up.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tLgr5mTmWvc/ScUiEgiNQQI/AAAAAAAABIY/Iv63vVPM2wM/s1600-h/2switches.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 137px; height: 95px;" src="http://3.bp.blogspot.com/_tLgr5mTmWvc/ScUiEgiNQQI/AAAAAAAABIY/Iv63vVPM2wM/s320/2switches.jpg" alt="" id="BLOGGER_PHOTO_ID_5315692396028969218" border="0" /></a><br /><br /><br /><br /><br /><br /><br />Stand in awe of my mighty illustration skills!<br /><br />There are a few ways to handle this:<br /><ol><li>The bulb's input can accept from multiple output sources</li><li>The output sources combine into 1. If either or both sources are charged, the bulb lights up. This is an "OR" relationship. Expanding on that:</li><li>The sources must enter an OR gate and the single output from that gate will be the bulb's input</li></ol>These solutions go from most simple to most complex, so why don't we choose the 1st and simplest? Actually, there is a reason and it's largely academic. What we're doing in sHs is an exercise in "sequential logic." That is: using boolean (on/off) values, we're moving in a linear sequence, evaluating as we go. This is a very old idea and there are certain conventions that are used. #3 above follows said convention.<br /><br />Make no mistake, we are in no way bound by these conventions. There are no teachers standing over our shoulder ready to whack our knuckles for doing our program in an unorthodox or colloquial way. Back in <a href="http://softhardsoft.com/2008/07/transister-choice.html">Transistor choice</a> when we were trying to choose whether to use MOSFET+CMOS logic, I had no problem justifying a simpler way of doing things. However, in this case, I'm still going to opt for #3 anyway because it makes sense in my mind.<br /><br />Regardless of which option you prefer though, we should all agree on one important point: the multiple inputs must resolve to a single collective ON or OFF value before we can determine whether the bulb should light. Any of the 3 above can achieve this.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-5763047871487196890?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-73680647977375965482009-03-16T23:09:00.005-04:002009-03-17T14:07:58.016-04:00Inputs and Outputs 1: push or pull?<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/Sb8VpmQNL7I/AAAAAAAABIQ/VLcRb3BXza8/s1600-h/push.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 151px; height: 96px;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/Sb8VpmQNL7I/AAAAAAAABIQ/VLcRb3BXza8/s320/push.gif" alt="" id="BLOGGER_PHOTO_ID_5313989889707814834" border="0" /></a><span style="font-weight: bold;">Pushing vs. Pulling</span><br /><br />I made an assumption in the <a href="http://softhardsoft.com/2008/09/zen-of-virtual-circuit.html">last post</a>: that outputs would <span style="font-weight: bold;">give</span> their values to inputs. Why couldn't it be the input's job to <span style="font-weight: bold;">get</span> their value from the output? (In programming, this give vs. get distinction is often referred to as <span style="font-weight: bold;">push</span>ing vs. <span style="font-weight: bold;">pull</span>ing.)<br /><br />The first reason to push is because it's intuitive. Why is it intuitive? Because that's how it works in real life. Why not make our programming metaphor follow reality when we can?<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/Sb8U5_e83HI/AAAAAAAABII/p4XntiKf_W8/s1600-h/pull.gif"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 118px; height: 84px;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/Sb8U5_e83HI/AAAAAAAABII/p4XntiKf_W8/s320/pull.gif" alt="" id="BLOGGER_PHOTO_ID_5313989071846825074" border="0" /></a><br /><br />Here's a simple example: Let's say we have a simulation with a power source, an open switch, then a light bulb. Now we'll close the switch.<br /><ul><li><span style="font-weight: bold;">Push</span>: when the switch is closed, it pushes its new "on" state to the light bulb and the bulb lights up.</li><li><span style="font-weight: bold;">Pull</span>: when the switch is closed, the light bulb somehow knows to inquire whether the switch's state has changed. If the switch is still open, the bulb stays out, else it lights up.</li></ul>To me, the pull method seems backwards. How does the light bulb know to inquire? There are actually plenty of common and logical solutions to these kinds of problems, but for now I see no reason why we shouldn't stick with the push method.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-7368064797737596548?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-78648834352685665822008-09-11T21:23:00.004-04:002008-09-11T21:26:07.654-04:00Code Downloads!Downloads of all softHARDsoft code can now be found here: <a href="http://downloads.softhardsoft.com/">http://downloads.softhardsoft.com/</a><br /><br />Reminder: the license I'm releasing the code under is <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons: Attribution-Share Alike 3.0 Unported</a><br /><br />The page will remain pretty Spartan but functional. Enjoy!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-7864883435268566582?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-37430654220453940382008-09-11T17:11:00.008-04:002009-03-25T16:03:42.824-04:00Zen of a Virtual Circuit<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.brickartist.com/lego-art/Yellow3.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 232px; height: 208px;" src="http://www.brickartist.com/lego-art/Yellow3.jpg" alt="" border="0" /></a>In <a href="http://softhardsoft.com/2008/07/how-to-make-machine-think.html">How to make a machine "think"</a> we considered a basic logic where:<br /><ul><li>Any piece's output can be another's input.</li><li>Use only 0 and 1 (boolean: TRUE and FALSE).<br /></li></ul>By meeting our second requirement (ie: by only passing around boolean values), we also satisfy our first requirement. If some items only accepted numbers, some only letters, and if outputs were similarly varied, then we'd have to specialize families of circuits right off the bat. As it is, all inputs and outputs are of the same type: boolean. Need the output of an OR gate to be the input to a transistor? No problem. Any output can go to any input as-is.<br /><br />We now have the foundation for an infinitely modular system -- Logic LEGOS!*<br /><br />So what <span style="font-style: italic;">is</span> a circuit?<br /><br />In a general sense, any piece of logical hardware can be a circuit. Any collection of circuits can also be considered a circuit:<br /><ul><li>transistor</li><li>inverter</li><li>full adder</li><li>Pentium processor<br /></li></ul>This is the beauty of our modular, LEGO-like architechture. With "circuit" being such a flexable term, we can build any manner of abstraction, and to us it's still just a circuit. It can still connect with any other circuit irrespective of how work is being done inside each one.<br /><br />Not that there aren't differences. Never mind the stuff inside. The outsides are very different too. Transistors have 2 inputs and 1 output. Inverters: 1 in, 1 out. Full adders: 3 in, 2 out. The Pentium processor, lots of each. Obviously we won't be able to statically define how many inputs and output a circuit can have. But we do now have some basic definitions for our first interfaces:<br /><br /><span style="font-weight: bold;">Circuit</span>: has some number of inputs and some number of outputs<br /><span style="font-weight: bold;">Input</span>: accepts a boolean value<br /><span style="font-weight: bold;">Output</span>: each emits a boolean value<br /><br />All of our circuits, no matter how simple or complex, will boil down to this. They'll have some number of inputs, some outputs, and stuff hidden in the middle to turn inputs into outputs.<br /><br />That's about all there is to say about this layer of the onion. Next we'll dig deeper on how our inputs and outputs need to relate to each other.<br /><br /><span style="font-weight: bold;">CODE: </span><a href="http://downloads.softhardsoft.com/2008-09-11.zip">http://downloads.softhardsoft.com/2008-09-11.zip</a><br /><br /><br />* From wikipedia: "The word LEGO® is a brand name and is very special to all of us in the LEGO Group Companies. We would sincerely like your help in keeping it special. Please always refer to our bricks as 'LEGO Bricks or Toys' and not 'LEGOS.'"<br /><br />Yeah, well build a bridge and get over it. I've never met anyone who calls them "LEGO Bricks or Toys." Like it or not, everyone outside of that company calls them "LEGOS." I have nothing but the greatest admiration for these toys, but I have no use for their PR pride.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-3743065422045394038?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-29926955719035293302008-09-10T20:43:00.006-04:002008-09-10T20:54:51.606-04:00Art Imitating LifeIn <a href="http://softhardsoft.com/2008/07/transistors-our-lowly-beginnings.html">Transistors: Our Lowly Beginnings</a>, I said:<blockquote>I'm going to spend as much time as necessary getting a rock solid transistor emulator working.</blockquote>I really meant not so much the emulation of the transistor proper, but rather the infrastructure that will be the foundation for the whole project. The first decision to be made about our architecture is:<br /><br /><span style="font-weight: bold;">How do we want circuits to work?</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tLgr5mTmWvc/SMhq4QqPu2I/AAAAAAAAAqU/5zadMZW8P54/s1600-h/circuit+open.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 71px; height: 36px;" src="http://3.bp.blogspot.com/_tLgr5mTmWvc/SMhq4QqPu2I/AAAAAAAAAqU/5zadMZW8P54/s320/circuit+open.png" alt="" id="BLOGGER_PHOTO_ID_5244559280850320226" border="0" /></a>In circuitry schematics (which is to say: in real circuits): electricity travels in a closed loop. If the loop is opened (ie: interrupted, broken),<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SMhrDP26cLI/AAAAAAAAAqc/_IgDNws2ycM/s1600-h/circuit+closed.png"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 71px; height: 36px;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SMhrDP26cLI/AAAAAAAAAqc/_IgDNws2ycM/s320/circuit+closed.png" alt="" id="BLOGGER_PHOTO_ID_5244559469613576370" border="0" /></a> then the electricity ceases to flow. The electricity always has to come from somewhere and go to somewhere. If we put a wire against a battery's terminal and touch the other end to a light bulb, the bulb stays dark. If we use another wire to go from the bulb's other terminal back to the battery's unused terminal, the bulb lights up.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SMhrUx3PFiI/AAAAAAAAAqk/_y4Ar8WVgbw/s1600-h/logic.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 103px; height: 47px;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SMhrUx3PFiI/AAAAAAAAAqk/_y4Ar8WVgbw/s320/logic.png" alt="" id="BLOGGER_PHOTO_ID_5244559770799511074" border="0" /></a>In logic diagrams: there's a linear source/input and destination/output. The output is not required to go anywhere. If you connect a lamp to the output of a circuit yielding "on" (alternately: "high", "1"), then the lamp lights up.<br /><br />Either choice would be acceptable. Creating a viable circuit would involve creating not only transistors, but also resistors and all other electrical components that make the physical processor function. softHARDsoft is ambitious enough without starting out that complex. In fact, I very much doubt we'll <span style="font-style: italic;">ever</span> get that complex: at the beginning or otherwise.<br /><br />The assumption behind our goals so far has been: we'll make a program that simulates a computer's logic at the most fundamental level. To this end, let's model our circuits not on real circuitry, but on logic flow. Let's use a non-looping system.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-2992695571903529330?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-60806925066669850992008-08-12T21:11:00.006-04:002008-08-18T11:56:44.413-04:00The August of Crickets<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SKI2L4fhGVI/AAAAAAAAAqM/EWqALL4gQNo/s1600-h/empty.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SKI2L4fhGVI/AAAAAAAAAqM/EWqALL4gQNo/s320/empty.jpg" alt="" id="BLOGGER_PHOTO_ID_5233805294728976722" border="0" /></a>Man, it's so dead on this blog you can almost hear crickets. What happened? Are we running out of ideas? Did we lose ambition? Was it <a href="http://softhardsoft.com/2008/07/hiatus.html">the car wreck</a>?<br /><br />No. There are 3 reasons why softHARDsoft has been so dead lately:<br /><ol><li>Time is being split between this project and another one.</li><li>Work has been stupidly overbearing and exhausting.</li><li>sHs is now starting to move beyond casual blog posts and into the realm of real planning (so writing would be less frequent anyway).</li></ol>sHs has certainly not been abandoned nor forgotten about. It just needs to take a back seat for a short time. We'll be back in full swing soon enough. To our few readers at this point: thanks for staying with us so far, and we promise to be back as soon as we can!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-6080692506666985099?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-54511528085450142322008-07-25T08:28:00.006-04:002008-08-12T21:25:39.936-04:00Transistors: Our Lowly BeginningsThe lowest level that softHARDsoft will implement is transistors. They work on pure physics and going any more basic than that seems a bit silly for our purposes.<br /><br />Transistors can be used as amplifiers or switches. They are the bedrock of the rapid advancement of electronics over the last 60 years. These tiny wonders can be used to amplify signals (as they are used in transistor radios and hearing aids) and can act as on/off switches (as is the basis for computer logic).<br /><br />In <a href="http://softhardsoft.com/2008/07/transister-choice.html">Transistor choice</a>, it was explained that we'll start with <a href="http://en.wikipedia.org/wiki/Bipolar_junction_transistor">bipolar junction transistors</a> (BJT transistors). These have the most basic construction of all transistors and for our purposes, they'll work as well as any of the others. In fact, they'll work better than the others because they'll be the easiest for which to to write emulation software. I'm going to spend as much time as necessary getting a rock solid transistor emulator working. It cannot be emphasized enough that <span style="font-weight: bold;">all computer logic comes back to transistors</span>. Everything.<br /><br /><span style="font-weight: bold;">Anatomy</span><br />A BJT transistor has 3 regions: emitter, base, and collector. Here's how an NPN* BJT transistor works: When current is available at the <span style="font-style: italic;">collector</span>, applying a tiny current to the <span style="font-style: italic;">base</span> causes the <span style="font-style: italic;">emitter</span> to emit an amount of current equal to the sum of the other 2. The sum of the currents is how amplification occurs. More importantly to us: the transistor acts as an on/off switch when we add power to or remove power from the base.<br /><br />Now that we have a switch that is activated by electricity, <span style="font-weight: bold;">we can use electricity to take action on other switches</span>.<br /><br />* There are 2 types of BJT transistors: NPN and PNP. The choice for which to use is arbitrary so we're using NPN.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-5451152808545014232?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-10285862905000371142008-07-18T22:38:00.000-04:002008-12-10T07:54:05.722-05:00How to make a machine "think"<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tLgr5mTmWvc/SIFSbBzCIbI/AAAAAAAAAp0/Zsfr-q7mcf8/s1600-h/brain_sm.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_tLgr5mTmWvc/SIFSbBzCIbI/AAAAAAAAAp0/Zsfr-q7mcf8/s320/brain_sm.gif" alt="" id="BLOGGER_PHOTO_ID_5224547667018916274" border="0" /></a><span style="font-weight: bold;">Logic</span><br />I know we've really already predicted the answer to the question "what do we need?": we need the parts that make up a computer. But we haven't determined why those parts the most appropriate? Why transistors? What benefit do we gain from them? What will they allow a computer to do? For that matter, what do we need our computer to do in the first place?<br /><br />What computers do is obvious. It's right there in the name. They <span style="font-style: italic;">compute</span>. They take input data, make decisions, and give output data. To make decisions, there needs to be some kind of predictable logic.<br /><br />What kind of logic can a machine use? This logic needs to be a type that a non-thinking thing can do on its own. There needs to be well-defined concrete input data. If we want to make complex decisions then we need a type of logic where the output data from one decision can be the input to another. To that end, no output can be undefined. If it were so, then we could have undefined input which we've already said we don't want. Our options for well-defined input/output is seemingly limitless: letters, numbers, words, etc. Is one type of input more useful than another?<br /><br />Conveniently enough there is an existing logic we can turn to for help. This type of logic is well established, is fundamental in math and language, has very few rules, and the rules it does have are all simple: Boolean logic (also known as binary logic).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tLgr5mTmWvc/SIFSeZcq_9I/AAAAAAAAAp8/sDQbYs7LSc4/s1600-h/binary_sm.jpg"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_tLgr5mTmWvc/SIFSeZcq_9I/AAAAAAAAAp8/sDQbYs7LSc4/s320/binary_sm.jpg" alt="" id="BLOGGER_PHOTO_ID_5224547724907184082" border="0" /></a>In <a href="http://en.wikipedia.org/wiki/Boolean_logic">Boolean logic</a>, data can be either TRUE or FALSE (alternatively: 1 or 0, on or off). Our TRUE and FALSE can relate to each other in a small number of rules that resemble pre-algebra. In keeping with the obvious minimalist theme of this logic, there are only a few relationships (aka: operations) and each is based on only 1 or 2 inputs at a time. With the NOT operation, you can turn one input into its opposite. You can also see if two inputs are the same as each other (XNOR), if both inputs are true (AND), if at least 1 is true (OR), or if one is true but not the other (XOR). Really, XOR and XNOR can be derived from the other 3, so there are only 3 fundamental operations.<br /><br />That's it. There's 100% of the basics of Boolean logic.<br /><br />Although this feels very limiting compared to the possibility of using numbers and words, this is in fact all we need. For now please trust me. It'll be more apparent later.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tLgr5mTmWvc/SIFTSaHGJYI/AAAAAAAAAqE/yi5j0W_eg7I/s1600-h/switch.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_tLgr5mTmWvc/SIFTSaHGJYI/AAAAAAAAAqE/yi5j0W_eg7I/s320/switch.jpg" alt="" id="BLOGGER_PHOTO_ID_5224548618438321538" border="0" /></a><span style="font-weight: bold;">Switches</span><br />Enough with the theoretical stuff, how do we get a machine to implement binary logic? Obviously, the on/off state of our data calls to mind light bulbs and light switches. All that remains is to figure out how to implement the 3 logical operations mentioned previously (NOT, AND, OR).<br /><br />It turns out that the key to implementing the logical operations with electricity is just a matter of using switches wired up certain ways. If you want an AND situation, hook up 2 switches in serial. For OR, hook up 2 in parallel. For NOT, just change the switch's current position.<br /><br /><span style="font-weight: bold;">Electronic Switches</span>: FINALLY, Our 1st hardware<br />Unless you want to sit there manually toggling switches all day, we need a way to have that part done for us automatically. We want switches that themselves can be controlled by electricity.<br /><br />Enter: transistors.<br /><br />And that's where we'll pick up next time.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-1028586290500037114?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-7962323595463457652008-07-15T19:27:00.007-04:002008-12-10T07:54:06.108-05:00Transistor choice<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tLgr5mTmWvc/SH03OjCScKI/AAAAAAAAAig/VPvqIQgb2l8/s1600-h/npn.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_tLgr5mTmWvc/SH03OjCScKI/AAAAAAAAAig/VPvqIQgb2l8/s320/npn.jpg" alt="" id="BLOGGER_PHOTO_ID_5223391865882177698" border="0" /></a>As I said in <a href="http://softhardsoft.com/2008/06/i-know-nothing-1-of-2-confession.html">I know nothing</a>, the inspiration for softHARDsoft comes from Charles Petzold's <a href="http://www.amazon.com/dp/0735611319?tag=mcra-20">Code: The Hidden Language of Computer Hardware and Software</a>. Throughout the book, Petzold designs a computer out of relays. Toward the very end of the book he reveals that transistors and not relays make real computers these days.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tLgr5mTmWvc/SH03hUwBAKI/AAAAAAAAAio/Mh4_W8Pl22U/s1600-h/pMosfet.jpg"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_tLgr5mTmWvc/SH03hUwBAKI/AAAAAAAAAio/Mh4_W8Pl22U/s320/pMosfet.jpg" alt="" id="BLOGGER_PHOTO_ID_5223392188464955554" border="0" /></a>Although I knew this fact, what I didn't know until fairly recently is that the transistors of modern computers are not just the common <a href="http://en.wikipedia.org/wiki/Bipolar_junction_transistor">BJT</a> transistors* described in hobbyist electronics books. In actual processors, <a href="http://en.wikipedia.org/wiki/MOSFET">MOSFET</a> transistors are used. Especially when MOSFET transistors are arranged in <a href="http://en.wikipedia.org/wiki/CMOS">CMOS</a> logic, there are significant gains in electricity usage and heat released. These are huge concerns when you're stuffing a few hundred million of these jokers into a couple of square inches. Not such a concern for sHs where all hardware is virtual.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tLgr5mTmWvc/SH03mz2vfrI/AAAAAAAAAiw/q4P85TNRSOE/s1600-h/CMOS.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_tLgr5mTmWvc/SH03mz2vfrI/AAAAAAAAAiw/q4P85TNRSOE/s320/CMOS.jpg" alt="" id="BLOGGER_PHOTO_ID_5223392282714013362" border="0" /></a>However, that leaves me with a dilemma: do I try to really emulate a processor by creating the internals of my logic gates using MOSFET+CMOS logic, or just plain old BJT-styled transistors? For now I'm going to do the latter and revisit the issue later if I feel like it. I feel I can justify this choice because I am in fact looking at design <span style="font-weight: bold;">a</span> computer. It doesn't have to be accurate to modern computers. In fact, this whole project is ambitious enough without trying to hold myself to such standards; especially at the beginning.<br /><br />* I realize that "BJT transistor" is redundant since the T stands for "transistor." But to amateur ears like mine, the sentence flows better than calling them "BJTs." Likewise with "MOSFET transistors" vs. "MOSFETs."<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-796232359546345765?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-53189856791660496412008-07-10T14:24:00.006-04:002008-07-10T14:30:18.736-04:00Follow-up to Code?Almost a decade after the fact, it's no real surprise that Charles Petzold doesn't intend to do a sequel to <a href="http://www.amazon.com/dp/0735611319?tag=mcra-20">Code</a>, however it was still disappointing to hear when I asked him directly. His email reply to me:<br /><br /><blockquote>I don't think this is precisely the book you're looking for, but I *do* think of my new book as a sequel to code:<br /><a href="http://www.theannotatedturing.com/">http://www.TheAnnotatedTuring.com</a></blockquote><br />Oh well. I'm sure I'll still read this book when I find time.<br /><br />You can purchase The Annotated Turing <a href="http://www.amazon.com/dp/0470229055?tag=mcra-20">from Amazon</a> or through links on the official site.<br /><br />[<span style="font-style: italic;">Update</span>: Charles Petzold stated as much <a href="http://www.charlespetzold.com/blog/2007/03/280150.html">here</a> a year ago but I only just became aware this post of his.]<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-5318985679166049641?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-69826622901824607472008-07-07T17:03:00.002-04:002008-07-07T17:13:07.135-04:00HiatusI got into a pretty severe wreck over the holiday weekend. We're all ok but this has left me with a long to-do list of things more important than sHs. I'll still post here when I get around to it but who knows how frequent that will be.<br /><br />Ford Crown Vics don't get very good gas mileage but they protect you really well from damage. This easily could have been fatal.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-6982662290182460747?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-37860318985570060122008-07-02T08:15:00.005-04:002008-12-10T07:54:06.290-05:00I know nothing part 2: A tribute to Dion Polk and Robert RodriguezIn college I had one class with a guy who did webpages as a hobby: Dion Polk. He was an older guy ("older" compared to a kid fresh out of high school) that I hung out with after class quite a bit. I owe him a lot. What did he do for me? Very little actually. We'd talk after class, I'd ask him questions about how he wrote webpages, and he enthusiastically answered my questions. The big thing he did for me was write down a url for an online tutorial for HTML. You can hardly go online now without tripping over a million such tutorials, each one equally as good as the one I saw then, but back in the pre-Google days of the internet, such wasn't the case. Back to my point: Dion's can-do, can-learn attitude reinvigorated my passion in technology.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tLgr5mTmWvc/SGtyKBLxoEI/AAAAAAAAAJA/9OnNRiXcoPA/s1600-h/rodriguez.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_tLgr5mTmWvc/SGtyKBLxoEI/AAAAAAAAAJA/9OnNRiXcoPA/s320/rodriguez.jpg" alt="" id="BLOGGER_PHOTO_ID_5218390109680934978" border="0" /></a>Flash forward some [mumble, mumble] years to watching the extras on the DVD of <a href="http://www.amazon.com/dp/B000BCKFWK?tag=mcra-20">Sin City</a>. Love it or hate it, Sin City is a visual masterpiece. On the DVD, co-director <a href="http://en.wikipedia.org/wiki/Robert_Rodriguez">Robert Rodriguez</a> spends some time explaining his mantra of "Mariachi-style" movie making -- where "creativity, not money, is used to solve problems." He talks about how he got into the movie biz and tells how he did pretty much all jobs himself. Then he casually mentions how the viewer can do pretty much all effects seen in Sin City using an inexpensive camera and the free software that's probably already on their laptop. I was floored! He's really suggesting that your average person can do this. In fact, he himself did this in many professional movies -- including for all the stunning visuals in Sin City.<br /><br />Although I was interested in computers since childhood and got pretty good with certain aspects, especially for a kid, I largely abandoned computers for my teenage rock n' roll years where I spent most of my non-school time playing in bands. In fact, throughout high school the only programming I did was writing pseudo-BASIC scripts on a graphics calculator to figure out my math formulas for me. Learning all this "computer stuff" in college was really starting from scratch. But I did it. One step at a time. From then until now I have faced countless times where I started out completely deficient in the knowledge needed for my desired field. Until I learned more. Now I have a fledgling skill-set I'm starting to be proud of. Not because I'm special or overly smart - I'm not. Not because I learned it in school - I didn't. It's because I said I can - and I did.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-3786031898557006012?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-7679717998626838172008-06-30T09:00:00.006-04:002008-06-30T09:14:39.988-04:00I know nothing 1 of 2: Confession<blockquote>"I know nothing except the fact of my ignorance."<br />- Socrates</blockquote><br />Time to come clean: everything I've said so far is true but potentially misleading. Although I really am a professional software developer, and have been for years, my hardware experience amounts to reading 3 or 4 books and as many dozens of articles. I know the concepts of assembly but have never written a complete usable program. C++ made me almost pull my hair out and I've only written rudimentary programs in C. <span style="font-weight: bold;">So what the hell makes me think I can remotely have a chance at accomplishing my goals in softHARDsoft?</span><br /><br />I got my initial inspiration for this project after reading what is hands-down the most amazing computer book I've read in my life: Charles Petzold's <a href="http://www.amazon.com/dp/0735611319?tag=mcra-20">Code: The Hidden Language of Computer Hardware and Software</a>. <span style="font-style: italic;">Code</span> takes you step by step from the basics of electronic circuits to a conceptually viable computer in 400 pages. His attitude is that anyone can understand this if it's properly explained. I completely buy into this. After reading Code the first time, a little idea started swimming around in the back of my head. I wanted to pick up a lot of relays and build a simple computer. It didn't take long to realize that buying just a few thousand relays at $2-3 a piece wasn't going to happen. (Not to mention the electrical engineering aspect, on which I've only ever read 2 or 3 books.) However, I knew I could learn just as much by building my computer from the one resource that was essentially free: I could write it all in code. The benefits of doing it in code are too many for me to ignore:<br /><ul><li>Free, other than time.</li><li>All components are the ideal versions of themselves. No shorted circuits. No size constraints. No interference from other parts. No decay, breaking, or burnout. Many real world inconveniences disappear.</li><li>The state of any part can be examined at any point.</li><li>Components I don't feel like doing yet can be ignored and I can write a good-enough approximation until I want to come back to it.</li><li>Parts can be swapped effortlessly. This will be especially relevant for the previous point as well as for writing improved versions later.</li><li>Code is what I know best. I don't have to spend months getting passably good with electrical engineering just to get to the point that I can physically construct a half adder.</li><li>Any component, no matter how rare or expensive in the real world, is at my disposal as long as I can learn enough about it.</li></ul>There are more reasons but you get the idea.<br /><br />The other reason I think I can accomplish a lot of my goals for sHs is: this is all learn-able, I just haven't learned it <span style="font-style: italic;">yet</span>. This is the life story of anyone self-taught at anything. There was a time when none of us knew thing one about computers. Now we do. We learn. And that's all I need to do to make this work as well. Learn.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-767971799862683817?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-80820240940938626732008-06-27T08:07:00.000-04:002008-12-10T07:54:06.586-05:00Licensing<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tLgr5mTmWvc/SGTW4KDD1MI/AAAAAAAAAI4/-ji6HxkhtGk/s1600-h/cc.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_tLgr5mTmWvc/SGTW4KDD1MI/AAAAAAAAAI4/-ji6HxkhtGk/s320/cc.png" alt="" id="BLOGGER_PHOTO_ID_5216530528660083906" border="0" /></a>This post is brought to you by the letter 'C.'<br /><br />I didn't want this licensing decision to be hanging over my head forever so I picked one that looked good enough for now. <a href="http://creativecommons.org/licenses/by-sa/3.0/">This Creative Commons license</a> I've selected basically says the following about this software:<br /><ul><li>You can share, copy, distribute, and transmit it.</li><li>You can remix, adapt, and alter it.</li><li>If you alter it, give credit to the source and extend these same rights to others.</li><li>Don't use it in commercial stuff.</li><li>If you want exceptions made for you personally, just ask. The copyright holder can grant additional privileges.</li></ul>The lion's share of what I've learned about programming has come from open source communities with licenses such as the one above. It's only fair that I reciprocate in kind.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-8082024094093862673?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-88166284209188528252008-06-25T10:05:00.003-04:002008-12-10T07:54:06.771-05:00Version control 3 of 3: installationI'm kinda getting tired of talking about version control software. As I said before, my interest is for it to be a means to an end, not a focus itself. To that end, I'm going to go through my installation then get on with the real purpose of softHARDsoft.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tLgr5mTmWvc/SGJYiYJBh6I/AAAAAAAAAIw/NNyjfCSs6HM/s1600-h/Fgrey.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_tLgr5mTmWvc/SGJYiYJBh6I/AAAAAAAAAIw/NNyjfCSs6HM/s320/Fgrey.jpg" alt="" id="BLOGGER_PHOTO_ID_5215828666067552162" border="0" /></a>What I'm actually installing is <a href="http://www.sourcegear.com/fortress/index.html">Fortress</a>. It's an ALM (Application Lifecycle Management) software suite that is made by SourceGear: the same company that makes Vault. It has everything Vault has and then some and is also <a href="http://www.ericsink.com/entries/SingleUserStillFree.html">free to single users</a>. To use for a single user, simply do not enter any serial numbers (license keys) and it will default to single license mode. The official setup guide is <a href="http://www.sourcegear.com/fortress/support/GettingStarted/index.html">here</a>.<br /><br /><a href="http://www.sourcegear.com/downloads.html">Download</a> Server and Client from SourceGear.<br /><br /><span style="font-weight: bold;">FORTRESS SERVER</span><br />To set up a Fortress (or Vault) server, you need:<br /><ul><li>Windows XP Pro or Windows 2000 SP3 or above</li><li>IIS 5 or above (included in any above OS)</li><li>.NET Framework 1.1 or 2.0 (free)</li><li>SQL Server. 2000, MSDE 2000 (free), 2005, or 2005 Express (free)</li></ul>I'll be using XP Pro, IIS 6, .NET 2.0, and SQL Server 2005 Express.<br /><br /><span style="font-weight: bold;">IIS</span><br />I already have XP and .NET set up. Next, I'll install IIS. Although I long ago removed an old web server I was no longer using (Apache), for some unknown reason I'm unable to start IIS on port 80 -- so I set IIS to 8080. When you install .NET after IIS, the .NET installation does some configuring of IIS automatically. When you do it in the reverse order as I have, you have to run <a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;q306005">aspnet_regiis.exe -i</a> to get it configured.<br /><br /><span style="font-weight: bold;">SQL SERVER</span><br />I installed SQL Server 2005 when I first installed Visual Studio 2005. However, I never use it and have long since set its Windows service to Manual. I set it back to Automatic and started the service. I'm not that familiar with SQL Server so I hope Fortress's installer file takes care of most of the SQL Server configuration for me.<br /><br />After finally being done with the prerequisites, time to install the server. One oddity on my computer, when it asks for a SQL Server, the default "(local)" option isn't working. I downloaded the free <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&amp;displaylang=en">Microsoft SQL Server Management Studio Express</a> to get a better idea of what my server may be called. The default in SQL Server Management Studio is "COMPUTER-NAME\SQLEXPRESS". (Hmm, maybe I have SQL Express after all.) When I try this in the Fortress installer, it works.<br /><br />The last step of the install took a while to run, but it worked.<br /><br /><span style="font-weight: bold;">FORTRESS CLIENT</span><br />Although it takes a couple of minutes to run, it's a no-brainer install.<br /><br />Enough of this stuff. I want to start the real planning of sHs.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-8816628420918852825?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-68717565538786120812008-06-23T09:44:00.004-04:002008-12-10T07:54:07.104-05:00Version control 2 of 3: selection<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SF-repzx5VI/AAAAAAAAAH8/pYLPTveFyqo/s1600-h/subversion_logo_hor-468x64.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SF-repzx5VI/AAAAAAAAAH8/pYLPTveFyqo/s320/subversion_logo_hor-468x64.png" alt="" id="BLOGGER_PHOTO_ID_5215075436625782098" border="0" /></a>At work I use a source control system, ClearCase, that integrates very well into my IDE, Visual Studio 2005. What I really want is a cheap or free integrated version control system to use at home. My other need is that I'm setting up a tool to be a means to an end. I'm not looking to invest any more time than possible to learning the nuances of it. I want it to be intuitive. I also want it to be popular so when I hit a snare that I have to Google, there will be plenty of available information addressing my problem.<br /><br />After poking around online, I found, not surprisingly, that everyone has a favorite and <span style="font-weight: bold;">theirs</span> is objectively the best. Seriously though, what I found that matched my criteria the closest is: Subversion + TortoiseSVN + AnkhSVN. I'm heavily influenced by those I respect and I was also swayed by Subversion etc. being recommended by several people who I admire in the coding world. Namely <a href="http://www.hanselman.com/blog/AnkhSVNUsingSubversionWithinVisualStudio.aspx">Scott Hanselman</a>, <a href="http://www.codinghorror.com/blog/archives/001093.html">Jeff Atwood</a>, and <a href="http://www.codeproject.com/KB/dotnet/SourceControl_VSNET.aspx">a CodeProject article</a> with an incredible 4.73/5 rating.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SF_cTs3R9BI/AAAAAAAAAIo/c5Uw3w4hijc/s1600-h/vault.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SF_cTs3R9BI/AAAAAAAAAIo/c5Uw3w4hijc/s320/vault.jpg" alt="" id="BLOGGER_PHOTO_ID_5215129124536972306" border="0" /></a>No sooner had I settled on Subversion et al than I found out that my old friend <a href="http://www.sourcegear.com/vault/index.html">Vault</a> is <a href="http://www.ericsink.com/entries/SingleUserStillFree.html">free to single users</a>! I've heard great things of it and honestly I still feel a little guilty that I never gave it a fair chance at my last job. What about all of those recommendations? That actually almost kept me sold on Subversion but Vault comes with a great recommendation as well. It was started by and is promoted by the amazing <a href="http://www.ericsink.com/">Eric Sink</a>.<br /><br />I still think Subversion + TortoiseSVN + AnkhSVN sounds like a good combination but I'm going to try Vault.<br /><br />Next: I'll detail my the success, or lack thereof, of the Vault installation.<br /><br />In case these should be useful later, here are my collected links for the Subversion based trio:<br /><ul><li><a href="http://www.codeproject.com/KB/dotnet/SourceControl_VSNET.aspx">Source Control with Visual Studio .NET</a></li><li><a href="http://www.codinghorror.com/blog/archives/001093.html">Setting up Subversion on Windows</a></li><li><a href="http://garrys-brain.blogspot.com/2006/11/visual-studio-2005-and-tortoisesvn.html">Visual Studio 2005 and TortoiseSVN Subversion Integration</a> - and other posts</li><li><a href="http://ilmatte.wordpress.com/2008/04/27/guide-to-versioning-a-visual-studio-solution-with-subversion-tortoisesvn-and-ankhsvn/">Guide to Versioning a Visual Studio Solution with Subversion, TortoiseSVN and AnkhSVN</a></li><li><a href="http://lifehacker.com/software/top/hack-attack-how-to-set-up-a-personal-home-subversion-server-188582.php">Hack Attack: How to set up a personal home Subversion server</a></li><li><a href="http://lifehacker.com/software/subversion/hack-attack-using-subversion-with-tortoisesvn-192367.php">Hack Attack: Using Subversion with TortoiseSVN</a></li><li><a href="http://blog.surfulater.com/2007/02/28/get-up-and-running-with-tortoisesvn-and-subversion-in-15-minutes/">Get up and running with TortoiseSVN and Subversion in 15 minutes</a></li><li><a href="http://www.hanselman.com/blog/AnkhSVNUsingSubversionWithinVisualStudio.aspx">AnkhSVN: Using Subversion within Visual Studio</a></li><li><a href="http://svnbook.red-bean.com/">Version Control with Subversion</a> - free online O'Reilly book</li><li><a href="http://www.visualsvn.com/">Visual SVN</a> - another highly recommended Subversion with Visual Studio integration</li></ul><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-6871756553878612081?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-83390555437531537512008-06-19T11:18:00.003-04:002008-06-19T11:24:30.782-04:00Version control 1 of 3: taking the plungeQuite fitting to the mentality behind softHARDsoft, before I start any coding I want to set up source control. Before any step in the process, there always seems to be another step to do first.<br /><br />In my first job out of college, I was involved in designing technologies but not actually doing the coding. In my next job, at which I worked for a long time, it was almost all coding and I was a self-taught one man army. I kept up with my code and did regular back-ups. Even our other developer teams didn't use version control so I saw no use for it.<br /><br />During my last few months there, another developer and myself began working closely together and it took no time at all to realize that we needed a real system to synchronize our stuff. (I refuse to admit what we did until we broke down and came to this realization.) In his prior job, he'd used been forced to use Visual SourceSafe (VSS). For our collaborative project he recommended Vault, a version control system which is marketed as a VSS replacement. We started using Vault and I hated it immediately.<br />Want to change some code? Here's what I was used to:<br /><ul><li>step 1: open IDE</li><li>step 2: change code</li><li>step 3: save</li><li>step 4: there is no step 4<br /></li></ul>Now we had to do this:<br /><ul><li>step 1: open IDE</li><li>step 2: check out file</li><li>step 3: write a comment for this check-out</li><li>step 4: change code</li><li>step 5: save</li><li>step 6: check in</li><li>step 7: resolve version conflicts<br /></li></ul>Which is to say: I'd entered a real development team.<br /><br />That company started to tank so I left and joined my current company where I've been for a few years. Here, from day 1, I've used a source control system called ClearCase. When ClearCase is good, you hardly notice it's there. When it's bad, things go 110% wonky and you find yourself wanting to find a new job rather than continue to use this demonic software. My only saving grace at work is that one of our founders has been using ClearCase at various jobs since the software first came out. He's a guru at it and can fix any of its idiosyncrasies.<br /><br />I'm embarrassed to admit that although I code frequently at home, I have never used version control there. Every so often I'll decide to do so, find it too frustrating to set up, and put it off yet again. I've found myself wishing for the capabilities of version control countless times but my procrastination has prevented me from taking the plunge.<br /><br />That ends now.<br /><br />I want source control for softHARDsoft and I want it for my other home projects as well.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-8339055543753153751?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-86142952626543260282008-06-17T09:33:00.003-04:002008-12-10T07:54:07.291-05:00Predicted pathPredicted path of softHARDsoft<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SFe-y2wAIiI/AAAAAAAAAG8/rZzHc7Wrbek/s1600-h/Emerald_City_3.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 266px; height: 200px;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SFe-y2wAIiI/AAAAAAAAAG8/rZzHc7Wrbek/s320/Emerald_City_3.jpg" alt="" id="BLOGGER_PHOTO_ID_5212844874604225058" border="0" /></a><span style="font-weight: bold;">soft</span><br />Since it's what I'm best and fastest with, the initial hardware simulator will be written in C# (.NET 2.0) running on WinXP. There are steps below in the 2nd <span style="font-weight: bold;">soft</span> section which will require a lot of assembly and/or C programming. After that, it may be desirable to come back and redo this in non-managed code for speed. Frankly though, I'm pretty excited about starting and I want to begin with my most rapid option.<br /><br /><span style="font-weight: bold;">HARD</span><br />create transistors<br />create simple circuits<br />create common circuit combinations<br />create computer components:<br /><ul><li>memory</li><li>CPU: My original thought was to simulate a <a href="http://en.wikipedia.org/wiki/Intel_8080">8080</a> or <a href="http://en.wikipedia.org/wiki/8086">8086</a>. Now I'm leaning toward a tiny custom proof of concept followed by either a <a href="http://en.wikipedia.org/wiki/4004">4004</a> or <a href="http://en.wikipedia.org/wiki/80386">80386</a>. Possibly all 3 in that order.<br /></li><li>hard drive: I haven't decided how to do permanent storage yet. Recreating flash memory would stick with it all being in circuits but simulating a regular platter hard drive may be a better starting point. More on this when this stage is reached.</li></ul><span style="font-weight: bold;">soft</span><br />This will depend on the processor made. For a 386, we should be able to run any 386 compatible software on sHs. For a small custom one or a 4004, the basics will probably be hand assembled and a simple C-like/ALGOL-like programming language should be figured out when/if assembly gets tiresome. Insert here the need for a compiler.<br />Operating System:<br /><ul><li>if 386: We can likely strip down the Linux kernel, alter a tiny Linux distro like Damn Small Linux, or use a microkernel like QNX</li><li>if custom or 4004: a simple OS will be created</li></ul>In all likelihood, this is not ever going to be efficient nor resemble a useful or modern computer. I'm learning a lot of it as I go along. Not to mention that I'm unlikely to single-handedly recreate in a few years what it took some of the greatest minds 50 years to evolve. I'm just learning, having fun, and hoping this may also be of some use to others.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-8614295262654326028?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0tag:blogger.com,1999:blog-1132049988667387317.post-60362652330826552032008-06-15T14:53:00.002-04:002008-12-10T07:54:07.454-05:00Peeling the Onion<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tLgr5mTmWvc/SFVv7-pyh1I/AAAAAAAAAG0/AGulBV-KTBY/s1600-h/npn-ourobos.jpg"><img style="margin: 0pt 10px 8px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_tLgr5mTmWvc/SFVv7-pyh1I/AAAAAAAAAG0/AGulBV-KTBY/s320/npn-ourobos.jpg" alt="" id="BLOGGER_PHOTO_ID_5212195219972458322" border="0" /></a> Breakdown of a computer: Practically speaking, a computer is a collection of useful software applications. Software is just arranged 1s and 0s inside of complex hardware. Complex hardware is made of smaller simple pieces of electronics and machinery working together in a predictable manner. A predictable physical item can be simulated in a computer program.<br /><br />Rewind.<br /><br />It's possible to make a computer program emulate the basic pieces of hardware. You could use such a program to arrange basic elements into complex hardware. You could even make this program able to run software like a computer does.<br /><br />So what have we made? Well, mainly the world's slowest and most inefficient computer. But also a learning tool where you can see any part of a computer. You could see and manipulate any piece and understand how these magical machines work.<br /><br />softHARDsoft is an experiment to create such a program.<br /><br />Notes:<br /><ul><li>This is not the same as making an emulator. An emulator is a black box that acts identically to the object it's imitating. Behind the scenes, it can use any means. Recreating the innards of a computer, as is the goal here, is much more specific and detailed. [For example: the clock display on Windows is a clock emulator. It does something behind the scenes and displays the time. Windows doesn't have a program to shift each spring and gear that would be found inside a clock.] In fact, I may create an emulator first at some point to solidify my interface or make a proof of concept before recreating the insides. The very base hardware pieces will be emulators because I'm not reconstructing physics itself to make them work.</li><li>sHs will be open source. License yet to be determined.<br />[<span style="font-style: italic;">UPDATE</span>: See the <a href="http://softhardsoft.com/2008/06/licensing.html">Licensing</a> post]<br /></li></ul>Disclaimer: I do not have a computer-related degree and am in no way an expert on any of this. Although I've been a professional software engineer for years, I'm still merely a self-taught programmer. The ambitious goals of softHARDsoft will go far into the realms of computer science and potentially into electrical engineering. Everything here is for my personal hobby which I hope will attract other enthusiasts. At any point, if it seems like I'm totally out of my league -- I am. I'm sure there will be times I'll be completely wrong on some things. At these times I hope others will help me out. But I don't want my inadequate starting qualifications to stop me from enjoying the experience or from learning as much as I can.<br /><br /><span style="font-weight: bold;">I highly recommend that anyone unfamiliar in matters of low-level hardware start somewhere other than here.</span> I recommend Charles Petzold's <a href="http://www.amazon.com/dp/0735611319?tag=mcra-20">Code: The Hidden Language of Computer Hardware and Software</a> but a brief trip through <a href="http://en.wikipedia.org/">Wikipedia</a> or HowThingsWork [<a href="http://computer.howstuffworks.com/computer-hardware-channel.htm">1</a>] [<a href="http://electronics.howstuffworks.com/solid-state-electronics-channel.htm">2</a>] would also be a good first step.<br /><br />* Regarding the image at the top of this post: it's a combination of an ouroboros (a snake eating its tail) and the circuitry diagramming symbol for a transistor. The recursive idea of a snake eating its own tail seemed appropriate for this "software inside hardware inside software" theme.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1132049988667387317-6036265233082655203?l=softhardsoft.com'/></div>Roberthttp://www.blogger.com/profile/02559342055958256950noreply@blogger.com0