<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:neftaly</id>
  <title>Neftaly Hernandez&#13;
</title>
  <subtitle>Get the hell off my lawn!</subtitle>
  <author>
    <name>Neftaly Hernandez</name>
  </author>
  <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom"/>
  <updated>2009-11-16T22:11:12Z</updated>
  <lj:journal userid="7361377" username="neftaly" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://neftaly.livejournal.com/data/atom" title="Neftaly Hernandez&#13;&#10;"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:24445</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/24445.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=24445"/>
    <title>Donnybrook Netcode</title>
    <published>2009-10-20T05:00:35Z</published>
    <updated>2009-11-16T22:11:12Z</updated>
    <content type="html">Microsoft's "Donnybrook" project is a set of ideas &amp; techniques designed primarily to allow large-scale multi-player action in first-person shooter games. &lt;br /&gt;Original document: &lt;a href="http://research.microsoft.com/pubs/72879/donnybrook.pdf"&gt;http://research.microsoft.com/pubs/72879/donnybrook.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;The following is my interpretation and notes on Donnybrook, in regards to a realistic military first-person shooter. &lt;b&gt;This is more for personal reference and development, though I can clarify anything if required. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Netcode optimisation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Concepts I would consider useful for servers with a large number of players, and my interpretation of related terms are as follows:&lt;br /&gt;* Doppelgangers – AI agents designed to simulate and compensate for the actions of uninteresting real-life users, as seen by the current player, with varying accuracy. Lesser priority players are updated at a slower rate.&lt;br /&gt;* Single-entity groups &amp; fixed entities – A 3-person tank uses far less bandwidth than 3 individual soldiers. Mounted AA/HMG’s requires no positional data and need only be updated for cosmetic reasons (to show roughly where they’re pointing). &lt;br /&gt;* Area of Interest refers to the area directly in front of a player, in which up-to-date player, object &amp; projectile data is considered of high importance. In the case of destructible objects and rockets/shells, the boundaries of this area are larger and extend behind the player (for concussion effects, sound rendering, etc). &lt;br /&gt;* Network Occlusion – rules for de-prioritizing (or even hiding) players within the area of interest. &lt;br /&gt;&lt;br /&gt;Dynamic “Doppelganger Resolution” may be useful over extended view distances with projectiles fired from weapons that are not pixel-on-pixel accurate. The resolution value expresses the time between updates for an individual doppelganger, and should range from perhaps 5 seconds (lowest resolution) to 200ms (highest doppelganger resolution). Beyond this point enemies should be considered real-time. Preferably accuracy calculation would be done on the server, as this would have the added benefit of reducing the accuracy of certain hacks (aimbot cheats don't know exactly where the enemy is at extended distances). &lt;br /&gt;&lt;br /&gt;The total accuracy of the current player based on their stance (prone, crouched, standing; unsighted, ironsights sighted, scope sighted; effective range of weapon, status modifiers, relative movement) should be measured. The resolution of doppelgangers on-screen can be reduced depending on weapon accuracy – beyond a certain range, the inherent properties of a gun make aiming pointless (where luck is more of a factor than player skill or accuracy). What's the point of drawing a real-time enemy 500m away for a player shooting them with his pistol?&lt;br /&gt;&lt;br /&gt;When the player is not armed with a standard weapon (sprinting, using binoculars, driving or flying a vehicle, indirect fire) the resolution of all doppelgangers on-screen should be reduced significantly, as pixel-perfect enemy positions are of little concern (with the possible exception of someone spotting for a sniper). Resolution should also be low for concealed enemies. &lt;br /&gt;Enemies covered by terrain or solid objects are invisible network-wise (will also prevent wall hacks). Objects that obscure an enemy player, such as foliage, can be considered solid objects by the netcode when seen by a far-away player, thus hiding the enemy.&lt;br /&gt;&lt;br /&gt;Friendly units should have a much lower update resolution, as their exact position is of little concern with the exception of close quarters (to avoid accidentally shooting them in the back or running them over). &lt;br /&gt;&lt;br /&gt;It may be preferable to incentivise players into spacing themselves properly, as wider-spaced infantry are both more realistic and easier for the netcode to handle. Suppression and indirect fire (rifle grenades, artillery etc) should be emphasized, with HUD effects (blurred screen, muted sound) and possibly fear/shock effects (harder to move, shivering, etc - player acts scared). Perhaps the compass could also show a rough distance and direction of nearby team members to encourage spacing and movement in formation? I can imagine coloured dots on the compass corresponding to squad mates (red for close, green for far). &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Friendly Maps&lt;/b&gt;&lt;br /&gt;The map layout itself can have a lot to do with network performance. From a technical standpoint, it would be preferable for players to engage in CQB from within a artificially small area of interest – created by use of walls and corridors, or depressions in the terrain. CQB on the top of hill, with an enemy army being rendered in the background, would not be ideal. The use of “CQB arenas”, or even just rugged maps with a broken line-of-sight, would result in better performance for users with slow connections, without any reduction in the overall number of players on a map. &lt;br /&gt;&lt;img src="http://imgur.com/iaC3u.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="-2"&gt;&lt;b&gt;Statistical Analysis&lt;/b&gt;&lt;br /&gt;Statistical analysis of gameplay may be worthwhile, to check the feasibility of these ideas. It would be interesting to see the average and maximum number of players that users could expect to encounter at a single time. Are people more likely to encounter a group of players at once, or individual members of a squad? If they do encounter a full squad, are they actually likely to kill any, or are they always doomed to die before scoring a kill? What is the average engagement range of different scoped, iron sighted and unsighted weapons? How does a sniper or SAW gunner engage enemies and move about the map when compared to someone with ironsights or a shotgun?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Forwarding Pool&lt;/b&gt; - Not really necessary&lt;br /&gt;The Donnybrook “forwarding pool” appears to be of minor importance. It would result in a reduction of upstream output on the server, and less overall data throughput required for players behind a LAN (half the paper covers what could essentially summarized as “make one LAN player a trusted host/proxy, the rest of the LAN players connect through him”, ala standard P2P gaming). The WAN-to-LAN scenario is specialized and wouldn't cover the majority of players.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unity3D Implementation&lt;/b&gt;&lt;br /&gt;Client-to-server update rate is specified by client and varies depending on the number of nearby users/enemies being targeted. When an enemy aims at client, the enemy sends a request to the server for better update resolution, who then fowards the request to the client. This is very simple to implement (indeed the only trouble I'm having with Unity is getting PhysX to accurately detect projectile colisions).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FPS Control &amp; Movement&lt;/b&gt;&lt;br /&gt;Right Click: Ironsights&lt;br /&gt;Right Click + Hold (2 sec): Scope&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:24309</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/24309.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=24309"/>
    <title>Simple templates</title>
    <published>2008-04-23T00:37:28Z</published>
    <updated>2008-04-30T22:54:26Z</updated>
    <content type="html">Extremely simple yet highly effective PHP templating engine.&lt;br /&gt;&lt;pre&gt;&lt;b&gt;include.php:&lt;/b&gt;
&amp;lt;?
function content($buffer) {
	/* Auto-templating function */ 
	if (@TEMPLATE === false) {
		return $buffer; 
	} else { 
		include "template.php";	
		return $template; 
	}
}
ob_start("content");
?&amp;gt;

&lt;b&gt;template.php:&lt;/b&gt;
&amp;lt;?php $template = &amp;lt;&amp;lt;&amp;lt;TEMPLATE
&amp;lt;html&amp;gt;

&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;title&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
{$buffer}
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
TEMPLATE;
?&amp;gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:23969</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/23969.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=23969"/>
    <title>UPC Barcodes</title>
    <published>2008-03-14T07:55:20Z</published>
    <updated>2009-06-01T21:53:08Z</updated>
    <content type="html">&lt;b&gt;Please note that my main site will be down for a while, and thus none of these examples will work.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;UPC barcodes are pretty easy to do in Javascript. This particular script takes a product name and 10 digit UPC barcode, adds a prefix, calculates the checksum and draws it. &lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid black; margin: auto; background-color: white; width: 320px; text-align: center; padding: 5px; "&gt;&lt;a href="http://neftaly.com/Misc/UPC/barcode.html"&gt;&lt;img src="http://neftaly.com/Misc/UPC/example.png" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;UPC.draw("Product Name", "1234567890");&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Download &lt;a href="http://neftaly.com/Misc/UPC/UPC.zip"&gt;&lt;u&gt;UPC.zip here&lt;/u&gt;&lt;/a&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:23698</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/23698.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=23698"/>
    <title>Experiements with &amp;lt;canvas&amp;gt;</title>
    <published>2007-10-29T21:30:24Z</published>
    <updated>2008-05-13T06:22:19Z</updated>
    <content type="html">This is a little something I put together as a test of the &amp;lt;canvas&amp;gt; element. It is derived from the aussie game "Puzzle Quest" and requires either FF or Opera. I'll take it down in a few days. &lt;br /&gt;&lt;s&gt;&lt;u&gt;HappyQuest&lt;/u&gt;&lt;/s&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;hr&gt;&lt;b&gt;map.xml:&lt;/b&gt;&lt;pre&gt;
&amp;lt;map&amp;gt;
&amp;lt;waypoint X="750" Y="410" type="castle-a" img="09" info="A castle. \nEtc. "&amp;gt;Castle Black&amp;lt;/waypoint&amp;gt;
&amp;lt;waypoint X="810" Y="035" type="village"  img="07" info="The northenmost village. "&amp;gt;Northpoint&amp;lt;/waypoint&amp;gt;
&amp;lt;waypoint X="800" Y="310" type="fort-a"   img="10" info="A mountaintop fort. "&amp;lt;Fort&amp;lt;/waypoint&amp;gt;
&amp;lt;waypoint X="380" Y="640" type="fort-b"   img="24" info="Some old ruins. "&amp;lt;Ruins&amp;lt;/waypoint&amp;gt;
&amp;lt;waypoint X="300" Y="450" type="town-a"   img="01" info="An inn located in the snow. "&amp;gt;Snowy Inn&amp;lt;/waypoint&amp;gt;
&amp;lt;/map&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;b&gt;paths.xml:&lt;/b&gt;&lt;pre&gt;
&amp;lt;paths&amp;gt;
&amp;lt;road start="Northpoint" end="Fort" /&amp;gt;
&amp;lt;road start="Snowy Inn" end="Castle Black" /&amp;gt;
&amp;lt;road start="Snowy Inn" end="Ruins" /&amp;gt;
&amp;lt;road start="Castle Black" end="Fort" /&amp;gt;
&amp;lt;road start="Castle Black" end="Ruins" /&amp;gt;
&amp;lt;/paths&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;b&gt;sprites.xml:&lt;/b&gt; (all loaded from a single "Sprite Sheet" image)&lt;pre&gt;
&lt;sprites&gt;
&amp;lt;!-- Buildings --&amp;gt;
&amp;lt;sprite width="072" height="065" X="010" Y="24"&amp;gt;castle-a&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="072" height="065" X="110" Y="24"&amp;gt;castle-b&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="061" height="054" X="214" Y="11"&amp;gt;fort-a&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="061" height="054" X="314" Y="11"&amp;gt;fort-b&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="046" height="045" X="424" Y="23"&amp;gt;town-a&amp;lt;/sprite&amp;gt;  
&amp;lt;sprite width="046" height="045" X="524" Y="23"&amp;gt;town-b&amp;lt;/sprite&amp;gt; 
&amp;lt;!-- End buildings --&amp;gt;

&amp;lt;!-- Outposts --&amp;gt;
&amp;lt;sprite width="32" height="32" X="0"  Y="100"&amp;gt;raise&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="32" height="32" X="32" Y="100"&amp;gt;village&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="32" height="32" X="64" Y="100"&amp;gt;turret&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite width="32" height="32" X="96" Y="100"&amp;gt;torch&amp;lt;/sprite&amp;gt; 
&amp;lt;!-- End outposts --&amp;gt;

&amp;lt;!-- Flags --&amp;gt;
&amp;lt;sprite type="flag" width="32" height="32" X="128" Y="100"&amp;gt;flag&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite type="flag" width="32" height="32" X="160" Y="100"&amp;gt;w&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite type="flag" width="32" height="32" X="192" Y="100"&amp;gt;r&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite type="flag" width="32" height="32" X="224" Y="100"&amp;gt;g&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite type="flag" width="32" height="32" X="256" Y="100"&amp;gt;b&amp;lt;/sprite&amp;gt; 
&amp;lt;sprite type="flag" width="32" height="32" X="288" Y="100"&amp;gt;y&amp;lt;/sprite&amp;gt; 
&amp;lt;!-- End Flags--&amp;gt;
&amp;lt;/sprites&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;hr&gt;&lt;b&gt;sprites.png:&lt;/b&gt;&lt;br /&gt;&lt;img src="http://neftaly.com/Misc/map/assets/sprites.png"&gt;&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:23541</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/23541.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=23541"/>
    <title>Guitar effects unit</title>
    <published>2007-02-05T08:31:36Z</published>
    <updated>2007-09-25T03:08:56Z</updated>
    <content type="html">This is a couple of circuits in one - a distortion pedal, a wah-wah, an amplifier and a pre-amp (similar to my last post). It's all powered by a couple of sealed lead-acid batteries. I'll install some speakers and an AC power supply on wednesday, and will finish an external wah-wah pedal shortly after. &lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://pics.livejournal.com/neftaly/pic/0000t09x"&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/0000t09x" border="1" width="300"&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/neftaly/pic/0000wezx"&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/0000wezx" border="1" height="150"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;I'm trying to get my hands on a few Bakelite knobs and some antique-looking speaker fabric, so that I can get it to look like a 40's era radio.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:23138</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/23138.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=23138"/>
    <title>Pre-amplifier</title>
    <published>2007-01-27T07:38:06Z</published>
    <updated>2007-09-25T03:08:52Z</updated>
    <content type="html">Here's a pre-amp I recently built - I'm particularly happy about how the case came out. &lt;br /&gt;&lt;center style="margin-top: 4px; "&gt;&lt;img border="1" src="http://pics.livejournal.com/neftaly/pic/0000rd94"&gt; &lt;img border="1" src="http://pics.livejournal.com/neftaly/pic/0000q2w9"&gt;&lt;/center&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:22449</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/22449.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=22449"/>
    <title>Worldbender Editor - what do you think?</title>
    <published>2006-09-16T11:14:37Z</published>
    <updated>2008-02-01T09:50:24Z</updated>
    <content type="html">The &lt;a href="http://neftaly.com/Misc/Worldbender/"&gt;&lt;u&gt;Worldbender Editor&lt;/u&gt;&lt;/a&gt; is an isometric level-editing system written in JavaScript. It's fairly complete, but I really would like some input on the good and the bad. Please, try it out, tell me what you think!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:21405</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/21405.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=21405"/>
    <title>Neftaly's magical IE PNG renderer</title>
    <published>2006-09-03T23:33:35Z</published>
    <updated>2007-09-25T03:08:05Z</updated>
    <content type="html">Existing PNG Alpha rendering hacks for IE were overly crappy, so I made this. &lt;br&gt;&lt;br&gt;
&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;pre&gt;&amp;lt;script language="JavaScript"&amp;gt;
  function PNG(obj) { /* Render PNG's in IE 5.5 &amp; 6. By Neftaly Hernandez (http://neftaly.com/). */
  version = parseFloat(navigator.appVersion.split("MSIE")[1]);
    if ((version &amp;gt;= 5.5) &amp;&amp; (version &amp;lt; 7) &amp;&amp; (document.body.filters)) {
      if (obj.src.indexOf(".png") &amp;gt;= 0) {
      obj.style.filter= "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+obj.src+"',sizingMethod='scale');";
      height = obj.offsetHeight;
      width = obj.offsetWidth; 
      obj.src = "http://neftaly.com/Misc/IEvsPNG/1px.gif"; /* A 1x1 Transparent GIF */
      obj.style.height = height+"px";
      obj.style.width = width+"px";
      }
    }
  }
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;i&gt;&amp;lt;img src="img.png" &lt;b&gt;onLoad="PNG(this)"&lt;/b&gt;&amp;gt;&lt;/i&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:21196</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/21196.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=21196"/>
    <title>Neftaly's shiny bars</title>
    <published>2006-09-03T02:47:11Z</published>
    <updated>2007-09-25T03:08:10Z</updated>
    <content type="html">With a little DHTML, slick-looking progress bars are extremely easy to implement. &lt;br /&gt;&lt;img src="http://neftaly.com/Misc/shinyBar/example.png" border="0"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://neftaly.com/Misc/shinyBar/shinyBar.html"&gt;&lt;u&gt;Visit my examples page&lt;/u&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:20517</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/20517.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=20517"/>
    <title>Neftaly's unreliable window-in-page script</title>
    <published>2006-08-15T22:05:50Z</published>
    <updated>2008-02-01T09:51:40Z</updated>
    <content type="html">Neftaly's unreliable window-in-page script - simple dragable DHTML windows &lt;a href="http://neftaly.com/Misc/neftalyWindow/"&gt;&lt;u&gt;(quick example)&lt;/u&gt;&lt;/a&gt;. &lt;br&gt;&lt;b&gt;NB: This is old code. A cleaner, better-looking version is available on request. &lt;/b&gt;&lt;br&gt;&lt;br&gt;
&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;hr&gt;&lt;b&gt;neftalyWindow.html:&lt;/b&gt;&lt;pre&gt;&amp;lt;html style="-moz-user-select: none; -khtml-user-select: none; user-select: none; "&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body onSelectStart="return false; " onDrag="return false; "&amp;gt;

&amp;lt;div id='windowDiv'&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script src="neftalyWindow.js" language="JavaScript"&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script language="JavaScript"&amp;gt;
document.settingsFrame = drawWindow('settingsFrame', 40, 60, 100, 200, 'Lollerskates', 'Hello there! You can do images or whatever else here...'); 
//document.getElementById(document.settingsFrame+"_content").innerHTML= 'My skates are lolling ;_; ';
//windowHide(document.settingsFrame);
windowShow(document.settingsFrame);
&amp;lt;/script&amp;gt;

&amp;lt;button onClick="windowShow(document.settingsFrame);"&amp;gt;Show Window&amp;lt;/button&amp;gt;
&amp;lt;button onClick="windowHide(document.settingsFrame);"&amp;gt;Hide Window&amp;lt;/button&amp;gt;
&amp;lt;button onClick="document.getElementById(document.settingsFrame+'_content').innerHTML= 'My skates are lolling ;_; ';"&amp;gt;Change Text&amp;lt;/button&amp;gt;

&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;hr&gt;&lt;b&gt;neftalyWindow.js:&lt;/b&gt;&lt;pre&gt;/* ***** Neftaly's unreliable window-in-page script - http://neftaly.com/ ***** */
	function drawWindow (id, top, left, height, width, title, content) { 
	wDiv = document.getElementById("windowDiv");
	wDiv.innerHTML = wDiv.innerHTML + '&amp;lt;div onMouseDown="raiseWindow(this);" style="visibility: hidden; z-index: 10004; width: '+width+'px; height: '+height+'px; top: '+top+'px; left: '+left+'px; position: absolute; " id="'+id+'_window"&amp;gt;&amp;lt;table cellpadding=0 cellspacing=0 border=0 bgcolor="#f0f0f0" style="width: 100%; height: 100%; border: 1px solid black; "&amp;gt;&amp;lt;tr style="height: 20px; "&amp;gt;&amp;lt;td&amp;gt;'
		+ '&amp;lt;table cellpadding=0 cellspacing=0 border=0 bgcolor="#0000CC" style="width: 100%; height: 100%; border-bottom: 1px solid black; " id="'+id+'_window_drag" onMouseDown="mouseDown(event, this); return false; "&amp;gt;&amp;lt;tr&amp;gt;'
		+ '&amp;lt;td&amp;gt;&amp;lt;div style="margin-left: 4px; cursor: move; color: #ffffff; font-weight: bold; width: 100%; height: 100%; " id="'+id+'_window_title"&amp;gt;'+title+'&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;'
		+ '&amp;lt;td style="width: 20px; background-color: #707070; cursor: pointer; cursor: hand; font-weight: bold; border-left: 1px solid black; " align=center onClick="windowHide(\''+id+'_window\'); "&amp;gt;X&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'
		+ '&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div style="width: 100%; height: 100%; " id="'+id+'_window_content"&amp;gt;'+content+'&amp;lt;/div&amp;gt;'
		+ '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/div&amp;gt;';
	//registerDrag(id+'_window_drag', "windowDrag", null);
	setTimeout("document.windowIDarray[document.windowIDarray.length] = document.getElementById('"+id+"_window'); ", 100); // It needs time to render
	return id+'_window';
	}
	
	function raiseWindow(obj) {
	/*normalZIndex = 10004; // The default z-index of the windows. 
		if (obj.style.zIndex != (normalZIndex + 1)) {
			for (i=0; i &amp;lt; document.windowIDarray.length; i++) {
			document.windowIDarray[i].style.zIndex=normalZIndex;
			}
		obj.style.zIndex=(normalZIndex + 1); 
		}*/
	document.getElementById("windowDiv").appendChild(obj);
	}

	function mouseDown(e, dragObj){ // Handle onMouseDown on draggable
		if (drag == false) {
			if (dragObj.id.indexOf("window_drag") &amp;gt; -1){
				if ((navigator.userAgent.toLowerCase().indexOf("opera") &amp;gt; -1) || (navigator.userAgent.toLowerCase().indexOf("msie") &amp;gt; -1)) {
				document.windowOffsetX = e.offsetX;
				document.windowOffsetY = e.offsetY;
				} else {
				document.windowOffsetX = e.layerX;
				document.windowOffsetY = e.layerY;
				}
			dragObject = dragObj;
			document.mouseStatus = 1; 
			document.releaseMouse = false;	
			document.dragPlayer = false; 
			dragBoxDrag = false; 
			windowDrag = true; 
			} 
		drag = true;
		}
	}

	function windowHide(id) { 
		/*if (id == document.paperDollFrame) {
		document.getElementById("tab_1").style.backgroundColor="#a0a0a0"; 
		} else if (id == document.inventoryFrame) {
		document.getElementById("tab_2").style.backgroundColor="#a0a0a0";
		} else if (id == document.chatFrame) {
		document.getElementById("tab_3").style.backgroundColor="#a0a0a0";
		} else if (id == document.settingsFrame) {
		document.getElementById("tab_4").style.backgroundColor="#a0a0a0";
		} */
	document.getElementById(id).style.visibility='hidden'; 
	}
	
	function windowShow(id) { 
		/*if (id == document.paperDollFrame) {
		document.getElementById("tab_1").style.backgroundColor="#f0f0f0"; 
		} else if (id == document.inventoryFrame) {
		document.getElementById("tab_2").style.backgroundColor="#f0f0f0";
		} else if (id == document.chatFrame) {
		document.getElementById("tab_3").style.backgroundColor="#f0f0f0";
		} else if (id == document.settingsFrame) {
		document.getElementById("tab_4").style.backgroundColor="#f0f0f0";
		} */
	document.getElementById(id).style.visibility='visible'; 
	}

// Non-specific functions &amp; code 
document.windowIDarray = new Array(); 
var windowDrag = false;
var drag = false;

	document.onmouseup = function(e){ // Handle onMouseUp on document
	windowDrag = false; 
	dragBoxDrag = false; 
	drag = false; 
	}

	document.onmousemove = function(e) { // Handle onMouseMove on document
		if (document.all?true:false) { // IE
		MouseX = event.clientX + document.body.scrollLeft;
		MouseY = event.clientY + document.body.scrollTop;
		} else {	// Mozilla
		MouseX = e.pageX;
		MouseY = e.pageY;
		} 
		if (MouseX &amp;lt; 0){
		MouseX = 0;
		}
		if (MouseY &amp;lt; 0){
		MouseY = 0;
		}	
		if (drag &amp;&amp; windowDrag) { // Dragging window
		dragObject = document.getElementById(dragObject.id.replace(/_drag/, "")); 
		dragObject.style.left = MouseX - document.windowOffsetX + 1;
		dragObject.style.top = MouseY - document.windowOffsetY + 1; 
		}
	return false;
	}&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:20106</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/20106.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=20106"/>
    <title>Cool login form + effect</title>
    <published>2006-08-13T08:32:00Z</published>
    <updated>2007-09-25T02:58:29Z</updated>
    <content type="html">I really like the look of &lt;a href="http://neftaly.com/Misc/login/"&gt;&lt;u&gt;this&lt;/u&gt;&lt;/a&gt; (mouseOver and mouseOut). Now all I need is something to use it with.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:19611</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/19611.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=19611"/>
    <title>Simple anti-XSS/SQL injection in PHP</title>
    <published>2006-08-09T05:57:09Z</published>
    <updated>2008-04-30T23:00:19Z</updated>
    <content type="html">Here's some more code. A nice, quick and effective way of automatically blocking nearly all XSS/SQL injection in PHP (excluding unquoted SQL query strings, which you shouldn't be doing in the first place). It isn't really suitable for all situations, but certainly makes a nice stopgap. &lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;pre&gt;  function noXSS($str) { 
  $from = array ("'", "\"", "&amp;lt;"); 
  $to = array ("&amp;amp;#39;", "&amp;amp;#34;", "&amp;amp;lt;"); 
  $str = str_replace($from, $to, $str);
  return $str;
  }

  foreach ($_GET as &amp;$rVal) {
  $rVal = noXSS($rVal); }
  foreach ($_POST as &amp;$rVal) {
  $rVal = noXSS($rVal); }
  foreach ($_COOKIE as &amp;$rVal) {
  $rVal = noXSS($rVal); }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Thats it. No excuses!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:19104</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/19104.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=19104"/>
    <title>Neftaly's reliable drag &amp; drop elements</title>
    <published>2006-08-01T00:13:13Z</published>
    <updated>2007-09-25T02:58:16Z</updated>
    <content type="html">Just some simple JavaScript I made for myself, but might as well share around. I was hunting for a decent Drag-and-Drop HTML elements scripts that let me have custom drop zone classes (i.e. round pegs and square holes). I found nothing suitable - while extremely functional, Scriptaculous and Rico are both the size of a small moon. My script is way easier to use, and only 3.5KB &lt;a href="http://neftaly.com/Misc/neftalyDrop/"&gt;&lt;u&gt;(quick example)&lt;/u&gt;&lt;/a&gt;. &lt;br&gt;&lt;br&gt;

