пятница, 7 февраля 2014 г.

Язык XML

Что такое XML
   Сегодня XML может использоваться в любых приложениях, которым нужна структурированная информация - от сложных геоинформационных систем, с гигантскими объемами передаваемой информации до обычных "однокомпьютерных" программ, использующих этот язык для описания служебной информации. При внимательном взгляде на окружающий нас информационный мир можно выделить множество задач, связанных с созданием и обработкой структурированной информации, для решения которых может использоваться XML:

MongoDB. Homework 5.

Homework: Homework 5.1 (Hands On)

db.posts.aggregate([{$unwind:"$comments"},{$group:{_id:"$comments.author",count:{$sum:1}}},{$sort:{"count":-1}},{$limit:1},{"$project":{_id:0,'tag':"$_id","count":1}}])

Aggregation Fraemwork

Очень хорошую статью нашел на хабре, что существенно упростило работу, честно украденный пост вот от сюда.

Документация по новшествам расположена в соответствующем разделе официального сайта. Сначала давайте разберем то, как же это работает и какие конструкции MongoDB нам помогут. 

Итак, самая главная сложность в выборке данных из MongoDB это работа с массивами и данными, содержащимися внутри каких-то отдельных элементов. Да, мы можем их выбрать как и в SQL, но не можем агрегировать по ним непосредственно при выборке. Новый фреймвок представляет собой декларативный способ работы с такими данными, основываясь на цепочке специальных операторов (их всего 7 штук). Данные выборки передаются из выхода одного оператора на вход другого, совсем как в unix. Отчасти при помощи новых операторов можно повторить уже существующие. Пусть коллекция test — это коллекция для хранения данных о людях. Стандартная выборка:

среда, 5 февраля 2014 г.

MongoDB. Homework 4.

Homework: Homework 4.1


Suppose you have a collection with the following indexes:

Индексы

В самом начале мы видели коллекцию system.indexes, которая содержит информацию о всех индексах в нашей базе данных. Индексы в MongoDB работают схожим образом с индексами в реляционных базах данных: они ускоряют выборку и сортировку данных. Индексы создаются с помощью ensureIndex:

db.unicorns.ensureIndex({name: 1});
И уничтожаются с помощью dropIndex:
db.unicorns.dropIndex({name: 1});
Уникальный индекс может быть создан, если во втором параметре установить unique в true:
db.unicorns.ensureIndex({name: 1}, {unique: true});
Можно создавать индексы над вложенными полями (опять же, используя точечную нотацию), либо над массивами. Также можно создавать составные индексы:
db.unicorns.ensureIndex({name: 1, vampires: -1});
Порядок вашего индекса (1 для восходящего и -1 для нисходящего) не играет роли в случае с простым индексом, однако он может быть существенен при сортировке или лимитировании с применением составных индексов.

Моделирование данных

Давайте сменим тему и поговорим о более абстрактных концепциях MongoDB. Довольно просто объяснять новые термины и новый синтаксис. Гораздо сложнее говорить о моделировании в терминах новой парадигмы. Смысл в том, что большинство из нас привыкли пробовать любую новую технологию, моделируя реальные задачи. Мы поговорим об этом, но в конечном счете вы должны попрактиковаться и изучить реальный код.
Когда речь заходит о моделировании данных, то документ-ориентированные базы данных не настолько сильно отличаются от реляционных, как другие NoSQL-решения. Существующие различия не столь велики, однако это не уменьшает их важности.

MongoDB. Homework week 3.

Homework 3.1
Скачиваем файлик, импортим в монго и пишем код:

import java.net.UnknownHostException;
import java.util.Iterator;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

вторник, 4 февраля 2014 г.

MongoDB. Homework week 2.

Homework 2.1
Итак, скачиваем предложный файл тут, импортируем его вот этой командой в наш mongo:
mongoimport -d students -c grades < grades.js
 После чего нам надо найти студента у которого самый маленький score среди тех, кто набрал больше 65 баллов. Пишем:
db.grades.find({type:"exam",score:{"$gte:65}}).sort({"score":1}).limit(3)
в итоге первая строчка с "_id" = 22.
Ответ: 22.

Homework 2.2
Наконец программирование, наконец Java!
Нам предлагают файл, скачанный тут изменить так, чтобы наименьшее поле с homework для каждого студента была удалено. Сделать это посредством Java, итак, приступим. Вот мой вариант решения:

понедельник, 3 февраля 2014 г.

CRUD operation in Java Driver.

Теперь рассмотрим эти же операции для Java:
insert(DBObject)
 Для добавления в коллекцию нужно создать объект BasicDBObject:
BasicDBObject doc = new BasicDBObject();
И, собственно добавление:
doc.put("username", "jyemin");
doc.put("birthDate", new Date(2345));
doc.put("programmer", true);
doc.put("age", 8);
doc.put("language", Arrays.asList("Java","C++"));
doc.put("address", new BasicDBObject("street", "20 Main").append("town","West").append("zip","56789"));

Quiz: Java Driver: Representing Documents

CRUD operation. 4 часть, надеюсь последняя.

Эту часть начнем с операциями над массивом, для начала создадим документ:
db.array.insert({_id:0, a:[1,2,3,4]})
Для изменения элемента используем функцию:
db.array.update({_id:0},{$set:{"a.2":5}})
после использования функции db.array.findOne():
{_id:0, a:[1,2,5,4]}
Для добавления нового элемента:
db.array.update({_id:0},{$push:{a:5}})
findOne: {_id:0, a:[1,2,5,4,6]}
Удаление элемента с конца:
db.array.update({_id:0},{$pop:{a:1}})
findOne: {_id:0, a:[1,2,5,4]}
Удаление элемента с начала:
db.array.update({_id:0},{$pop:{a:-1}})
findOne: {_id:0, a:[2,5,4]}
Добавление нескольких элементов в конец:
db.array.update({_id:0},{$pushAll:[7,8,9]})
findOne: {_id:0, a:[2,5,4,7,8,9]}
Удаление конкретного значения из массива:
db.array.update({_id:0},{$pull:5})
findOne: {_id:0, a:[2,4,7,8,9]}
Удаление нескольких элементов:
db.array.update({_id:0},{$pullAll:{a:[2,4,8]})
findOne: {_id:0, a:[7,9]}
Добавление в конец:
db.array.update({_id:0},{$addToSet{a:5})
findOne: {_id:0, a:[7,9,5]}
При повторе последнего действия несколько раз ничего не произойдет, добавляет значение только единожды!

воскресенье, 2 февраля 2014 г.

CRUD operation. Часть 3

Разберем немного действий с курсором.
db.people.find()
Как мы знаем, с помощью этой функции выводятся все документы существующие в people коллекции. Присвоим переменной cur значение этой функции:
 cur = db.people.find()
Теперь мы можем выполнять действия с курсором, например:
cur.hasNext() - проверяет, есть ли следующий элемент и возвращает true/false
cur.next() - возвращает текущий элемент и передвигает курсор на одно значение вперед.
cur.limit(5) - лимит на количество выводимых документов
cur.sort({name:-1}) - сортировка по name полю, по возрастанию
cur.sort({name:-1}).limit(3) - сортировка +  лимит
cur.sort({name:-1}).limit(3).skip(2) - сортировка +лимит, вывод начиная с 3 документа

Quiz: Querying, Cursors

Recall the documents in the scores collection:
{
 "_id" : ObjectId("50844162cb4cf4564b4694f8"),
 "student" : 0,
 "type" : "exam",
 "score" : 75
}
Write a query that retrieves exam documents, sorted by score in descending order, skipping the first 50 and showing only the next 20.

CRUD operation. Часть 2.

Продолжение темы CRUD в MongoDB. Постараюсь писать более форматировано)

Использование $or:
db.people.find({$or:[{name:{$regex:"e$"}},{age:{$exists:true}}]});
Происходит выборка документов, в которых поле name содержит "e" в конце строки или содержит поле age.

Quiz: Using $or

How would you find all documents in the scores collection where the score is less than 50 or greater than 90?
db.scores.find({$or:[{score:{$lt:50}},{score:{$gt:90}}]})

Использование $and:
db.people.find({$and:[{name:{$regex:"e$"}},{age:{$exists:true}}]});
Происходит выборка документов, в которых поле name содержит "e" в конце строки и присутствует поле age.

Quiz: Using $and

CRUD operation. Часть 1.

 CRUD операции(Create, Read, Update, Delete) - тут думаю не нужно вдаваться в подробности, скажу только то, что они имеют такую же смысловую нагрузку как и SQL базах данных, а по их названию можно догадаться, для чего они нужны. Лучше разберем их синтаксис.
Я уже вскользь затрагивал такие команды, как use db, show collections, db.collection.find(), db.collection.findOne(), сейчас  чуть подробнее разберу, для чего они нужны.

Итак:
mongod - запускаем наш MongoDB сервер.
mongo - наша оболочка, через которую мы будем производить все операции на начальном этапе.
use db - вместо db указываем любую базу данных с которой будем работать
show collections - показывает все существующие коллекции в нашей базе данных
db - показывает, в какой базе данных мы находимся
Еще можно сделать вот так:

суббота, 1 февраля 2014 г.

MongoDB. Homework week 1.

Вот мы и добрались до домашнего задания первой недели!
Homework 1.1
Нам предлагают установить mongoDB, скачать архив с файлами, распаковать и использовать mongorestore. После успешного выполнения этих действий, пишем:
mongo
use m101
db.hw1.findOne()
Барабанная дробь!

JSON

JSON (JavaScript Object Notation) - простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition - December 1999. JSON - текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными.
  • Коллекция пар ключ/значение. В разных языках, эта концепция реализована как объект, запись, структура, словарь, хэш, именованный список или ассоциативный массив.
  • Упорядоченный список значений. В большинстве языков это реализовано как массив, вектор, список или последовательность.
Это универсальные структуры данных. Почти все современные языки программирования поддерживают их в какой-либо форме. Логично предположить, что формат данных, независимый от языка программирования, должен быть основан на этих структурах.

Spark: POST запросы

Если необходимо передать на веб-сервер большой объем данных, например, текст сообщения или файл, используют POST-запрос. В этом типе запроса параметры помещаются в тело HTTP-запроса, а размер передаваемых данных в байтах указывается в заголовке Content-Length:
POST /enter HTTP/1.1
<Различные заголовки>
Content-Length: 27
<Различные заголовки>

login=admin&password=qwerty
Таким образом, в URL передаваемые параметры не видны. Простым способом сформировать POST-запрос не получится, они в основном генерируются с помощью HTML-форм. Что же касается PHP, то для POST-параметров выделен глобальный массив $_POST, доступ к которому аналогичен массиву $_GET.

Spark: GET запросы

Сначала разберем, что такое GET запрос.
GET-запрос — это самый распространенный вид HTTP-запроса. При помощи него происходит запрос браузером любого файла веб-сервера. HTTP-запрос типа GET состоит только из HTTP-заголовков, тело у него отсутствует.
При помощи GET-запроса можно передать веб-серверу параметры — некоторую информацию. Например, если на сайте предусмотрена авторизация пользователей, то с помощью параметров можно передавать имя пользователя и пароль для проверки. Рассмотрим механизм передачи параметров с помощью GET-запроса.
В первой строке запроса после ключевого слова GET помещается путь к запрашиваемому документу. Если в пути встречается знак вопроса, то принято считать, что в этом месте путь заканчивается, а за ним начинаются GET-параметры этого запроса:
GET /examples/test.html?параметры HTTP/1.1
GET-параметр имеет формат имя_параметра=значение_параметра, сами параметры разделяются знаком &. Пример GET-запроса с двумя параметрами:
GET /enter?login=admin&password=qwerty HTTP/1.1

А теперь все вместе!

MongoDB, Freemarker, Spark.
Итак, осталось подытожить все, что я делал до этого.
Начнем с запуска MongoDB сервера(mongod), и самого Mongo shell(mongo). После чего пишем use test (test - название нашей базы данных) в окне с запущенным shell. Просмартиваем все коллекции командой show collections, выбираем любую, предположим у меня есть коллекция mecollection и добавляем один элемент командой db.mycollection.save({'name':'Dmitry'}). Теперь наша коллекция хранит одно значение name:Dmitry(одно значение, это если до этого ваша коллекция была пустая) Просмотреть элементы коллекции можно командой db.mycollection.find() или db.mycollection.findOne() вывод элемента, на котором стоит курсор.
 Теперь мы можем вернуться в eclipse(NetBeans или Intelij Idea, не знаю, что там у вас).

Использование Spring & Freemarker

Тут все довольно просто, нам нужно объединить 2 предыдущих  класса, вот что получится(файл hello.ftl оставляем прежним):
import freemarker.template.Configuration;
import freemarker.template.Template;
import spark.Request;
import spark.Response;
import spark.Route;
import spark.Spark;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
public class HelloWorldSparkFreemarkerStyle {
    public static void main(String[] args) {
        final Configuration configuration = new Configuration();
        configuration.setClassForTemplateLoading(
                HelloWorldSparkFreemarkerStyle.class, "/");
        Spark.get(new Route("/") {
            @Override
            public Object handle(final Request request,
                                 final Response response) {
                StringWriter writer = new StringWriter();
                try {
                    Template helloTemplate = configuration.getTemplate("hello.ftl");
                    Map<String, Object> helloMap = new HashMap<String, Object>();
                    helloMap.put("name", "Freemarker");
                    helloMap.put("word","MongoDB");
                    helloTemplate.process(helloMap, writer);
                } catch (Exception e) {
                    halt(500);
                    e.printStackTrace();
                }
                return writer;
            }
        });
    }
}

FreeMarker - еще одна полезная штука.

FreeMarker — компилирующий обработчик шаблонов, написанный на Java, один из инструментов, позволяющих отделить бизнес-логику и данные от представления в духе концепции Model-view-controller. Используется преимущественно при разработке web-приложений с использованием Java-сервлетов, также может использоваться для вывода текста в других случаях: генерация CSS, исходного кода Java и т. д. В отличие от JSP FreeMarker не является зависимым от архитектуры сервлета или от протокола HTTP. Таким образом шаблонизатор может использоваться не только в web-проектах. FreeMarker является свободным ПО.

Например, у нас есть код:
<html>
<body>
<p>Hello ${name}! You have the following messages:
<#list messages as m>
  <p><b>${m.from}:</b> ${m.body}</p>
</#list>
</body>
</html>

Spark for Java

Итак, краткий обзор Spark. Очень краткий, т.к. все, что я о нем знаю, это то, что Spark небольшой фреймворк для Java, с помощью которого можно создавать web- приложения, без развертывания какого либо сервера, то есть достаточно добавить в pom.xml файл dependency:
<dependency>
      <groupId>com.sparkjava</groupId>
      <artifactId>spark-core</artifactId>
      <version>1.1.1</version>
</dependency>