Note: this rough draft has turned into https://github.com/maxogden/art-of-node#art-of-node
go to https://github.com/maxogden/art-of-node#art-of-node to view the newer versions of this document
/** | |
* Mark and Sweep Garbage Collection technique. | |
* MIT Style License | |
* by Dmitry Soshnikov | |
*/ | |
// This diff describes the simplest version of mark and sweep | |
// GC in order to understand the basic idea. In real practice the | |
// implementation can be much tricker and more optimized. |
go to https://github.com/maxogden/art-of-node#art-of-node to view the newer versions of this document
d3.legend is a quick hack to add a legend to a d3
chart. Simply add a g
and .call(d3.legend)
. Any elements that have a title set in the "data-legend"
attribute will be included when d3.legend
is called. Each title will appear only once (even when multiple items define the same data-legend) as the process uses a set based on a existing names, not an array of all items.
By default the color in the legend will try to match the fill attribute or the stroke attribute of the relevant items. Color can be explicitly defined by attribute "data-legend-color"
The order of items in the legend will be sorted using the top of the bounding box for each included item. The order can be explicitly defined by attribute "data-legend-pos"
Copyright (c) 2012–2013 Daniel Foreman-Mackey | |
Permission is hereby granted, free of charge, to any person obtaining a copy of | |
this software and associated documentation files (the "Software"), to deal in | |
the Software without restriction, including without limitation the rights to | |
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
the Software, and to permit persons to whom the Software is furnished to do so, | |
subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in all |
function log( change ) { | |
// Note that |change.object| is actually a reference to the | |
// target object. | |
if ( change.type === "read" ) { | |
console.log( "What was accessed? ", change.name ); | |
console.log( "What value was given? ", change.oldValue ); | |
} | |
else { |
'use strict'; | |
/** | |
* Require the RED module. | |
*/ | |
var RED = require('RED'); | |
/** | |
* Create a new RED server. | |
*/ |
/* | |
* Abstraction.js | |
* | |
* Copyright (c) 2012 "Cowboy" Ben Alman | |
* Licensed under the MIT license. | |
* http://benalman.com/about/license/ | |
*/ | |
var Abstraction = (function($) { | |
var _ = $.prototype; |
Here's some more perf analysis: what was the limiter for node.js in the original fs.readFile benchmark, | |
causing large performance difference? | |
Examining thread microstates using prstat (SmartOS): | |
# prstat -mLcp 92432 1 | |
Please wait... | |
[...] | |
PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/LWPID | |
92432 root 90 10 0.0 0.0 0.0 0.0 0.0 0.0 7 9 42K 0 node/1 |
ar http = require('http'); | |
var fs = require('fs'); | |
var util = require('util'); | |
var fileCache; | |
var sendFile = function(conn, file) { | |
conn.writeHead(200, {"Content-Type": "text/html", "Content-Length": file.length}); | |
conn.write(file); | |
conn.end(); | |
} |
So, to get something like /etc/rc.local
you can use the custom SMF import facility. (See the source
for more information about how this actually works.)
/opt
is mounted out of zones/opt
by default. You can create a directory /opt/custom/smf
and populate it with SMF manifests. Any manifests you put in there will be imported by SmartOS when it boots. Below is an example SMF manifest that simply starts /opt/custom/bin/postboot
, a self-explanatory shell script that you can use like /etc/rc.local
.
Note that it would likely be better to customise and respin your own images, as putting a bunch of platform state in the zones pool undoes some of the benefits of the ramdisk platform architecture that SmartOS has.