&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;hr&gt;&lt;b&gt;neftalyDrop.html&lt;/b&gt;&lt;pre&gt;&amp;lt;html style="-moz-user-select: none; -khtml-user-select: none; user-select: none; "&amp;gt;
&amp;lt;head&amp;gt;

&amp;lt;style&amp;gt;
  .boxx {
  border: 1px solid; 
  height: 56px; 
  width: 56px; 
  }
&amp;lt;/style&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body onSelectStart="return false; " onDrag="return false; "&amp;gt;

&amp;lt;script src="neftalyDrop.js" language="JavaScript"&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div id="inv1" class="boxx"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id="inv2" class="boxx"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id="inv3" class="boxx"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id="inv4" class="boxx"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id="inv5" class="boxx"&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;img id="dragme1" src="http://developer.kde.org/documentation/standards/kde/tpl_icons/hc_icon_template1.gif"&amp;gt;
&amp;lt;img id="dragme2" src="http://developer.kde.org/documentation/standards/kde/tpl_icons/hc_icon_template3.gif"&amp;gt;

&amp;lt;script language="JavaScript"&amp;gt;
registerDrop("inv1", "*"); 
registerDrop("inv2", "*"); 
registerDrop("inv3", "*"); 
registerDrop("inv4", "paper"); 
registerDrop("inv5", "*"); 

