lucrul la propriul produs digital sau maturizarea unei companii de IT

Lucrul la propriul produs digital sau maturizarea unei companii de IT

Mă preocupă de ceva vreme subiectul produselor digitale/online proprii și cred cu tărie că viitorul IntelligentBee depinde semnificativ de acesta. Deși noi am pornit la drum drept o companie de servicii și outsourcing, am integrat dezvoltarea de produse proprii în viziunea și misiunea companiei.  Progresele noastre în această direcție s-au concretizat o dată cu înființarea propriei noastre echipei de Product.

Cât despre oportunitățile celor din industria IT locală în contextul dat, acestea sunt surprinse în detaliu în interviul de mai jos, pe care îl redau în întregime:

 

Dat fiind întregul proces de globalizare tehnologică, tot mai multe companii software își îndreaptă atenția spre dezvoltarea de produse online in-house, diferențiindu-se astfel de competitori. În acest context, tot mai mulți oameni de online doresc să contribuie la această diferențiere, doresc să își pună amprenta asupra pieței. De aceea, una dintre cele mai pregnante dileme cu care se confruntă cei care au reușit să bifeze întreaga listă de cunoștințe și abilități posibile în cariera lor, este: Și acum ce urmează?

Pentru a-i ajuta în elucidarea acestei dileme, am vorbit cu Costi Teleman, CEO IntelligentBee, companie IT ieșeană, aflând astfel o serie de insight-uri utile.

Costi, ne poți spune de ce apare această dilemă în rândul persoanelor cu o experiență îndelungată în digital?

În general, cariera unor astfel de persoane este construită într-un continuu curs ascendent. Au parte de posibilități nenumărate de a învăța, sunt ghidate de persoane experimentate în arii specifice, parcurg o ierarhie bine stabilită, se bucură de siguranță financiară și beneficii de recreere. Dar apare și un moment în care consideră că sunt capabile să se implice într-un proiect asupra căruia își pot pune semnificativ amprenta. Unul de care să fie responsabile în totalitate și în care fiecare zi de muncă să fie o aventură.

De aceea, tot mai mulți oameni de online, atât experimentați, cât și începători, își doresc să fie parte a unui start-up cu o viziune de business pe termen lung ce include dezvoltarea propriilor produse digitale, în detrimentul companiilor bine stabilite pe piață.

Ce perspectivă profesională ar avea ele în acest caz?

Pentru cei care simt că au atins punctul culminant în carieră și doresc să își folosească abilitățile pentru a dezvolta un proiect care va aduce un aport important pe piața tehnologiilor web, e important să știe că tot mai multe companii hotărăsc schimbarea direcției de business și își dezvoltă propriile produse digitale.

Care ar fi avantajele unui astfel de business?

Avantajele implicării într-o astfel de echipă sunt multiple.

În primul rând, există mari șanse ca nimeni din acea echipă să nu aibă cunoștințele tale, expertiza pe care ai dobândit-o sau modul în care gândești. Așadar, vei aduce un aport semnificativ atât în dezvoltarea produsului respectiv, cât și a echipei cu care lucrezi, pentru că împreună sunteți responsabili de succesul acestuia. Pe unii, această situație i-ar putea speria. Dar pentru alții, nu poate exista o motivație mai puternică. În special, pentru cei ce își doresc să împărtășească din cunoștințele lor și pentru care viața lor profesională capătă sens atunci când reușesc să formeze oameni.

De asemenea, ca membru a unei astfel de echipe, ești un inițiator pentru industria IT prin produsele dezvoltate. Această poziție îți va permite să dezvolți un produs cu un timp de execuție mai redus, să livrezi bazându-te exact pe ceea ce știi să faci, dar și să înveți noi principii în ceea ce privește produsele digitale și consumatorii cărora li se adresează.

Mai mult, vei realiza acel tip de activități pe care erai atât de nerăbdător să le începi, cele prin care îți poți pune amprenta în mediul digital pe termen lung. Pentru acest ultim tip de activități ești dispus să faci compromisuri, să îți sacrifici un weekend sau să faci un sprint de lucru mai îndelungat pentru a vedea rezultatele dorite.

Unde ar putea fi găsite astfel de echipe?

Cea mai des întâlnită opțiune pentru a găsi compania ce poate oferi provocări de acest gen ar fi părăsirea orașului sau a țării. Dar acum, oamenii de online din Iași, dar și din restul orașelor Moldovei, au șansa de a rămâne acasă deoarece companiile software ieșene au început să-și dezvolte echipe de Product Development. Și IntelligentBee se numără printre acestea. Până în acest moment am dezvoltat o serie de produse proprii și dorim în continuare să oferim pasionaților de digital șansa de a-și pune amprenta asupra pieței prin skill-urile lor.

Ne poți spune mai multe despre IntelligentBee?

IntelligentBee este o companie de outsourced software development & technical support din Iași. Oferim, de mai bine de 7 ani, echipe dedicate de engineering și suport tehnic care reușesc să se alinieze rapid la obiectivele de business ale clienților, devenind o extensie a departamentelor interne a acestora.

În plus, am integrat dezvoltarea propriilor produse digitale atât în misiunea companiei, cât şi în viziunea noastră pe termen lung. Astfel, IntelligentBee a construit propriul departament de Product. Este format din oameni ce nu mai doresc să “joace” în siguranță, ci doresc să se facă remarcați prin produsele digitale construite. Dorința acestui departament e aceea ca produsele pe care le realizează să adauge valoare industriei din care fac parte.

Dar, viziunea pe termen lung a companiei nu include strict doar acest departament de Product, ci și creșterea industriei IT prin produsele pe care le va dezvolta.

Cum ai descrie echipa de Product IntelligentBee?

În primul rând, echipa de Product, la fel ca întreaga companie, este construită din oameni buni în ceea ce fac, stăpâni pe know-how-ul lor, capabili să livreze încă din prima zi. La aceasta se mai adaugă și cele 4 valori după care ne ghidăm activitatea, cei 4H, cum ne place să le numim: Honest, Happy, Humble and Hungry.

Astfel, echipele IntelligentBee sunt formate din oameni deschiși, sinceri, ce își recunosc greșelile, își asumă responsabilități și oferă mereu feedback constructiv. Aceștia acceptă fiecare provocare și sărbătoresc orice reușită. Sunt adevărați jucători de echipă, reușind să înțeleagă fiecare perspectivă și dorind să fie mai buni în ceea ce fac, zi de zi. Mai mult, sunt avizi după cunoaștere, fiind în permanență în căutarea de lucruri noi pe care le-ar putea învăța.

Ce avantaje pot găsi cei interesați în a lucra în astfel de echipe de Product?

  • Își vor dezvolta abilitățile de coordonare
  • Vor lucra cu o echipa care înțelege pe deplin întregul proces tehnic de dezvoltare a produsului
  • Vor lucra pentru un proiect în care calitatea primează în detrimentul limitărilor temporale
  • Posibilitatea de a-și expune propriile idei și perspective asupra procesului de dezvoltare a produsului și asupra tehnologiilor folosite
  • Libertate de decizie în ceea ce privește procesul de dezvoltare a produsului
  • Pot dezvolta un produs prin care își pot pune amprenta asupra pieței
  • Posibilitatea de a lansa idei inovatoare în echipa din care face parte
  • Vor fi implicați într-un segment al pieței în dezvoltare și se vor număra printre puținii care fac acest lucru în Iași: dezvoltarea propriilor produse digitale
  • Vor face parte dintr-o cultură organizațională în care eficiența proceselor se îmbină cu sentimentul de familie
  • Nu vor lucra pentru noi, ci vor lucra alături de noi pentru dezvoltarea propriilor produse digitale

În concluzie, ce fel de specialiști caută IntelligentBee pentru echipa sa de Product?

Eu cred că orice companie care a decis să investească în produse proprii caută asta, nu doar IntelligentBee. Dar dacă e să vorbim de noi, căutam atât oameni pentru execuția produselor pe care dorim să le dezvoltăm, cât și oameni cu know-how-ul necesar în promovarea acestora. În principiu, oameni dispuși să iasă din zona lor de confort și care doresc să își pună amprenta în piața digital.

 

