Permalink
Browse files

Merge branch 'dev'

Conflicts:
	lib/bundle.js
	lib/entry.js
	package.json
  • Loading branch information...
2 parents b7e05b5 + 373cd61 commit 05b69d69ec723da851766e6d6cd240979265e17a @bpostlethwaite committed Aug 8, 2012
Showing with 281 additions and 85 deletions.
  1. +4 −8 README.md
  2. +25 −15 docs/CV.md
  3. +4 −8 docs/README.md
  4. +72 −23 lib/entry.js
  5. +30 −0 npm-debug.log
  6. +1 −2 package.json
  7. +72 −23 public/bundle.js
  8. +23 −2 public/index.html
  9. +49 −3 public/style.css
  10. BIN public/wave.png
  11. +1 −1 server.js
View
12 README.md
@@ -1,15 +1,11 @@
# Droplets
A Javascript physics engine and real-time server-client setup project with node.js which evolved into my personal website.
-The backend computations handling the wave-field physics are written in javascript and solve the wave equation PDE using the finite-difference Euler Method. The transparent overlay animations are all CSS3. Websockets connect the server to clients and employs a broadcast facility to register droplets clicked by a single user to all clients simultaneously. The server also parses markdown files which hold the site content into html and streams this data to the client upon connection.
+The backend computations handling the wave-field physics are written in javascript and solve the wave equation PDE using the finite-difference Euler Method. The module that solves the physics is called [pde-engine](https://github.com/bpostlethwaite/pde-engine) and I have published this to [npm](https://npmjs.org/). The transparent overlay animations are all CSS3. Websockets connect the server to clients and employs a broadcast facility to register droplets clicked by a single user to all clients simultaneously. The server also parses markdown files which hold the site content into html and streams this data to the client upon connection.
_The website runs best on Chrome._
### Todo
-1. Turn javascript function wavefield into a node.js module and publish to NPM
-2. Test CSS3 animations with IE
-3. xlen and ylen resolution sizes should be dependent on overall screen size. Smaller screen sizes can computationally afford better resolutions.
-
-### Issues
-1. Strange Firefox bug: content does not fade in with delay on second access. I suspect the `opacity` property is not being reset to `0` when unselected.
-
+1. Test CSS3 animations with IE
+2. xlen and ylen resolution sizes should be dependent on overall screen size. Smaller screen sizes can computationally afford better resolutions.
+3. Finish coding and implementing the Poisson Equation (gravity and electrostatics)
View
40 docs/CV.md
@@ -3,31 +3,41 @@
* <http://www.benpostlethwaite.ca>
* 778-869-9361
-## Education
+### Education
-*Geophysics, M.S.*
-Fall 2006 - present
-University of British Columbia, Vancouver Canada.
+#### Geophysics, M.Sc.
-*First Aid Level I*
+ Fall 2010 - present
+ University of British Columbia, Vancouver Canada.
-*WHIMIS certifications*
+#### Geophysics, B.Sc.
-## Proficiency
-I have experience managing hard-rock and soft-rock geophysical datasets, handling information flow and visualization. I have performed inversions and written inversion code for gravity, DC and seismic data. I have strong mathematical ability especially linear algebra and numerical optimation. I can write code in Matlab, C, C++, Python and Javascript and have the base skills necessary to quickly pick up additional languages. I have written programs in all of these languages including desktop applications, server-side web programs and simulation and numerical solvers. I am a proficient Linux administrator and have run several servers including virtualized machines. I have spent a great amount of time outdoors and enjoy mountaineering and outdoor life. I consider this an asset for positions which involve extended periods working from camps.
+ Fall 2006 - Fall 2010
+ University of British Columbia, Vancouver Canada.
-## Experience
-### Aurora Geosciences
-#### Crew Chief - April 2011 to September 2011
-I was a crew chief with [Aurora Geoscience](http://www.aurorageosciences.com) running magnetic, VLF and ELF surveys as well as working with an HLEM crew.
+### Proficiency
+
+ * Managing large geophysical datasets, handling information flow and performing data mining and visualization.
+ * Inversions with third party code as well as my own inversion code for gravity, DC and seismic data.
+ * Strong mathematical ability especially in the linear algebra and numerical optimation domains.
+ * Proficiently coding in Matlab, C, Python and Javascript and have the base skills necessary to quickly pick up additional languages.
+ * Written programs spanning desktop applications, server-side web programs and simulation and numerical solvers.
+ * Proficient Linux administrator and have managed several servers and virtualized machines.
+ * Outdoor enthusiast specifically mountaineering and kayaking. I consider this an asset for positions which involve extended periods working from camps.
+
+### Experience
+
+#### Aurora Geosciences - April 2011 to September 2012 - Summer work
+
+Junior Geophysicist and Crew Chief with [Aurora Geoscience](http://www.aurorageosciences.com) running magnetic, VLF and ELF surveys as well as working with an HLEM crew.
* Managed crew and equipment to complete survey goals safely and on time.
* Tested prototype ELF geophysical equipment and established a method for visualizing and working with output data.
* Identified areas that would be amenible to automation and wrote Perl and Python programs/scripts to speed up and reduce error in geophysical processing and survey design.
-### Active Turf Irrigation
-#### Installation and Maintenance Serviceman - March 2008 to September 2010
-I was an installer and serviceman with [Active Turf Irrigation](http://activeturfirrigation.com) working on larger industrial projects or handling maintainance contracts with a service van.
+#### Active Turf Irrigation - March 2008 to September 2010
+
+I was an installation and maintenance serviceman with [Active Turf Irrigation](http://activeturfirrigation.com) working on larger industrial projects or handling maintainance contracts with a service van.
* Worked with larger crews in fast paced environment.
* Worked with, and managed expectations of, customers in planning and job roll out.
View
12 docs/README.md
@@ -1,15 +1,11 @@
# Droplets
A Javascript physics engine and real-time server-client setup project with node.js which evolved into my personal website.
-The backend computations handling the wave-field physics are written in javascript and solve the wave equation PDE using the finite-difference Euler Method. The transparent overlay animations are all CSS3. Websockets connect the server to clients and employs a broadcast facility to register droplets clicked by a single user to all clients simultaneously. The server also parses markdown files which hold the site content into html and streams this data to the client upon connection.
+The backend computations handling the wave-field physics are written in javascript and solve the wave equation PDE using the finite-difference Euler Method. The module that solves the physics is called [pde-engine](https://github.com/bpostlethwaite/pde-engine) and I have published this to [npm](https://npmjs.org/). The transparent overlay animations are all CSS3. Websockets connect the server to clients and employs a broadcast facility to register droplets clicked by a single user to all clients simultaneously. The server also parses markdown files which hold the site content into html and streams this data to the client upon connection.
_The website runs best on Chrome._
### Todo
-1. Turn javascript function wavefield into a node.js module and publish to NPM
-2. Test CSS3 animations with IE
-3. xlen and ylen resolution sizes should be dependent on overall screen size. Smaller screen sizes can computationally afford better resolutions.
-
-### Issues
-1. Strange Firefox bug: content does not fade in with delay on second access. I suspect the `opacity` property is not being reset to `0` when unselected.
-
+1. Test CSS3 animations with IE
+2. xlen and ylen resolution sizes should be dependent on overall screen size. Smaller screen sizes can computationally afford better resolutions.
+3. Finish coding and implementing the Poisson Equation (gravity and electrostatics)
View
95 lib/entry.js
@@ -12,7 +12,7 @@ $(document).ready(function() {
//var socket = io.connect("http://droplets.benjp.c9.io")
var socket = io.connect("wss://droplets.jit.su")
//var socket = io.connect("http://192.168.1.113:8081")
- , field
+ , field = engine()
, canvas = document.getElementById('canvas')
, c = canvas.getContext('2d')
, xlen = 12
@@ -21,6 +21,7 @@ $(document).ready(function() {
, cols
, xpix
, ypix
+ , intID = []
// This turns on and off button selected class for animations
$(".category").click(function() {
@@ -35,43 +36,89 @@ $(document).ready(function() {
}
}) // end click
+// This turns on and off button selected class for mode info text
+ $(".mode").click(function() {
+ var mode = null
+ //turn of all previously selected
+ $('.selectedII').not(this).removeClass('selectedII')
+ // Toggle this buttons class.
+ $(this).toggleClass('selectedII')
+ // If it wasn't previously selected then continue and engage.
+ if ( $(this).hasClass('selectedII') ) {
+ // get mode ID
+ mode = $(this).attr('id')
+ //find matching classes associated w/ ID
+ $("." + mode).addClass('selectedII')
+ }
+ // Start up appropriate physics mode
+ switch(mode) {
+ case "mode1":
+ waveEqnMode();
+ break;
+ case "mode2":
+ diffusionEqnMode();
+ break;
+ case "mode3":
+ noMode();
+ break;
+ default:
+ noMode();
+ } // end switch
+ }) // end mode click
+
+
+
// CONTENT SOCKETS /////////////////////////////////////////////////
socket.on('readme', function(data) {
$('.content.tog3').html(data)
})
+ socket.on('cv', function(data) {
+ $('.content.tog4').html(data)
+ })
// MODE FUNCTIONS ///////////////////////////////////////////////////
// Function called on window resize which resets both canvas dims
// as well as calling physics engine resize method.
// Also acts as a general clearing house.
- function reset() {
+ function resetScreen() {
$(window).resize(function(e) {
rows = Math.floor(window.innerHeight / xlen)
cols = Math.floor(window.innerWidth / ylen)
field.setResolution(rows, cols)
canvas.width = window.innerWidth
canvas.height = window.innerHeight
- field.s = buildSprites(10)
+ //field.s = buildSprites(10)
})
$(window).trigger('resize')
}
+ // Function to clear previous bindings and interval
+ // timers from previously selected modes
+ function clearMode() {
+ var i
+ $(canvas).unbind("mousemove")
+ $(canvas).unbind("click")
+ for (i = 0; i < intID.length; i++) {
+ clearInterval(intID[i])
+ }
+ }
+
function waveEqnMode() {
+ clearMode()
field = engine( {
dt: 0.1
, gamma: 0.02
, eqn: "wave"
})
- reset() // Call reset which inits field to window size
+ resetScreen() // Call reset which inits field to window size
var colorgrada = buildColorGrad("#000092", 41, -1).reverse()
, colorgradb = buildColorGrad("#000092", 41, 1)
colorgradb.shift()
-
field.mag = 15
+
// Bind Click //////////////////////////////////////////
- $(canvas).unbind() // get rid of previous bindings
- canvas.addEventListener("click",function(evt) {
+ $(canvas).bind("click", function(evt) {
var xp = evt.pageX
, yp = evt.pageY
socket.emit('clientDroplet',{
@@ -86,30 +133,27 @@ $(document).ready(function() {
field.adj = 40
field.cg = colorgrada.concat(colorgradb)
// Start Animation
- setInterval(renderField, 30)
+ intID[0] = setInterval(renderField, 30)
} // END WAVEEQNMODE
function diffusionEqnMode() {
+ clearMode()
field = engine( {
dt: 0.1
- , gamma: 0.02
, eqn: "diffusion"
- , alpha: 1
+ , alpha: 0.5
})
- reset() // Call reset which inits field to window size
+ resetScreen() // Call reset which inits field to window size
field.mag = 30
- xpix = 0.5*Math.round(window.innerWidth)
- ypix= 0.5*Math.round(window.innerHeight)
// Click Binding //////////////////////////////////////////
- $(canvas).unbind()
- $(canvas).mousemove(function(e){
- xpix = e.pageY
- ypix = e.pageX
+ $(canvas).bind("mousemove", function(evt) {
+ xpix = evt.pageX
+ ypix = evt.pageY
})
- setInterval(tracedrops, 50)
+ intID[0] = setInterval(tracedrops, 50)
function tracedrops() {
field.addSource( (ypix / ylen) | 0 , (xpix / xlen) | 0 , field.mag)
@@ -126,9 +170,8 @@ $(document).ready(function() {
field.adj = 0
field.cg = buildColorGrad(null)
-
// Start Animation
- setInterval(renderField, 50)
+ intID[1] = setInterval(renderField, 50)
} // END DIFFUSIONEQMODE
@@ -165,6 +208,15 @@ $(document).ready(function() {
} // END PoissonEqnMode
+
+ // Default mode when engine not engaged.
+ function noMode() {
+ clearMode()
+ resetScreen()
+ }
+
+
+
// If any event newDroplet, it acts no matter the mode!
socket.on('newDroplet', function(d) {
var yp = Math.round( d.y * window.innerHeight ) //recover from percentage
@@ -256,9 +308,6 @@ $(document).ready(function() {
return s
}
-// SET MODE /////////////////////////////////////////////////////
- //poissonEqnMode()
- waveEqnMode()
}) // end JQuery
View
30 npm-debug.log
@@ -0,0 +1,30 @@
+0 info it worked if it ends with ok
+1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'init' ]
+2 info using npm@1.1.46
+3 info using node@v0.8.5
+4 verbose config file /home/ben/.npmrc
+5 verbose config file /usr/etc/npmrc
+6 verbose config file /usr/lib/node_modules/npm/npmrc
+7 verbose read json /home/ben/programming/node/droplets/package.json
+8 silly package data undefined
+9 info init written successfully
+10 error Error: canceled
+10 error at Interface.<anonymous> (/usr/lib/node_modules/npm/node_modules/read/lib/read.js:53:13)
+10 error at Interface.EventEmitter.emit (events.js:115:20)
+10 error at Interface._ttyWrite (readline.js:606:16)
+10 error at ReadStream.onkeypress (readline.js:98:10)
+10 error at ReadStream.EventEmitter.emit (events.js:115:20)
+10 error at emitKey (readline.js:1057:12)
+10 error at ReadStream.onData (readline.js:806:7)
+10 error at ReadStream.EventEmitter.emit (events.js:88:17)
+10 error at TTY.onread (net.js:403:14)
+11 error If you need help, you may report this log at:
+11 error <http://github.com/isaacs/npm/issues>
+11 error or email it to:
+11 error <npm-@googlegroups.com>
+12 error System Linux 3.4.7-1-ARCH
+13 error command "/usr/bin/node" "/usr/bin/npm" "init"
+14 error cwd /home/ben/programming/node/droplets
+15 error node -v v0.8.5
+16 error npm -v 1.1.46
+17 verbose exit [ 1, true ]
View
3 package.json
@@ -2,7 +2,7 @@
"author": "Ben Postlethwaite <post.ben.here@gmail.com>",
"name": "droplets",
"description": "Personal website with nodejs wavefield generator and interactive html display",
- "version": "0.2.3",
+ "version": "0.3.2",
"homepage": "https://github.com/bpostlethwaite/droplets",
"repository": {
"type": "git",
@@ -20,7 +20,6 @@
"optionalDependencies": {},
"engines": {
"node": ">=0.6"
- "node": ">0.6"
},
"subdomain": "droplets",
"domains": [
View
95 public/bundle.js
@@ -10066,7 +10066,7 @@ $(document).ready(function() {
//var socket = io.connect("http://droplets.benjp.c9.io")
var socket = io.connect("wss://droplets.jit.su")
//var socket = io.connect("http://192.168.1.113:8081")
- , field
+ , field = engine()
, canvas = document.getElementById('canvas')
, c = canvas.getContext('2d')
, xlen = 12
@@ -10075,6 +10075,7 @@ $(document).ready(function() {
, cols
, xpix
, ypix
+ , intID = []
// This turns on and off button selected class for animations
$(".category").click(function() {
@@ -10089,43 +10090,89 @@ $(document).ready(function() {
}
}) // end click
+// This turns on and off button selected class for mode info text
+ $(".mode").click(function() {
+ var mode = null
+ //turn of all previously selected
+ $('.selectedII').not(this).removeClass('selectedII')
+ // Toggle this buttons class.
+ $(this).toggleClass('selectedII')
+ // If it wasn't previously selected then continue and engage.
+ if ( $(this).hasClass('selectedII') ) {
+ // get mode ID
+ mode = $(this).attr('id')
+ //find matching classes associated w/ ID
+ $("." + mode).addClass('selectedII')
+ }
+ // Start up appropriate physics mode
+ switch(mode) {
+ case "mode1":
+ waveEqnMode();
+ break;
+ case "mode2":
+ diffusionEqnMode();
+ break;
+ case "mode3":
+ noMode();
+ break;
+ default:
+ noMode();
+ } // end switch
+ }) // end mode click
+
+
+
// CONTENT SOCKETS /////////////////////////////////////////////////
socket.on('readme', function(data) {
$('.content.tog3').html(data)
})
+ socket.on('cv', function(data) {
+ $('.content.tog4').html(data)
+ })
// MODE FUNCTIONS ///////////////////////////////////////////////////
// Function called on window resize which resets both canvas dims
// as well as calling physics engine resize method.
// Also acts as a general clearing house.
- function reset() {
+ function resetScreen() {
$(window).resize(function(e) {
rows = Math.floor(window.innerHeight / xlen)
cols = Math.floor(window.innerWidth / ylen)
field.setResolution(rows, cols)
canvas.width = window.innerWidth
canvas.height = window.innerHeight
- field.s = buildSprites(10)
+ //field.s = buildSprites(10)
})
$(window).trigger('resize')
}
+ // Function to clear previous bindings and interval
+ // timers from previously selected modes
+ function clearMode() {
+ var i
+ $(canvas).unbind("mousemove")
+ $(canvas).unbind("click")
+ for (i = 0; i < intID.length; i++) {
+ clearInterval(intID[i])
+ }
+ }
+
function waveEqnMode() {
+ clearMode()
field = engine( {
dt: 0.1
, gamma: 0.02
, eqn: "wave"
})
- reset() // Call reset which inits field to window size
+ resetScreen() // Call reset which inits field to window size
var colorgrada = buildColorGrad("#000092", 41, -1).reverse()
, colorgradb = buildColorGrad("#000092", 41, 1)
colorgradb.shift()
-
field.mag = 15
+
// Bind Click //////////////////////////////////////////
- $(canvas).unbind() // get rid of previous bindings
- canvas.addEventListener("click",function(evt) {
+ $(canvas).bind("click", function(evt) {
var xp = evt.pageX
, yp = evt.pageY
socket.emit('clientDroplet',{
@@ -10140,30 +10187,27 @@ $(document).ready(function() {
field.adj = 40
field.cg = colorgrada.concat(colorgradb)
// Start Animation
- setInterval(renderField, 30)
+ intID[0] = setInterval(renderField, 30)
} // END WAVEEQNMODE
function diffusionEqnMode() {
+ clearMode()
field = engine( {
dt: 0.1
- , gamma: 0.02
, eqn: "diffusion"
- , alpha: 1
+ , alpha: 0.5
})
- reset() // Call reset which inits field to window size
+ resetScreen() // Call reset which inits field to window size
field.mag = 30
- xpix = 0.5*Math.round(window.innerWidth)
- ypix= 0.5*Math.round(window.innerHeight)
// Click Binding //////////////////////////////////////////
- $(canvas).unbind()
- $(canvas).mousemove(function(e){
- xpix = e.pageY
- ypix = e.pageX
+ $(canvas).bind("mousemove", function(evt) {
+ xpix = evt.pageX
+ ypix = evt.pageY
})
- setInterval(tracedrops, 50)
+ intID[0] = setInterval(tracedrops, 50)
function tracedrops() {
field.addSource( (ypix / ylen) | 0 , (xpix / xlen) | 0 , field.mag)
@@ -10180,9 +10224,8 @@ $(document).ready(function() {
field.adj = 0
field.cg = buildColorGrad(null)
-
// Start Animation
- setInterval(renderField, 50)
+ intID[1] = setInterval(renderField, 50)
} // END DIFFUSIONEQMODE
@@ -10219,6 +10262,15 @@ $(document).ready(function() {
} // END PoissonEqnMode
+
+ // Default mode when engine not engaged.
+ function noMode() {
+ clearMode()
+ resetScreen()
+ }
+
+
+
// If any event newDroplet, it acts no matter the mode!
socket.on('newDroplet', function(d) {
var yp = Math.round( d.y * window.innerHeight ) //recover from percentage
@@ -10310,9 +10362,6 @@ $(document).ready(function() {
return s
}
-// SET MODE /////////////////////////////////////////////////////
- //poissonEqnMode()
- waveEqnMode()
}) // end JQuery
View
25 public/index.html
@@ -23,8 +23,29 @@
<button id="tog3" class="category tog3"><h2>Website Readme</h2></button><br/>
<button id="tog4" class="category tog4"><h2>CV and links</h2></button><br/>
<br/>
- <dd> Click the screen to add a droplet to the quiet surface. The droplet and ripples will be seen by <em>ALL</em> viewers of this webpage, wherever they might be. <br/><br/></dd>
- <br/>
+ <button id="mode1" class="mode mode1"><h2>wave</h2></button>
+ <button id="mode2" class="mode mode2"><h2>heat</h2></button>
+ <button id="mode3" class="mode mode3"><h2>grav</h2></button>
+ <br/><br/><br/>
+
+ <div class="modeinfo mode1">
+ <dd> Hyperbolic Equation: </dd>
+ <br/>
+ <dd>Click the screen to to send ripples across the surface of the webpage. The droplet and ripples will be seen by <em>ALL</em> viewers of this webpage, wherever they might be. </dd>
+ </div>
+
+ <div class="modeinfo mode2">
+ <dd> Parabolic Equation: </dd>
+ <br/>
+ <dd>Move the cursor around the screen to amass heat. It will diffuse over time and this diffusion will be seen by <em>ALL</em> viewers of this webpage, wherever they might be. </dd>
+ </div>
+
+ <div class="modeinfo mode3">
+ <dd> Elliptic Equation: </dd>
+ <br/>
+ <dd> Not yet functional </dd>
+ </div>
+
<br/>
</div>
View
52 public/style.css
@@ -1,4 +1,5 @@
html, body {
+ position: absolute;
background: #000092; /* Use middle color of colorgrad */
width: 100%;
height: 100%;
@@ -44,7 +45,7 @@ dd {
margin: 40px 0 0 40px;
float: left;
width: 180px;
- height: 400px;
+ height: 440px;
-ms-border-radius: 15px;
-moz-border-radius: 15px;
-webkit-border-radius: 15px;
@@ -89,7 +90,52 @@ dd {
color:#E3DD29;
}
+/**** MODE BUTTONS *********************************/
+.mode {
+ float:left !important;
+ -ms-box-shadow:0 1px 0 0 #BF8B11;
+ -webkit-box-shadow:0 1px 0 0 #BF8B11;
+ -moz-box-shadow:0 1px 0 0 #BF8B11;
+ box-shadow:0 1px 0 0 #BF8B11;
+ background-color:transparent;
+ width:50px;
+ -ms-border-radius:6px;
+ -webkit-border-radius:6px;
+ -moz-border-radius:6px;
+ border-radius:6px;
+ border:1px solid #DBA118;
+ margin: 0px 3px 3px 0px;
+ padding: 3px 0;
+ text-decoration:none;
+}
+.mode:hover {
+ -ms-box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ -moz-box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ -webkit-box-shadow:0 0 10px 2px rgba(176, 171, 14,0.5);
+ box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ border:1px solid #E3DD29;
+}
+.mode:hover > h2 {
+ color:#E3DD29;
+}
+.mode.selectedII {
+ -ms-box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ -moz-box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ -webkit-box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ box-shadow:0 0 5px 1px rgba(176, 171, 14,0.5);
+ border:1px solid #E3DD29;
+}
+.mode.selectedII > h2 {
+ color:#E3DD29;
+}
+/**** MODE MESSAGE *********************************/
+.modeinfo {
+ display: none;
+}
+.modeinfo.selectedII {
+ display: inline-block;
+}
/**** CONNECTORS ***********************************/
.connector {
float: left;
@@ -130,7 +176,7 @@ dd {
float: left;
margin: 40px 0 0 0;
width: 0;
- min-height: 400px;
+ min-height: 440px;
overflow-y: auto;
overflow-x: hidden;
padding: 0 0 !important;
@@ -152,7 +198,7 @@ dd {
padding: 10px 21px;
}
.content.selected {
- min-hieght: 400px;
+ min-hieght: 440px;
-webkit-animation: appear 1s 2s normal both;
-moz-animation:appear 1s 2s normal both;
View
BIN public/wave.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
2 server.js
@@ -71,7 +71,7 @@ function readAndConnect(items, cb) {
} // end parseMarkdown
} // end ReadContent
-var files = ["README.md"]
+var files = ["README.md","CV.md"]
readAndConnect(files, function (data) {
//
// SOCKETS!

0 comments on commit 05b69d6

Please sign in to comment.