registerDrag("dragme1", "gear", "inv1");  
registerDrag("dragme2", "paper", "inv2");  
&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
 
&lt;/pre&gt;&lt;hr&gt;&lt;b&gt;neftalyDrop.js:&lt;/b&gt;&lt;pre&gt;/* ***** Neftaly's reliable drag &amp; drop elements - http://neftaly.com/ ***** */

  function registerDrop(Did, Type) { // Setup drop zone, eg: registerDrop([DIV ID], [Drop Zone Class, or wildcard '*']); 
  dropObj = document.getElementById(Did); 
  dropArray[Did] = new Array(); 
  dropArray[Did][0] = dropObj; 
  dropArray[Did][1] = Type; 
  dropArray[Did][2] = null; 
    dropObj.onmouseup = function(e) { 
    mouseUp(this); 
    return false; 
    }
  }

  function registerDrag(Did, Type, Drop) { // Setup draggable object, eg: registerDrag([IMG ID], [Drop Zone Class], [ID of initial Drop Zone]);  
  dragObj = document.getElementById(Did);
  dragArray[Did] = new Array();
  dragArray[Did][0] = dragObj;
  dragArray[Did][1] = Type;
    dragObj.onmousedown = function(e) { 
    mouseDown(this); 
    return false; 
    }
  dropObj = document.getElementById(Drop);
  dropObj.appendChild(dragArray[Did][0]);
  dropArray[dropObj.id][2] = dragObj; 
  }
  
  function mouseDown(dragObj){ // Handle onMouseDown on draggable
    if (dragArray[dragObj.id][0] == dragObj) { 
    drag = true; 
    dragObject = dragArray[dragObj.id]; 
      for (i in dropArray) {
        if (dropArray[i][2] == null &amp;&amp; (dropArray[i][1] == dragObject[1] || dropArray[i][1] == "*")) {
        dropArray[i][0].style.backgroundColor = "#f0f0f0";
        }
      }
    }
  }
  
  function mouseUp(dropObj){ // Handle onMouseUp on drop zone
    if (drag) { 
    document.getElementById("dragIcon").style.visibility = "hidden";
    drag = false; 
      if (dropArray[dropObj.id][2] == null &amp;&amp; (dropArray[dropObj.id][1] == dragObject[1] || dropArray[dropObj.id][1] == "*")) {
      dropArray[dragObject[0].parentNode.id][2] = null; 
      dropObj.appendChild(dragObject[0]);
      dropArray[dropObj.id][2] = dragObject[0]; 
      }
      for (i in dropArray) {
      dropArray[i][0].style.backgroundColor = "";
      }
    }
  }


  if (!document.all?true:false) { // Initalise event capture for Mozilla
  document.captureEvents(Event.MOUSEMOVE)
  document.captureEvents(Event.MOUSEUP)
  // document.captureEvents(Event.MOUSEDOWN)
  }

  document.onmouseup = function(e){ // Handle onMouseUp on document
    if (drag) { 
    document.getElementById("dragIcon").style.visibility = "hidden";
    drag = false; 
      for (i in dropArray) {
      dropArray[i][0].style.backgroundColor = "";
      }
    }
  }

  document.onmousemove = function(e) { // Handle onMouseMove on document
    if (document.all?true:false) { // IE
    MouseX = event.clientX + document.body.scrollLeft;
    MouseY = event.clientY + document.body.scrollTop;
    } else {  // Mozilla
    MouseX = e.pageX;
    MouseY = e.pageY;
    } 
    if (MouseX &amp;lt; 0){
    MouseX = 0;
    }
    if (MouseY &amp;lt; 0){
    MouseY = 0;
    }  
    if (drag) {
    dragIconObj = document.getElementById("dragIcon");
    dragIconObj.style.left = MouseX + 5;
    dragIconObj.style.top = MouseY + 5;
      if (dragIconObj.style.visibility != "visible") {
      dragIconObj.style.visibility = "visible";
      }
      if (dragIconObj.src != dragObject[0].src) {
      dragIconObj.src = dragObject[0].src;
      }
    }
  return true;
  }

