A MEAN Hackathon

I'm preparing to do some simple MongoDB hackathons in Scandinavia, and because I don't want to forget how to do all the steps, I actually wrote down an example exercise. This is a simple and fun exercise just to get some data into MongoDB and then get it out again. We're going to use some awesome JavaScript tools for the out part: Node.js and Crest for a simple HTTP API, and Angular.js to draw the pretty pictures. So this is not just a MongoDB hackathon but more like a fullstack JavaScript or MEAN hackathon. (Strictly speaking there's no Express.js, so maybe this is a NMCA hackathon?)

Install MongoDB

The usual apt, yum and brew methods will work for this tutorial. If you're not fully committed to MongoDB just yet, you can also download the zip file, unpack it and just run:

bin/mongod --dbpath .

The fine manual has the details.

Get some data

This is the fun part, and I encourage you to Bring Your Own Data. Here are just some examples of open data sets that work well for this kind of tutorial:

etc... For this example, I've used the first table in the excel file found here: https://www.hri.fi/fi/data/helsingin-ja-helsingin-seudun-vaestoennuste-… (I've attached it to this blog post in CSV format for your convenience.)

Getting data into MongoDB

This will be different depending on the data you want to insert. If you have a file that is comma separated (csv), tab separated (tsv) or json, then you are in luck, because mongoimport is an easy way to feed it into MongoDB:

mongoimport --headerline --type tsv --db hackathon --collection hki2050 hki2050.csv

Check that data is in MongoDB

$ mongo hackathon
MongoDB shell version: 2.6.4
connecting to: hackathon
sputnik-rs:PRIMARY> db.hki2050.find().pretty()
	"_id" : ObjectId("53edc731a3ba2c0df4ad9847"),
	"Vuosi" : 2014,
	"Väestö" : 612664,
	"0-14" : 84154,
	"0-14 %" : 13.7,
	"15-29" : 135934,
	"15-29 %" : 22.2,
	"30-44" : 139432,
	"30-44 %" : 22.8,
	"45-59" : 119136,
	"45-59 %" : 19.5,
	"60-74" : 92241,
	"60-74 %" : 15.1,
	"75+" : 41767,
	"75+ %" : 6.8

Install Node.js

To install Node, once again you'll be fine for this exercise just installing whatever is in your apt, yum or brew repository. Another popular way to install node, and to get the guaranteed latest version is using this shell script. It will install Node and NPM under ~/local/.

...and install Crest

You can install Crest as an NPM module (See README) but in this exercise we will use my own fork from github. The standard Crest doesn't support using aggregation queries, so I've added them to my own fork. Hopefully one day they will be supported.

git clone https://github.com/henrikingo/crest.git
cd crest
npm install # Install modules listed in package.json

(Note, if you are using anything else than the above forked Crest repo, you need to check or remove the username and password lines from config.json.)

Test the HTTP API

The last command above should have started a Crest server on localhost:3500. Now if you go with a browser to https://localhost:3500/hackathon/hki2050 (Replace "hackathon" and "hki2050" with your own db name and collection name.) ...you will see the collection we imported above. Crest modifies the MongoDB "_id" fields to just "id" and also converts the ObjectId() to just strings. You can use these id values in the GET request url. For example, one of my documents has the id "53edc731a3ba2c0df4ad9847". So I can open this in my browser: https://localhost:3500/hackathon/hki2050/53edc731a3ba2c0df4ad9847 which gives me my first line of population statistics as a json document:

 "0-14 %":13.7,
 "15-29 %":22.2,
 "30-44 %":22.8,
 "45-59 %":19.5,
 "60-74 %":15.1,
 "75+ %":6.8,

(Linebreaks added, the browser has just one line.)

Angular.js with d3.js graphs

With our open dataset available over a HTTP REST API, it's time for the pretty pictures! For simplicity, we do not download or install any of these JS libraries, we just link directly to where they were born. There's a gotcha: When combining Angular and D3, you need to go with the D3 library first. So we'll add that to the html head:

<link href="https://nvd3.org//assets/css/nv.d3.css" rel="stylesheet" />
<script src="https://nvd3.org//assets/lib/d3.v3.js"></script>
<script src="https://nvd3.org//assets/js/nv.d3.js"></script>

