Personal collection of code snippets from 1999th year

By Kalinin Alexandr — f121h@yandex.ru, vk.com/aik84

About SEEyp (last update: 2014-09-11 22:29:29)

SEEyp is a free collection of code snippets: PHP (PDO, Laravel, Slim, Yii), Java (Jsoup, Apache Commons, Hibernate, Solr) and C++ (statistics). Free for personal and commercial use.

Disclaimer

The SEEyp and all contents of the SEEyp are provided on an "as is" basis without warranties of any kind, either expressed or implied, including without limitation warranties of title or implied warranties of merchantability or fitness for a particular purpose.

GIT (new branch, commit, merge, diff and push)

# GIT (new branch)

git status
git checkout master
git fetch
git pull
git reset --hard origin/master
git checkout -b ID0001

# GIT (commit and merge)

git status
git add .
git commit -a -m "About ..."
git fetch
git merge origin/master

# GIT (diff and push)

git diff --color-words origin/master
git push origin ID0001

PHP (Laravel, CRUD)

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
 
class StatisticsController extends BaseController {

	private $validatorRules = [
		'event' => 'required|min:2|max:40', 
		'value' => 'required|min:1|max:60'];
	
	/**
	* isAdmin
	*/
	public function __construct() {
		$this->beforeFilter('auth');
	}
	
	/**
	* List
	*/
	public function index() {
		return View::make('list', ['statistics' => Statistics::paginate(5)]);
	}
	
	/**
	* Add form
	*/
	public function add() {
		return View::make('add');
	}
	
	/**
	* Edit form
	*/
	public function edit($id) {
		return View::make('edit', ['statistics' => Statistics::find($id)]);
	}
	
	/**
	* View
	*/
	public function view($id) {
		return View::make('view', ['statistics' => Statistics::find($id)]);
	}
	
	/**
	* Delete
	*/
	public function delete($id) {
		Statistics::find($id)->delete();
		Log::info('Delete (Statistics) = ' . $id . ' = ' . Auth::user()->email);
		return Redirect::to('/admin/example/');
	}
	
	/**
	* Create
	*/
	public function create() {
		$validator = Validator::make(Input::all(), $this->validatorRules);
		if ($validator->passes()) {
			$statistics = new Statistics();
			$statistics->event = Input::get('event');
			$statistics->value = Input::get('value');
			$statistics->save();
			
			Log::info('Create (Statistics) = '. $statistics->id .' = '. Auth::user()->email);
			return Redirect::to('/admin/example/');
		}
		return View::make('add');
	}
	
	/**
	* Update
	*/
	public function update() {
		$validator = Validator::make(Input::all(), $this->validatorRules);
		if ($validator->passes()) {
			$statistics = Statistics::find(Input::get('id'));
			$statistics->event = Input::get('event');
			$statistics->value = Input::get('value');
			$statistics->save();
			
			Log::info('Update (Statistics) = '. $statistics->id .' = '. Auth::user()->email);
			return Redirect::to('/admin/example/');
		}
		return View::make('edit', ['statistics' => Statistics::find(Input::get('id'))]);
	}
	
	/**
	* Import
	*/
	public function import() {
		if (Input::hasFile('file')) {
			if (Input::file('file')->isValid()) {
				Log::info('Import (Statistics) = '. Auth::user()->email);
				Input::file('file')->move('../private/doc/', 'statistics.st');
				$contents = File::get('../private/doc/statistics.st');
				
				if(!CsvValidator::isValid($contents, 'statistics')) {
					return View::make('statistics-help');
				}
				
				foreach(explode("\n", $contents) AS $line) {
					$addStat = explode(";", $line);
					$orm = new Statistics();
					$orm->event = empty($addStat[0]) ? '0' : $addStat[0];
					$orm->value = empty($addStat[1]) ? '0' : $addStat[1];
					$orm->save();
				}
			}
		}
		return Redirect::to('/admin/example/');
	}
}
/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
 
class LoginController extends BaseController {
	
	/**
	* Login form
	*/
	public function form() {
		return View::make('login');
	}
	
	/**
	* Logout user
	*/
	public function logout() {
		Auth::logout();
		return Redirect::to('/admin/example/login');
	}
	
	/**
	* Login user
	*/
	public function login() {
		$userdata = ['email' => Input::get('email'), 'password' => Input::get('password')];
		if(Auth::attempt($userdata)) {
			Log::info('Login = ' . Input::get('email'));
			return Redirect::to('/admin/example/');
		} else {
			return Redirect::to('/admin/example/login');
		}
	}
}
/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
 
class AjaxApiController extends BaseController {

	private $validatorMessageRules = [
		'name' => 'required|min:2|max:60', 
		'email' => 'required|email|min:4|max:60', 
		'message' => 'required|min:5'
		];
	
	/**
	* Add message
	*/
	public function addMessage() {
		$validator = Validator::make(Input::all(), $this->validatorMessageRules);
		if ($validator->passes()) {
			$message = new UserMessage();
			$message->name = Input::get('name');
			$message->email = Input::get('email');
			$message->message = Input::get('message');
			$message->save();
		}
		return $validator->messages();
	}
}