// Initalise arrays etc
var drag = false; 
var dragObject = new Object; 
var dragArray = new Array(); 
var dropArray = new Array(); 

// Draw the "drag cursor"
document.write('&amp;lt;img id="dragIcon" style="z-index: 999999; position: absolute; width: 32px; height: 32px; visibility: hidden; "&amp;gt;'); 
 
&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:17629</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/17629.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=17629"/>
    <title>Super awesome bumper 19th birth anniversary day edition</title>
    <published>2006-05-31T09:05:26Z</published>
    <updated>2007-09-25T02:54:22Z</updated>
    <content type="html">Greetings, people of the Internet. I have not graced you with my presence in a while, and for this I am truly sorry. The rumors you heard were correct: I am now, in fact, 19 years old.&lt;br&gt;&lt;br&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;I've finished working on my PlayStation Two (Slim). Now it has a DMS4 SE Pro mod-chip with ToxicOS, 40GB 2.5” IDE hard-drive and optional 250GB 3.5” USB hard-drive. Having no memory card kills all incentive to use it, however.&lt;br /&gt;&lt;div align="center"&gt;&lt;img border="1" src="http://pics.livejournal.com/neftaly/pic/0000ecbe" alt="" /&gt;&lt;br /&gt;&lt;/div&gt; </content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:16597</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/16597.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=16597"/>
    <title>Simple Object Access Protocol parody</title>
    <published>2006-03-02T08:44:02Z</published>
    <updated>2007-09-25T02:54:25Z</updated>
    <content type="html">A totally pointless concept I came up with:&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;b&gt;Internet connected soap&lt;/b&gt;&lt;br /&gt;A quick project that I wish to work on is "internet connected soap". Basically, embedding a webserver in a bar of soap-on-a-rope, such as the example pictured below. Both power and data outputs (SLIP connection) could be accessable through the rope.&lt;br /&gt;&lt;img src="http://www.3dmolds.com/images/tutorials/mp-soap-on-a-rope/wine-soap-on-a-rope-256.jpg" border="1"&gt;&lt;br /&gt;&lt;br /&gt;It is an idea sufficiently random (and 'arty'?) enough to pass on it's own, but it might actually lead somewhere. For example, an ultrasonic transducer could possibly be used to calculate the amount of soap left. I'm happy with just how nerdy the idea is as it stands, though. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Alright, I actually made it work with a spare PIC I had lying around - the novelty wore off after about 20 seconds :P&lt;br /&gt;&lt;img border="0" src="http://www.createblog.com/stats/log.php?id=10162" style="width: 0px; height: 0px; " width="0" height="0"&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:16186</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/16186.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=16186"/>
    <title>More past projects</title>
    <published>2006-02-23T21:31:40Z</published>
    <updated>2007-09-25T02:54:31Z</updated>
    <content type="html">What follows is absolute unadulterated self-indulgent crap... but it makes worthy posting material.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;These are a few newspaper articles from my SS project, between the years 2001 - 2002. It was basically something I entered in a science fair with, and ended up doing extremely well with at a national level. Some asshat with diabetes totally wasted me at coming first in NZ, though. &lt;br /&gt;Bastard. &lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/000090d0/s640x480" border="1"&gt;&lt;br&gt;NZ Herald back-page article&lt;/td&gt;
