Вот пример с использованием dplyr
. Вы просто используете соответствующую строку формата даты за месяц %m
или год %Y
в инструкции format
.
set.seed(123)
df <- data.frame(date = seq.Date(from =as.Date("01/01/1998", "%d/%m/%Y"),
to=as.Date("01/01/2000", "%d/%m/%Y"), by="day"),
value = sample(seq(5), 731, replace = TRUE))
head(df)
date value
1 1998-01-01 2
2 1998-01-02 4
3 1998-01-03 3
4 1998-01-04 5
5 1998-01-05 5
6 1998-01-06 1
library(dplyr)
df %>%
mutate(month = format(date, "%m"), year = format(date, "%Y")) %>%
group_by(month, year) %>%
summarise(total = sum(value))
Source: local data frame [25 x 3]
Groups: month [?]
month year total
(chr) (chr) (int)
1 01 1998 105
2 01 1999 91
3 01 2000 3
4 02 1998 74
5 02 1999 77
6 03 1998 96
7 03 1999 86
8 04 1998 91
9 04 1999 95
10 05 1998 93
.. ... ... ...
Я работаю в среде, где отдельная команда сервера выполняет конфигурацию QA и Рабочих серверов для наших приложений. Каждое приложение обычно развертывается на двух серверах в QA и трех серверах в Производстве. Моя команда разработчиков обнаружила, что это лучше минимизировать сумму конфигурации, требуемой на сервере путем помещения как можно большего количества конфигурации в войне (или ухо). Это делает конфигурацию сервера легче и также сводит к минимуму вероятность, что команда сервера неправильно настроит сервер.
у Нас нет определенной для машины конфигурации, но у нас действительно есть определенная для среды конфигурация (Dev, QA и Производство). Нам сохранили конфигурационные файлы в военном файле, которые называет среда (напр. dev.properties, qa.properties, prod.properties). Мы помещаем-D свойство на командную строку Java VM's сервера для определения среды (напр. Java-Dapp.env=prod...). Приложение может искать app.env системное свойство и использовать его для определения названия файла свойств для использования.
я предполагаю, есть ли у Вас небольшое количество определенных для машины свойств тогда, Вы могли бы определить их как-D свойства также. Конфигурация палаты общин обеспечивает простой способ объединить файлы свойств с системными свойствами.
Мы настраиваем пулы соединения на сервере. Мы называем пул соединения тем же для каждой среды и просто указываем на серверы, которые присвоены каждой среде к соответствующей базе данных. Приложение только должно знать одно имя пула соединения.
конфигурационные файлы wrt, я думаю Steve , ответ является лучшим до сих пор. Я добавил бы предложение создания внешних файлов относительно пути установки военного файла - тот способ, которым у Вас может быть несколько установок войны в одном сервере с различными конфигурациями.
, например, Если бы мой dev.war
распакован в /opt/tomcat/webapps/dev
, то я использовал бы ServletContext.getRealPath
для нахождения основной папки и военного имени папки, таким образом конфигурационные файлы будут жить в ../../config/dev
относительно войны, или /opt/tomcat/config/dev
для абсолюта.
я также соглашаюсь с [1 110] счет о помещении как можно меньше в эти внешние конфигурационные файлы. Используя базу данных или JMX в зависимости от Вашей среды для хранения столько, сколько это имеет смысл к. Apache Конфигурация палаты общин имеет хороший объект для обработки конфигураций, поддержанных таблицей базы данных.
Относительно библиотек, я соглашаюсь с [1 112] неизвестный , чтобы иметь все освобождение в WEB-INF/lib
папка в военном (самоупакованном) файле. Преимущество состоит в том, что каждая установка приложения автономна, и у Вас могут быть различные сборки войны с помощью различных версий библиотек одновременно.
недостаток - то, что это будет использовать больше памяти, поскольку каждое веб-приложение будет иметь свою собственную копию классов, загруженных его собственным загрузчиком класса.
, Если это излагает реальное беспокойство, то Вы могли поместить банки в общую папку библиотеки для Вашего контейнера сервлета ($CATALINA_HOME/lib
для кота). Все установки Вашего веб-приложения, работающего на том же сервере, должны использовать те же версии библиотек все же. (На самом деле это не строго верно, поскольку Вы могли поместить переопределяющие версии в папку индивидуума WEB-INF/lib
при необходимости, но это становится довольно грязным для поддержания.)
я создал бы автоматизированный установщик для общих библиотек в этом случае, с помощью InstallShield или NSIS или эквивалентный для операционной системы. Что-то, что может помочь сказать, есть ли у Вас самый актуальный набор библиотек, и обновление, снижение, и т.д.
Я думаю что, если свойства являются конкретной машиной/развертыванием, то они принадлежат на машине. Если я собираюсь обернуть вещи в войне, это должно быть отбрасывание-innable, что не означает ничего, что это характерно для машины, на которой это работает. Эта идея повредится, если война будет иметь зависимые свойства машины в ней.
то, Что мне нравится делать, разрабатывают проект с properties.example файлом, каждая машина имеет .properties, который живет где-нибудь, война может получить доступ к нему.
альтернативный путь состоял бы в том, чтобы иметь задачи Ant, например, для dev-войны, войны этапа, войны напоминания и иметь наборы части свойств проекта, испеченного в в военной сборке. Мне не нравится это так же, потому что Вы собираетесь закончить тем, что имели вещи как расположение файлов на отдельном сервере как часть Вашей сборки проекта.
Я поместил всю конфигурацию в базу данных. Контейнер (Tomcat, WebSphere, и т.д.) предоставляет мне доступ к начальному соединению с базой данных и с тех пор, все выходит из базы данных. Это допускает несколько сред, кластеризации и динамических изменений без времени простоя (или по крайней мере без повторно развертывания). Особенно хороший способность изменить уровень журнала на лету (хотя Вам будут нужны или администраторский экран или в фоновое напоминание для взятия изменений). Очевидно, это только работает на вещи, которые не требуются, чтобы запускать приложение, но обычно, можно добраться до базы данных довольно быстро после запуска.
Я обычно делаю два файла свойств:
Сервер (статичный?) библиотеки: Я сильно препятствую использованию библиотеки сервера в своих приложениях, поскольку оно добавляет зависимость к серверу:
при абсолютной необходимости "в этом объекте в банке этого appserver", пытаются скопировать банку в приложении, надеясь, нет никакой зависимости от банки другого сервера и проверки classloading политики приложения (я беру привычку поместить "родителя в последний раз" classloading политика в отношении всех моих приложений: я уверен, что не буду "загрязнен" банками сервера - но я не знаю, является ли это "лучшая практика").