PHP (PDO, Slim)

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2008-01-05 19:10:00 (last modify: 2014-03-05 21:34:12)
 */

/**
 * 
 * FILE: /kalinin/db/pdo.php
 *
 */
class ExamplePDO {

	private static $_instance;
	private $_pdo;
	private $_conf = ["mysql:host=localhost;dbname=t1;charset=utf8", "root", ""];
	private $_prm = [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];

	/**
	* Constructor
	*/
	private function __construct() {
		$this->_pdo = new PDO($this->_conf[0], $this->_conf[1], $this->_conf[2], $this->_prm);
	}
	
	/**
	* Singleton
	*/
	private function __clone() {}
	private function __wakeup() {} 
	public static function getInstance() {
		if (self::$_instance === null) {
			self::$_instance = new self;  
		}
		return self::$_instance;
	}
	
	/**
	* Get connection
	*/
	public function getConnection() {
		return $this->_pdo;
	}
}

/**
 * 
 * FILE: /kalinin/models/IReport.php
 *
 */
interface IReport {
	function validator($report);
	function save($report);
}

/**
 * 
 * FILE: /kalinin/models/SimpleReport.php
 *
 */
class SimpleReport implements IReport {

	private $_pdo;
	
	/**
	* Constructor
	*/
	public function __construct($_pdo) {
		$this->_pdo = $_pdo;
	}
	
	/**
	* Validator
	*/
	public function validator($report) {
		$errors = [];
		if(empty($report['page_id'])) {
			$errors[] = 1;
		} else {
			if(!filter_var($report['page_id'], FILTER_VALIDATE_INT)) {
				$errors[] = 2;
			}
		}
		if(empty($report['stars'])) {
			$errors[] = 3;
		} else {
			if(!filter_var($report['stars'], FILTER_VALIDATE_INT)) {
				$errors[] = 4;
			}
		}
		return $errors;
	}
	
	/**
	* Save report
	*/
	public function save($report) {
		$stm = $this->_pdo->prepare("INSERT INTO `simple_report` 
			(`page_id`, `stars`, `ip`, `agent`) VALUES (?, ?, ?, ?);");
		
		$stm->bindParam(1, $report['page_id'], PDO::PARAM_INT);
		$stm->bindParam(2, $report['stars'], PDO::PARAM_INT);
		$stm->bindParam(3, $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
		$stm->bindParam(4, $_SERVER['HTTP_USER_AGENT'], PDO::PARAM_STR);
		$stm->execute();
	}
}

/**
 * 
 * FILE: /kalinin/app/ReportFactory.php
 *
 */
class ReportFactory {
	public static function create($type) {
		$connection = ExamplePDO::getInstance()->getConnection();
		switch ($type) {
			case "simple":
				return new SimpleReport($connection);
			break;
		}
	}
}

/**
 * 
 * FILE: /kalinin/index.php
 *
 */
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();

/**
 * 
 * Config
 *
 */
$app = new \Slim\Slim();
$app->config('debug', true);
$app->config(['templates.path' => './views/']);
$conf['url'] = 'http://127.0.0.1:8098/';

/**
 * 
 * Show form
 *
 */
$app->get('/form', function () use ($app) {
	$app->render('form.php');
});

/**
 * 
 * Save simple report
 *
 */
$app->post('/save-simple-report', function () use ($app) {	
	$model = ReportFactory::create("simple");
	$errors = $model->validator($app->request->post());
	
	if(empty($errors)) {
		$model->save($app->request->post());
	}

	$app->render('ajax.php', ['errors' => json_encode($errors)]);
});

/**
 * 
 * 404
 *
 */
$app->notFound(function () use ($app, $conf) {
	$app->redirect($conf['url'], 301);
});

/**
 * 
 * Exception
 *
 */
$app->error(function (\Exception $e) use ($app, $conf) {
	$app->redirect($conf['url'], 301);
});

$app->run();

PHP (Yii 2.0, CRUD)

<?php

namespace app\controllers;

use Yii;
use app\models\Page;
use app\models\PageSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;

/**
 * PageController implements the CRUD actions for Page model.
 */
class PageController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['index', 'update', 'delete', 'view'],
                'rules' => [
                    [
                        'actions' => ['index', 'update', 'delete', 'view'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
        ];
    }

    /**
     * Lists all Page models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new PageSearch;
        $dataProvider = $searchModel->search(Yii::$app->request->getQueryParams());

        return $this->render('index', [
            'dataProvider' => $dataProvider,
            'searchModel' => $searchModel,
        ]);
    }
    
     /**
     * Displays a single Page model.
     * @param string $alias
     * @return mixed
     */
    public function actionProd($alias)
    {
        if(!$alias) {
            return $this->redirect(['prod', 'alias' => 'example']);
        }
        
        $model = Page::findOne(['alias' => $alias]);
        
        if(!$model) {
            return $this->redirect(['prod', 'alias' => 'example']);
        }
        
        $this->layout = 'example'; // In view: $this->beginContent('@app/views/layouts/example.php');
        
        return $this->render('example', [
            'model' => $model
        ]);
    }

    /**
     * Displays a single Page model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Page model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Page;

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Updates an existing Page model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Deletes an existing Page model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['prod', 'alias' => '123']);
    }

    /**
     * Finds the Page model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Page the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Page::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}
<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "posts".
 *
 * @property integer $id
 * @property string $alias
 * @property string $title
 * @property string $body
 */
class Page extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'posts';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['alias', 'body', 'title'], 'required'],
            [['body'], 'string'],
            [['alias'], 'string', 'max' => 40, 'min' => 3],
            [['title'], 'string', 'max' => 80, 'min' => 6]
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'alias' => Yii::t('app', 'Alias'),
            'title' => Yii::t('app', 'Title'),
            'body' => Yii::t('app', 'Content'),
        ];
    }
}