Then Angular:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.js"></script>

Then the ring to bind them together. Yes, there is an Angular module which wraps the cool D3.js graphing library into Angular directives. It is called, well, angularjs-nvd3-directives.

<script src="https://cmaurer.github.io/angularjs-nvd3-directives/

(The above is a single line, delete the line break.)

First Angular code

Great, we're ready to go. Add one more script tag to point to your own js file.

<script src="hackathon.js"></script>

We will introduce the client side code in 5 steps. At first, let's just see that Angular works. Create a simple Hello World Angular app:

Angular step 1: Hello World

var app = angular.module('hackathonApp', []);
app.controller('HackathonCtrl', function($scope) {
  $scope.audience = "World";

As this is a quick hackathon, I'm not gonna rant about everything the above does. Read a good Angular.js tutorial to learn more about apps, controllers, models, views and data binding. Then make following changes to our HTML:

<html ng-app="hackathonApp">
<body ng-controller="HackathonCtrl">
  <p>Hello {{audience}}!


</body> </html> As you can see, Angular works by introducing its own attributes into the HTML elements (body and html above, we'll use more soon) as well as using {{curly bracketed tags}} for dynamic values.

Angular step 2: Show some real data

Now, let's try to actually show some json data. As a first step, justcopy paste a few documents from MongoDB into your javascript code. Minw looks like:

var testdata = [{"Vuosi":2014,"Väestö":612664,"0-14":84154,"0-14 %":13.7,
"15-29":135934,"15-29 %":22.2,"30-44":139432,"30-44 %":22.8,"45-59":119136,
"45-59 %":19.5,"60-74":92241,"60-74 %":15.1,"75+":41767,"75+ %":6.8,
{"Vuosi":2015,"Väestö":621771,"0-14":86251,"0-14 %":13.9,"15-29":136493,
"15-29 %":22,"30-44":143233,"30-44 %":23,"45-59":119273,"45-59 %":19.2,
"60-74":93649,"60-74 %":15.1,"75+":42871,"75+ %":6.9,"id":"53edc731a3ba2c0df4ad9848"},
{"Vuosi":2016,"Väestö":631053,"0-14":88392,"0-14 %":14,"15-29":137157,"15-29 %":21.7,
"30-44":147175,"30-44 %":23.3,"45-59":119277,"45-59 %":18.9,"60-74":95526,
"60-74 %":15.1,"75+":43527,"75+ %":6.9,"id":"53edc731a3ba2c0df4ad9849"},
{"Vuosi":2017,"Väestö":637597,"0-14":90388,"0-14 %":14.2,"15-29":136537,
"15-29 %":21.4,"30-44":150232,"30-44 %":23.6,"45-59":118846,"45-59 %":18.6,
"60-74":96157,"60-74 %":15.1,"75+":45437,"75+ %":7.1,"id":"53edc731a3ba2c0df4ad984a"}];

Then change the controller code to:

var app = angular.module('hackathonApp', []);
app.controller('HackathonCtrl', function($scope, $http) {
  $scope.results = testdata;
  $scope.keys = Object.keys($scope.results[0]);

We can now use the variables results and keys to print the above data in simple tabular form in HTML:

  <table border="1">
      <td ng-repeat="key in keys">{{key}}</td>
    <tr ng-repeat="doc in results">
      <td ng-repeat="key in keys">{{doc[key]}}</td>

This should print the first few lines of a HTML table with your data.

Angular step 3: fetching data with $http service

If you got as far as the above, it's time to plug the client into the real data source coming from the HTTP REST API. It's as simple as:

var app = angular.module('hackathonApp', []);
app.controller('HackathonCtrl', function($scope, $http) {
     function(data, status, headers, config) {
       $scope.results = data;
       $scope.keys = Object.keys($scope.results[0]);

Note that you need to add $http into the function arguments!

Interlude: enjoy what you've achieved so far!

Before the grande finale, now is a good time to take a step back and enjoy the great progress you've made so far. You've used several contemporary and cool technologies to:

  1. Download an Excel table (in this example, from Helsinki Region Infosharing web site)
  2. convert it to csv
  3. convert that to json
  4. import it to MongoDB
  5. export it over HTTP REST interface (with Node)
  6. fetch data into the web browser with Angular
  7. Print it as a HTML table

In other words, you've used lots of fancy technology, to convert a data table that was formerly available in table format on the internet, and made it available in table format on the internet!

Angular/D3 step 4: Some data massaging

Nvd3 expects data in this format:

[ { "key" : "Series 1",
    "values" : [ [x1, y1], [x2, y2], ... ]
  {  "key" : "Series 2",
     "values" : ...

It's likely that your data isn't exactly in that format. There are multiple ways you could fix that:

  • Use MongoDB aggregation framework to output result sets in the needed format
  • Add some middleware code to the Crest HTTP API to transform the data into the needed format. (Possibly in combination with using aggregation framework.)
  • There are some hooks in Nvd3 that could be used to adapt to data that has another structure. (But I have no idea how to use them.)
  • You could just write a little javascript function into the Angular controller to massage the data into the needed structure.

For a quick hack, I'll of course do the last one:

// Need to convert HTTP data to what nvd3-chart-directives expects:
// [ { key : "Series 1", values : ...}, { key : "Series 2", values : ... }, ... ]
function convertHttpToNvd3(data){
  var res = [{ "key" : "0-14", "values" : []}, 
             { "key" : "15-29", "values" : []}, 
             { "key" : "30-44", "values" : []}, 
             { "key" : "45-59", "values" : []}, 
             { "key" : "60-74", "values" : []}, 
             { "key" : "75+", "values" : []} ];
  for(doc in data){
    res[0]["values"].push( [ data[doc]["Vuosi"],  data[doc]["0-14"] ] );
    res[1]["values"].push( [ data[doc]["Vuosi"], data[doc]["15-29"] ] );
    res[2]["values"].push( [ data[doc]["Vuosi"], data[doc]["30-44"] ] );
    res[3]["values"].push( [ data[doc]["Vuosi"], data[doc]["45-59"] ] );
    res[4]["values"].push( [ data[doc]["Vuosi"], data[doc]["60-74"] ] );
    res[5]["values"].push( [ data[doc]["Vuosi"],   data[doc]["75+"] ] );
  return res;

Then I just call that before binding the data:

     function(data, status, headers, config) {     
       data = convertHttpToNvd3(data);          
       $scope.results = data;

(Note that the table output stops working at this point. I used console.log() to check that my data ended up in the intended structure.)

Angular step 5: the pretty pictures!

Finally, it's time for some fancy graphics to make this look a bit more awesome! It depends on the data you're using, but for my data I want to use a stacked area chart. This is why I love the angularjs-nvd3-directives bindings. As long as I can get my data, and have it in the right structure, I just add another directive. The graph is interactive, you can drill into it, get nice tooltips with additional data, etc. It's like HTML was extended and I don't need to write a single line of code! I haven't been this excited since they invented the <BLINK> tag!!!!! To use the NVD3 angular components, we must inject nvd3ChartDirectives as a dependency into the angular app:

var app = angular.module('hackathonApp', ['nvd3ChartDirectives']);

Then add a suitable graph to the html page:

            noData="Couldn't fetch the data"

(See above link for explanations of the attributes.) Screenshot of the resulting Nvd3 graph

Приветствую Вас дамы и господа!
Нам будет приятно видеть у нас на сайте

Мы знаем потребности наших клиентов, которые хотят заказать адаптивный сайт. Когда вы обратитесь к нам, то получите именно тот инструмент, который максимально будет соответствовать специфике вашего бизнеса. Мы готовы выполнить качественно любой проект, не важно это будет landing page или большой интернет магазин. Зачем нужен веб-ресурс, если о нем никто не знает и он не приносит деньги? Наши эксперты владеют эффективными технологиями привлечения потенциальных клиентов из поисковых систем. То есть на ваш интернет-ресурс придут посетители, которым действительно интересен ваш товар!
Наша контора занимается свыше 10 лет ремонтом и обслуживанием оргтехники в городе Минске.
Всегда рады помочь Вам!С уважением,ТЕХНОСЕРВИC

Доброго времени суток господа!

Есть такой замечательный сайт для заказа услуг стоматологии в Минске.К вашим услугам лучшие стоматологи Минска с многолетним стажем.
Перед нами поставлена амбициозная задача: создать самую лучшую стоматологическую службу в Беларуси. И с каждым днем мы приближаемся к своей цели.Последние десять лет наблюдается большой спрос на оказание стоматологических услуг – только в одном Минске сегодня действует около двухсот зубных клиник и частных кабинетов. Наличие огромной конкуренции привело к тому, что Дентистри отвечает самым высоким стандартам качества.Мы уделяем большое внимание профессиональному развитию команды, для чего регулярно направляем сотрудников на обучение и мастер-классы как в Беларуси, так и за рубежом. Хирурги и ортопеды успешно прошли необходимое обучение и имеют допуски к осуществлению одномоментной имплантации и применению систем All-on-4 и All-on-6. Все доктора и медицинские сестры имеют первую квалификационную категорию.Выделим три наиболее важных:Специализация на решении сложнейших клинических случаев имплантации и протезирования.Принятая к исполнению политика качества и внедрение аналитических инструментов позволяет нам спрогнозировать возможные риски и принять наиболее оптимальный вариант. Многие наши Клиенты рассказывали, что по своему месту жительства им просто отказывали в лечении!Демократичная ценовая политика.Мы грамотно оптимизировали рабочий процесс и снизили затраты. У нас единый прейскурант вне зависимости от гражданства пациента;Гарантийная поддержка пациентов.На медицинские услуги предоставляются широкие гарантии. В случае наступления гарантийного случая все работы будут проведены бесплатно.За последние два года мы стали реальными лидерами в организации и проведении стоматологического лечения. Мы приняли пациентов из России, Казахстана, Украины, Литвы, Латвии, Эстонии, Польши, Германии, Швеции, Финляндии, Израиля, США, Канады, Австралии и еще десятка государств. Кроме того, к нам обращаются и со всех уголков Беларуси.По результатам проведенного в ноябре-декабре 2018 года опроса пациентов получили великолепную оценку работы: 96,4% респондентов поставили нам высшую оценку. Большое вам спасибо за доверие!самостоятельно оказывает сервисные услуги по организации лечения “под ключ”: дистанционные бесплатные консультации, трансферы, прохождение дополнительного медицинского обследования в Минске.формируем положительный имидж белорусской стоматологии и медицинской отрасли в целом. Мы открыты всему миру.Популярные стоматологические услуги в Беларуси.Самой популярной стоматологической услугой, несомненно, является имплантация зубов. Благодаря высокому качеству работ, гарантии положительного результата мы заслужили уважение и отличную репутацию среди Клиентов.Мы работаем с линейкой имплантов Megagen, Noris, а также системой премиум-уровня Straumann и Nobel. В нашем распоряжении собственные зуботехническая лаборатория и рентген-кабинет с компьютерным томографом последнего поколения.
От всей души Вам всех благ!

Приветствую Вас друзья!

Предлагаем Вашему вниманию сервис оргтехники и продажу расходников для дома и офиса.Наша организация «КОПИМЕДИАГРУПП» работает 10 лет на рынке этой продукции в Беларуси.В сервисном центре клиенты могут заправить картридж сертифицированным совместимым тонером. Мастера проводят перезаправку картриджей лазерных устройств и струйных со встроенной СНПЧ. В случае необходимости можно сделать перепрошивку или замену чипа, благодаря которым пользователи смогут перезаправлять новые чернила практически неограниченное количество раз.Заправка картриджей для принтера обязательно включает проверку состояния комплектующих, в числе которых фотобарабан, вал первичного заряда, ракель, магнитный вал и другие запчасти. При необходимости неисправные или изношенные детали заменяются на новые. На замену стандартным – специалисты могут установить перезаправляемые картриджи.В список предоставляемых услуг входит ремонт и восстановление техники:лазерных и струйных принтеров;МФУ;копировальных аппаратов;факсов;плоттеров.Высокая квалификация специалистов и наличие профильного инструмента позволяют проводить точную диагностику и устранять неисправности абсолютно любого характера.Для устройств Samsung и Xerox проводится перепрошивка. Установка нового программного обеспечения снимает блокировку на заправку оригинальных и установку совместимых картриджей.Как заказать заправку картриджей

Приветствую Вас дамы и господа!

Предлагаем Вашему вниманию замечательный сайт для заказа услуг стоматологии в Минске.К вашим услугам лучшие стоматологи Минска с многолетним стажем.
В случаях, когда терапевтическая стоматология бессильна, приходится прибегать к хирургической. А если зубосохраняющие операции не принесут результата, прибегают к удалению зуба.Необходимость вырвать зуб возникает при:полном или сильном разрушении кариесом;наличии кисты;острых формах периодонтита;количестве зубов выше нормы;неправильном расположении в десне — актуально для зубов мудрости, нередко растущих перпендикулярно основному зубному ряду;установке брекет-системы или зубного протеза;физическом травмировании, смещении в десне, невозможности восстановительной операции.Рекомендации после удаления.После операции в десне остается открытая лунка, на которую иногда накладываются швы. Нежелательно касаться лунки языком, дав сформироваться кровяному сгустку. По той же причине рекомендуется не принимать пищу на протяжении 3-4 часов после посещения стоматолога. Необходимо некоторое время воздерживаться от горячей еды и напитков, а также алкоголя. Несоблюдение рекомендации приведет к увеличению периода заживления и болезненным ощущениям.Качественно и безопасно вырвать зуб в Минске можно платно. Цена удаления зуба в стоматологии зависит от количества корней, расположения, сложности удаления. Операция проводится квалифицированными хирургами-стоматологами.
От всей души Вам всех благ!

Добрый день дамы и господа!
Предлагаем Вашему вниманию высококачественные профессиональные плёнки. Наша организация работает 15 лет на рынке этой продукции в Беларуси. С помощью оконных пленок мы превращаем хрупкое стекло в новый строительный материал, сочетающий такие свойства как прочность, термоизоляцию, солнцезащиту и современный внешний вид. Высокое качество тонировочных, защитных, декоративных и солнцезащитных пленок позволяет нам давать заказчикам и партнерам гарантии долговечности и надежности. Тонировка стекла и окон позволяет дозировать свет и солнечную энергию — в помещении, находящемся под защитой тонированного стекла, сохраняется оптимальная температура. С помощью оконных пленок можно воплотить в жизнь любую архитектурную идею.

Цены на покупку диплома могут сильно варьироваться в зависимости от уровня образования,
специальности и страны, в которой был выдан диплом. Обычно цена за покупку диплома колеблется от нескольких сотен до нескольких тысяч долларов. Однако следует помнить, что покупка диплома является незаконной и может иметь серьезные последствия, включая уголовную ответственность.
Рекомендуется получить диплом легальным путем мы вам помежем получить диплоиы такие как
<a href=https://russdiplomik.com/kupit-diplom-v-bryanske.html>купить реальный диплом о высшем образовании</a> через обучение в учебном заведении.



Доброго времени суток друзья!

Вопрос об изготовление ритуальных памятников, не терпит спешки. В основном надгробия устанавливаются через год после похорон. По христианским обычаям, изначально, ставят железный или деревянный крест. Существует старое поверие, что усопшие на том свете, носят крест на себе, пока очищается душа. И ноша памятника для них сложна и тяжела. Поэтому и не стоит сразу спешить с этим моментом.Ближе к годовщине стоит подумать и заказать памятник. Существует несколько видов надгробий. Наиболее распространенные тип – стела. Она ставится на могилах различных религий и вероисповеданий, где предусматривается погребение в землю. Также зачастую устанавливают плиты и кресты. По сути все зависит от вашего выбора, завещания усопшего, финансовой возможности, а также традиций, которые существуют в роду. Когда вы в плотную подойдете к вопросу заказать памятник в Калининграде, обращайтесь к нам.
Наша фирма занимается свыше 10 лет ритуальными услугами в городе Калиниграде.Вот что мы можем предложить вам:

Здравствуйте дамы и господа!

Предлагаем Вашему вниманию замечательный сайт для заказа услуг стоматологии в Минске.К вашим услугам лучшие стоматологи Минска с многолетним стажем.
Хотите отбелить зубы, поставить пломбу или установить протез? Ищете стоматологию в Минске, где уровень услуг оправдывает цену? Частная клиника предложит полный комплекс стоматологических услуг: от профилактической гигиены до имплантации.Какие услуги мы предлагаем?Терапевтическое лечение. Вылечим кариес, корневые каналы, некариозные поражения, устраним гиперчувствительность зубов, выполним эстетическую реставрацию и восстановим зубы.Профгигиена. Удалим зубной камень и мягкий налет, отполируем зубы и покроем фтор-лаком. Используем аппарат Air-Flow.Протезирование. Подберем вид протезирования, установим съемные и несъемные протезы.Хирургия. Удалим больной зуб, установим импланты.Пародонтология. Устраним кровоточивость десен, удалим зубной камень и налет из пародонтальных карманов.Также у нас вы можете безопасно отбелить зубы. Врач подберет один из способов:офисное отбеливание.Используем систему фотоотбеливания Beyond Polus. Всего 1 час в кресле стоматолога – и вы получите красивую улыбку без боли и вреда для эмали;домашнее отбеливание.Изготавливаем персональные каппы по слепку челюстных дуг, чтобы отбеливание не создавало дискомфорта. Каппы достаточно носить дома 6-8 часов.Записаться на прием просто: оставляйте заявку онлайн, по телефону или заказывайте звонок. Перезвоним, ответим на вопросы и подберем удобное время приема.На консультации врач осмотрит ротовую полость, определит проблему, составит план лечения и сориентирует по стоимости. Цена первичной консультации врача-стоматолога – от 6 рублей, последующие – бесплатно.Прием ведут стоматологи первой категории со стажем более 10 лет. Врачи и медперсонал регулярно повышают квалификацию и посещают профильные семинары. У нас работают стоматологи разных направлений: терапевт, ортодонт, хирург, ортопед. Пользуйтесь услугами и оцените наши плюсы:большинство процедур в рамках клиники. Делаем рентген-диагностику, имплантацию и другие процедуры на собственном оборудовании;гарантии. Даем гарантию на работу врачей-стоматологов;забота о клиентах. Подбираем удобное время приема и напоминаем о дне и времени накануне посещения.Записывайтесь на прием в нашу стоматологическую клинику! Регулярно проводим бесплатные профосмотры для детей и взрослых. Позаботьтесь о здоровье зубов сейчас, чтобы не тратиться на лечение в будущем.

Add new comment

The content of this field is kept private and will not be shown publicly. Cookie & Privacy Policy
  • No HTML tags allowed.
  • External and mailto links in content links have an icon.
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.
  • Use [fn]...[/fn] (or <fn>...</fn>) to insert automatically numbered footnotes.
  • Each email address will be obfuscated in a human readable fashion or, if JavaScript is enabled, replaced with a spam resistent clickable link. Email addresses will get the default web form unless specified. If replacement text (a persons name) is required a webform is also required. Separate each part with the "|" pipe symbol. Replace spaces in names with "_".
About the bookAbout this siteAcademicAccordAmazonBeginnersBooksBuildBotBusiness modelsbzrCassandraCloudcloud computingclsCommunitycommunityleadershipsummitConsistencycoodiaryCopyrightCreative CommonscssDatabasesdataminingDatastaxDevOpsDistributed ConsensusDrizzleDrupalEconomyelectronEthicsEurovisionFacebookFrosconFunnyGaleraGISgithubGnomeGovernanceHandlerSocketHigh AvailabilityimpressionistimpressjsInkscapeInternetJavaScriptjsonKDEKubuntuLicensingLinuxMaidanMaker cultureMariaDBmarkdownMEAN stackMepSQLMicrosoftMobileMongoDBMontyProgramMusicMySQLMySQL ClusterNerdsNodeNoSQLodbaOpen ContentOpen SourceOpenSQLCampOracleOSConPAMPPatentsPerconaperformancePersonalPhilosophyPHPPiratesPlanetDrupalPoliticsPostgreSQLPresalespresentationsPress releasesProgrammingRed HatReplicationSeveralninesSillySkySQLSolonStartupsSunSybaseSymbiansysbenchtalksTechnicalTechnologyThe making ofTransactionsTungstenTwitterUbuntuvolcanoWeb2.0WikipediaWork from HomexmlYouTube


Recent blog posts

Recent comments