Tu ai lucra alături de o echipă compactă pentru propriile produse digitale, în detrimentul unei companii multinaționale? De ce?

Aș fi bucuros dacă mi-ai da mai multe detalii despre preferințele tale profesionale. Iar dacă ai curiozități sau nelămuriri, lasă un comentariu și voi încerca să răspund la ele cât de rapid posibil.


Golang Guide: A List of Top Golang Frameworks, IDEs & Tools

Golang Guide: A List of Top Golang Frameworks, IDEs & Tools

Since its introduction, Google’s Go Programming Language (Golang) has been experiencing an increasing popularity among mainstream users. In a December 2016 survey, 89% of the 3,595 respondents claimed that they program in Go at work or outside of work.

Additionally, Go ranks highest among the programming languages in terms of expertise and preference. This July 2017, Go ranks 10th in Tiobe's Programming Language of the Year, jumping from its 55th ranking last year.

Clearly, Go is attracting many programmers from various disciplines and software development outsourcing professionals. And it’s safe to say that this is due to the ease of using Go.

As a compiled, open-source programming language, Go makes it easy for developers to build simple, reliable, and efficient software. It is the product of the innovation and evolution of the more conservative languages such as C and C++.

With Go, the amount of code typing is reduced and writing robust APIs without sacrificing its performance has become easier. Designed for scalability and concurrency, Go makes optimizations possible. A compiler can perform all the code inspection work before runtime.

We’ve compiled a list of the top frameworks, IDEs, and tools for Golang for your quick reference. Bookmark it on your browser so that you can come back whenever you’re working with Go!

Frameworks for Golang

Web frameworks help developers build applications as easily and quickly as possible. Go is still relatively new, so it’s important to use frameworks with sufficient documentation.

Here are 9 frameworks you can use to help you build projects using the Go Language.

1. Revel

As a high productivity framework for Go, Revel includes a Hot Code Reload tool that lets you rebuild your project on every file change. It also includes a wide variety of comprehensive and high-performance features, so you don’t need to find external libraries to integrate into the framework.

Golang Framework Revel

2. Beego

Beego is a full-fledged MVC framework with its own logging library, ORM, and web frameworks. You don’t need to find and install third-party libraries. It features a built-in tool called Bee Tool that watches out for code changes and runs tasks when changes are detected.

Beego will save you a lot of hours, especially in the beginning of a project when you’re figuring out the logging framework or application structure.

Golang Framework Beego

3. Martini

Inspired by Sinatra, Martini is an extremely light but powerful framework. It was developed for writing modular web applications and services in Golang.

It features a non-intrusive design that’s quick and easy to use and includes a wide range of handlers and middleware. It’s capable of performing basic routing, exception handling, and default document serving for AngularJS apps in HTML5 mode.

Golang Framework Martini

Martini’s best feature is its use of reflection, which lets developers dynamically insert data into the handler functions and add new services. Martini is also fully compatible with the http.HandlerFunc interface. The downside, though, is that the Martini framework is no longer maintained.

Golang Framework Martini 2

4. Gin Gonic

Gin Gonic is a web framework with a martini-like API, but with much better performance. If you’ve used Martini before, then you’ll be familiar with Gin Gonic. Otherwise, it will only take you 10 minutes to learn Gin. It’s that easy!

Gin Gonic is a minimalistic framework that includes only the most essential libraries and features. This makes it perfect for developing high-performance REST APIs. Plus, it’s 40 times faster than Martini.

You can add middleware, nested groups, JSON validation, and rendering, but it still maintains its optimum performance. Gin Gonic uses httprouter, the fastest HTTP router for Go.

Golang Framework Gin Gonic

5. Buffalo

Building new web applications with Go is quick and simple with Buffalo. When you’re starting a new project, Buffalo already has everything setup for you—from front-end to back-end development.

It features Hot Reloading, which means that dev command will watch your .go and .html files automatically. It will then rebuild and restart your binary for you. Just run the dev command, and you’ll see the changes go live right before your eyes!

Buffalo is more than just a framework – it’s a holistic web development eco-system that lets you get straight to building your application.

Golang Framework Buffalo

6. Goji

Goji is a lightweight and fast web framework that has composability and simplicity as its main priority. Much like net/http.ServeMux, Goji is a minimalistic HTTP request multiplexer. It includes Einhorn support, which makes it possible for you to have websocket support in Goji.

Additional features include URL patterns, re-configurable middleware stack, graceful shutdown, and more. Goji can be used in production and has served billions of requests across several organizations.

Golang Framework Goji

7. Tiger Tonic

Inspired by Dropwizard, Tiger Tonic is a Go framework for developing JSON web services and building high-performance REST APIs. To stay true to the principles of Golang, Tiger Tonic strives to keep features orthogonal.

The downside to Tiger Tonic is its inadequacy when it comes to building large, back-end applications.

Golang Framework Tiger Tonic

8. Gocraft

Another powerful yet minimalistic framework, Gocraft offers fast and scalable routing performance. It adds routing to the net/http package from the standard library.

Gocraft is a Go mux and middleware package that features casting and reflection capabilities so that you can type your code statically. You can also add an optional functionality with the built-in middleware or write your own.

Since performance is always one of the top concerns for developers, Gocraft is a great choice for developers. It’s very easy to write backend web applications using the Gocraft framework.

Golang Framework Gocraft

9. Mango

Although Mango is not actively maintained by its creator, Paul Bellamy, a lot of Go users still use it. The great thing about Mango is its modularity. You can choose from a variety of libraries to include in your project.

Mango lets you build reusable modules of HTTP functionality as quickly and easily as possible. It compiles a list of middleware and application into a single http server object to keep your code self-contained.

Golang Framework Mango

Integrated Development Environment (IDEs) for Golang

IDEs for Golang are gaining popularity, along with the Go Language. While many developers still prefer to use text editors, many prefer to use IDEs as well.

If you’re working on a large-scale project with an extensive codebase, an IDE can help you organize your code and navigate it with ease. Furthermore, IDEs can help you test your code and edit them accordingly.

Here are the top IDEs that work great with Golang.

1. Gogland

Software development company JetBrains released another reliable IDE, but this time, for Golang. Gogland is a commercial IDE that provides a robust ergonomic environment for Go developers. It also features coding assistance, debugger, and an integrated terminal.

Because an established company created Gogland, it has an extensive IntelliJ plugin ecosystem where you can get additional tools should you need more.

Golang IDE Gogland

2. Visual Studio Code

Created by Microsoft, Visual Studio Code is a full-featured, open-source IDE and code editor that supports a wide variety of programming languages. It features smart completion with IntelliSense; debugging using break points, call stacks, and an interactive console; built-in Git integration; and hierarchical folder and file explorer.

As another popular IDE, Visual Studio Code has a supportive community of Go developers that regularly contribute. With Visual Studio Code, you can extend functionalities with the array of available plugins.

Golang IDE Visual Studio Code

3. LiteIDE

LiteIDE is among the first Golang-centric, open-source IDEs that was created more than 5 years ago. As a C++ Qt application with a unique look and feel, LiteIDE offers code management, configurable build commands, gdb and Delve debugger, auto-completion and theming with WordApi, MIME type based system, and more. It also provides JSON and Golang support.

Golang IDE LiteIDE

4. Wide

Wide is a web-based IDE for Golang programmers. It’s designed for collaborative development and works best for teams and web development agencies. Wide features include code highlight, debugging, Git integration, and more.

Because Wide is created and maintained by a Chinese developer, most of its documentation and support are in Chinese.

Golang IDE Wide

5. Atom with go-plus plugin

If you’re already using Atom, your code editing experience in Golang can be improved with an open-source package called go-plus. With go-plus, you get instant, real-time feedback on your syntax and build errors.

Golang IDE Atom

The go-plus package offers almost all Golang support in Atom. It can also be used for tools, build flows, linters, vet and coverage tools.

Go-plus also includes various code snippets and features such as autocomplete with gocode, code formatting with gofmt, goreturns, or goimports, and more.

Golang IDE Atom+go-plus

6. Eclipse with GoClipse