MySQL

CREATE TABLE IF NOT EXISTS `goals` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) NOT NULL,
  `description` varchar(250) NOT NULL,
  `value` double NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(60) NOT NULL,
  `password` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


CREATE TABLE IF NOT EXISTS `users_properties` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `gender` int(1) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


CREATE TABLE IF NOT EXISTS `pages` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `alias` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `content` longtext COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;


CREATE UNIQUE INDEX `alias` ON pages(`alias`);


SELECT title, COUNT(*) cnt FROM `pages` GROUP BY title HAVING cnt > 1;


INSERT INTO `goals` (`id`, `name`, `description`, `value`, `date`) 
VALUES (NULL, 'countUsers', 'Всего пользователей на данный момент', 
	(
	SELECT COUNT(id) FROM `users`
	), 
CURRENT_TIMESTAMP);


INSERT INTO `goals` (`id`, `name`, `description`, `value`, `date`) 
VALUES (NULL, 'countAllMan', 'Всего мужчин зарегистрировано на сайте', 
	(
	SELECT COUNT(u.id)
	FROM `users` u
	JOIN `users_properties` up ON u.id = up.user_id
	WHERE up.gender = 1
	), 
CURRENT_TIMESTAMP);

Java (FileHelper)

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
public class FileHelper {
	
	/**
	 * Write string to file
	 * @param fileName
	 * @param content
	 */
	public void saveStringToFile(String fileName, String content) {
		try {
			FileUtils.writeStringToFile(new File(fileName), content, "UTF-8");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Read lines from file
	 * @param fileName
	 */
	public List<String> readFromFile(String fileName) {
		List<String> lines = new ArrayList<String>();
		try {
			lines = FileUtils.readLines(new File(fileName), "UTF-8");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return lines;
	}
	
	/**
	 * Download content
	 * @param url
	 */
	public String readFromURL(String url) {
		String content = null;
		InputStream in = null;
		try {
			in = new URL(url).openStream();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			content = IOUtils.toString(in);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(in);
		}
		
		return content;
	}
}

JAVA (Statistics)

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.math3.stat.correlation.Covariance;
import org.apache.commons.math3.stat.correlation.KendallsCorrelation;
import org.apache.commons.math3.stat.correlation.PearsonsCorrelation;
import org.apache.commons.math3.stat.correlation.SpearmansCorrelation;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
public class Statistics {

	private DescriptiveStatistics stats = new DescriptiveStatistics();
	private PearsonsCorrelation pc = new PearsonsCorrelation();
	private KendallsCorrelation kc = new KendallsCorrelation();
	private SpearmansCorrelation sc = new SpearmansCorrelation();
	private Covariance cv = new Covariance();
	
	/**
	 * Set values
	 * @param in
	 */
	public void setValues(Double[] in) {
		for (Double value : in) {
			this.stats.addValue(value);
		}
	}
	
	/**
	 * Show all values
	 */
	public void showValues() {
		for (Double value : this.stats.getValues()) {
			System.out.println(value);
		}
	}
	
	/**
	 * Stat info
	 */
	public Map<String,Double> statInfo() {
		Map<String,Double> result = new HashMap<String,Double>();
		
		result.put("PopulationVariance", this.stats.getPopulationVariance());
		result.put("Max", this.stats.getMax());
		result.put("Min", this.stats.getMin());
		result.put("Mean", this.stats.getMean());
		result.put("GeometricMean", this.stats.getGeometricMean());
		result.put("Kurtosis", this.stats.getKurtosis());
		result.put("Skewness", this.stats.getSkewness());
		result.put("StandardDeviation", this.stats.getStandardDeviation());
		result.put("Sum", this.stats.getSum());
		result.put("Variance", this.stats.getVariance());
		result.put("N", Double.valueOf(this.stats.getN()));
		
		return result;
	}
	
	/**
	 * Pearson's product-moment correlation
	 * Kendall's Tau-b rank correlation
	 * Spearman's rank correlation
	 * Covariance
	 */
	public Map<String,Double> correlationInfo(double[] a, double[] b) {
		Map<String,Double> result = new HashMap<String,Double>();
		
		result.put("Pearson's product-moment correlation", this.pc.correlation(a,b));
		result.put("Kendall's Tau-b rank correlation", this.kc.correlation(a,b));
		result.put("Spearman's rank correlation", this.sc.correlation(a,b));
		result.put("Covariance", this.cv.covariance(a,b));
		
		return result;
	}
}
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
public class SplitTestReport {

	private DescriptiveStatistics splitA = new DescriptiveStatistics();
	private DescriptiveStatistics splitB = new DescriptiveStatistics();
	
	/**
	 * Set values
	 * @param in
	 */
	public void setValues(Double[] arrayA, Double[] arrayB) {
		for (Double value : arrayA) {
			this.splitA.addValue(value);
		}
		for (Double value : arrayB) {
			this.splitB.addValue(value);
		}
	}
	
	/**
	 * Is B win?
	 */
	public Boolean isBWin() {
		if(this.splitA.getSum() < this.splitB.getSum()) {
			return true;
		}
		return false;
	}
	
	/**
	 * Diff (%)
	 */
	public Double diff() {
		Double diff = this.splitB.getSum() - this.splitA.getSum();
		return (diff / this.splitA.getSum()) * 100.0;
	}
	
	/**
	 * Is A real?
	 */
	public Boolean isAReal() {
		return (this.splitA.getMax() > 0.0);
	}
	
	/**
	 * Is B real?
	 */
	public Boolean isBReal() {
		return (this.splitB.getMax() > 0.0);
	}
}

JAVA (Jsoup)

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
public class JsoupExample {
	
	private Document doc;
	
	/**
	 * Use proxy
	 */
	public JsoupExample() {
		System.getProperties().put("http.proxyHost", Conf.getConf("Conf.host"));
		System.getProperties().put("http.proxyPort", Conf.getConf("Conf.port"));
		System.getProperties().put("http.proxyUser", Conf.getConf("Conf.user"));
		System.getProperties().put("http.proxyPassword", Conf.getConf("Conf.password"));
	}
	
	/**
	 * URL
	 * @param url
	 * @throws IOException
	 */
	public void setDocument(String url) throws IOException {
		this.doc = Jsoup.connect(url).get();
	}
	
	/**
	 * Title
	 * @return
	 */
	public String getTitle() {
		return this.doc.select("title").first().text();
	}
	
	/**
	 * H1
	 * @return
	 */
	public String getH1() {
		return this.doc.select("h1").first().text();
	}
	
	/**
	 * H2-H4
	 * @return
	 */
	public List<String> getH24List() {
		List<String> ls = new ArrayList<String>();
		
		Elements links = doc.select("h2");
		for (Element link : links) {
			ls.add(link.text());
		}
		
		Elements linksH3 = doc.select("h3");
		for (Element link : linksH3) {
			ls.add(link.text());
		}
		
		Elements linksH4 = doc.select("h4");
		for (Element link : linksH4) {
			ls.add(link.text());
		}
		
		return ls;
	}
	
	/**
	 * A (href=)
	 * @return
	 */
	public List<String> getAList() {
		Elements links = doc.select("a");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.attr("href"));
		}
		
		return ls;
	}
	
	/**
	 * A (text)
	 * @return
	 */
	public List<String> getATextList() {
		Elements links = doc.select("a");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.text());
		}
		
