Архив метки: couchdb

CouchDB: группировка данных по родительскому элементу

При разработке своего одного приложения (скоро анонсирую!) я использовал в качестве БД Apache CouchDB, точнее использовал его чуть более продвинутую версию от коммерческой организации – CouchBase. В этом посте я привожу решение нередкой, но нетривиально решаемой задачи (нетривиально для людей, не знакомых до этого с NoSQL).

Задача

Возврат сгруппированных значений по родительскому элементу.

В БД обычно данные хранятся в примерно таком формате:

{
   "_id": "256b9dd4492210351c9db34ee500d817",
   "_rev": "1-94366c1d2b7a075f33ebbd7a96565f4b",
   "url": "http://surdoserver.ru",
   "status": 200,
   "timestamp": 1969072012,
   "ping": 332
}
{
   "_id": "256b9dd4492210351c9db34ee500f288",
   "_rev": "1-1770b12a395ca76887c792e5c1d99f8f",
   "url": "http://surdoserver.ru",
   "status": 200,
   "timestamp": 1969073012,
   "ping": 220
}
и т.д.

Нам же необходимо получить статистику по каждому сайту без дублирования информации, то есть что-то типа такого:

{
   "url": "http://surdoserver.ru",
   "data":
   [
      "status": 200,
      "timestamp": 1969072012,
      "ping": 332
   ],
   [
     "status": 200,
     "timestamp": 1969073352,
     "ping": 220
   ]
}

Читать далее

Erlang: couchbeam rebar compile problem [SOLVED]

Всю жизнь писал я на обычных C-like языках (C++, php, Java, JS и пр.). Это довольно интересно, но выучив пару таких ЯП, понимаешь, что дальше все будет тоже самое. Поэтому в познавательно-развлекательных целях увлекся я функциональным языком программирования Erlang.

Сам язык очень интересный, позволяет писать железобетонные сервера с постоянными подключениями (готовимся к html5 sockets %) ), имеет необычный функциональный синтаксис, близкий к математическим выражениям, и т.д. В ближайшем будущем напишу о нем по-подробней и представлю небольшой проект, который я на нем пишу.

В моем приложении используется внешняя библиотека для работы с БД CouchDB – Couchbeam, которая в свою очередь требует еще пару библиотек.

Оказалось, в среде erlang есть аналог Maven (приложение для сборки всех зависимостей) – rebar. Неплохой мануал по теме есть на Хабре.

Чтобы настроить rebar на автоматическое скачивание и компиляцию couchbeam, в файле rebar.config пишется примерно следующее:

%% Здесь будут лежать зависимости
{deps_dir, ["deps"]}.

%% Поддиректории, в которые rebar должен заглядывать
{sub_dirs, ["rel"]}.

%% Список зависимостей
{deps,
[
{couchbeam, ".*", {git, "http://github.com/benoitc/couchbeam.git", "master"}}
]}.

Для непосредственного скачивания зависимостей выполняем

./rebar get-deps

а для компиляции

./rebar compile 

Вот тут-то и появилась ошибка на которую я убил не меньше часа:

./rebar compile
...
==> mochiweb (compile)
ERROR: compile failed while processing /Users/dimitry/Documents/workspaces/eclipse-java/site_stater/deps/mochiweb: {'EXIT',{function_clause,[{filelib,wildcard,[{"R14","c_src/*.c"}]},
                          {rebar_port_compiler,expand_sources,2},
                          {rebar_port_compiler,compile,2},
                          {rebar_core,run_modules,4},
                          {rebar_core,execute,4},
                          {rebar_core,process_dir,4},
                          {rebar_core,process_each,5},
                          {rebar_core,process_dir,4}]}}
 

Оказалось, все дело в файле конфигурации rebar (rebar.config) библиотеки ejson, для которой необходим сервер mochiweb. Для того, чтобы все нормально скомпилировалось, необходимо закомментировать первую строку:

%%{port_sources, [{ "R14", "c_src/*.c"}, {"R14", "c_src/yajl/*.c"}]}.

Точного описания директивы я так и не нашел, но, судя по всему, она указывает, откуда брать NIF (модули, написанные на C) для компиляции.
После её комментирования все компилируется, как по волшебству.)

UPDATE
Разобрался, в чем было дело: я пытался собираться проект основной версией rebar (из github), а нужна была та, что поставлялась в архиве с couchbeam. В этой версии есть компиляция Сишных модулей в erlang, видимо это улучшение где-то в pull коммитах. К сожалению, у этого проекта нет версий, поэтому и возникла такая ситуация.

Java: собираем проект с Maven для совместной работы над проектом

Предыстория: есть java библиотека (в моем случае библиотека ektorp для работы с CouchDB)  которая имеет кучу зависимостей (то есть использует исходные коды других библиотек). Заботливый автор вместо упаковки всех необходимых библиотек (зависимостей) вместе с оригинальной библиотекой выложил свою библиотеку в общее хранилище (репозитарий) хороших библиотек Maven.

Задача: использовать библиотеку в совместном проекте. Над проектом будут работать другие люди, которые ничего не знаю о Maven и обучение этой технологии займет достаточное время. Поэтому принято решение собрать в один jar файл все зависимости библиотеки вместе с самой библиотекой.

Решение:

  1. В eclipse устанавливаем плагин m2eclipse (Maven 2 for eclipse).
  2. Учимся как им пользоваться на сайте. Все представлено в наборе видюшек, очень удобно и понятно.
  3. Создаем maven проект (в Project explorer -> Create Maven Project). Назовем его ektrop-assembled (group id, artifact id).
  4. В зависимостях добавляем org.ektorp
  5. Настраиваем pom.xml. Здесь мы добавляем общедоступный плагин для сборки проекта (maven-assembly-plugin). Настраиваем его на сборку проекта в один файл и чтобы при запуске этапа package этот плагин делал свою работу. Конечное содержимое файла pom.xml:
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>ektorp-assembled</groupId>
      <artifactId>ektorp-assembled</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <build>
      	<plugins>
      		<plugin>
      			<groupId>org.apache.maven.plugins</groupId>
      			<artifactId>maven-assembly-plugin</artifactId>
      			<version>2.2.1</version>
      			<configuration>
    	          <descriptorRefs>
    	            <descriptorRef>jar-with-dependencies</descriptorRef>
    	          </descriptorRefs>
    	        </configuration>
    	        <executions>
    	          <execution>
    	            <id>make-assembly</id> <!-- this is used for inheritance merges -->
    	            <phase>package</phase> <!-- bind to the packaging phase -->
    	            <goals>
    	              <goal>single</goal>
    	            </goals>
    	          </execution>
    	        </executions>
      		</plugin>
      	</plugins>
      </build>
      <dependencies>
        <dependency>
          <groupId>org.ektorp</groupId>
          <artifactId>org.ektorp</artifactId>
          <version>1.1.1</version>
          <scope>compile</scope>
        </dependency>
      </dependencies>
    </project>
    
  6. В eclipse выбираем Run as..->Maven package
  7. После всех процедур в папке проекта target появляется файл ektrop-assembled-0.0.1-SNAPSHOT-jar-with-dependencies.jar – это и есть необходимый файл с основной библиотекой и всеми её зависимостями.
  8. Полученный jar копируем в любой проект и подключаем в Build path.