Because Eclipse is a widely popular IDE, numerous plugins have been created for it. GoClipse is an Eclipse plugin for Golang that offers Go source code editing with configurable syntax highlighting and automatic indentation and brace completion.

GoClipse also serves as a project wizard and builder that reports syntax and build errors instantly. Additional features of GoClipse include debugging functionality and code assist.

Golang IDE Eclipse+GoClipse

7. Sublime Text with GoSublime

Sublime Text is another sophisticated text editor with a large community of contributors and developers. As such, a wide variety of plugins has been created for this IDE.

GoSublime is a Golang plugin for Sublime Text 3 that offers code completion from Gocode, lint/syntax check while you’re wiring code, automatic addition and removal of package imports, and more.

Golang IDE GoSublime

8. Vim with vim-go plugin

Vim is a free, open-source IDE that can be customized and configured with various plugins. If you’re a Golang programmer, you can use Vim with the vim-go plugin created by Fatih Arslan. Vim-go automatically installs all the necessary binaries for providing a smooth Vim integration for Golang.

Vim-go is a powerful plugin suite for writing and developing Go. Its features include advanced source code analysis, adding and removing import paths, multiple 3rd liner support, goto definition, quick file executions, and much more.

Vim-go is highly customizable, with individual features that can be enabled or disabled according to your need.

Golang IDE Vim-Go

9. Komodo

Komodo is a full-featured Go language IDE that supports other programming languages such as Node.js, Python, Ruby, Perl, and more. With this Go IDE, you can write clean code easily. Its features include an advanced code editor, intelligent code completion, syntax checking, version control and unit testing, and a Go Code Intelligence that allows code browsing and code hinting.

The great thing about Komodo is that it works great for team collaboration since multiple developers can edit a document simultaneously. Komodo can be installed on Mac, Windows, or Linux with just one license.

Golang IDE Komodo

10. IntelliJ IDEA with Go Language (golang.org) Support Plugin

IntelliJ IDEA (same company as JetBrains) is an IDE that can be used with Golang through the Go language support plugin. If you want to use IntelliJ IDEA with Golang, you need to install this plugin, albeit with limited features as opposed to Gogland.

Golang IDE IntelliJ IDEA Golang Support

Tools for Golang

Golang tools can be used for a wide variety of projects and web applications. Developers can write code and build applications as quickly and easily as possible with these helpful tools.

Here’s a list of the top Golang tools for your reference.

1. Apicompat

Apicompat is a new Go language tool that helps developers detect backwards, incompatible changes and exported declarations.

With Apicompat, you can avoid false positives. However, not every backwards incompatible change can be detected by Apicompat. Swapping argument parameters and other changes still need to be considered by the library author.

Golang Tool Apicompat

2. Checkstyle

Inspired by Java Checkstyle, Checkstyle for Golang prints out coding style suggestions. It also lets developers check file line/function and line/param number, which can then be configured by the user.

Golang Tool Checkstyle

3. Depth

Depth is another useful Golang tool that helps web developers retrieve and visualize Go source code dependency trees. It can be used as a standalone command-line application or as a particular package within your own project. You can add customizations by simply setting the appropriate flags on the Tree before resolving.

Golang Tool Depth

4. Go-Swagger

This toolkit includes a wide variety of features and functions. Go-Swagger is an implementation of Swagger 2.0, and can serialize and deserialize swagger specifications. It’s a minimalist yet powerful representation of your RESTful API.

With Go-Swagger, you can swagger spec document, validate against jsonschema, and other extra rules. Other features include code generation, API generation based on swagger specs, spec document generation based on the code, extended string formats, and more.

Golang Tool Go-Swagger

5. Go Meta Linter

If you need to run Go lint tools and normalize their output concurrently, that’s exactly what Go Meta Linter can do for you. Go Meta Linter is intended to be used with a text editor or an IDE integration such as Sublime Linter plugin, Atom go-plus package, Emacs Flycheck checker, Vim/Neovim, and Go for Visual Studio Code. It also supports a wide variety of linters and configuration files like JSON.

Golang Tool Go Meta Linter

6. Go-callvis

Go-callvis is a web development tool that allows you to visualize the call graph of your Go program with Graphviz's dot format. This tool is especially useful when building large projects with complex codebases. This is also useful when you want to understand another developer’s code structure or rebuild someone else’s project.

With go-callvis, developers can focus specific package within a program; group functions according to package and methods according to type; and limit packages to custom path prefixes, and ignore those that contain them.

Golang Tool Go-Callvis

7. Gonative

Gonative is a simple Golang tool that lets you build Go toolchains with native libs, which can be cross-compiled while still utilizing the Cgo-enabled versions of the stdlib packages.

Gonative downloads the binary distributions for each platform and copies their libraries into its proper places. At the same time, Gonative sets the correct mod time to avoid unnecessary rebuilds.

Unfortunately, Gonative remains untested on Windows. Additionally, there’s no Linux/arm support provided.

Golang Tool Gonative

8. Grapes

Grapes is a lightweight Golang tool designed to distribute commands over ssh easily. It’s written and actively maintained by Yaron Sumel.

Grapes will soon support full host key validation, so that’s something developers should watch out for.

Golang Tool Grapes

9. Gosimple

The great thing about this Golang linter is that it focuses on simplifying Go source code. Gosimple always targets the latest Go version, so it requires Go version 1.6 or later.

If there’s a new Go release, gosimple will suggest the easiest and simplest methods to avoid complicated constructs.

Golang Tool Gosimple

10. Go Vendor

Go Vendor is the Golang tool that works with the standard Vendor folder. It allows developers to copy existing dependencies from $GOPATH with govendor add/update. You can also directly pull new dependencies or update existing dependencies with govendor fetch and move legacy systems with govendor migrate.

Golang Tool Go-vendor

Wrapping It Up

If you’re coming from a JS/Node background, you need to learn some new programming concepts such as coroutines, channels, strict typing with compilation, interfaces, structs, pointers, and some other differences. But, once you get into the groove, you’ll find Golang easier and faster to use.

 


Face Detection with Apple’s iOS 11 Vision Framework

Great stuff is coming from Apple this autumn! Among a lot of new APIs there is the Vision Framework which helps with detection of faces, face features, object tracking and others.

In this post we will take a look at how can one put the face detection to work. We will make a simple application that can take a photo (using the camera of from the library) and will draw some lines on the faces it detects to show you the power of Vision.

Select an Image

I will go fast through this so if you are a really beginner and you find this too hard to follow, please check the my previous iOS related post, Building a Travel Photo Sharing iOS App, first, as it has the same photo selection functionality but explained in greater detail.

You will need Xcode 9 beta and a device running iOS 11 beta to test this. Let’s start by creating a new Single View App project named FaceVision:

Open the Main.storyboard and drag a button Take Photo to the center of it. Use the constraints to make it stay there :) Create a takePhoto action for it:

[crayon-5b76d22780780015291378/]

Here we used an UIImagePickerController to get an image so we have to make our ViewController implement the UIImagePickerControllerDelegate and UINavigationControllerDelegate protocols:

[crayon-5b76d22780792825780130/]

We also need an outlet for the button:

[crayon-5b76d22780798418618904/]

And an image var:

[crayon-5b76d2278079e702110326/]

We also need to add the following in the Info.plist to be able to access the camera and the photo library:

  • Privacy - Camera Usage Description: Access to the camera is needed in order to be able to take a photo to be analyzed by the app
  • Privacy - Photo Library Usage Description: Access to the photo library is needed in order to be able to choose a photo to be analyzed by the app

After the users chooses an image we will use another view controller to show it and to let the user start the processing or go back to the first screen. Add a new View Controller in the Main.storyboard. In it, add an Image View with an Aspect Fit Content Mode and two buttons like in the image below (don’t forget to use the necessary constraints):

Now, create a new UIViewController class named ImageViewControler.swift and set it to be the class of the new View Controller you just added in the Main.storyboard:

[crayon-5b76d227807a4307990469/]

Still in the Main.storyboard, create a Present Modally kind segue between the two view controllers with the showImageSegue identifier:

Also add an outlet for the Image View and a new property to hold the image from the user:

[crayon-5b76d227807aa425864304/]

Now, back to our initial ViewController class, we need to present the new ImageViewController and set the selected image:

[crayon-5b76d227807b0023263743/]

We also need an exit method to be called when we press the Close button from the Image View Controller:

[crayon-5b76d227807b6661787324/]

To make this work, head back to the Main.storyboard and Ctrl+drag from the Close button to the exit icon of the Image View Controller and select the exit method from the popup.

To actually show the selected image to the user we have to set it to the imageView:

[crayon-5b76d227807bb933380491/]

If you run the app now you should be able to select a photo either from the camera or from the library and it will be presented to you in the second view controller with the Close and Process! buttons below it.

Detect Face Features

It’s time to get to the fun part, detect the faces and faces features in the image.

Create a new process action for the Process! button with the following content:

[crayon-5b76d227807c1324164985/]

After translating the image orientation from UIImageOrientation values to kCGImagePropertyOrientation values (not sure why Apple didn’t make them the same), the code will start the detection process from the Vision framework. Don’t forget to import Vision to have access to it’s API.

We’ll add now the method that will be called when the Vision’s processing is done:

[crayon-5b76d227807c8011611017/]

This also calls yet another method that does the actual drawing on the image based on the data received from the detect face landmarks request:

[crayon-5b76d227807ce418096750/]

As you can see we have quite a lot of features that Vision is able to identify: the face contour, the mouth (both inner and outer lips), the eyes together with the pupils and eyebrows, the nose and the nose crest and, finally, the median line of the faces.

You can now run the app and take some unusual selfies of yourself. Here’s mine:

I hope you enjoyed this, please let me know in the comments how did it go and if there are things that can be improved. Also, some pictures taken with the app wouldn’t hurt at all :)

You can get the code from here: https://github.com/intelligentbee/FaceVision

Thanks!


Building a Travel Photo Sharing iOS App

Hello! I want to show you how to build a relative simple photo sharing app with a twist: your images will be placed on a map background of your current location. You will also be able to add a short message and your name, to end up with an image looking like this (so you can brag to your friends with what you visited in the awesome vacation you have):

To follow this tutorial you need an Apple computer with xCode installed and an Apple developer account.

Create the Project

Open xCode and create a new project named PicTravel. Choose the Single View Application template:

Give the project a name, we chose PicTravel but you ca choose what other name you like. Also fill in the organization name and the organization identifier for your project:

The last step is to save the newly created project in your Developer folder.

Building the Interface

From the left panel, open the Main.storyboard. This is where we will build our app interface.

From the right panel, the bottom part, drag an ImageView and place it in the center of the scene. Resize it so it covers everything (snap it to the blue lines that appear).

Pin the ImageView to the scene margins using the constraints dialog like you see in the image below:

We will use this to put a background image for our app’s main screen. Download the background image from here then open the Assets.xcassets item from the left panel, click on the “+” button from the bottom and add a new image set named Background.

Drag the downloaded image to the “1x” placeholder to end up with something like this (we will not use the “2x” and “3x” placeholder for this tutorial, but you can add bigger resolution images to it if you want).

Now, back to the Main.storyboard, select the ImageView and, from the Attributes Inspector, select the Background image and set the Content Mode to Aspect Fill.

It’s time to add a new image to our assets that we will use for the take a photo button we are about to add. Download the image from here, create a new Image Set named Button in the Assets.xcassets and drag the image into the 1x placeholder like we did earlier with the background.

Next, in the Main.storybord, drag a button to the center of the scene. Set it’s Type to Custom, clear the Title and set the Background to the Button image we just created. From the Size Inspector, set the button with and height to 115.

Add two new constraints for the button’s with and heigh (115 each), then, from the Alignment Constriants, align the button horizontally and vertically in the container.

Now let’s add two text fields for the user’s name and message. Place them like in the image below, with the constraints listed below. Don’t forget the blue guides that make the placement easier for you. To create constrains between two elements you can Ctrl+drag from one to another and select the type of constraint you want from the popup that appears.

For the message text field:

  • Top Space to the name text field: 15
  • Bottom Space to the button: 15
  • Width <= 500
  • Align Center X to superview
  • Trailing Space to superview: 0 with a Priority of 900 - that’s very important as it will keep the text field pinned to the margin on iPhones but on bigger devices the width constraint will be stronger so it will not grow larger than 500.
  • Leading Space to superview: 0 with a Priority of 900

For the name field:

  • Bottom Space to the message text field: 15
  • Width <= 500
  • Align Center X to superview
  • Trailing Space to superview: 0 with a Priority of 900
  • Leading Space to superview: 0 with a Priority of 900

Set the placeholders for each of the text fields to “Enter Your Name” and “Add a Short Message” so the user knows what to do. Set the Font to Noteworthy Light with a size of 17 for both.

Also, for the name field set the Capitalization to Words, Correction and SpellChecking, both to No. For the message field set the Capitalization to Sentences.

Here’s the result:

And here’s how it looks on an iPad (you can use the bottom bar under the scene to select on what device you want to preview the interface):

There are two more small elements to add and our main screen will be finished.

Add a label at the bottom with the following text: “Share your travel experiences instantly with your friends & family!”. Set it’s Font to Noteworthly Light 17, Alignment to center, Color to #5E7A96 and Lines to 0. Use the following constrains:

  • Trailing Space to superview’s margins: 0
  • Leading Space to superview’s margins: 0
  • Bottom Space to Bottom Layout: 20
  • Height: 64

Finally, add a new view at the top, having a white background with a opacity of 60%. Constrains used are:

  • Trailing Space to superview: 0
  • Leading Space to superview: 0
  • Bottom Space to Top Layout: 20
  • Height: 20

Here is the final design:

We will use this screen to get the user’s name and message and open the camera or photo library to take a photo. But after we gel all we need from the user, we need a new screen to show the final image and let him share it. So let’s add a new screen to our app.

From the Object Library, drag a new View Controller near the first one:

Set the background for the view of this new View Controller to #ACE0F6.

Next, add two buttons like in the image below. Type is custom, background color is #EE4205, font Noteworthy Light 17. Height 40, width 70 and 110. They are pinned to the bottom layout + 20, left or right of the container and also have constraints on with and height.

At the top, add a label to show the current status of the app to the user. Pin it to the top, left and right margins using constrains with a height of 40. Set the font to Noteworthy Light 19 and color to #EE4205. The initial text will be “Generating your image…” center aligned.

To show the generated image we need an Image View. Drag it to the center of the second screen and create the following constraints for it:

  • Top Space to “Generating your image…” label: 8
  • Bottom Space to “Share Image!” button: 8
  • Leading Space to superview margin: 0
  • Trailing Space to superview margin: 0

Also set it’s Content Mode to Aspect Fit

The last piece of the puzzle is an Activity Indicator View that we will use to visually inform the user that something happens behind the scenes (final image generation) and he has to wait for a few seconds.

Drag it from the Object Library and place it in the middle of the screen. Add constraints to center it horizontally and vertically in the container and set its Behavior to Animating and Hides When Stopped.

That’s it, our app’s interface is done. Run the app in the simulator to see how it looks.

Now it’s time to write some code.

Taking a Photo

With the main.storyboard still open, select the button from the first screen then open the Assistant editor and be sure you have the ViewController.swit file open on the right side. Use the manual mode if you have in case the Assistant editor has a problem figuring this out.

Now, Ctrl+drag from the button to the code to create a new action (be sure to select Action as the Connection , set the Name to selectPhotoClicked and the Type to UIButton):


[crayon-5b76d227826bb946585421/]

Also Ctrl+drag from the two text fields and the button to the code and create three outlets:

[crayon-5b76d227826cb166684687/]

Now let’s start with the most interesting part, choosing a photo. The user will be given a choice to take a photo using the camera or to choose one from the photo library. For this we will use an action sheet.

Edit the selectPhotoClicked method to add the code for this:

[crayon-5b76d227826d1576719651/]

To make this code work we need to make our ViewController a delegate for both UIImagePickerControllerDelegate and UINavigationControllerDelegate. To do this change the line defining the ViewController class to the following:

[crayon-5b76d227826d9984753943/]