		return ls;
	}
	
	/**
	 * Strong
	 * @return
	 */
	public List<String> getStrongList() {
		Elements links = doc.select("strong");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.text());
		}
		
		return ls;
	}
	
	/**
	 * Em
	 * @return
	 */
	public List<String> getEmList() {
		Elements links = doc.select("em");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.text());
		}
		
		return ls;
	}
	
	/**
	 * P
	 * @return
	 */
	public List<String> getPList() {
		Elements links = doc.select("p");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.text());
		}
		
		return ls;
	}
	
	/**
	 * Img (alt=)
	 * @return
	 */
	public List<String> getAltList() {
		Elements links = doc.select("img");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.attr("alt"));
		}
		
		return ls;
	}
	
	/**
	 * Img (title=)
	 * @return
	 */
	public List<String> getImgTitleList() {
		Elements links = doc.select("img");
		List<String> ls = new ArrayList<String>();

		for (Element link : links) {
			ls.add(link.attr("title"));
		}
		
		return ls;
	}
}

JAVA (Statistics, Hibernate)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
	<class name="kalinin.example.stat.Stat" table="stat">
		<meta attribute="class-description">By Kalinin Alexandr</meta>
		<id name="id" type="int" column="id"><generator class="native"/></id>
		<property name="keyWord" column="key_word" type="string"/>
		<property name="visits" column="visits" type="integer"/>
		<property name="date" column="date" type="date"/>
	</class>
</hibernate-mapping>
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.GenericGenerator;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
@Entity
@Table( name = "stat" )
public class Stat {
	
	private Integer id;
	private Integer visits;
	private String keyWord;
	private Date date;
	
	public Stat() {	
		// Hibernate
	}
	
	public Stat(Integer id, Integer visits, String keyWord, Date date) {
		this.id = id;
		this.visits = visits;
		this.keyWord = keyWord;
		this.date = date;
	}

	/**
	 * @return the id
	 */
	@Id
	@GeneratedValue(generator="increment")
	@GenericGenerator(name="increment", strategy = "increment")
	public Integer getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the visits
	 */
	public Integer getVisits() {
		return visits;
	}

