Giter VIP home page Giter VIP logo

beacons's Introduction

##Reading Beacon/iBeacons information via Raspberry PI

TODO: Write a project description

Installation

TODO: Describe the installation process

Usage

TODO: Write usage instructions

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

History

TODO: Write history

Credits

TODO: Write credits

License

TODO: Write license

##Code to detect beacons on a raspberry pi or macbook pro

##Raspberry

Node-RED - flow for Bluemix and freeboard

[{"id":"b193695.f4e6c98","type":"twilio-api","z":"188173d5.e77e8c","sid":"ACa0f19b5b58eaefa0fb851d91c9278506","from":"12018796475","name":""},{"id":"c5eb96a3.3a1468","type":"ibmiot in","z":"33a55897.cc5aa8","authentication":"boundService","apiKey":"","inputType":"evt","deviceId":"sinfrommac","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"IBM IoT","service":"registered","allDevices":"","allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":true,"x":96,"y":144,"wires":[["7ceaa03a.83156","24f5b694.db0a4a"]]},{"id":"24f5b694.db0a4a","type":"debug","z":"33a55897.cc5aa8","name":"IOTIncomming","active":false,"console":"false","complete":"payload","x":262,"y":190,"wires":[]},{"id":"cd779173.32887","type":"freeboard","z":"33a55897.cc5aa8","name":"Beacons","x":467,"y":244,"wires":[]},{"id":"7ceaa03a.83156","type":"function","z":"33a55897.cc5aa8","name":"Add Image","func":"\nvar now = ( new Date() ).getTime();\nvar time_stamp = now;\nvar range = 1;\nvar imgmac = "https://s-media-cache-ak0.pinimg.com/236x/2d/78/86/2d7886d8dd374f1e5ffa1568b43b5975.jpg";\nvar imgph= "http://cdn2.gsmarena.com/vv/bigpic/lg-nexus-4-new.jpg";\nvar imgbean = "http://iceddev.com/blog/content/images/2015/04/bean.png";\nvar imgpi = "http://ecx.images-amazon.com/images/I/51MrYF3ct0L.SX300.jpg";\nvar imgurlatv = "http://images.pocketgamer.co.uk/FCKEditorFiles//41uTXEtgjqL__SL1024_.jpg";\nvar imgreco = "http://www.smartmobilepos.com/images/reco-v.jpg";\nvar imgtile= "https://tctechcrunch2011.files.wordpress.com/2013/06/tile-hero-shot-flat.jpg?w=400";\nvar fitbit= "http://ecx.images-amazon.com/images/I/716MkCvGjKL.SL1500.jpg";\nvar imgunkown="http://www.civstats.com/images/leaders/Unknown_lg.jpg";\nvar imgti = "http://www.myweathercenter.net/wp-content/uploads/2015/03/IMG_5972-e1426969479603.jpg";\nvar imgtv = "http://pisces.bbystatic.com/image2/BestBuy_US/en_US/images/abn/2015/tvv/fo/nav/tv-ht-fo1.jpg";\nvar imgflex = "https://static0.fitbit.com/simple.b-cssdisabled-png";\nmsg.payload.d.ble.interval = 0;\nif (typeof msg.payload.d.ble.beaconname != 'undefined')\n{\nif (msg.payload.d.ble.beaconname == 'CC2650 SensorTag')\n msg.payload.d.ble.imgurl=imgti;\nif (msg.payload.d.ble.beaconname.indexOf('TV') >-1)\n msg.payload.d.ble.imgurl=imgtv;\nif (msg.payload.d.ble.beaconname == 'Apple TV')\n msg.payload.d.ble.imgurl=imgurlatv;\n\nelse if (msg.payload.d.ble.beaconname == 'RECO')\n{\n msg.payload.d.ble.imgurl=imgreco;\n if (msg.payload.d.ble.minor == 4298)\n if(context.global.recointerval == 0 )\n {\n context.global.recointerval = msg.payload.d.ts;\n }else{\n msg.payload.d.ble.interval = msg.payload.d.ts - context.global.recointerval ;\n //msg.payload.d.ble.pinterval = msg.payload.d.ts - msg.payload.d.ble.interval ;\n context.global.recointerval = now;\n }\n\n\n}else if (msg.payload.d.ble.beaconname == 'One')\n{ msg.payload.d.ble.imgurl=fitbit;\n if(context.global.oneinterval == 0)\n {\n context.global.oneinterval = msg.payload.d.ts;\n }else{\n msg.payload.d.ble.interval = msg.payload.d.ts - context.global.oneinterval ;\n //msg.payload.d.ble.pinterval = msg.payload.d.ts - msg.payload.d.ble.interval ;\n context.global.oneinterval = now;\n }\n\n}else if (msg.payload.d.ble.beaconname == 'Tile')\n{ msg.payload.d.ble.imgurl=imgtile;\n\n if(context.global.tileinterval == 0)\n {\n context.global.tileinterval = now;\n }else{\n msg.payload.d.ble.interval = msg.payload.d.ts - context.global.tileinterval ;\n context.global.tileinterval = now;\n }\n\n}\nelse if (msg.payload.d.ble.beaconname.indexOf('Flex') > -1)\n msg.payload.d.ble.imgurl=imgflex;\nelse if (msg.payload.d.ble.beaconname == 'Unknown')\n msg.payload.d.ble.imgurl=imgunkown;\nelse if (msg.payload.d.ble.beaconname == 'raspberrypi-0')\n msg.payload.d.ble.imgurl=imgpi;\nelse if (msg.payload.d.ble.beaconname == 'Bean')\n msg.payload.d.ble.imgurl=imgbean;\nelse if (msg.payload.d.ble.beaconname == 'MVKPhone')\n msg.payload.d.ble.imgurl=imgph;\nelse if (msg.payload.d.ble.beaconname == 'MacBookPro')\n msg.payload.d.ble.imgurl=imgmac;\n \n}else{\n msg.payload.d.ble.beaconname == 'Unknown'\n msg.payload.d.ble.imgurl=imgunkown;\n}\n\nif (msg.payload.d.ble.accuracy < 0.62)\n msg.payload.d.ble.inrange=range;\nelse\n msg.payload.d.ble.inrange=range-1;\n\n//if (typeof(context.global.blenamelist) == 'undefined')\n //context.global.blenamelist=[];\n\n if (msg.payload.d.ble.bletypes.indexOf(msg.payload.d.ble.beaconname) == -1) {\n msg.payload.d.ble.bletypes.push(msg.payload.d.ble.beaconname);\n //msg.payload.d.ble.blenamelist=context.global.blenamelist;\n\n }else{\n // $scope.todo is already in the $scope.todos array, alert the user\n }\n \n \n \nmsg.payload.d.date = new Date(now)\nreturn msg;\n","outputs":1,"noerr":0,"x":278,"y":146,"wires":[["431f6ff5.bce09","e6580f0a.a583d","e9c33b50.163cc8"]]},{"id":"7ac53547.853acc","type":"function","z":"33a55897.cc5aa8","name":"Add Image","func":"var payload = { "d": { "ble": { "thistype": 0, "nbletypes": 5, \n"numberofble": 0, "uuid": "",\n"major": 0, "minor": 0,\n"measuredPower": 0, "rssi": 0,\n"accuracy": 99, \n"bletypes":"",\n"proximity": "immediate", "beaconname": "MVKEmpty", "beacontype":\n"iBeacon1", "imgurl": \n"http://www.civstats.com/images/leaders/Unknown_lg.jpg"\n }, \n"deviceIP": "9.80.236.198", "deviceMac": "acbc3296b8e3",\n"lat": 43.64517, "lng": -79.38068, "ts": 1449080914866, \n"sine": 33.34414952148453, "cos": 94.277079360197, "temparture": 41 } }\nmsg.payload = payload;\nreturn msg;","outputs":1,"noerr":0,"x":275,"y":333,"wires":[["cd779173.32887","9ab8a6c9.654758","b010bbc7.389a88"]]},{"id":"866b6401.799498","type":"inject","z":"33a55897.cc5aa8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":101,"y":317,"wires":[["7ac53547.853acc","d57775bd.2a8888"]]},{"id":"d57775bd.2a8888","type":"function","z":"33a55897.cc5aa8","name":"Global","func":"context.global.blenamelist = [];\ncontext.global.recointerval = 0\ncontext.global.tileinterval = 0\ncontext.global.oneinterval = 0","outputs":1,"noerr":0,"x":265,"y":293,"wires":[[]]},{"id":"a07926e.fc15bd8","type":"http request","z":"33a55897.cc5aa8","name":"","method":"POST","url":"https://gcm-http.googleapis.com/gcm/send","x":673,"y":400,"wires":[["cc44eb1f.903878"]]},{"id":"1a0af853.787cd8","type":"function","z":"33a55897.cc5aa8","name":"send notification","func":"var newmsg = {};\nnewmsg.headers = { 'Authorization' : 'key=AIzaSyAaUJuB_Hcq34ZmgvkMjCj0fLJTuENr-PE' };\nnewmsg.headers2 = { 'Authorization' : 'key=AIzaSyDHOfJsif3g-7zvXUyyJM1OGgShNY2nxgc' };\nnewmsg.payload = \n{\n "to" : "/topics/global",\n "data" : { "message" : "See Beacon "+msg.payload.d.ble.beaconname+" RSSI="+msg.payload.d.ble.rssi}\n};\n \nreturn newmsg;","outputs":1,"noerr":0,"x":468,"y":399,"wires":[["a07926e.fc15bd8"]]},{"id":"cc44eb1f.903878","type":"debug","z":"33a55897.cc5aa8","name":"GCM","active":true,"console":false,"complete":"payload","x":829,"y":396,"wires":[]},{"id":"91f4fed2.5a476","type":"switch","z":"33a55897.cc5aa8","name":"Name=One","property":"payload.d.ble.minor","rules":[{"t":"cont","v":"4298"}],"checkall":"true","outputs":1,"x":388,"y":1006,"wires":[["4ae73eb9.13a1e","4346fa3d.d829c4","72a79f99.8eefa"]]},{"id":"7a1b560f.c64178","type":"freeboard","z":"33a55897.cc5aa8","name":"bstatus","x":978,"y":1152,"wires":[]},{"id":"4ae73eb9.13a1e","type":"switch","z":"33a55897.cc5aa8","name":"One/Dist","property":"payload.d.ble.rssi","rules":[{"t":"gt","v":"-60"},{"t":"lt","v":"-60"}],"checkall":"true","outputs":2,"x":381,"y":1137,"wires":[["c3adef12.504d4"],["cc0bcaad.bc85a8"]]},{"id":"c3adef12.504d4","type":"function","z":"33a55897.cc5aa8","name":"statusIn","func":"msg.payload.d.ble.status="In";\nreturn msg;","outputs":1,"noerr":0,"x":644,"y":1129,"wires":[["7a1b560f.c64178","941b206.35d8ee"]]},{"id":"cc0bcaad.bc85a8","type":"function","z":"33a55897.cc5aa8","name":"statusOut","func":"msg.payload.d.ble.status="Out";\nreturn msg;","outputs":1,"noerr":0,"x":644,"y":1181,"wires":[["7a1b560f.c64178"]]},{"id":"e5cd6763.e06ba8","type":"function","z":"33a55897.cc5aa8","name":"statusLeft","func":"msg.payload.d.ble.status="Left";\nreturn msg;","outputs":1,"noerr":0,"x":829,"y":1228,"wires":[["7a1b560f.c64178","941b206.35d8ee"]]},{"id":"4346fa3d.d829c4","type":"debug","z":"33a55897.cc5aa8","name":"Ble to Freeb","active":false,"console":"false","complete":"payload","x":644,"y":1040,"wires":[]},{"id":"941b206.35d8ee","type":"debug","z":"33a55897.cc5aa8","name":"StatusToFreeb","active":false,"console":"false","complete":"payload","x":943,"y":1066,"wires":[]},{"id":"e6580f0a.a583d","type":"switch","z":"33a55897.cc5aa8","name":"RecoOne","property":"payload.d.ble.beaconname","rules":[{"t":"cont","v":"RECO"},{"t":"cont","v":"One"}],"checkall":"true","outputs":2,"x":469,"y":124,"wires":[["e9c33b50.163cc8"],["7ddf6b09.822094"]]},{"id":"72a79f99.8eefa","type":"delay","z":"33a55897.cc5aa8","name":"","pauseType":"rate","timeout":"20","timeoutUnits":"seconds","rate":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":664,"y":1227,"wires":[["e5cd6763.e06ba8"]]},{"id":"54187882.abe788","type":"e-mail","z":"33a55897.cc5aa8","server":"smtp.gmail.com","port":"465","name":"[email protected]","dname":"","x":619,"y":449,"wires":[]},{"id":"bb90c7c8.446f38","type":"inject","z":"33a55897.cc5aa8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":266,"y":450,"wires":[["f02b502.f0fd4b","5b67e856.a49818","3e9ee98a.c16116","1a0af853.787cd8"]]},{"id":"f02b502.f0fd4b","type":"function","z":"33a55897.cc5aa8","name":"email","func":"msg.payload= "See Beacon "+msg.payload.d.ble.beaconname+" RSSI="+msg.payload.d.ble.rssi;\nmsg.topic="Hello FitBit is in PI's Range";\nreturn msg;","outputs":1,"noerr":0,"x":436,"y":450,"wires":[["54187882.abe788","3276ce84.cd8932"]]},{"id":"3276ce84.cd8932","type":"debug","z":"33a55897.cc5aa8","name":"email","active":true,"console":"false","complete":"true","x":618,"y":487,"wires":[]},{"id":"f6d55a3f.092aa8","type":"twilio out","z":"33a55897.cc5aa8","service":"ext","twilio":"b193695.f4e6c98","from":"","number":"12018796475 ","name":"mvk","x":625,"y":532,"wires":[]},{"id":"5b67e856.a49818","type":"function","z":"33a55897.cc5aa8","name":"sms","func":"msg.payload="Hello Markus";\nmsg.topic="+1 201-879-6475";\nreturn msg;","outputs":1,"noerr":0,"x":436,"y":531,"wires":[["f6d55a3f.092aa8","b42ade2e.4bd52"]]},{"id":"b42ade2e.4bd52","type":"debug","z":"33a55897.cc5aa8","name":"twillio","active":true,"console":"false","complete":"true","x":625,"y":572,"wires":[]},{"id":"ff3183ed.00ce8","type":"twitter out","z":"33a55897.cc5aa8","twitter":"","name":"Tweet","x":620,"y":614,"wires":[]},{"id":"3e9ee98a.c16116","type":"function","z":"33a55897.cc5aa8","name":"twitter","func":"msg.payload="D @markusvankempen Beacon FitBit"+msg.payload.d.ble.beaconname+" close by with RSSI="+msg.payload.d.ble.rssi+" - date:" +msg.payload.d.date;\nreturn msg;","outputs":1,"noerr":0,"x":438,"y":612,"wires":[["ff3183ed.00ce8","6219b405.9de64c"]]},{"id":"6219b405.9de64c","type":"debug","z":"33a55897.cc5aa8","name":"twitter","active":true,"console":"false","complete":"true","x":620,"y":653,"wires":[]},{"id":"c194a2d.f3e6b6","type":"ibmiot in","z":"33a55897.cc5aa8","authentication":"boundService","apiKey":"","inputType":"evt","deviceId":"macbookpro","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"IBM IoT","service":"registered","allDevices":"","allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":true,"x":105,"y":35,"wires":[["90914ec9.6f6eb","efdcd315.10233"]]},{"id":"9ab8a6c9.654758","type":"freeboard","z":"33a55897.cc5aa8","name":"MacBeacons","x":649,"y":36,"wires":[]},{"id":"1d7c2431.3e576c","type":"switch","z":"33a55897.cc5aa8","name":"Filter","property":"payload.d.ble.minor","rules":[{"t":"eq","v":"4298"}],"checkall":"true","outputs":1,"x":459,"y":35.5,"wires":[["9ab8a6c9.654758","5c02bde7.f0a224"]]},{"id":"5c02bde7.f0a224","type":"debug","z":"33a55897.cc5aa8","name":"MacBeacons","active":true,"console":"false","complete":"payload","x":649,"y":76,"wires":[]},{"id":"b010bbc7.389a88","type":"freeboard","z":"33a55897.cc5aa8","name":"PiBeacons","x":822,"y":110,"wires":[]},{"id":"90914ec9.6f6eb","type":"function","z":"33a55897.cc5aa8","name":"Add Image","func":"\nvar now = ( new Date() ).getTime();\nvar time_stamp = now;\nvar range = 1;\nvar imgph= "http://cdn2.gsmarena.com/vv/bigpic/lg-nexus-4-new.jpg";\nvar imgbean = "http://iceddev.com/blog/content/images/2015/04/bean.png";\nvar imgpi = "http://ecx.images-amazon.com/images/I/51MrYF3ct0L.SX300.jpg";\nvar imgurlatv = "http://images.pocketgamer.co.uk/FCKEditorFiles//41uTXEtgjqL__SL1024_.jpg";\nvar imgreco = "http://www.smartmobilepos.com/images/reco-v.jpg";\nvar imgtile= "https://tctechcrunch2011.files.wordpress.com/2013/06/tile-hero-shot-flat.jpg?w=400";\nvar fitbit= "http://ecx.images-amazon.com/images/I/716MkCvGjKL.SL1500.jpg";\nvar imgunkown="http://www.civstats.com/images/leaders/Unknown_lg.jpg";\nvar imgti = "http://www.myweathercenter.net/wp-content/uploads/2015/03/IMG_5972-e1426969479603.jpg";\nvar imgtv = "http://pisces.bbystatic.com/image2/BestBuy_US/en_US/images/abn/2015/tvv/fo/nav/tv-ht-fo1.jpg";\nvar imgflex = "https://static0.fitbit.com/simple.b-cssdisabled-png";\nmsg.payload.d.ble.interval = 0;\nif (typeof msg.payload.d.ble.beaconname != 'undefined')\n{\nif (msg.payload.d.ble.beaconname == 'CC2650 SensorTag')\n msg.payload.d.ble.imgurl=imgti;\nif (msg.payload.d.ble.beaconname.indexOf('TV') >-1)\n msg.payload.d.ble.imgurl=imgtv;\nif (msg.payload.d.ble.beaconname == 'Apple TV')\n msg.payload.d.ble.imgurl=imgurlatv;\n\nelse if (msg.payload.d.ble.beaconname == 'RECO')\n{\n msg.payload.d.ble.imgurl=imgreco;\n if (msg.payload.d.ble.minor == 4298)\n if(context.global.recointerval == 0 )\n {\n context.global.recointerval = msg.payload.d.ts;\n }else{\n msg.payload.d.ble.interval = msg.payload.d.ts - context.global.recointerval ;\n //msg.payload.d.ble.pinterval = msg.payload.d.ts - msg.payload.d.ble.interval ;\n context.global.recointerval = now;\n }\n\n\n}else if (msg.payload.d.ble.beaconname == 'One')\n{ msg.payload.d.ble.imgurl=fitbit;\n if(context.global.oneinterval == 0)\n {\n context.global.oneinterval = msg.payload.d.ts;\n }else{\n msg.payload.d.ble.interval = msg.payload.d.ts - context.global.oneinterval ;\n //msg.payload.d.ble.pinterval = msg.payload.d.ts - msg.payload.d.ble.interval ;\n context.global.oneinterval = now;\n }\n\n}else if (msg.payload.d.ble.beaconname == 'Tile')\n{ msg.payload.d.ble.imgurl=imgtile;\n\n if(context.global.tileinterval == 0)\n {\n context.global.tileinterval = now;\n }else{\n msg.payload.d.ble.interval = msg.payload.d.ts - context.global.tileinterval ;\n context.global.tileinterval = now;\n }\n\n}\nelse if (msg.payload.d.ble.beaconname.indexOf('Flex') > -1)\n msg.payload.d.ble.imgurl=imgflex;\nelse if (msg.payload.d.ble.beaconname == 'Unknown')\n msg.payload.d.ble.imgurl=imgunkown;\nelse if (msg.payload.d.ble.beaconname == 'raspberrypi-0')\n msg.payload.d.ble.imgurl=imgpi;\nelse if (msg.payload.d.ble.beaconname == 'Bean')\n msg.payload.d.ble.imgurl=imgbean;\nelse if (msg.payload.d.ble.beaconname == 'MVKPhone')\n msg.payload.d.ble.imgurl=imgph;\n \n}else{\n msg.payload.d.ble.beaconname == 'Unknown'\n msg.payload.d.ble.imgurl=imgunkown;\n}\n\nif (msg.payload.d.ble.accuracy < 0.62)\n msg.payload.d.ble.inrange=range;\nelse\n msg.payload.d.ble.inrange=range-1;\n\n//if (typeof(context.global.blenamelist) == 'undefined')\n //context.global.blenamelist=[];\n\n if (msg.payload.d.ble.bletypes.indexOf(msg.payload.d.ble.beaconname) == -1) {\n msg.payload.d.ble.bletypes.push(msg.payload.d.ble.beaconname);\n //msg.payload.d.ble.blenamelist=context.global.blenamelist;\n\n }else{\n // $scope.todo is already in the $scope.todos array, alert the user\n }\n \n/* if (msg.playload.d.mystatus != "Entered" || msg.playload.d.mystatus != "Dwelling" )\n {\n msg.payload.d.ble.imgurlroaming=imgunkown;\n }else{\n msg.payload.d.ble.imgurlroaming=msg.payload.d.ble.imgurl;\n }*/\nmsg.payload.d.date = new Date(now)\nreturn msg;\n","outputs":1,"noerr":0,"x":277,"y":35,"wires":[["1d7c2431.3e576c"]]},{"id":"efdcd315.10233","type":"debug","z":"33a55897.cc5aa8","name":"MacIncoming","active":false,"console":"false","complete":"payload","x":285,"y":79,"wires":[]},{"id":"59fa64c1.a6059c","type":"debug","z":"33a55897.cc5aa8","name":"PiRoaming","active":true,"console":"false","complete":"payload","x":830,"y":152,"wires":[]},{"id":"7ddf6b09.822094","type":"switch","z":"33a55897.cc5aa8","name":"fitbit","property":"payload.d.ble.rssi","rules":[{"t":"gt","v":"-60"}],"checkall":"true","outputs":1,"x":637,"y":161,"wires":[["59fa64c1.a6059c"]]},{"id":"23772997.dc88d6","type":"delay","z":"33a55897.cc5aa8","name":"","pauseType":"rate","timeout":"20","timeoutUnits":"minutes","rate":"20","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":667,"y":270,"wires":[["1a0af853.787cd8","f02b502.f0fd4b"]]},{"id":"e9c33b50.163cc8","type":"switch","z":"33a55897.cc5aa8","name":"Rico 4298","property":"payload.d.ble.minor","rules":[{"t":"eq","v":"4298"}],"checkall":"true","outputs":1,"x":642,"y":122,"wires":[["b010bbc7.389a88","59fa64c1.a6059c"]]},{"id":"431f6ff5.bce09","type":"switch","z":"33a55897.cc5aa8","name":"Unknown","property":"payload.d.ble.beaconname","rules":[{"t":"cont","v":"Unknown"},{"t":"else"}],"checkall":"true","outputs":2,"x":469,"y":160,"wires":[[],["cd779173.32887"]]}]

beacons's People

Contributors

markusvankempen avatar

Watchers

James Cloos avatar Rodolfo Lomascolo avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.