If you test now the app will crash with an error like “This app has crashed because it attempted to access privacy-sensitive data without a usage description…”. That’s because the app has to ask the user’s permission to access the photo library or the camera and we have to provide a reason for this, reason that will be presented to the user. To do this open the Info.plist file and add a two new items:

  • Privacy - Photo Library Usage Description with a string value of Access to the photo library is needed in order to be able to choose a photo to be shared by the app.
  • Privacy - Camera Usage Description with a string value of Access to the camera is needed in order to be able to take a photo to be shared by the app.

Also, if you try to choose the “camera” option in the simulator, the app will crash again because the simulator has no camera (“Source type 1 not available”). We need to add a test for this and only present the option if the camera is available:

[crayon-5b76d227826df984001279/]

One more thing to fix before we start handling the actual images: try to run the app on an iPad (in the simulator or on a real device). The app crashes one more time :(

Your application has presented a UIAlertController of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller’s popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.

That’s because the UIAlertController on an iPad is presented like a popover (UIModalPresentationPopover) and it needs a position to be shown at. To do this we will have to test if we have a popoverPresentationController in the alert and, if true, set it’s sourceView and sourceRect (we are using an Swift optional for this, as the code after the question mark will be executed only if the popoverPresentationController is not nil):

[crayon-5b76d227826e7364933598/]

We also need to make the photo selection from the library to be shown as a popover on an iPad:

[crayon-5b76d227826ed383300626/]

Now everything should be fine. Let’s see how to handle the image the user chooses.

We already added a View Controller in the Main.storyboard to show the final image to the user but we need an associated view controller class for it so we have a place to write the code involved in the process.

From the File menu select New -> File… then choose the Cocoa Touch Class option and click Next. Name the new class ShareViewController and be sure to set it as a subclass of UIViewController, no XIB, Swift language.

Click Next one more time and be sure to have the PicTravel Group selected and PicTravel target checked. Then Create the file.

Go back to the Main.storyboard and select the second view controller and set it’s class to the new ShareViewController we just created (you can do this from the Identity inspector, the Class dropdown).

Now, with the view controller still selected, open the assistant editor and make sure it is set to automatically open the associated file. This should be the ShareViewController class. Ctrl+drag from the Image View, Activity Indicator and the Label to the class to create outlets for them:

[crayon-5b76d227826f5107856387/]

Also add some new variables for the user’s image, name and message:

[crayon-5b76d227826fb421774223/]

So, here’s what we will do next: when the user chooses an image, we instantiate the ShareViewController, set its image, name and message properties to the user’s data then present the ShareViewController.

To do this we need to create a segue (transition). Close the assistant editor then, in the Main.storyboard, Ctrl+drag from the first “View Controller” (click on the yellow symbol from the top-right) to the “Share View Controller” and define a “Present Modally” segue. then click on the created segue and set it’s identifier to showImageSegue (we will need this later in the code to identify this specific segue).

Now open our ViewController class. Add a new method to be called when the user selects an image (this is part of the UIImagePickerControllerDelegate):

[crayon-5b76d22782702444865139/]

Here’s what this method does:

  • dismiss the image picker controller
  • get the image in a class variable
  • present the ShareViewController by performing the showImageSegue segue

For this we need a new image variable to be defined in our ViewController class:

[crayon-5b76d22782708381239130/]

To send the data to the ShareViewController, we will use a method that is called just before the segue to the new view controller happens:

[crayon-5b76d2278270e734621819/]

Now run the app. After the user selects an image, the second view controller should be presented to the user. But… we have no way to close it. Let’s do this next.

Still in the ViewController, create an action that will be called when the ShareViewController will exit (here we will also set the image to nil to free the memory because we don’t need it anymore):

[crayon-5b76d22782713826447532/]

Back to the Main.storyboard, Ctrl+drag from the Close button to the exit symbol from the top-right of the ShareViewController and select the exit method when prompted.

This should solve our problem of closing the second screen.

Let’s get now to the main objective of our app: get the user’s location, generate a map image and put the photo the user selected on top of it together with the name, location and message.

To continue, add some constants to the ShareViewController class that will be used in the code that follows:

[crayon-5b76d22782719168851920/]

Getting Current User Location

First we need to add a new key to Info.plist, Privacy - Location When In Use Usage Description with the value of Current location is needed to generate a map image of your location.

Now we need to import CoreLocation into our ShareViewController:

[crayon-5b76d2278271f080526295/]

Declare a new locationManager variable:

[crayon-5b76d22782725825786849/]

Add a new method that will start the process of finding the user location:

[crayon-5b76d2278272a491784663/]

For this to work we need to implement the CLLocationManagerDelegate protocol:

[crayon-5b76d2278272f620827365/]

We also need to define the showError function:

[crayon-5b76d22782734310067551/]

Now implement the method of the CLLocationManagerDelegate protocol that is called when we get a location update:

[crayon-5b76d2278273a289488368/]

This method will receive the user’s location, stop the location updates (because we don’t need them anymore) and calls a generateMapImage function (that we’ll define later) with the retrieved location as an argument. It also uses the Apple’s geocoder service to find out the city and country name for the retrieved location and puts them in a new class variable locationString:

[crayon-5b76d22782741164171347/]

Generate the Map Image

To generate the map image we will use the following function:

[crayon-5b76d22782746164315022/]

You need to import MapKit into ShareViewController:

[crayon-5b76d2278274c497644220/]

Also a new class variable is used:

[crayon-5b76d22782752127885568/]

To calculate the map size we used another function, calculateMapImageSize that returns a CGSize object to be used when generating the map image:

[crayon-5b76d22782758938979683/]

Building the Final Image

The last thing we need to do is to generate the final image with all the pieces put together:

[crayon-5b76d2278275d791579436/]

Here we used two helper methods, calculateUserImageFinalSize and sizeOfString. The last one deserves a little attention because it will return a CGSize object with the dimensions needed to draw a text with specific attributes.

[crayon-5b76d22782767562024627/]

Now that we have everything in place, we need to start the whole process when the ShareViewController is loaded and presented to the user:

[crayon-5b76d2278276e151834616/]

Test the app. Enter your name, a short message and select a photo. You should get the following result:

Sharing the Final Image

Ok, now let’s see how do we share the resulted image. To do this we will use an UIActivityViewController.

Add a new shareImage action for the Share Image! button using Ctrl+drag into the ShareViewController like we did earlier for the photo button:

[crayon-5b76d22782774361877948/]

The code for the actual sharing is pretty simple:

[crayon-5b76d22782779430536449/]

Try it! Now you can save the image or share it with your friends & family using the installed apps on your device.

Final Touches

To finish the app we need to do two more things:

  • add an app icon
  • make the startup screen look good

To add an app icon, first download the images from here, then open the Assets.xcassets from the left panel, select the AppIcon item and drag&drop downloaded images to their respective placeholders.

To change the startup screen , which is white right now, open the LaunchScreen.storyboard from the left panel and drag an Image View to it. Add constraints so it covers the entire screen, select the Background Image and set the Content Mode to Aspect Fill (it will look exactly like our main app's screen background).

That’s it! You can now run the app and even install it on your device to take it out in the wild.

The code for this app is available on github: https://github.com/intelligentbee/PicTravel

You can also download the final app from the App Store: https://itunes.apple.com/us/app/pictravel/id1263495901?mt=8


Introduction to React Native

React Native is a framework for building native apps using React made by Facebook. With React Native, you don't build a “mobile web app”, an “HTML5 app”, or a “hybrid app”. You build a real mobile app that's indistinguishable from an app built using Objective-C or Java. React Native uses the same fundamental UI building blocks as regular iOS and Android apps. You just put those building blocks together using JavaScript and React. - from https://facebook.github.io/react-native/

In the following lines we will take a short tour of React Native to help you familiarize with the platform and hopefully get you started in your React Native development career.

We will create a simple app called RandomNumbers that will pick some numbers from a pool, numbers that you can use later at anything you need (for example playing the lottery).

Install React Native

You will need to install Node, Watchman, the React Native command line interface, a JDK, and Xcode or Android Studio (or both). You can find details on how exactly do to this, depending on your platform, here: https://facebook.github.io/react-native/docs/getting-started.html. Select the "Building Projects with Native Code" tab and then follow the instructions.

When you’re done, create a new project with the react-native init RandomNumbers command then cd into the newly created RandomNumbers folder.

The above command created an empty React Native project that you can immediately run on your device using the react-native run-ios or react-native run-android commands (you need to have an Android emulator already started for the last command to work).

Make Your First Change

Open the RandomNumbers folder in an code editor of your choice. Here you will find some files and folders, the most important ones being the index.ios.js and index.android.js files that contain our starting point of the app.

Edit one (or both) of the files above, depending on the platform you are testing, to the following:

 
[crayon-5b76d227843fa896226227/]
Save the edited file, then, in the emulator, press Cmd+R to reload the app. It will refresh itself to reflect the changes, no recompiling needed. Isn’t this cool?

React Native Components

Just like in React, a React Native app is made up by several components that work together to achieve the ultimate goal of the app. To see the list of available components visit https://facebook.github.io/react-native/docs/getting-started.html and scroll to the Components section in the left menu.

We will start by making the two React Native starting points (from the index.ios.js and index.android.js files) to load a single component called App.

Create a new App.js file with the following content:
[crayon-5b76d22784407449883420/]
Now change the index.ios.js and index.android.js to the following (both will have the same content):
[crayon-5b76d2278440d866880390/]
We just removed everything from them and loaded the App component so we now have a common starting point for both platforms.

Generate a Random Number

Let’s add a Button that will trigger the number generator of our app. First import the Button component, then add the actual button to the render method (in App.js):
[crayon-5b76d22784413207063601/]
For this to work we need to define a new method generateRandomNumber:
[crayon-5b76d22784419522324665/]
Now if you click on the Generate! button, a random number between 0 and 100 will be generated and printed to the console.

To see the console output open the developer menu in your app by  pressing Cmd+D and select Debug JS Remotely. A new browser window will open and there you can check the console output like you normally do when developing for the web.

Output Data to the Screen

Now we have our generated random number, but how can we show it to the user? For this we will use the state concept of React. The are two fundamental concepts of React that you need to understand: the state and props.

There are two types of data that control a component: props and state. Props are set by the parent and they are fixed throughout the lifetime of a component. For data that is going to change, we have to use state.

You can read more about this topic here:

Start by creating a constructor for our App component that sets the initial state:
[crayon-5b76d22784420877009874/]
In the generateRandomNumber method, change the state to contain the newly generated number:
[crayon-5b76d22784426939138954/]
Finally add a new Text component in the render() method that will show the random number from the app’s state:
[crayon-5b76d2278442b337456665/]
Now, every time you click the Generate! button a new random number will appear on the screen.

How Many Numbers?

What if you need more than one number, extracted from a pool of numbers?

To define the pool of numbers we will use a slider with values from 1 to 100. To define how many numbers do we need to be extracted from the pool, we will use a picker with values from 1 to 10. This way we can configure the app to do what we need at run-time.

Import the Slider component then add it to the app:
[crayon-5b76d22784431441303730/]
We need to show the current slider value to the user so we will add it to the state of our app:
[crayon-5b76d22784436021722390/]
When the slider moves, we have to update the state:
[crayon-5b76d2278443c539623006/]
Add a new text component to show it to the user (and an informative label):
[crayon-5b76d22784441371967859/]
Now to select how many numbers we need, let’s try a picker:
[crayon-5b76d22784446883936842/]
For this we added amount to the state:
[crayon-5b76d2278444c586654808/]
Now let’s change the generateRandomNumbers method to take in account the new settings:
[crayon-5b76d22784451560924000/]
What if you try to generate 10 numbers out of 5? Or something like this? We will have to tell the user that’s not possible using an alert.
[crayon-5b76d22784457869757375/]
That’s all we had to do for our app functionality. Try it!

... but, to be honest, it doesn't look so good :(

Making the App Look Good

Let’s start by adding a nice background to our app. First download the image from here and save it to your project folder. Then replace the root <View> with an <Image> component (also be sure to include the Image component at the beginning of the file):
[crayon-5b76d22784473971746291/]
Update the container style to this:
[crayon-5b76d22784479862336570/]
Now, let’s take care of the button. We will remove the <Button> component because it’s not as customizable as we need and replace it with a <TouchableOpacity> (don’t forget to include this component too and remove the <Button> from the includes because we will not use it anymore). Also get the button background image from here.
[crayon-5b76d2278447f544151083/]
Next we will use some styling for the rest of the components, here is all the render() code and styles:
[crayon-5b76d22784485054108691/]
[crayon-5b76d2278448c505765298/]
You will also need the slider thumb images from here and here.

If you run the app now, you will find a much better interface:

The images used in this tutorial were downloaded from pixabay.com then edited using Photoshop:

Getting Your App Ready to Be Published

So our app is done, how do we publish it to the AppStore and Google Play Store?

First, let's fix one small problem: if you rotate your emulator screen (Cmd+Left or Right Arrow) you will see that the app will go into landscape and it will not be usable anymore :(

Too lock the app to portrait we need to go "native".

For iOS, open xCode then open the project found in the randomNumbers/ios folder. Select the project in the left pane then, under Deployment Info, uncheck Landscape Left and Landscape Right Device Orientation so we are only left with the Portrait orientation.

For Android, you can just open the android/app/src/AndroidManifest.xml and add android:screenOrientation="portrait" under the activity section:
[crayon-5b76d22784495709663534/]
 

Now, to see those changes, you have to relaunch the app again. Not just reload, relaunch with the react-native run-ios or react-native run-android commands and try to rotate the emulator. Everything should be fine this time.

Now back to our main task, getting the app ready to be published.

iOS

First let's add the app's icons. Open the xCode project and select Images.xcassets from the left panel. Then select the AppIcon item and drag each icon image to its corresponding placeholder. Download the icons from here.

When you're done, select Product -> Archive from the menu to build the iOS package (it only works with a Generic iOS Device selected or a real device, no emulators).

Android

To add app icons in Android, you have to put them in the android/app/src/main/res/mipmap* folders (overwrite the existing ic_launcher.png). You can get the icons from here.

Now you need to generate a signing key then a signed APK. I found the walkthrough from the React Native documentation to be pretty good so you just follow it: https://facebook.github.io/react-native/docs/signed-apk-android.html

Final Words

That's it! You now have your first React Native application ready to be sent into the wild. I hope you had fun doing this, please let us know in the comments how it worked for you. Oh, and you can find the final code here.

Have a nice mobile developer life! :)


tinyint, symfony, doctrine

How to add TINYINT MySQL type to Doctrine in Symfony 2.8

Hello! A few days ago I needed to define an entity with a TINYINT type column to hold a rating value between 1 and 5. I was doing this in a Symfony 2.8 project and to my surprise, Doctrine was unable to handle this type of data out of the box (it uses it for booleans but it has no TINYINT standalone type).

So I searched the internet for a solution and I found some but nothing complete.

The solution (TINYINT vs Doctrine):

First you need to define the new Doctrine type class like this:
[crayon-5b76d2278564a169043896/]
Then, to register it, I used the boot function of the AppBundle:
[crayon-5b76d22785655718342924/]
I had to use the try / catch block to avoid an error when running symfony console commands having no database defined:

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000] [1049] Unknown database 'rating'' in vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:43