	/**
	 * @param visits the visits to set
	 */
	public void setVisits(Integer visits) {
		this.visits = visits;
	}

	/**
	 * @return the keyWord
	 */
	public String getKeyWord() {
		return keyWord;
	}

	/**
	 * @param keyWord the keyWord to set
	 */
	public void setKeyWord(String keyWord) {
		this.keyWord = keyWord;
	}

	/**
	 * @return the date
	 */
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "stat_date")
	public Date getDate() {
		return date;
	}

	/**
	 * @param date the date to set
	 */
	public void setDate(Date date) {
		this.date = date;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Stat [id=" + id + ", visits=" + visits + ", keyWord=" + keyWord
				+ ", date=" + date + "]";
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((date == null) ? 0 : date.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((keyWord == null) ? 0 : keyWord.hashCode());
		result = prime * result + ((visits == null) ? 0 : visits.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Stat)) {
			return false;
		}
		Stat other = (Stat) obj;
		if (date == null) {
			if (other.date != null) {
				return false;
			}
		} else if (!date.equals(other.date)) {
			return false;
		}
		if (id == null) {
			if (other.id != null) {
				return false;
			}
		} else if (!id.equals(other.id)) {
			return false;
		}
		if (keyWord == null) {
			if (other.keyWord != null) {
				return false;
			}
		} else if (!keyWord.equals(other.keyWord)) {
			return false;
		}
		if (visits == null) {
			if (other.visits != null) {
				return false;
			}
		} else if (!visits.equals(other.visits)) {
			return false;
		}
		return true;
	}
}
import java.util.List;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
public class StatDAO extends AbstractDao {
	
	/**
	 * List
	 */
	public List<Stat> listStat() {
		return super.findAll(Stat.class);
	}
	
	/**
	 * Get
	 */
	public Stat getStat(Integer id) {
		return (Stat) super.find(Stat.class, id);
	}
	
	/**
	 * Add
	 */
	public void addStat(Stat stat) {
		super.saveOrUpdate(stat);
	}
	
	/**
	 * Delete
	 */
	public void deleteStat(Stat stat) {
		super.delete(stat);
	}
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
	<class name="kalinin.example.goals.Goal" table="goals">
		<meta attribute="class-description">By Kalinin Alexandr</meta>
		<id name="id" type="long" column="id"><generator class="native"/></id>
		<property name="name" column="name" type="string"/>
		<property name="description" column="description" type="string"/>
		<property name="value" column="value" type="double"/>
		<property name="date" column="date" type="date"/>
	</class>
</hibernate-mapping>
import java.util.Date;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-01-05
 */
public class Goal {
	private Long id;
	private String name;
	private String description;
	private Double value;
	private Date date;
	
	public Goal() {}
	
