## Wednesday, June 5, 2019

### Introduction in Big-O Notation

Big O notation is a mathematical notation that describes the limiting behavior of a function when the argument tends towards a particular value or infinity. It is a member of a family of notations invented by Paul Bachmann, Edmund Landau, and others, collectively called Bachmann-Landau notation or asymptotic notation.

Academics use big O, big Θ (theta), big Ω (omega) to describe runtimes.

#### O (big O)

 f(n) = O(g(n))
O-notation gives an upper bound for a function to within a constant factor. We write f (n) = O(g(n)) if there are positive constants n0 and c such that to the right of n0, the value of f (n) always lies on or below cg(n).

#### Ω (big omega)

 f(n) = Ω(g(n))
Ω -notation gives a lower bound for a function to within a constant factor. We write f (n) = Ω (g(n)) if there are positive constants n0 and c such that to the right of n0, the value of f(n) always lies on or above cg(n).

#### Θ (big theta)

 f(n) = Θ(g(n))
Θ-notation bounds a function to within constant factors. We write f(n) = Θ(g(n)) if there exist positive constants n0, c1, and c2 such that to the right of n0, the value of f(n) always lies between c1g(n) and c2g(n) inclusive.

#### Big O notation in software development industry

In software development industry, people seem to have merge all this concept into one. In software development we use Big O notation to work out how long an algorithm will take to run. This lets us understand how a piece of code will scale. It measures algorithmic efficiency.

Using O-notation, we can often describe the running time of an algorithm merely by inspecting the algorithm’s overall structure. For example, the doubly nested loop structure yields an O(n^2) on the worst-case running time.

### Running time of an algorithm