Now you can use the new type in your entities:
[crayon-5b76d2278565d283270562/]

Learn how to setup Docker machine for Symfony development.

Hope this helps someone :)
Have a great day!


Node.js Guide: A List of Top Node.js Frameworks, Tools, and IDEs

Node.js Guide: A List of Top Node.js Frameworks, Tools, and IDEs

Created by Ryan Dahl in 2009, Node.js is an open-source platform built using the Google Chrome JavaScript runtime. It enables software and app developers to build fast and scalable web applications using just a few lines of code.

The official website of Node.js described it as:

“Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.”

The world of custom software development constantly evolves with new trends, techniques, and languages. But, with the Node.js library of modules, app development is significantly simplified. It provides quick and efficient solutions for back-end development and it integrates well with front-end platforms.

Web and network server applications written using Node.js are becoming more and more prevalent. Independent app and software developers, web design agencies, IT companies, and businesses both small and large utilize Node.js for various projects and applications.

We’ve collated a comprehensive guide on the top frameworks, tools, and IDEs for Node.js to further streamline your workflow.

 

Frameworks for Node.js

Node.js frameworks are increasingly gaining prominence in web programming and application development. Their main objective is to get you up and running as fast as possible by providing functionality that is not available in Node.js out of the box. These features come in many flavors and most frameworks will try to envelop all you need to deliver your project.

