View allAll Photos Tagged debugging
Continuing my hacker hip-hop feud with Mike Ossmann, I've got a Bluetooth Low Energy chip under a debugger. Not enough to claim victory, but I've got Sergey Bratus to lay some fat beats for that.
Wanting to switch the octave on a VCO from a pushbutton on a (real) keyboard, I couldn't find anything readymade so this is what I came up with. Mouseover for notes.
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata
I tried to debug, but it failed to find the debugger.
FYI, these screens are 8 3/8" x 6", if you ever want to, you know, pixelate them or something. (Leave a hole in the bottom right corner that is 1 1/4" x 1/2" so you can still access the off button.)
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata
Cycling is good practice for diagnosis and debugging, especially of odd sounds. I've chased all manner of clicks and clunks and pops through the years, but this one nagged me on my ride yesterday and I couldn't narrow it down to the previous causes. I got home and checked the shoe cleats for dirt and such but couldn't see anything obvious. I pulled off the cleat bolts and found a few washers cracked all the way through, plus one about to go. Sure, they had been on the shoes a long time, but I'd done that before without them failing. This batch of metal may have been sub-par (or maybe I'm just so much stronger than I used to be... nah). I recall reading about counterfeit SAE bolts and wondered how many other fasteners these days were being made with lower-grade materials. Luckily this was just a nuisance failure. I put all new hardware on...
Dark Souls Remastered
• Debug Menu (free camera and timestop. FOV cannot be changed in free camera mode, it is locked)
• 9400x5400 (cropped and downsampled)
• Reshade
© Fleur Augustinus / transmediale
discussion
Crashed Economy: Debugging and Rebooting
with Steve Lambert (us), Daniel Garcia Andujar (sp) and Elanor Colleoni (it/dk) as respondent.
To face the current economical crisis means to question dualistic perspectives such as capitalism vs anti-capitalism as well as to imagine a sustainable network of values in which accumulation of growth and precarity are substituted by a grassroots ecology of sharing built on an increasing capacity for sociability. This event presents two sets of projects which question the notion of capitalism through direct intervention and collective reflections proposing an exodus from proprietary money and trade regulation through distributed commons and practices of social networking.
In Part 1: What Capitalism? Steve Lambert (us) and Daniel Garcia Andujar (es) show how one can critique the concept of capitalism in times of crisis through direct interventions and ludic practices. Elanor Colleoni (it/dk) will act as respondent.
Steve Lambert (USA) – Capitalism Works for ME! True-False
Capitalism Works For Me! True/False is a 6m by 3m sign with an electronic voting display allowing passerby to vote on a deceptively simple question: Does capitalism work for you? Every aspect of the interaction is designed to draw them into more complex questions and conversations. The idea that “there is no alternative” to the way our world works, robs our ability to dream. As citizens we need the courage to begin these discussions so we can move on to new and better visions for our future.
Daniel Garcia Andujar (Spain) / Technologies To The People – Postcapital
Border, Capitalism monolith, Collaboration, Collective Intelligence, Community, Complexity, Connectivity, Constructing History, CopyWhat?, Cultural Memory, Dangerous Knowledge, Decision, Decoding, Digital Diogenes, Digital Revolution, Digitalization, Education, Erratum, Fear, Floating Knowledge, Free software, Global Archive, Information Society, Knowledge Production, Language Cartography, Learn to Learn, Mapping, Mass Media Critic, Memory, Network, Participation, Pathologisation, Post-communism, Private Property, Pro-commons, Public Space, Re-reading, Regression, Simplification, Specific, Topography of Fear, Translation, Transparency, Utopia, Voicing…
Termites? We have a HiTech startup for that!
Actually, HiTech is kind of a retro name. I have a Hi-Tech C® Z80 compiler, perhaps this is its debugger?
The chipKIT PGM is designed to work with the MPLAB® and MPLAB X development environments available from Microchip. This allows the chipKIT boards, for example, to be used as a more traditional microcontroller development platform using the professional tools available from Microchip. While the PICkit™3 programmer can generate programming voltages needed to program all Microchip PIC devices, the chipKIT PGM can only program devices that are programmable with 3.3V programming voltage. Further, the PICkit3 can source a small amount of current to provide power to some boards being programmed. The chipKIT PGM does not provide power to the board being programmed.
store.digilentinc.com/chipkit-pgm-programmer-debugger-for...
I have to admit that I am pretty lousy at soldering pert board kits. I
have become so used to using printed circuit boards that it is
difficult for me to think about jumpers and part placement as I am
soldering. Unfortunately, my battery desulfator didn't come out so
good. I am getting a sinewave that is slow and low powered. I'm
confident that eventually this will get resolved.
Plug your phone into your computer using a USB cable. Open the Settings app on your phone and navigate to the Developer Options section. Navigate to the USB Debugging option in that menu and toggle it on or off accordingly.
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata
The chipKIT PGM is designed to work with the MPLAB® and MPLAB X development environments available from Microchip. This allows the chipKIT boards, for example, to be used as a more traditional microcontroller development platform using the professional tools available from Microchip. While the PICkit™3 programmer can generate programming voltages needed to program all Microchip PIC devices, the chipKIT PGM can only program devices that are programmable with 3.3V programming voltage. Further, the PICkit3 can source a small amount of current to provide power to some boards being programmed. The chipKIT PGM does not provide power to the board being programmed.
store.digilentinc.com/chipkit-pgm-programmer-debugger-for...
Using Processing.org
import processing.pdf.*;
boolean debug = false;
boolean randomized = false;
boolean randomNumberNodes = false;
boolean randomRadius = false;
// Variables for how complex a drawing
int numberBranches = 5;
int minNodes = 3; //this will always set an odd number
int maxNodes = 10; //this will always set an odd number
// Declarations
int pagePixels;
int arrayLength = 1000000;
int i;
int j;
String filename;
// randomizing limits
float randLow = .95;
float randHigh = 1.05;
float randRadiusLow = .80;
float randRadiusHigh = 1.25;
// node array variables
String branchAction;
boolean maxLevelFlag = false;
boolean maxNodeFlag = false;
boolean reuseFlag = false;
// node calculation variables
int nodes;
int parentNode;
float x;
float y;
float radius; //4 for 5 branches
float angle = 0.0;
// drawing varables
float drawMod;
PGraphics pg;
// Declare and construct objects
//---------------Branch-----------------
// Creates the array
Branch branch[] = new Branch[numberBranches] ;
//---------------Node-----------------
// Creates the array
Node node[] = new Node[arrayLength] ;
// Setup
// -----
void setup() {
size(9000, 9000, PDF, "Snowflake01.pdf");
pagePixels = numberBranches * 1800;
radius = pagePixels / 4;
filename = year()+"-"+month()+"-"+day()+" "+hour()+"-"+minute()+"-"+second()+" Snowflake.pdf";
// size(pagePixels, pagePixels);
// pg = createGraphics(pagePixels, pagePixels);
pg = createGraphics(pagePixels, pagePixels, PDF, filename);
pg.beginDraw();
smooth();
background(255,255,255,0);
pg.endDraw();
}
// Draw
void draw() {
// All of these funtions are quite extensive, read them below.
buildArray();
drawAllChildToChild();
drawChildInRing();
drawNodeOrbits();
drawParentToChild();
drawNodeEllipse();
println("DONE");
exit();
} // ************** Draw END **************
void keyPressed() {
if (key == 'q') {
exit();
}
if (key == 's') {
saveDrawing();
}
}
// KeyPressed END
void saveDrawing() {
println("Saving...");
filename = year()+"-"+month()+"-"+day()+" "+hour()+"-"+minute()+"-"+second()+"- Snowflake.pdf";
println("Saved.");
}
//-------------------
// Building the Array
//-------------------
void buildArray() {
println("Branches " + numberBranches);
//---------------Branch-----------------
// Creates the objects and assigns them to the array
for (i = 0; i < numberBranches; i++) {
branch[i] = new Branch();
}
// Sets the first node as branch[0]
branch[0].Branch(int((2*round(random(minNodes,maxNodes)/2))+1), radius); //int NodeNum; float radius;
if(debug == true){
println("Branch 0 Node #: " + branch[0].getNodeNum() );
println("Branch 0 radius: " + branch[0].getRadius() );
}
// Reset arrayLength to the first node
arrayLength = 1;
// Sets the values for the array
for (i = 1; i < numberBranches; i++) {
// designed to always produce an odd number
// branch[i].Branch(int((2*round(random(minNodes,maxNodes)/2))+1), branch[i-1].getRadius()/2); //int NodeNum; float radius;
branch[i].Branch(int((2*round(random(minNodes,maxNodes)/2))+1), branch[i-1].getRadius()/2.075); //int NodeNum; float radius;
if(debug == true){
println("Branch " + i + " Node #: " + branch[i].getNodeNum() );
println("Branch " + i + " radius: " + branch[i].getRadius() );
}
}
arrayLength = node.length;
if(debug == true){
println("arrayLength #: " + arrayLength);
}
//---------------Node-----------------
// Creates the objects and assigns them to the array
for (i = 0; i < arrayLength; i++) {
node[i] = new Node();
}
if(debug == true){
println("Node Array Length #: " + node.length);
println("");
}
// Clear out array
for (i = 0; i < arrayLength; i++) {
//int int branchPosition, int nodePosition, int parentReference, int nodeNumber, float nodeRadius, float theta, float x, float y, String action
node[i].Node(0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0, "empty");
}
if (debug == true) {
println("START");
println("");
println("node, int branchPosition, int nodePosition, int parentReference, int nodeNumber, float nodeRadius, float theta, float x, float y, String action");
}
if (randomNumberNodes == false) {
// First Node
//int int branchPosition, int nodePosition, int parentReference, int nodeNumber, float nodeRadius, float theta, float x, float y, String action
node[0].Node(0, 0, 0, branch[0].getNodeNum(), radius, 0.0, pagePixels/2, pagePixels/2, "up");
} else {
// First Node
//int int branchPosition, int nodePosition, int parentReference, int nodeNumber, float nodeRadius, float theta, float x, float y, String action
node[0].Node(0, 0, 0, int((2*round(random(minNodes,maxNodes)/2))+1), radius, 0.0, pagePixels/2, pagePixels/2, "up");
}
node[0].setNodePosition(node[0].getNodeNumber());
if(debug == true){
print("0, ");
node[0].printNode();
}
// DETERMINE WHAT ACTIONS TO TAKE: add, up, down, reuse
//---------------------------------------
for (i = 1; i < arrayLength; i++) {
// set boolean conditions ...this was for legability...
// maxLevelFlag = was the last node at the highest branch level?
// maxNodeFlag = was the last node at the highest node number (the last node)?
// reuseFlag = was the last node a reuse. Or, was it a node that exists already as we move back down the tree?
if (node[i-1].getBranchPosition() == numberBranches - 1) { // If max level
maxLevelFlag = true;
} else {
maxLevelFlag = false;
}
if (node[i-1].getNodePosition() == node[node[i-1].getParentReference()].getNodeNumber() ) { // If max node from parent node
maxNodeFlag = true;
} else {
maxNodeFlag = false;
}
if (node[i-1].getAction() == "reuse") { // If reuse
reuseFlag = true;
} else {
reuseFlag = false;
}
// Set actions based on boolean conditions
if (maxLevelFlag == false && maxNodeFlag == false && reuseFlag == false) {
parentNode = i - 1;
branchAction = "up";
}
if (maxLevelFlag == false && maxNodeFlag == true && reuseFlag == false) {
parentNode = i - 1;
branchAction = "up";
}
if (maxLevelFlag == false && maxNodeFlag == true && reuseFlag == true) {
if (node[node[i-1].getParentReference()].getNodePosition() < node[node[node[i-1].getParentReference()].getParentReference()].getNodeNumber()) { // if parent is not max node
parentNode = node[node[i-1].getParentReference()].getParentReference();
branchAction = "down";
} else {
if (node[i-1].getBranchPosition() == 0) { // if back to the start
arrayLength = i - 1;
println("arrayLength = " + arrayLength);
i = node.length - 1;
branchAction = "reuse";
} else {
parentNode = node[node[i-1].getParentReference()].getParentReference();
branchAction = "reuse";
}
}
}
if (maxLevelFlag == true && maxNodeFlag == false && reuseFlag == false) {
parentNode = node[i-1].getParentReference();
branchAction = "add";
}
if (maxLevelFlag == true && maxNodeFlag == true) {
if (node[node[i-1].getParentReference()].getNodePosition() == node[node[node[i-1].getParentReference()].getParentReference()].getNodeNumber()) { // if parent is max node
parentNode = node[node[i-1].getParentReference()].getParentReference();
branchAction = "reuse";
} else {
parentNode = node[node[i-1].getParentReference()].getParentReference();
branchAction = "down";
}
}
// ACTIONS: add, up, down, reuse
//---------------------------------------
// Add node at same branch level
if (branchAction == "add") {
// Set Parent Reference.
node[i].setParentReference(parentNode);
// Keep the parent node's branch level.
node[i].setBranchPosition(node[i-1].getBranchPosition());
// Add 1 to the node position of the previous node.
node[i].setNodePosition(node[i-1].getNodePosition() + 1);
//if Adding a node, NodeNumber is zero
node[i].setNodeNumber(0);
if (randomRadius == false) {
node[i].setNodeRadius(branch[node[i].getBranchPosition()].getRadius());
} else {
node[i].setNodeRadius(random(randRadiusLow,randRadiusHigh)*branch[node[i].getBranchPosition()].getRadius());
}
// Set the angle by adding the Node's branch angle (2 PI / Number of nodes) to the previous node's angle.
if (randomized == true) {
node[i].setAngle(random(randLow,randHigh)*(node[node[i].getParentReference()].getAngle() + (node[i].getNodePosition()*(TWO_PI / node[node[i].getParentReference()].getNodeNumber() ))));
}
if (randomized == false) {
node[i].setAngle((node[node[i].getParentReference()].getAngle() + (node[i].getNodePosition()*(TWO_PI / node[node[i].getParentReference()].getNodeNumber()) )));
}
// Calculate and set the x, y position of the node
if (randomized == true) {
x = node[node[i].getParentReference()].getX() + sin(node[i].getAngle()) * random(randLow,randHigh)*node[node[i].getParentReference()].getNodeRadius();
y = node[node[i].getParentReference()].getY() + cos(node[i].getAngle()) * random(randLow,randHigh)*node[node[i].getParentReference()].getNodeRadius();
}
if (randomized == false) {
x = node[node[i].getParentReference()].getX() + sin(node[i].getAngle()) * node[node[i].getParentReference()].getNodeRadius();
y = node[node[i].getParentReference()].getY() + cos(node[i].getAngle()) * node[node[i].getParentReference()].getNodeRadius();
}
node[i].setPosition(x, y);
// Set action
node[i].setAction("add");
}
// Go up one branch level, add node to upper branch level
if (branchAction == "up") {
// Set Parent Reference.
node[i].setParentReference(parentNode);
// Go up one branch level. Add 1 to the former node's branch level.
node[i].setBranchPosition(node[i-1].getBranchPosition() + 1);
// When you go up a branch the node is always 1, the starting position.
node[i].setNodePosition(1);
//if Maximum branch level, NodeNumber is zero
if(node[i].getBranchPosition() == numberBranches - 1) {
node[i].setNodeNumber(0);
} else {
if (randomNumberNodes == false) {
node[i].setNodeNumber(branch[node[i].getBranchPosition()].getNodeNum() );
} else {
node[i].setNodeNumber(int((2*round(random(minNodes,maxNodes)/2))+1) );
}
}
if (randomRadius == false) {
node[i].setNodeRadius(branch[node[i].getBranchPosition()].getRadius());
} else {
node[i].setNodeRadius(random(randRadiusLow,randRadiusHigh)*branch[node[i].getBranchPosition()].getRadius());
}
// Set the angle by adding the Node's branch angle (2 PI / Number of nodes) to the previous node's angle.
if (randomized == true) {
node[i].setAngle(random(randLow,1.01)*(node[i-1].getAngle() + (TWO_PI / node[node[i].getParentReference()].getNodeNumber() )));
}
if (randomized == false) {
node[i].setAngle((node[i-1].getAngle() + (TWO_PI / node[node[i].getParentReference()].getNodeNumber() )));
}
// Calculate and set the x, y position of the node
if (randomized == true) {
x = node[i-1].getX() + sin(node[i].getAngle()) * random(randLow,randHigh)*node[node[i].getParentReference()].getNodeRadius();
y = node[i-1].getY() + cos(node[i].getAngle()) * random(randLow,randHigh)*node[node[i].getParentReference()].getNodeRadius();
}
if (randomized == false) {
x = node[i-1].getX() + sin(node[i].getAngle()) * node[node[i].getParentReference()].getNodeRadius();
y = node[i-1].getY() + cos(node[i].getAngle()) * node[node[i].getParentReference()].getNodeRadius();
}
node[i].setPosition(x, y);
// Set action
node[i].setAction("up");
// Set parentNode to this node
parentNode = i;
}
// Go down one branch level, add node from parent at lower branch level
if (branchAction == "down") {
// Set Parent Reference.
node[i].setParentReference(parentNode);
// Keep the parent node's branch level.
node[i].setBranchPosition(node[node[i-1].getParentReference()].getBranchPosition());
// Add 1 to the parent node's position.
node[i].setNodePosition(node[node[i-1].getParentReference()].getNodePosition() + 1);
if (randomNumberNodes == false) {
node[i].setNodeNumber(branch[node[i].getBranchPosition()].getNodeNum() );
} else {
node[i].setNodeNumber(int((2*round(random(minNodes,maxNodes)/2))+1) );
}
if (randomRadius == false) {
node[i].setNodeRadius(branch[node[i].getBranchPosition()].getRadius());
} else {
node[i].setNodeRadius(random(randRadiusLow,randRadiusHigh)*branch[node[i].getBranchPosition()].getRadius());
}
// Set the angle by adding the node's branch angle (2 PI / Number of nodes) to the parent's angle.
if (randomized == true) {
node[i].setAngle(random(.99,1.01)*(node[node[i-1].getParentReference()].getAngle() + (TWO_PI / node[node[i].getParentReference()].getNodeNumber() )));
}
if (randomized == false) {
node[i].setAngle((node[node[i-1].getParentReference()].getAngle() + (TWO_PI / node[node[i].getParentReference()].getNodeNumber() )));
}
// Calculate and set the x, y position of the node
if (randomized == true) {
x = node[parentNode].getX() + sin(node[i].getAngle()) * random(randLow,randHigh)*node[node[i].getParentReference()].getNodeRadius();
y = node[parentNode].getY() + cos(node[i].getAngle()) * random(randLow,randHigh)*node[node[i].getParentReference()].getNodeRadius();
}
if (randomized == false) {
x = node[parentNode].getX() + sin(node[i].getAngle()) * node[node[i].getParentReference()].getNodeRadius();
y = node[parentNode].getY() + cos(node[i].getAngle()) * node[node[i].getParentReference()].getNodeRadius();
}
node[i].setPosition(x, y);
// Set action
node[i].setAction("down");
}
// Go down one branch level, reuse parent at lower branch level
if (branchAction == "reuse") {
// Set Parent Reference.
node[i].setParentReference(parentNode);
// Keep the parent node's branch level.
node[i].setBranchPosition(node[node[i-1].getParentReference()].getBranchPosition());
// Keep the parent node position.
node[i].setNodePosition(node[node[i-1].getParentReference()].getNodePosition());
// Keep the parent node number.
node[i].setNodeNumber(node[node[i-1].getParentReference()].getNodeNumber());
// Keep the parent node radius.
node[i].setNodeRadius(node[node[i-1].getParentReference()].getNodeRadius());
// Keep the parent angle.
node[i].setAngle(node[node[i-1].getParentReference()].getAngle());
// Keep the parent x.
x = node[node[i-1].getParentReference()].getX();
// Keep the parent y.
y = node[node[i-1].getParentReference()].getY();
// Keep the parent postition.
node[i].setPosition(x, y);
// Set action
node[i].setAction("reuse");
// set parentNode to the reused node's parent to keep it moving down
parentNode = node[i].getParentReference();
}
if (debug == true) {
// print node information
print(i + ", ");
node[i].printNode();
}
}
// buildArray END
}
//-------------------
// Drawing Functions
//-------------------
void drawAllChildToChild() {
println("START: Draw line connecting all children together...");
// Draw line connecting all children together
for (i = 1; i < arrayLength; i++) {
for (j = 2; j < arrayLength; j++) {
if(node[i].getParentReference() == node[j].getParentReference() && i!= j) {
drawMod = numberBranches-node[i].getBranchPosition()+1;
if (randomized == true) {
stroke(random(randLow,randHigh)*round(random(100,150)),
random(randLow,randHigh)*round(random(100,150)),
random(randLow,randHigh)*round(random(100,150)),
random(randLow,randHigh)*round(random(200,255))*drawMod/numberBranches);
strokeWeight(random(.75,1.5)*drawMod*.03);
}
if (randomized == false) {
stroke(10 * drawMod/numberBranches,
200 * drawMod/numberBranches,
200 * drawMod/numberBranches,
255 * drawMod/numberBranches);
strokeWeight(drawMod*.05);
}
pg.beginDraw();
line (node[i].getX(), node[i].getY(), node[j].getX(), node[j].getY());
pg.endDraw();
}
}
}
println("END: Draw line connecting all children together.");
}
void drawChildInRing() {
println("START: Draw line connecting all children together in a ring...");
// Draw line connecting all children together in a ring
for (i = 1; i < arrayLength; i++) {
for (j = 2; j < arrayLength; j++) {
if( (node[i].getParentReference() == node[j].getParentReference() && node[i].getNodePosition() + 1 == node[j].getNodePosition())
||
(node[i].getParentReference() == node[j].getParentReference() && (node[i].getNodePosition() == 1
&& node[j].getNodePosition() == node[node[j].getParentReference()].getNodeNumber()))
)
{
drawMod = numberBranches-node[i].getBranchPosition()+1;
if (randomized == true) {
stroke(random(randLow,randHigh)*round(random(215,255))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(125,150))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(25,75))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(200,255))*drawMod/numberBranches);
strokeWeight(random(.75,1.25)*drawMod*.0625);
}
if (randomized == false) {
stroke(250 * drawMod/numberBranches,
166 * drawMod/numberBranches,
52 * drawMod/numberBranches,
255 * drawMod/numberBranches);
strokeWeight(drawMod*.0625);
}
pg.beginDraw();
line (node[i].getX(), node[i].getY(), node[j].getX(), node[j].getY());
pg.endDraw();
}
}
}
println("END: Draw line connecting all children together in a ring.");
}
void drawParentToChild() {
println("START: Draw line connecting parent node to child node...");
// Draw line connecting parent node to child node
for (i = 1; i < arrayLength; i++) {
if(node[i].getAction() != "reuse") {
drawMod = numberBranches-node[i].getBranchPosition()+1;
if (randomized == true) {
stroke(random(randLow,randHigh)*round(random(0,50)),
random(randLow,randHigh)*round(random(0,150)),
random(randLow,randHigh)*round(random(200,255)),
random(randLow,randHigh)*round(random(200,255))*drawMod/numberBranches); //blue
strokeWeight(random(.75,1.5)*drawMod*.125);
}
if (randomized == false) {
stroke(0,
127 * drawMod/numberBranches,
195 * drawMod/numberBranches,
255 * drawMod/numberBranches); //blue
strokeWeight(drawMod*.125);
}
pg.beginDraw();
line (node[i].getX(), node[i].getY(), node[node[i].getParentReference()].getX(), node[node[i].getParentReference()].getY());
pg.endDraw();
}
}
println("END: Draw line connecting parent node to child node.");
}
void drawNodeOrbits() {
println("START: Draw ellipse at each node with radius...");
// Draw ellipse at each node
for (i = 0; i < arrayLength; i++) {
if(node[i].getAction() != "reuse") {
drawMod = (numberBranches - node[i].getBranchPosition())*1.5;
// Fill
if (randomized == true) {
fill(random(randLow,randHigh)*round(random(5,125)),
random(randLow,randHigh)*round(random(175,255)),
random(randLow,randHigh)*round(random(5,125)),
random(randLow,randHigh)*round(random(30,50))*drawMod/numberBranches); //green
}
if (randomized == false) {
fill(127 * drawMod/numberBranches,
255 * drawMod/numberBranches,
50 * drawMod/numberBranches,
40 * drawMod/numberBranches);
}
// Stroke
if (randomized == true) {
stroke(random(randLow,randHigh)*round(random(0,125)),
random(randLow,randHigh)*round(random(200,255)),
random(randLow,randHigh)*round(random(0,125)),
random(randLow,randHigh)*round(random(225,255))*drawMod/numberBranches); //green
strokeWeight(random(.75,1.5)*drawMod*.0625);
}
if (randomized == false) {
stroke(63 * drawMod/numberBranches,
127 * drawMod/numberBranches,
25 * drawMod/numberBranches,
255 * drawMod/numberBranches);
strokeWeight(drawMod*.0625);
}
pg.beginDraw();
ellipse(node[i].getX(), node[i].getY(), node[i].getNodeRadius(), node[i].getNodeRadius());
pg.endDraw();
}
}
println("END: Draw ellipse at each node with radius.");
}
void drawNodeEllipse() {
println("START: Draw ellipse at each node...");
// Draw ellipse at each node
for (i = 0; i < arrayLength; i++) {
for (j = 0; j < numberBranches; j++) {
if (node[i].getBranchPosition()==j){
if(node[i].getAction() != "reuse") {
drawMod = (numberBranches - node[i].getBranchPosition());
// Fill
if (randomized == true) {
fill(random(randLow,randHigh)*round(random(100,150))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(200,255))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(25,75))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(200,255))*drawMod/numberBranches); //green
}
if (randomized == false) {
fill(127 * drawMod/numberBranches,
255 * drawMod/numberBranches,
50 * drawMod/numberBranches,
250 * drawMod/numberBranches);
}
// Stroke
if (randomized == true) {
stroke(random(randLow,randHigh)*round(random(0,50))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(100,150))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(0,50))*drawMod/numberBranches,
random(randLow,randHigh)*round(random(200,255))*drawMod/numberBranches); //green
strokeWeight(random(.75,1.5)*drawMod*.0625);
}
if (randomized == false) {
stroke(63 * drawMod/numberBranches,
127 * drawMod/numberBranches,
25 * drawMod/numberBranches,
250 * drawMod/numberBranches);
strokeWeight(drawMod*.0625);
}
pg.beginDraw();
ellipse(node[i].getX(), node[i].getY(),pow(drawMod,1.5),pow(drawMod,1.5));
pg.endDraw();
}
}
}
}
println("END: Draw ellipse at each node.");
}
// ---------------
// HERE BE CLASSES
// ---------------
public class Node{
// the first letter of a class name should be capitalized
// the class has fields
// for fields, spell the first word lowercase, capitalize the first letter of each subsequent word
// --------------------------
// these are private and you use the get Methods to return the public values
// private float radius, theta, x, y, action;
int branchPosition, nodePosition, parentReference, nodeNumber;
float theta, x, y, nodeRadius;
String action;
// the class has constructors
// --------------------------
public void Node(int startBranchPosition, int startNodePosition, int startParentReference, int startNodeNumber, float startNodeRadius, float startAngle, float startX, float startY, String startAction) {
branchPosition = startBranchPosition;
nodePosition = startNodePosition;
parentReference = startParentReference;
nodeNumber = startNodeNumber;
nodeRadius = startNodeRadius;
theta = startAngle;
x = startX;
y = startY;
action = startAction;
}
// the class has methods
// the first (or only) word in a method name should be a verb
// --------------------------
// ---------SET and GET------------
public int getBranchPosition() {
return branchPosition;
}
public void setBranchPosition(int newValue) {
branchPosition = newValue;
}
public int getNodePosition() {
return nodePosition;
}
public void setNodePosition(int newValue) {
nodePosition = newValue;
}
public int getParentReference() {
return parentReference;
}
public void setParentReference(int newValue) {
parentReference = newValue;
}
public int getNodeNumber() {
return nodeNumber;
}
public void setNodeNumber(int newValue) {
nodeNumber = newValue;
}
public float getNodeRadius() {
return nodeRadius;
}
public void setNodeRadius(float newValue) {
nodeRadius = newValue;
}
public float getAngle() {
return theta;
}
public void setAngle(float newValue) {
theta = newValue;
}
public float getX() {
return (x);
}
public float getY() {
return (y);
}
public void setPosition(float newX, float newY) {
x = newX;
y = newY;
}
public String getAction() {
return action;
}
public void setAction(String newValue) {
action = newValue;
}
public void printNode() {
println(branchPosition + ", " + nodePosition + ", " + parentReference + ", " + nodeNumber + ", " + nodeRadius + ", " + theta + ", " + x + ", " + y + ", " + action);
}
}
public class Branch{
// the first letter of a class name should be capitalized
// the class has fields
// for fields, spell the first word lowercase, capitalize the first letter of each subsequent word
// --------------------------
// these are private and you use the get Methods to return the public values
// private float radius, theta, x, y;
int NodeNum;
float radius;
// the class has constructors
// --------------------------
public void Branch(int startNodeNum, float startRadius) {
NodeNum = startNodeNum;
radius = startRadius;
}
// the class has methods
// the first (or only) word in a method name should be a verb
// --------------------------
// ---------SET and GET------------
public int getNodeNum() {
return NodeNum;
}
public void setNodeNum(int newValue) {
NodeNum = newValue;
}
public float getRadius() {
return radius;
}
public void setRadius(float newValue) {
radius = newValue;
}
}
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata
© Fleur Augustinus / transmediale
discussion
Crashed Economy: Debugging and Rebooting
with Steve Lambert (us), Daniel Garcia Andujar (sp) and Elanor Colleoni (it/dk) as respondent.
To face the current economical crisis means to question dualistic perspectives such as capitalism vs anti-capitalism as well as to imagine a sustainable network of values in which accumulation of growth and precarity are substituted by a grassroots ecology of sharing built on an increasing capacity for sociability. This event presents two sets of projects which question the notion of capitalism through direct intervention and collective reflections proposing an exodus from proprietary money and trade regulation through distributed commons and practices of social networking.
In Part 1: What Capitalism? Steve Lambert (us) and Daniel Garcia Andujar (es) show how one can critique the concept of capitalism in times of crisis through direct interventions and ludic practices. Elanor Colleoni (it/dk) will act as respondent.
Steve Lambert (USA) – Capitalism Works for ME! True-False
Capitalism Works For Me! True/False is a 6m by 3m sign with an electronic voting display allowing passerby to vote on a deceptively simple question: Does capitalism work for you? Every aspect of the interaction is designed to draw them into more complex questions and conversations. The idea that “there is no alternative” to the way our world works, robs our ability to dream. As citizens we need the courage to begin these discussions so we can move on to new and better visions for our future.
Daniel Garcia Andujar (Spain) / Technologies To The People – Postcapital
Border, Capitalism monolith, Collaboration, Collective Intelligence, Community, Complexity, Connectivity, Constructing History, CopyWhat?, Cultural Memory, Dangerous Knowledge, Decision, Decoding, Digital Diogenes, Digital Revolution, Digitalization, Education, Erratum, Fear, Floating Knowledge, Free software, Global Archive, Information Society, Knowledge Production, Language Cartography, Learn to Learn, Mapping, Mass Media Critic, Memory, Network, Participation, Pathologisation, Post-communism, Private Property, Pro-commons, Public Space, Re-reading, Regression, Simplification, Specific, Topography of Fear, Translation, Transparency, Utopia, Voicing…
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata
The chipKIT PGM is designed to work with the MPLAB® and MPLAB X development environments available from Microchip. This allows the chipKIT boards, for example, to be used as a more traditional microcontroller development platform using the professional tools available from Microchip. While the PICkit™3 programmer can generate programming voltages needed to program all Microchip PIC devices, the chipKIT PGM can only program devices that are programmable with 3.3V programming voltage. Further, the PICkit3 can source a small amount of current to provide power to some boards being programmed. The chipKIT PGM does not provide power to the board being programmed.
store.digilentinc.com/chipkit-pgm-programmer-debugger-for...
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata
ZoomCharts at DevClub.lv: Developing a Javascript SDK
On January 15, 2015, ZoomCharts Co-Founder and CTO Viesturs Zariņš presented at DevClub.lv - a community of Latvian IT specialists that gather monthly and host free talks, presentations, and events to allow the local IT community to share knowledge, network, and communicate. Zariņš discussed the unique challenges faced in developing JavaScript SDK.
Here is a brief overview of his PowerPoint presentation on ZoomCharts, the world’s most interactive data visualization software that will support all your data presentation needs with incredible speed.
What is ZoomCharts?
What defines ZoomCharts advanced data visualization software? It is NOT another HTML5 charts library. It is:
- Interactive
- Fast
- Touch enabled
- Supports big data
A long time ago
DOS 6.2 allowed for:
- 320x240x8bpp
- Direct access to pixels on screen
- Assembler for performance
Today, the Web has finally caught up in the graphics department. Now, we have access to:
- Multiple browsers and rendering technologies
- Multiple resolutions
- Performance that varies by browser and device
Development setup:
- We write in JavaScript
- Commit to GitHub
- Build system in JavaScript
- Debug in Chrome
- Run automated tests
- Like WebStorm (and Vim)
Graphics:
Canvas (fast)
SVG (slow)
WebGL (>50%)
Interactive animations:
Zoom in and out of the graph, drag and drop data, all with your mouse or trackpad.
Graceful degradation:
High FPS (frames per second) lets you scale graphics with low image degradation.
Third party libraries:
- Raphael
- Hammer.js
- Leaflet
- Moment.js
Challenges:
- Responsive design: layouts can shift and look nice on desktop screens vs. not so nice on vertical, mobile screens
- Big screen resolutions: uses devicePixelRatio for sharp rendering, but no hardware acceleration beyond 2048x2048
- Safari compatibility: with 100% CPU, input events are blocked and browser locks up; strange code offers fixes
- HTML on canvas: DOM is slow; basic HTML markup must be parsed and rendered manually; text caching helps
Support:
- Process: TrialSupportBuy
- 1 day issue resolution
- #1 Tell me what I did wrong
- #2 Can you do…
Testing:
- Automated tests on every GIT push
Automatically:
- Compare images
- Record performance
- View errors in console
Interactive testing:
- Next step: record and playback
BrowserStack:
- Interactive mode
- Automated: Selenium API
Debugging:
Chrome Developer tools (F12)
- Debugging
- Profiling
- Timeline
Remote debugging available: developer.chrome.com/devtools/docs/remote-debugging
Future:
- More charts
- Extension API
- Memory allocation tracking
- WebGL
We are looking for statically-typed language:
- Error checking
- Performance
- Superior minification
- Easy to write and read
- Easy to call from JS
Building
Custom build script:
- Compile
- Minify
- Extract documentation
- Embed customer data
Check out ZoomCharts products:
Network Chart
Big network exploration
Explore linked data sets. Highlight relevant data with dynamic filters and visual styles. Incremental data loading. Exploration with focus nodes.
Time Chart
Time navigation and exploration tool
Browse activity logs, select time ranges. Multiple data series and value axes. Switch between time units.
Pie Chart
Amazingly intuitive hierarchical data exploration
Get quick overview of your data and drill down when necessary. All in a single easy to use chart.
Facet Chart
Scrollable bar chart with drill-down
Compare values side by side and provide easy access to the long tail.
ZoomCharts
The world’s most interactive data visualization software
#zoomcharts #interactive #data #interactivedata #datavisualization #interactivedatavisualization #chart #graph #charts #graphs #Javascript #JavascriptSDK #DevClubIV #Latvia #PowerPoint #PowerPointpresentation #fast #bigdata