&lt;td&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/000085as/s640x480" border="1"&gt;&lt;br&gt;Northern Advocate front-page article&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/0000beyg/s640x480" border="1"&gt;&lt;br&gt;Whangarei Report front-page #1&lt;/td&gt;
&lt;td&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/0000crp6/s640x480" border="1"&gt;&lt;br&gt;Whangarei Report front-page #2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/0000ae9g/s640x480" border="1"&gt;&lt;br&gt;North Shore Times article&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;I made a design registration on each device, and ended up making a small profit. The experience I gained was certainly worthwile, even if I consider the project to have been somewhat embarrasing in regards to my personal technological standards. Mind you, I made these nearly 5 years ago. &lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:15948</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/15948.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=15948"/>
    <title>A humanitarian effort of herculean proportions</title>
    <published>2006-02-23T08:09:11Z</published>
    <updated>2007-09-25T02:54:38Z</updated>
    <content type="html">The AP was one of my "humanitarian" projects. For the good of the people, y'all!&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;Digging through some old stuff of mine, I came across some prototype AP (AutoPill, I think) equipment that I had built. I stopped working on it a year or two ago, simply because I ran out of time and money. I don't think i'll invest any more of either (because both are in such short supply), which means this is one idea I don't wish to register/patent/sell.&lt;br /&gt;&lt;br /&gt;Basically, a patient would be issued with an "electronic box" and several specalised pill bottles. Inside each pill bottle lid sat a minature transmitter, which activated itself and sent out a signal whenever the bottle was opened. The "box" received this signal, sent out both a visual and audio confirmation, then recorded the time that the bottle was opened. &lt;br /&gt;&lt;br /&gt;At the end of a set time (say, 12 hours) the box would connect to a PTSN line and send it's log to a hospital server. If, say, an elderly person forgot to take their pills, hospital staff would be able to contact them to check their status. If the said person had a heart attack/etc, and required an operation, the Anesthesian could ensure that any medication they may have had/not had would not interfere. &lt;br /&gt;&lt;br /&gt;The "box" could also be worked to remind patients exactly what pills needed to be taken (via LCD display, coloured LED's and specific tones). It, like everything else, was built around a PICAXE microcontroller. Not only are PICAXE's extremely easy to program (using a variant of BASIC), they are rather cheap. A PICAXE 08 retails for just over $5, while a BASIC Stamp costs many times this. I also experimented with PIC chips, which are a couple of dollars each. However, they used Assembly on the RISC instruction set - I only had limited success working them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AP Transmitter #1&lt;/b&gt;&lt;br /&gt;This is an early prototype (working). I quite liked the idea of having a reed switch on the inside of the lid and magnets on the bottle, as it meant that the transmitter could be sealed/sterile/re-usable.&lt;br /&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/00007af1" border="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AP Transmitter #2&lt;/b&gt;&lt;br /&gt;Later prototype (working). Shown with a microswitch, but could just as easily be using a reed. Unfortunatly I got all clumsy while installing reed's and managed to break about 5, as well as peppering my fingers with enough glass shards to draw blood. &lt;br /&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/00005ykk" border="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AP Receiver&lt;/b&gt;&lt;br /&gt;Very simplistic - gets the data from the transmitters, beeps &amp; flashes, and sends it off via RS232. If I was still working on this, I would install about 32k of memory, a DTMF encoder, some buttons and a LCD screen.&lt;br /&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/00006kp0" border="1"&gt;&lt;br /&gt;&lt;br /&gt;At the backend was a computer with a modem. A Perl script ran to collect data from callers, and then stuck it on a MySQL database. A PHP script was used to format all the data - showing patient histories, personal information and conditions as well as listing any patients that had missed pills.&lt;br /&gt;&lt;br /&gt;I have plenty more Schematics, Diagrams, CAD drawings, writeups, etc on a CD somewhere - it appears to gone walkies. If I find it i'll remember to post some more choice stuff.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:neftaly:15719</id>
    <link rel="alternate" type="text/html" href="http://neftaly.livejournal.com/15719.html"/>
    <link rel="self" type="text/xml" href="http://neftaly.livejournal.com/data/atom/?itemid=15719"/>
    <title>Underwater ROV updates</title>
    <published>2006-02-23T04:19:50Z</published>
    <updated>2007-09-25T02:54:43Z</updated>
    <content type="html">My submersible hasn't been forgotten (merely piled under loads of work).&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;I have decided to construct the majority of the ROV out of PVC piping. The main reason for this is that if I make any design errors, repair/rebuilding is extremely simple. When it's all working, I'll switch to Aluminium (and Stainless Steel, if I can get some instruction).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Camera/controller dome&lt;/b&gt;&lt;br /&gt;I have a very nice polycarbonate dome for the Camera and Microcontroller to rest in. It's going to be a mission to totally waterproof it, and light tends to bounce around the inside of the lens once it gets in (read: glare), but it is very sturdy. I hope that contact with salt water/pool chemicals don't spoil it too much. &lt;br /&gt;&lt;img src="http://www.jaycar.co.nz/products_uploaded/productLarge_8130.jpg" border="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Batteries in hull&lt;/b&gt;&lt;br /&gt;As it stands, the hull I am testing takes 6 of these (6v 3.5 aH sealed lead-acid batteries - mockup pictured below). I will have 3 cells in parallel, connected in series into another lot of 3 in parallel, giving 12v @ 10.5 aH - more than enough. I want to make the battery compartments swappable, or even stackable. Surplustronics (on Queen street) has an incredible deal on these batteries ($3/ea or 2 for $5).  &lt;br /&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/00003x2e" border="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sealed motor&lt;/b&gt;&lt;br /&gt;Below is a very poorly constructed diagram for a propulsion system I wish to impliment. I already have the resources to build it, so I will hold off on further explainations it until I can get it working.&lt;br /&gt;&lt;img src="http://pics.livejournal.com/neftaly/pic/00004c0p" border="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: &lt;/b&gt; The basic design is working out fine. However, I am having major problems with propulsion, that have effectively ground this project to a halt. Time to cut my losses and recover as many parts as possible.&lt;br /&gt;</content>
  </entry>
</feed>