Here are the latest framework innovations that expand the features and functionality of Node.js.

 

1. ActionHero

ActionHero is a Node.js API server and framework that offers custom packages for companies of all sizes with high-end customer support.

At it’s core it allows you to write a RESTful API that you can consume either via HTTP, WebSockets or plain TCP Socket connections. You can also do this by using a front-end ActionHero Client that’s based on Primus that the framework provides.

You can use it to easily provide a real-time information to your users and even allow them to talk to each other using chat rooms that are natively supported by this framework.

This framework also provides scalability out of the box, as such, it relies on Redis in order to communicate with other nodes in the network.

Top companies such as Riot Games, Samsung, Task Rabbit, and Madglory utilize the ActionHero framework.

ActionHero

 

2. Derby.js

Derby is a full stack MVC framework used for modern web applications. A differentiating feature of Derby is that it allows you to sync JSON and text data between browsers, servers and databases for real-time collaboration.

If you have a heavy front-end then, then this framework is for you, as it supports server side rendering.

Additional features include offline usage, conflict resolution and template bindings to simplify writing multi-user applications.

Derby JS

 

3. Express

Distributed under the MIT license, Express is one of the most fundamental Node.js frameworks. It offers a flexible structure for processing requests. It integrates well with several community developed modules that cater to most project requirements.

This minimalistic framework is very lightweight, as such, it’s focused on performance above all. It also allows you to easily scaffold a project using a generator so that you can jump right into writing code.

Its features include simplified multiple routing, template engines, middlewares, and more.

MySpace, Geekli.st, Klout, Segment.io, and Yummly all use Express.

Express JS

 

4. Hapi

Hapi is capable of building full websites and enterprise level functions. Walmart developers encountered extensibility and maintainability issues from the Express framework as their application grew in size. They needed another framework that can accommodate the  the Black Friday influx of customers. Thus, Walmark developers created Hapi.

However, developers commonly use this rich framework for building services that pull data from the back-end and serve it efficiently, all while keeping well maintained code base.

Features include input and response validation, server-side caching, sessions, cookie-parsing, logging and others. Hapi also developed dozens of API development plugins for documentation, authentication, and other functions. Big brands such as Macy’s and Disney use Hapi.

Hapi JS

 

5. Keystone

Keystone is another full stack, open-source framework based on Express, with a few other libraries. It can be used to create database-driven websites, applications, and APIs in Node.js. It’s stack includes the Express framework and MongoDB as a database.

It’s main selling point is that it provides an auto-generated Admin UI to manage your database driven website. With Keystone, you get the best features of Express and Mongoose combined, resulting in a robust CMS framework.

Keystone JS

 

6. Koa.js

Dubbed as the “next generation web framework for Node.js”, Koa.js followed in the footsteps of Express. It provides a lightweight Node.js framework for building efficient web APIs and applications.

Koa.js utilizes generated-based control flows to eliminate callbacks and minimize errors. Unlike most frameworks, Koa is more modular and relies less on middleware. However, plugin packages are also available for routing, compression, caching and more.

Koa JS

 

7. Meteor

Meteor is a full stack framework for web and mobile applications. It boasts of a subscription-based cloud deployment service called Galaxy, which enables developers to easily deploy their applications in the cloud.

Global companies using Meteor include Mazda, Ikea, Qualcomm, and PGA Tour.

Meteor JS

 

8. Sails

Sails is an MVC framework ideal for customized, data-driven web APIs for businesses and enterprises. It’s known for its capability to simplify processes for real-time chat applications, dashboards, and multiplayer games.

This framework comes bundled with an ORM that boasts support for any database. It also provides an easy way to generate RESTful APIs.

Sails JS

 

9. Total.js

Total.js is a full stack MVC framework written in pure JavaScript. It has everything other frameworks have and more. What sets it out from the crowd is it’s native support for processing media like images and video streaming.

It’s also compatible with client-side frameworks such as Angular.js, Polymer, Backbone.js, Bootstrap, jQuery, D3, as well as other frameworks mentioned above.

Total JS

 

10. Restify

Restify is a Node.js module designed to create APIs by the book, allowing you to create an application that strictly conforms to all the rules of developing a correct REST web service. It focuses on debugging and profiling so that you can isolate systems and optimize your server performance.

Restify JS

 

Tools for Node.js

Node.js tools are used by web developers and software programmers for a wide variety of applications and workflows. These tools make it easier for developers working with Node.js.

Whether you’re an amateur or an expert developer, these Node.js tools will be useful for you.

 

1. Babel

Babel is a JavaScript transpiler commonly used as a tool for front-end development. It allows you to use all ES6 features while compiling ES5 for production. As a result, code readability is improved.

Babel supports the latest version of JavaScript so that you can use the newest syntax without waiting for browser support. It can also be integrated with other JavaScript tools.

Babel JS

 

2. Broccoli

Broccoli is a Node.js build tool running on an ES6 module that boasts of blazing rebuild and compile speeds, chainable plugins, and a flexible ecosystem. Broccoli dubbed itself as “the asset pipeline for ambitious applications.”

Broccoli JS

 

3. Electrode.io

Electrode.io is another tool built by developers of WalmartLab. It’s a universal platform for building both React.js and Node.js applications using the most standardized structures, advanced technology, and best practices.

With Electrode.io, greater focus is placed on consistency and universality instead of configuration and customization. This ensures reusability and performance.

Electrode JS

 

4. Log.io

It can be difficult to monitor hundreds of files spread across various computers. Log.io is a real-time log monitoring tool to help you monitor your deployments and troubleshoot quickly. It exposes a stateless TCP API where you can write your logs to. You monitor your log messages in a single browser session, so you can address issues and bugs immediately.

Log JS

 

 

5. Migrat

Migrat is a simple, yet pluggable, data migration tool that uses plain text. Designed for a variety of stacks and processes, Migrat runs migrations once globally or per server.

Migrat is not tied to any database engine, and can be found on GitHub and NPM.

Migrat JS

 

6. PM2

As an advanced production process manager for Node.js, PM2 monitors all launched processes to determine whether they’re running properly.

According to Full Stack Developer, Mariusz Dybciak, “You don’t need to worry about restarting applications after they’ve crashed, PM2 does it for you.” The finance software company, Intuit, and the online payment gateway, PayPal, use PM2.

PM2 JS

 

7. Webpack

JavaScript module bundling has been around for several years now, and helps developers and programmers save countless hours of manual labor.

Webpack is a JavaScript module bundler that simplifies deployments by creating bundles, and asynchronously loaded to reduce the loading time. With Webpack, bundling and serving assets are easy, quick, and painless.

Webpack JS

 

Integrated Development Environment (IDEs) for Node.js

An Integrated Development Environment (IDE) is a collection of tools used for a myriad of Node.js web applications. Most IDEs are used as a source code editor, automation tool builder, and a debugger. It lets web and app developers edit and debug their codes accurately and quickly.

We’ve picked out 15 modern and advanced IDEs for Node.js.

 

1. Aptana Studio

If you like Eclipse, then you should check out Aptana Studio. It’s an Eclipse-based IDE that was trimmed down to focus on web application technologies and popular frameworks.

With Aptana Studio, you can develop and test applications in a single environment, as it supports the latest browser languages such as HTML5, CSS3, JavaScript, Ruby, Rails, PHP, and Python.

Aptana Studio

 

2. Atom

Atom is a modern, open-source text editor built with HTML, JavaScript, CSS, and Node.js integration. Its features include cross-platform editing on OS X, Windows, or Linux, a built-in package manager where you can search, install, and create new packages, and smart autocompletion to help you write codes faster.

The best thing about Atom is that it’s fully hackable and customizable. Even the core packages can be changed.

Atom

 

3. Brackets

Created by Adobe Systems, Brackets is a lightweight but powerful text editor with advanced features that include inline editing, live code previewing, preprocessor support, code folding, and command line integration.