1. O(log n)
2. O(1)
3. O(n)
4. O(n log n)
5. O(n^2)
6. O(2^n)
7. O(n!)
 Big-O Complexity Chart (http://www.bigocheatsheet.com/)

## Sunday, April 29, 2018

### Intro

For some reasons recommended in the Travis-CI documentation, way does not work. Please find below what they recommend.

`travis encrypt \$(heroku auth:token) --add deploy.api_key`

Travis-CI fails with the following error:

`not logged in invalid option "--api_key="`

### How to generate a correct secure string

1. Navigate to your Heroku account: https://dashboard.heroku.com/account
2. Find API key section and copy key

1. Go to project root directory
2. Run the following command:

`travis encrypt <api-key> -r <github-user>/<repo-name> --add deploy.api_key`

That script will add a secure string to .travis.yml.

## Tuesday, April 3, 2018

### Intro

The developer needs to debug web application. The web application is running on IIS.

### Attach to process

Open your project in Visual Studio and build it. Then go to Debug → Attach to Process (Ctrl + Alt + P).  See picture below.

 Attaching to IIS process in Visual Studio

In 'Attach to' section select appropriate code type if you know it, otherwise you can keep it as default 'Automatically determine the type of code to debug'. In such case, the appropriate debugger will be selected based on the kind of code that is running.

To make sure that 'Available processes' windows shows your IIS process, check 'Show processes from all users' checkbox. Then use the filter to find all aspnet_wp.exe, w3p.exe, or w3wp.exe processes.

### Multiple w3wp processes

Which w3wp.exe PID corresponds to which application pool? This is the question you will face if you have multiple web applications running on your machine.

In IIS7+ and Windows 2008+, you can use appcmd.exe utility to determine which PID belongs to which IIS process. Open command prompt as Administrator → navigate to %windir%\system32\inetsrv\ → run following command:

```cd/d %windir%\system32\inetsrv\

appcmd list wp```

The output of the command will show which PID belongs to which IIS process. See picture below.

 The output of appcmd utility execution

## Monday, March 5, 2018

### Installing Jenkins on Windows with IIS. HTTPS configuration.

This post gives you an overview how to install Jenkins on Windows using IIS and reverse proxy.

### Jenkins installation

By default, Jenkins will be available on 8080 port. Open your browser and navigate to http://localhost:8080. It is the address where Jenkins is running.

### Setting up IIS

To setup reverse proxy you need to install the following IIS plugins:
Click on links above and you will be navigated to official installation source for both IIS plugins.

### Reverse proxy for Jenkins

First of all, we need to create a new website. Create a new one with the name 'Jenkins'. After installation of IIS plugins, you should be able to configure a reverse proxy.

Follow the instructions from https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+IIS to setup HTTPS to HTTP reverse proxy for Jenkins.

### HTTPS configuration

We will use Let’s Encrypt for certificate generation. Let’s Encrypt is a free, automated, and open Certificate Authority. And Certify tool to manage certificates.
2. Click 'New Certificate', choose your IIS site (which must have 1 or more hostname bindings set). Save your settings and click 'Request Certificate'
3. All done! Click 'Configure Auto Renew' to set up the scheduled task for renewals.

### Conclusion

Now we have a basic setup for Jenkins on IIS with HTTPS support.

## Tuesday, January 30, 2018

### Create static HTML website generator using Nunjucks and Gulp

In this article, we will learn how to create simple static website generator using Nunjucks and Gulp. Our implementation does not require any specific knowledge, just some basic JavaScript, and HTML. Of course, complexity depends on website functionality, but in our scenario, we will focus on the main idea of static website generation.

### Project structure

```|-- .editorconfig
|-- .gitattributes
|-- .gitignore
|-- src
|-- build.sh
|-- build.cmd
|-- package.json
|-- run.sh
|-- run.cmd
|-- gulpfile.js
|-- build  // output directory for generated HTML
|-- config // directory contains configuration for web server
|-- css
|-- img
|-- pages // directory with web-site pages
|-- 404.html
|-- index.html
|-- templates // nunjucks templates
|-- macros
|-- parts
|-- _footer.html
|-- _globals.html
|-- _layout.html
```

There are 3 files in the root of the project. .editorconfig is the interesting one. EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs. More information about EditorConfig could be found using the following link http://editorconfig.org/.

### Building common layout

Nunjucks is templating engine with block inheritance, auto-escaping, macros, asynchronous control, and more. To build our website we will start with defining master page layout using nunjucks way of templating. Link to nunjucks templating documentation: https://mozilla.github.io/nunjucks/templating.html

_layout.html

```<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>My site</title>
<meta name="keywords" content="">
<meta name="description" content="">
{% endblock %}
<body>
{% block header %} {% endblock %}
<div class="main">
{% block content %} {% endblock %}
</div>
{% include "parts/_footer.html" %}
<!-- Common scripts placeholder. -->
{% block scripts %}
{% endblock %}
</body>
</html>```

As you can see layout contains the reference to _footer.html. Nunjucks allows you to extract several parts of  HTML markup into reusable components.

_footer.html

```{% import '_globals.html' as globals %}

<footer class="footer">
Check out website <a href="{{globals.website_url}}">{{globals.website_url}}</a>
</footer>```

### Website shared settings

It is useful to have one common place where you can store global settings for your website. For such purposes, we will create the_globals.html file, where will store shared configuration. On previous code snippet, you can find an example how to use global settings.

_globals.html

```{% set website_url = "http://www.maniuk.net" %}
```

### Creating page

All pages go to pages directory. The page might extend any of specified base layouts. Following code example shows markup for a simple index page.

index.html

```{% extends "_layout.html" %}

<title>My site</title>
<meta name="keywords" content="">
<meta name="description" content="">
{% endblock %}

{% endblock %}

{% block content %}
Hello world!
{% endblock %}
```

We want current page to be highlighted in navigation menu so we will create nunjucks macro to achieve that.

```{% macro renderHeader(activePage='index') %}
<div class="logo">
<a href="/">
<img src="/img/logo.png" alt="logo" />
</a>
</div>
<li class="navigation-list-item {%if activePage == 'index' %}current{% endif %}">
</li>
<li class="navigation-list-item {%if activePage == '404' %}current{% endif %}">
</li>
</ul>
</nav>
{% endmacro %}
```

### Building project with gulp

First of all, we need to specify the list of dependencies we need for a successful build.

```"devDependencies": {
"browser-sync": "^2.18.13",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^4.0.0",
"gulp-clean-css": "^3.9.0",
"gulp-concat": "^2.6.1",
"gulp-htmlmin": "^3.0.0",
"gulp-imagemin": "^3.3.0",
"gulp-nunjucks-render": "^2.2.1",
"gulp-sass": "^3.1.0",
"gulp-uglify": "^3.0.0"
},```

End now it is time for a gulpfile.js file with build configuration.

gulpfile.js

```var gulp =            require('gulp'),
browserSync =     require('browser-sync').create(),
sass =            require('gulp-sass'),
uglify =          require('gulp-uglify'),
autoprefixer =    require('gulp-autoprefixer'),
cleanCSS =        require('gulp-clean-css'),
imagemin =        require('gulp-imagemin'),
nunjucksRender =  require('gulp-nunjucks-render'),
concat =          require('gulp-concat'),
htmlmin =         require('gulp-htmlmin');

// Static Server + watching scss/html files.
browserSync.init({
server: './build'
});

gulp.watch('css/dev/*.scss', ['sass']);
gulp.watch('./**/*.html', ['nunjucks-html-watch'])
});

return gulp.src('css/style.scss')
.pipe(sass())
.pipe(autoprefixer({
browsers: ['last 2 versions'],
}))
.pipe(cleanCSS())
.pipe(gulp.dest('./build/css'))
.pipe(browserSync.stream());
});

return gulp.src('js/*.js')
.pipe(uglify())
.pipe(gulp.dest('build/js'))
});

return gulp.src('img/**')
.pipe(imagemin({
progressive: true,
optimizationLevel: 3
}))
.pipe(gulp.dest('build/img'))
});

return gulp.src('pages/**/*.+(html|nunjucks)')
.pipe(nunjucksRender({
path: ['templates']
}))
.pipe(htmlmin(
{
collapseWhitespace: true,
}))
.pipe(gulp.dest('build'))
});

});

return gulp.src([
'./node_modules/jquery/dist/jquery.min.js'])
.pipe(concat('vendors.js'))
.pipe(gulp.dest('build/js/'));
});

gulp.src([
'config/web.config'
])
.pipe(gulp.dest('build'));
});

// Compile project.
['sass', 'compressImage', 'compressJs', 'nunjucks', 'vendors-scripts', 'copy-files']);

// Compile and start project.
```

### Local development

I find it handy to use gulp build-in HTTP server, developers can easily emulate a server on their machine. Following bash script runs simple HTTP server for local development.

run.sh

```#!/usr/bin/env bash
echo "Installing dependencies..."
npm install

echo "Running gulp"
./node_modules/.bin/gulp
```

### Conclusion

Gulp and Nunjucks are great tools and it is possible to create static site generator using them. Full source code could be found on GitHub repo: https://github.com/aliakseimaniuk/blog-examples/tree/master/static-site-generator.

## Thursday, January 4, 2018

### List of email marketing automation servies

In this article, you can find a list of useful email marketing automation tools.

1. UniSender - https://www.unisender.com/en/
2. Mailchimp - https://mailchimp.com/
3. Sendsay - https://sendsay.ru/
4. Emarsys - https://www.emarsys.com/en/
5. Silverpop - http://www.silverpop.com/home/
6. Zetaglobal - https://zetaglobal.com/
7. Salesforce - https://www.salesforce.com/
8. Campaignmonitor - https://www.campaignmonitor.com/
9. Emma - https://myemma.com/
10. Selligent - https://www.selligent.com/
11. Klaviyo - https://www.klaviyo.com/

## Thursday, November 16, 2017

### Intro

By default, Jenkins has disabled mail.smtp.starttls option and if you want to send notifications through any SMPT service which requires TLS, for example, through Gmail SMTP server, you need to enable this option. If the option is disabled you receive the following exception:

```com.sun.mail.smtp.SMTPSendFailedException:
530 5.7.0 Must issue a STARTTLS command first. q15sm1393424wra.91 - gsmtp ```

#### Fixing SMTPSendFailedException on Windows

1. Navigate to Jenkins installation folder. To find out exact installation folder you need to navigate to 'Manage Jenkins' page and check 'Home directory' property. By default home directory should be 'C:\Program Files (x86)\Jenkins'
2. Open 'jenkins.xml' and add '-Dmail.smtp.starttls.enable=true' to arguments. See XML-code snippet below:

```<executable>%BASE%\jre\bin\java</executable>
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dmail.smtp.starttls.enable=true -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>```

3. Restart Jenkins by navigating to {base_jenkins_url}/restart URL.

#### Fixing SMTPSendFailedException on Ubuntu 16.04

Basically, the steps are pretty the same as for Windows. First of all you need to figure out where Jenkins stores it configuration. By default, it should be '/etc/default/jenkins' file.

1. Open '/etc/default/jenkins' file.
2. Add '-Dmail.smtp.starttls.enable=true' to Java arguments.

```# arguments to pass to java

# Allow graphs etc. to work even when an X server is present