	public Goal(Long id, String name, String description, Double value, Date date) {
		this.id = id;
		this.name = name;
		this.description = description;
		this.value = value;
		this.date = date;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Double getValue() {
		return value;
	}

	public void setValue(Double value) {
		this.value = value;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	@Override
	public String toString() {
		return "Goals [id=" + id + ", name=" + name + ", description="
				+ description + ", value=" + value + ", date=" + date + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((date == null) ? 0 : date.hashCode());
		result = prime * result
				+ ((description == null) ? 0 : description.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((value == null) ? 0 : value.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Goal other = (Goal) obj;
		if (date == null) {
			if (other.date != null)
				return false;
		} else if (!date.equals(other.date))
			return false;
		if (description == null) {
			if (other.description != null)
				return false;
		} else if (!description.equals(other.description))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (value == null) {
			if (other.value != null)
				return false;
		} else if (!value.equals(other.value))
			return false;
		return true;
	}
}
import java.util.List;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
public interface IGoalDAO {
	public List <Goal> search(String criteria);
	public Double metric(String criteria);
}
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
public class GoalDAOImpl implements IGoalDAO {

	@Override
	public List <Goal> search(String criteria) {
		Session session = null;
		List goals = new ArrayList<Goal>();
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Query query = session.createQuery(criteria);
			goals = query.list();
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
		return goals;
	}

	@Override
	public Double metric(String criteria) {
		Session session = null;
		Double result = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Query query = session.createQuery(criteria);
			result = (Double) query.uniqueResult();
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
		return result;
	}
}
/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
public class Factory {
	private static Factory instance = null;
	private static IGoalDAO goalDAO = null;
	
	public static synchronized Factory getInstance() {
		if (instance == null) {
			instance = new Factory();
		}
		return instance;
	}

	public IGoalDAO getGoalDAO() {
		if (goalDAO == null) {
			goalDAO = new GoalDAOImpl();
		}
		return goalDAO;
	}
}
import java.util.List;

/**
 * @author Kalinin Alexandr
 * @see http://www.kalinin84.info/
 * @since 2014-08-26 21:34:12
 */
public class GoalsReport {

	public void example() {
		
		String criteriaA = "from Goal where name <> 'nox' and date > '2014-09-05'";
		String criteriaB = "select avg(value) from Goal where name = 'pw'";
		
		List <Goal> goals = Factory.getInstance().getGoalDAO().search(criteriaA);
		for (Goal goal : goals) {
			System.out.println(goal);
		}

		System.out.println(Factory.getInstance().getGoalDAO().metric(criteriaB));
	}
}

JAVA (Solr)

<add>
	<doc>
		<field name="id">1</field>
		<field name="event">login</field>
		<field name="value">UserName</field>
	</doc>
	<doc>
		<field name="id">2</field>
		<field name="event">test</field>
		<field name="value">All ok!</field>
	</doc>
	<doc>
		<field name="id">3</field>
		<field name="event">seo</field>
		<field name="value">Ok!</field>
	</doc>
</add>
<dataConfig>
	<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" 
		url="jdbc:mysql://localhost:3306/t1" user="root" password=""/>

	<document>
	<entity name="events" pk="id" query="SELECT id, event, value FROM events">
		<field column="id" name="id" />
		<field column="event" name="event" />
		<field column="value" name="value" />
	</entity>
	</document>
</dataConfig>

C++ (Statistics)

/////////////////////////////////////////////////////////////////////////
// 
// Author: Kalinin Alexandr
// Email: f121h@yandex.ru
// Date: 21 May 2001 (last update: 11 May 2010)
//
/////////////////////////////////////////////////////////////////////////

/* 
/////////////////////////////////////////////////////////////////////////
// Create a new file (file name: main.txt) and add the following content to it
// The file main.txt can be located in the directory with seeyp.exe
// After the create is complete, you have to run seeyp.exe and click Run

// Set a title of document
# Title

// Add a note to your report
* Sub-heading
- Text

// Descriptive statistical analysis
= ? MetricID 10 20 30 40 50 60.12 78.24

// Pearson's product-moment coefficient
= + MetricID 10 20 30 40 50 60.12 78.25
= - MetricID 10 20 30 40 50 60.12 78.29

// Site quality checker (Bounce rate%, Repeat visitors%, Sales conversions%)
= / SiteID 8.36 36.6 5.741
/////////////////////////////////////////////////////////////////////////
*/

#include <iostream>
#include <sstream>
#include <math.h>
#include <fstream>
#include <algorithm>
#include <string>
#include <stdio.h>
#include <string.h>

using namespace std;

double ak[5512];
double st[5512];
double diff[5512];

/**
* Sum
*/
double seeypSum(double v[], int size) {
	double sum = 0.0;
	for(int i = 0; i < size; i++) {
		sum += v[i];
	}
	return sum;
}

/**
* Mean
*/
double seeypMean(double v[], int size) {
	return (seeypSum(v, size) / size);
}

/**
* Variance
*/
double seeypVariance(double v[], int size) {
	double mean = seeypMean(v, size);
	double temp = 0.0;
	for(int i = 0; i < size; i++) {
		temp += (v[i] - mean) * (v[i] - mean);
	}
	return (temp / size);
}

/**
* Standard Deviation
*/
double seeypStandardDeviation(double v[], int size) {
	return sqrt(seeypVariance(v, size));
}

/**
* Min
*/
double seeypMin(double v[], int size) {
	double min = v[0];
	for(int i = 0; i < size; i++) {
		if(v[i] < min) {
			min = v[i];
		}
	}
	return min;
}

/**
* Max
*/
double seeypMax(double v[], int size) {
	double max = v[0];
	for(int i = 0; i < size; i++) {
		if(v[i] > max) {
			max = v[i];
		}
	}
	return max;
}

/**
* Pearson's product-moment coefficient
*/
double seeypPRC(double dataX[], double dataY[], int size) {
	double meanX = seeypMean(dataX, size);
	double meanY = seeypMean(dataY, size);
	double uz , varX , varY = 0.0;
	for (int i = 0; i < size; i++) {
		uz += (dataX[i] - meanX) * (dataY[i] - meanY);
		varX += (dataX[i] - meanX) * (dataX[i] - meanX);
		varY += (dataY[i] - meanY) * (dataY[i] - meanY);
	}
	return uz / (size * sqrt(varX / size) * sqrt(varY / size));
}

/**
* Random
*/
double seeypRandom(double min, double max) {
	double r = (double)rand() / (double)RAND_MAX;
	return min + r * (max - min);
}

/**
* Use rnd
*/
double seeypRnd(double v[]) {
	for(int i = 0; i < 1000000; i++) {
		if(ceil(seeypRandom(v[0], v[1])) == v[2]) {
			return i;
		}
	}
	return 0;
}

/**
* Site Quality Checker
*/
double seeypSiteQualityChecker(double v[]) {
	// Site quality
	double q = 0.0;
	// Bounce rate (%)
	double bounceRate[5] = {70.0, 60.0, 40.0, 20.0, 10.0};
	// Repeat visitors (%)
	double repeatVisitors[5] = {5.0, 10.0, 20.0, 30.0, 40.0};
	// Sales conversions (%)
	double salesConversions[5] = {1.0, 2.0, 3.0, 5.0, 10.0};
	
	for(int i = 0; i < 5; i++) {
		if(v[0] <= bounceRate[i]) {
			q += 4.0;
		}
		if(v[1] >= repeatVisitors[i]) {
			q += 6.0;
		}
		if(v[2] >= salesConversions[i]) {
			q += 10.0;
		}
	}
	// Bounce rate > 90% or repeat visitors < 3% or sales conversions < 0.98%
	if(v[0] > 90.0 || v[1] < 3.0 || v[2] < 0.98) {
		q = 0.0;
	}
	return q;
}

/**
* Find diff
*/
string seeypLife(int size) {
	stringstream report;
	for(int i = 0; i < size; i++) {
		diff[i] = ak[i] - st[i];
		report << diff[i] << " ";
	}
	return report.str();
}

/**
* Add P
*/
void seeypAddP(double v[], int size) {
	for(int i = 0; i < size; i++) {
		ak[i] = v[i];
	}
}

/**
* Add M
*/
void seeypAddM(double v[], int size) {
	for(int i = 0; i < size; i++) {
		st[i] = v[i];
	}
}

/**
* Report
*/
string seeypReport(int i, double pr[], string id, string op) {
	stringstream report;
	if(op == "i") {
		report << " Metric: " << id << "\n";
		report << " Rnd i = " << seeypRnd(pr); 
		report << " (Min = " << pr[0];
		report << ", Max = " << pr[1];
		report << ", Fn = " << pr[2] << ")";
	}
	if(op == "+") {
		seeypAddP(pr, i);
		report << " Load " << id << " (total numbers: " << i << ")";
	}
	if(op == "-") {
		seeypAddM(pr, i);
		report << " Load " << id << " (total numbers: " << i << ")\n";
		report << " Pearson's product-moment coefficient: " << seeypPRC(ak, st, i) << "\n";
		report << " ==== Diff (a[i]-b[i]) ====\n";
		report << " Diff: " << seeypLife(i) << "\n";
		report << " Mean: " << seeypMean(diff, i) << " (";
		report << " min = " << seeypMin(diff, i) << ",";
		report << " max = " << seeypMax(diff, i) << ",";
		report << " sum = " << seeypSum(diff, i) << ")\n";
		report << " Population standard variance: " << seeypVariance(diff, i) << "\n";
		report << " Population standard deviation: " << seeypStandardDeviation(diff, i);
	}
	if(op == "?") {
		report << " Metric: " << id << " (total numbers: " << i << ")\n";
		report << " Min: " << seeypMin(pr, i) << "\n";
		report << " Max: " << seeypMax(pr, i) << "\n";
		report << " Mean: " << seeypMean(pr, i) << "\n";
		report << " Sum: " << seeypSum(pr, i) << "\n";
		report << " Population standard variance: " << seeypVariance(pr, i) << "\n";
		report << " Population standard deviation: " << seeypStandardDeviation(pr, i);
	}
	if(op == "/") {
		report << " Site: " << id << "\n";
		report << " Bounce rate : " << pr[0] << "%\n";
		report << " Repeat visitors: " << pr[1] << "%\n";
		report << " Sales conversions: " << pr[2] << "%\n";
		report << " Site quality checker: " << seeypSiteQualityChecker(pr) << "%";
	}
	return report.str();
}

/**
* Read code
*/
string seeyp(string cnt)  {
	int i = 0, error = 0;
	double pr[5512];
	string op, id;
	stringstream seeyp, report;
	seeyp << cnt;
	
	if(seeyp >> op) {
		error = 0;
	} else {
		report << " Error: #001\n";
		error = 1;
	}
	
	if(seeyp >> id) {
		error = 0;
	} else {
		report << " Error: #002\n";
		error = 1;
	}
	
	while (seeyp.good()) {
		if(i > 5511) {
			report << " Error: #003\n";
			error = 1;
			break;
		}
		if(seeyp >> pr[i]) {
			error = 0;
		} else {
			report << " Error: #004\n";
			error = 1;
			break;
		}
		i++;
	}
	
	if(i < 2) {
		report << " Error: #005\n";
		error = 1;
	}
	
	if(error == 0) { 
		return seeypReport(i, pr, id, op);
	} else {
		return report.str();
	}
}

/**
* Read from file and save result
*/
void run(string fileName, string fileNameResult) {
	string content, title, result;
	ofstream ofresult;
	ifstream stFile(fileName.c_str());
	ofresult.open(fileNameResult.c_str());
	if (stFile.is_open() && ofresult.is_open()) {
		while(stFile.good()) {
			getline(stFile, content, '\n');
	
			if(content.length() < 2)
			{
				continue;
			}
			
			content.erase(remove(content.begin(), content.end(), '\r'), content.end());
			content.erase(remove(content.begin(), content.end(), '<'), content.end());
			content.erase(remove(content.begin(), content.end(), '>'), content.end());

			if(content.substr(0,2) == "# ")
			{
				title = content.erase(0,2);
			}
			else if(content.substr(0,2) == "//")
			{
				continue;
			}
			else if(content.substr(0,2) == "* ")
			{
				result += "<h3>" + content.erase(0,2) + "</h3>\n";
			}
			else if(content.substr(0,2) == "= ")
			{
				result += "<pre>" + seeyp(content.erase(0,2)) + "</pre>\n\n";
			}
			else if(content.substr(0,2) == "- ")
			{
				result += "<p>" + content.erase(0,2) + "</p>\n";
			}
		}
		ofresult << "\n\n";
		
		
		ofresult.close();
		stFile.close();
	}
}

The 57 Most Useful Books

1. Advanced Web Metrics with Google Analytics by Brian Clifton
2. Search Engine Optimization (SEO) Secrets by Danny Dover
3. SEO Fitness Workbook: The Seven Steps to Search Engine Optimization Success on Google by Jason McDonald
4. Search Engine Optimization For Dummies by Peter Kent
5. The Art of SEO (Theory in Practice) by Stephan Spencer
6. SEO 2014 Beyond :: Search engine optimization will never be the same again (Webmaster Series) by Dr. Andy Williams
7. PHP and MySQL for Beginners by Mark A Lassoff
8. Learning PHP, MySQL, JavaScript, CSS and HTML5: A Step-by-Step Guide to Creating Dynamic Websites by Robin Nixon
9. PHP and MySQL Web Development (5th Edition) (Developer's Library) by Luke Welling and Laura Thomson
10. Yii Application Development Cookbook - Second Edition by Alexander Makarov
11. CakePHP 2 Application Cookbook by James Watts 
12. Getting Started with Laravel 4
13. Laravel Application Development Cookbook by Terry Matula 
14. Laravel Design Patterns and Best Practices by Arda Kilicdagi and H. Ibrahim YILMAZ
15. Learning PHP Design Patterns by William Sanders
16. Php Design Pattern Essentials by Tony Bevis
17. NetBeans IDE 8 Cookbook by David Salter
18. JavaScript and JQuery: Interactive Front-End Web Development by Jon Duckett
19. A Software Engineer Learns HTML5, JavaScript and jQuery
20. Getting Started with Bootstrap 3 by Ryan Flores and Ken Darrow
21. Step By Step Bootstrap 3: A Quick Guide to Responsive Web Development Using Bootstrap 3 by Riwanto Megosinarso
22. Jump Start Bootstrap by Syed Fazle Rahman
23. CSS3: The Missing Manual by David Sawyer McFarland
24. Thinking in CSS by Aravind Shenoy
25. CSS3 Foundations by Ian Lunn
26. CSS for Beginners: Learn to Tweak Your Website Design by Dr. Andy Williams
27. Learning HTML and XHTML Basics: A Beginner's Guide to Learn Web Developing by Santonu Kumar Dhar
28. Pro jQuery 2.0 (Expert's Voice in Web Development)
29. Don't Make Me Think, Revisited: A Common Sense Approach to Web Usability (3rd Edition) (Voices That Matter) by Steve Krug
30. A Field Guide To Usability Testing (Smashing eBook Series 21) by Smashing Magazine
31. The Official Ubuntu Server Book (3rd Edition) by Kyle Rankin and Benjamin Mako Hill
32. Ubuntu 14.04 Lts Server: Administration and Reference by Richard Leland Petersen
33. Debian 7: System Administration Best Practices by Rich Pollei 
34. Learn Version Control with Git: A step-by-step course for the complete beginner
35. Excel 2013 Bible by John Walkenbach
36. Excel 2013 For Dummies
37. Microsoft Excel 2013 Data Analysis and Business Modeling by Wayne Winston
38. Microsoft Business Intelligence Tools for Excel Analysts by Michael Alexander, Jared Decker and Bernard Wehbe
39. Java: A Beginner's Guide by Herbert Schildt
40. Java: The Complete Reference (Complete Reference Series) by Herbert Schildt
41. Core Java Volume I--Fundamentals (9th Edition) (Core Series) by Cay S. Horstmann and Gary Cornell
42. Java 8 Preview Sampler by Herbert Schildt, Maurice Naftalin, Hendrik Ebbers and J.F. DiMarzio
43. Java Cookbook by Ian F. Darwin
44. Java 7 Pocket Guide by Robert Liguori and Patricia Liguori
45. Java SE8 for Programmers (3rd Edition) (Deitel Developer Series) by Paul Deitel and Harvey Deitel
46. Java Performance: The Definitive Guide by Scott Oaks
47. Professional Java for Web Applications by Nicholas S. Williams
48. Software Testing: Essential Skills for First Time Testers by Umer Ghazali 
49. A Software Tester's Journey from Getting a Job to Becoming a Test Leader! by Vijay Shinde and Debasis Pradhan
50. Software Testing: A Craftsman's Approach, Fourth Edition by Paul C. Jorgensen
51. Software Testing Tips: Experiences & Realities by Baris Sarialioglu
52. JIRA 6.x Administration Cookbook by Patrick Li
53. Kanban in Action by Marcus Hammarberg and Joakim Sunden
54. Selenium WebDriver Practical Guide by Satya Avasarala
55. Selenium Testing Tools Cookbook by Gundecha Unmesh
56. Selenium IDE Automation Testing Tutorial by Richard Thrust
57. Selenium Design Patterns and Best Practices by Dima Kovalenko

Copyright © 1999 — 2014, Kalinin Alexandr (vk.com/aik84)