It utilizes visual tools and preprocessor support that make it easy for both front-end developers and web designers to work from the browser.

Brackets

 

4. Cloud 9

With Cloud 9, web and API development becomes much easier. It combines a powerful online editor with a full Ubuntu workspace in the Cloud so you can write, run, and debug your code.

Its key features include a built-in terminal, language and code completion tools, debugger, split view, and more. These functionalities can also be extended using a quite simple extension manager.

Name brands such as Soundcloud, Atlassian, Heroku, Mailchimp, and Mozilla work with Cloud 9.

Cloud 9

 

5. Codenvy

Codenvy also provides cloud workspaces for web designers and app developers to write, run, and debug on premise or in the cloud.

Developers can easily collaborate on a single project by using a shared URL. The team can work with their local IDE or the beautifully designed Eclipse Che cloud IDE.

Codenvy

 

6. CodeLite

An open-source IDE that fully supports Node.js, CodeLite specializes in programming languages such as C, C++, PHP, and JavaScript. Some features include Node.js debugger, intelligent code completion, lightweight memory footprint, and compilers.

CodeLite

 

7. Eclipse

Known for its Java Integrated Development Environment (IDE), Eclipse is one of the most popular cloud-based IDEs for web developers. It’s capable of combining language support and other features into any default package. Because it has a very active community, you can find open source plugins and developer tools in the Eclipse Marketplace.

Eclipse is highly-customizable and extendable, with features such as built-in debugger, error checking, source code generation, code refactoring, help window as toy type, and more.

Eclipse

 

8. Intellij IDEA

Maximize your productivity with Intellij IDEA by Jetbrains, a robust IDE compatible with various technologies such as Node.js, Angular.js, JavaScript, HTML5, and more. Intellij IDEA offers intelligent code completion, code analysis, and refactoring tools.

Another advantage of Intellij IDEA is its productivity-boosting features for Java EE, Spring, GWT, Grails, Play, and other frameworks.

IntelliJ IDEA

 

9. Koding

Koding is yet another open-source, cloud-based IDE that offers a smart interface that enables dev teams and managers to streamline their workflows. What’s great about it is its data analytics features for CTOs to locate bottlenecks and loopholes in the process to optimize efficiency and productivity.

Other features of Koding include syntax highlighting, keyboard shortcuts, collapsible panes, cloud workspace, auto indenting, code folding, and code preview using a built-in browser. Koding is ideal for large teams of hundreds or thousands of developers.

Koding

 

10. Komodo IDE

Komodo IDE is a cross-platform, polyglot IDE that provides a complete set of tools, integrations, and frameworks for a hassle-free web and application development. It supports over 100 programming languages such as Python, PHP, Go, Perl, Tcl, Ruby, NodeJS, HTML, CSS, JavaScript, and more.

Additional features of Komodo IDE include syntax and highlighting, code intelligence, debugging, markdown viewer, and DOM viewer. Komodo also offers multi-cursor support so that you can edit at the same time.

Komodo IDE

 

11. NetBeans

NetBeans is a free, modern IDE that supports multi-language programming for desktop, web, and mobile applications. Because it’s an open-source IDE, NetBeans allows developers to work on both the web and the desktop by building their own plugin to meet specific needs and functions.

NetBeans IDE

 

12. Sublime Text

As an innovative text editor for code, markup, and prose, Sublime Text provides a state-of-the-art user interface that allows developers to easily jump to characters, symbols, lines, or words using keyboard shortcuts.

You can also use other advanced features such as split editing, project switching, and multiple selection to rename variables and manipulate your files quickly.

Sublime Text

 

13. WebMatrix

Created by Microsoft, WebMatrix is a simple and lightweight IDE for Windows. It is ideally used for ASP.NET WebPages development and even PHP, HTML, and CSS. WebMatrix includes features such as code completion and built-in templates.

In October 28, 2016, Microsoft announced the discontinuation of formal support for WebMatrix starting November 1, 2017. Community support will continue in its forums.

WebMatrix

 

14. WebStorm IDE

Jetbrains popularized another powerful IDE for modern JavaScript development. WebStorm IDE offers intelligent code completion, rapid error detection, navigation and refactoring for JavaScript, TypeScript, stylesheet languages, and other popular frameworks. The newest version of WebStorm can be integrated with Jest, and supports Vue.js and standard JS.

Developer teams of popular brands such as Yahoo!, Reuters, Soundcloud, Intuit, Wix, Expedia, and BMW use this robust IDE.

WebStorm IDE

 

15. Visual Studio Code

Microsoft created Visual Studio Code to replace WebMatrix. Visual Studio Code is a free, open-source editor that runs on OS X, Windows, and Linux that supports operations such as debugging, embedded Git control, task running, and version control.

Other features include syntax and highlighting, IntelliSense code completion, and code refactoring. It supports more than 30 programming languages.

Additional tools and extensions are also provided for Node.js, TypeScript, JavaScript, ASP.NET 5, and more.

Visual Studio Code

 

Final Words

Node.js is becoming increasingly popular for web and app developers worldwide. Frameworks, tools, and IDEs are useful for both beginners and professional users alike. It makes writing and testing codes a lot easier and faster


Emulating a Redis Failover with Docker

Reading the Redis documentation can be a bit confusing without the hands-on experience. You could in theory create multiple processes of the Redis Server on your machine and configure each of them in part, but what if you could do it in a few commands? Not only that but emulate the network they’re connected to as well.

I’ve been looking into this and there’s a few examples out there on Web, the best one I could find was this one: https://github.com/AliyunContainerService/redis-cluster

So, starting from that example, I’ve tried to do the next best thing, which is to create a single docker-compose.yml file for all of it. Removing the need to build each image, just to do a docker-compose up and scale as needed.

Here’s what I got:
[crayon-5b76d22786178994852144/]
Basically, after saving this into a docker-compose.yml file and running docker-compose up in that folder you’ll get this:

You can now scale as needed. For example, by running:
[crayon-5b76d22786183702007160/]
You’ll end up with:

To initiale a failover, you’ll need to take the master out of the picture, you can do that with:
[crayon-5b76d2278618a824697848/]
You can now observe the communication between the sentinels and slaves. After the down-after-milliseconds and failover timeout passes, one of the slaves will be selected for promotion.

After the sentinels agree on the selection, the slave will become the new master.

You can now unpause the old master by doing this:
[crayon-5b76d22786190538737388/]
The old master will now become a slave of the new master and perform a sync.

That’s about it. As an exercise you could try setting up a cluster starting from this and observe failovers there.


Counting lines and words using Go

For those who need to count words and lines in text files, an easy approach for this matter is to use bufio.ScanWords and bufio.ScanLine in order to quickly solve the problem.

To count words:

[crayon-5b76d22786d83352518068/]
ScanWords is a split function for a Scanner that returns each space-separated (checks unicode.IsSpace) word of text, with trimmed whitespace.

To count lines:

[crayon-5b76d22786d8f748560964/]
ScanLines is a split function for a Scanner that returns each line of text (separated by "\r?\n"). It returns also empty lines and the last line is returned even if it has no newline at the end.


Setup Docker Machine for Symfony Development

If you need a development environment for Symfony, hosted by Docker, you can use the fazy/apache-symfony docker image to start with, then extend it to your need.

In your Symfony project's folder add the Dockerfile and docker-compose.yml files.

In the first one, we added mysql and composer, then we used the docker-compose.yml file to mount a local volume to the docker container with file sync.

This way you can code on your machine and test in the docker environment.

The Dockerfile:
[crayon-5b76d227872a1774345394/]
The docker-compose.yml file:
[crayon-5b76d227872ad145172840/]
To build the Docker container use:

[crayon-5b76d227872b3427190314-i/]

To start it when it's down just remove the --build parameter:

[crayon-5b76d227872b8492604223-i/]

Once is running, you can view it's ID by running:

[crayon-5b76d227872be118773887-i/]

Now grab the first 3 characters from the id and use them in the next command to be able to log in the running container:

[crayon-5b76d227872c3354465046-i/]

Finnaly, to access the Symfony project in your browser, go to http://localhost:8080/app_dev.php and have fun!