Showing posts with label Business Intelligence. Show all posts
Showing posts with label Business Intelligence. Show all posts

Monday, September 05, 2011

Running BIRT Reports in Tomcat

Context: You have database and you need to do data analysis: draw charts, build some tables, calculate totals, etc. You want it all to be available over the web and secured with a password.

Your database is any JDBC-supported database (I use MySQL 5.1.49).
Your server is running any OS where Java can run (I use Ubuntu Linux 10.10 available through SSH).

I will show how to implement this using Eclipse BIRT 3.7.

Developer Environment
  1. Download "Eclipse IDE for Java and Report Developers" package here.
    Unzip to install.
  2. Design new report (I created sales.rptdesign). This is really straightforward.
JDBC Driver. You will need MySQL JDBC driver to create Data Source for report. I got mysql-connector-java-5.1.17-bin.jar here.
Installing the driver in BIRT designer is easy using "Manage drivers..." dialog. But you will probably have problems deploying it to the runtime.

Fonts. You probably won't have any problems with fonts in BIRT designer. And again you will likely have problems with fonts in runtime.

Connection Profile Store. With BIRT 3.7 you can use Connection Profiles to hold database connections. After you've finished designing and testing your report, double click report Data Source to bring properties dialog and create new connection profile store in there. Save it to some file (I saved to planet33_v2.xml).
Here's what I have in there:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DataTools.ServerProfiles version="1.0">
    <profile autoconnect="No" desc=""
        id="ecc3bc60-d4fd-11e0-957a-e0e31b9a34ee" name="planet33_v2"
        providerID="org.eclipse.datatools.enablement.mysql.connectionProfile">
        <baseproperties>
            <property
                name="org.eclipse.datatools.connectivity.db.connectionProperties"
                value="" />
            <property name="org.eclipse.datatools.connectivity.db.savePWD"
                value="true" />
            <property name="org.eclipse.datatools.connectivity.drivers.defnType"
                value="org.eclipse.datatools.enablement.mysql.5_1.driverTemplate" />
            <property name="jarList"
                value="/usr/local/share/mysql-connector-java-5.1.17-bin.jar" />
            <property name="org.eclipse.datatools.connectivity.db.username"
                value="your_username" />
            <property name="org.eclipse.datatools.connectivity.db.driverClass"
                value="com.mysql.jdbc.Driver" />
            <property name="org.eclipse.datatools.connectivity.db.databaseName"
                value="planet33_v2" />
            <property name="org.eclipse.datatools.connectivity.db.password"
                value="your_password" />
            <property name="org.eclipse.datatools.connectivity.db.version"
                value="5.1" />
            <property name="org.eclipse.datatools.connectivity.db.URL"
                value="jdbc:mysql://127.0.0.1:3306/planet33_v2" />
            <property name="org.eclipse.datatools.connectivity.db.vendor"
                value="MySql" />
        </baseproperties>
        <org.eclipse.datatools.connectivity.versionInfo>
            <property name="server.version" value="5.1.49" />
            <property name="technology.name.jdbc" value="JDBC" />
            <property name="server.name" value="MySQL" />
            <property name="technology.version.jdbc" value="4.0.0" />
        </org.eclipse.datatools.connectivity.versionInfo>
        <driverreference>
            <property name="driverName" value="MySQL JDBC Driver" />
            <property name="driverTypeID"
                value="org.eclipse.datatools.enablement.mysql.5_1.driverTemplate" />
        </driverreference>
    </profile>
</DataTools.ServerProfiles>

Note: I bet you can use JDNI data sources here (and I suppose this is even preferable because of connection pooling, etc.). Please, drop a few lines in comments below with instructions how you do this.

You can now edit XML source of you report and replace /report/data-sources with something like this:

<data-sources>
    <oda-data-source extensionID="org.eclipse.birt.report.data.oda.jdbc.dbprofile"
        name="Planet33 V2 Data Source" id="359">
        <property name="OdaConnProfileName">planet33_v2</property>
        <property name="OdaConnProfileStorePath">../conf/planet33_v2.xml</property>
    </oda-data-source>
</data-sources>

Several things to mention here:
  • planet33_v2.xml (Connection Profile Store)
    • Check all properties and change them according to your connection.
    • Note the jarList property, there you should specify path(s) to where your JDBC drivers located (I copied driver that I've downloaded to /usr/local/share/mysql-connector-java-5.1.17-bin.jar).
    • When you create connection profile store file from designer it places property with name="org.eclipse.datatools.connectivity.driverDefinitionID". You should remove this property because of this issue.
  • sales.rptdesign (The Report)
    • You should keep value of ida-data-source@id attribute the same that was in your design.
    • Value of OdaConnProfileName should match value of DataTools.ServerProfiles/profile@name attribute from planet33_v2.xml.
    • Note that OdaConnProfileStorePath is relative path (see below). But you can keep it absolute if you want. 

Server Environment

(Note: I recommend to configure Tomcat instance on your developer machine first to make it easier to verify report settings, and then transfer the entire $CATALINA_HOME to production server. Of course, you can do all these steps on production server directly.)
  1. Download Apache Tomcat (any Java application server should be fine).
    Unzip to some folder (I used /usr/local/share/apache-tomcat-5.5.33/) -- this will be $CATALINA_HOME.
  2. Download BIRT "Runtime" package here.
    Copy birt.war (BIRT Web Viewer application) to $CATALINA_HOME/webapps.
  3. Edit $CATALINA_HOME/catalina.sh and paste these lines somewhere after JAVA_OPTS variable initialized (this prepares workspace for DTP plugin):
    
    
    java_io_tmpdir=$CATALINA_HOME/temp
    org_eclipse_datatools_workspacepath=$java_io_tmpdir/workspace_dtp
    mkdir -p $org_eclipse_datatools_workspacepath
    
    JAVA_OPTS="$JAVA_OPTS -Dorg.eclipse.datatools_workspacepath=$org_eclipse_datatools_workspacepath"
    
    
  4. Start Tomcat by running $CATALINA_HOME/startup.sh. After this BIRT Report Viewer application should be available by http://localhost:8080/birt. Also birt.war should be now extracted to $CATALINA_HOME/webapps/birt -- this will be $BIRT_HOME. You can now delete $CATALINA_HOME/webapps/birt.war.
  5. Copy planet33_v2.xml to $CATALINA_HOME/conf as (remember OdaConnProfileStorePath property in sales.rptdesign file?).
  6. Copy your sales.rtpdesign file to $BIRT_HOME.
At this point you should be able to execute the report by simply following the address http://localhost:8080/birt/frameset?__report=sales.rptdesign&__dpi=600.

Note the __dpi URL parameter -- it controls DPI of chart images rendered in HTML/PDF. You will probably want to modify like this it to increase image quality. Also note that if you set chart output format to SVG you will get vector graphics quality in PDF output.

Security

There are obvious reasons why you may want to keep your reports secure.

Besides that keep in mind that in BIRT Web Viewer application all reports sources (*.rptdesign files) available to user by request. Try navigating to http://localhost:8080/birt/sales.rptdesign and you'll see what I mean. I think this is a good reason, why you should use connection profile store (or at least JNDI data sources), because that files not available through HTTP.

Implementing simple (HTTP BASIC AUTH) security with Tomcat is pretty simple.

First, modify $BIRT_HOME/WEB-INF/web.xml, by adding this (you can change role names as you want):
<!-- Define a security constraint on this application -->
<security-constraint>
  <web-resource-collection>
    <web-resource-name>Entire Application</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <!-- This role is not in the default user directory -->
    <role-name>manager</role-name>
  </auth-constraint>
</security-constraint>             
<!-- Define the login configuration for this application -->
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>BIRT Report Viewer</realm-name>
</login-config>
<!-- Security roles referenced by this web application -->
<security-role>
  <description>
    The role that is required to log in to the BIRT Report Viewer
  </description>
  <role-name>manager</role-name>
</security-role>

You may also do the same for $CATALINA_HOME/conf/web.xml to secure all applications in this Tomcat instance.
Second, you should edit $CATALINA_HOME/conf/tomcat-users.xml to define user login and password.

Thats all, you're secured :) This is should be fine for most cases, but I would recommend you to read about HTTPS if your data is extremely secure.

Deploy to server

  1. Copy Tomcat to the server:
    Tip: Use scp command in terminal to transfer files from your machine to the server over SSH:
    scp /usr/local/share/apache-tomcat-5.5.33 dmitrygusev@planet33.ru:/usr/local/share/
  2. Copy JDBC Driver to the server:
    • Copy this driver to the same path as specified in the jarList property from planet33_v2.xml file.
    • DO NOT COPY this driver to $BIRT_HOME/WEB-INF/lib, because it may lead to ClassNotFoundException.
Fix file permissions. When you copy files over scp you may need to chmod them to grant read/execute access. This should fix it:

chmod a+r /usr/local/share/mysql-connector-java-5.1.17-bin.jar
chmod -R a+r /usr/local/share/apache-tomcat-5.5.33/
chmod a+x /usr/local/share/apache-tomcat-5.5.33/bin/*.sh

Now you should be able to start tomcat and run reports on the server.

Fonts. BIRT PDF output doesn't work good for Russian fonts out-of-the-box, because of licensing issues with fonts. One simple solution to fix this is:
  1. Get the *.ttf font files you need (you can copy them from any Windows installation, look in c:\Windows\Fonts). These 8 files should be enough in most cases (these are "Arial" and "Times New Roman" fonts):

    arialbd.ttf  arialbi.ttf  ariali.ttf  arial.ttf
    timesbd.ttf  timesbi.ttf  timesi.ttf  times.ttf
  2. Copy these files to /usr/share/fonts/truetype (or any other place that is referenced from fontsConfig.xml).
  3. Don't forget to fix file permissions:
    chmod a+r /usr/share/fonts/truetype/*.ttf
  4. Reference the fonts from *.rptdesign (or configure font-aliases):
    /report/styles
    <style name="report" id="4">
        <property name="fontFamily">"Arial"</property>
        <property name="fontSize">9pt</property>
    </style>
    
  5. Restart Tomcat:
    • $CATALINA_HOME/bin/shutdown.sh
    • $CATALINA_HOME/bin/startup.sh
Russian Localization. I used this method to do it. Although you may want to try BIRT Language Packs.


Troubleshooting.

  • Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
    At least one of these environment variable is needed to run this program

    You should define JAVA_HOME variable. Execute this command before running Tomcat's *.sh files in terminal:

    export JAVA_HOME=/usr/bin/java
  • If you get OutOfMemoryError you may want to give JVM more memory. Edit $CATALINA_HOME/bin/catalina.sh to include this (see this thread on stackoverflow, and read more about JVM memory settings):

    JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx512m -XX:MaxPermSize=256m"
  • If you got OutOfMemoryError you most likely couldn't restart Tomcat using $CATALINA_HOME/bin/shutdown.sh script.

    To kill Tomcat instance use htop command in terminal. In htop interface select Tomcat process (this is /usr/lib/java), press 'k', select 9 SIGKILL in "Send signal" area, and press Enter. To exit htop press 'q'.
  • Executing report never stops. Tomcat process consumes all CPU resources.

    I've seen this situation when used charts in report and they were on page break. I fixed this by moving charts to other place (far from page break). Changing page size to avoid page breaks also fixes this issue.

Wednesday, September 03, 2008

7 показателей эффективного управления личными финансами

Для начала небольшая предыстория вопроса.

Ленивые могут пролистать пост вниз, прямо к скриншоту, и попытаться разобраться самостоятельно, но сразу предупрежу, что без собственной такой предыстории и разбирательств в вопросе управления личными финансами вы вряд ли осознаете необходимость и практическую значимость того, что там увидите.

Итак, прошло уже больше двух месяцев, как мы с Настей начали планировать домашний бюджет. За основу мы решили взять советы Макса Крайнова и его идею о "4 конвертах".

Почему именно ее? Потому что приблизительно в то время я наткнулся на блог Макса и попал на период, когда он только начал развивать идею с конвертами. Кажется это был апрель-май.

У меня заняло около месяца на знакомство с идеей 4 конвертов и вообще знакомством идеи ведения домашнего бюджета.

Еще через месяц появился его online-сервис www.4konverta.com, который стал эталонной реализацией идеи "4 конверта". При работе с этим сервисом я очень скоро уперся в его функциональные ограничения (в нем еще попросту не было нужных функций, некоторые и сейчас находятся на стадии активной разработки), не удивительно - ведь сервис еще только набирает обороты, привлекая все больше людей.

Этот момент совпал с нашим очередным переездом на новую квартиру, где у меня попросту не было интернета. У меня не было даже тех 30 секунд в день для заполнения ежедневных трат, про которые так часто говорит Макс.

Между тем я уже не мог отказаться от планирования, потому что первые данные о структуре моего бюджета заставили задуматься и показали о необходимости принимать меры.

Одновременно с этим стало понятно, что без актуальной первичной информации в "конвертах", то есть данных о ежедневных тратах, я не смогу получить достоверную картину и, следовательно, не смогу доверять данным сервиса.

Задолго до 4 конвертов мы с Настей пытались собирать чеки, чтобы хотя бы примерно попытаться построить прогноз - сколько мы тратим и на что. Но из-за того, что очень часто чеки либо терялись, либо мы просто забывали их брать этот прогноз получался очень неточным (около 30% месячного дохода терялось в неизвестном направлении). Логичным решением был отказ от сбора чеков и переход на 4 конверта, то есть заносить все траты непосредственно туда. Именно тогда у меня родилась идея написать приложение для своего мобильного телефона, через которое я бы смог заносить текущие траты непосредственно по факту их совершения.

Я написал это приложение за одни выходные. Идея мобильного клиента мне настолько понравилась, что я решил сделать его доступным для всех, выпустив его под бесплатной Open Source лицензией, чтобы каждый пользователь сервиса "4 конверта" смог решить для себя вопрос учета ежедневных трат раз и навсегда. Сегодня, после выхода последнего обновления (10 дней назад), мобильную версию 4 конвертов закачали около 100 человек и эта цифра постоянно растет!

По просьбе пользователей я также выпустил версию клиента для платформы Windows Mobile, но решил сделать эту версию платной. Почему? Потому что сам ей не пользуюсь и просто хочу вернуть деньги за время, потраченное на разработку.

Кроме того, я считаю, что сам мобильный клиент стоит своих денег, ведь ошибка в собственном прогнозе из-за неверных данных может стоить гораздо больше, чем эти копейки.

О каком прогнозе идет речь? Для начала пара примеров, как мы жили раньше.

Например, у нас могли закончится деньги до зарплаты, и в это же время нужно было платить кредит. Или могло быть так, что за неделю до зарплаты мы с Настей могли сходить в ресторан и потратить последние деньги, оставив себе 500 рублей на неделю до следующей получки :)

Сейчас я вспоминаю об этом с улыбкой :), но я с большим удивлением обнаружил, что все мои знакомые и друзья до сих пор находятся в таком положении - они не могут контролировать свои траты. Они даже не знают сколько у них денег и не представляют, увеличивается ли их капитал или они тратят больше, чем получают и вскоре их ждет ситуация, как у большинства - они в лучшем случае будут жить от зарплаты до зарплаты, как мы раньше, отказывая себе во многом.

Сервис "4 конверта" позволил дать ответы на большинство этих вопросов. Как минимум он позволяет задуматься о положении дел!

Но дело в том, что с того самого момента, когда у меня появился мобильный клиент, мои потребности в обработке моих данных по движению денег начали расти быстрее, чем функционал этого сервиса (хотя, надо отметить, что он развивается семимильными шагами и многое из того, чего мне не хватало тогда в нем уже есть).

Не дожидаясь реализации нужных мне функций, я перенес основные идеи из сервиса "4 конверта" себе в Excel. Сегодня моя книга кэш-фло выглядит примерно таким образом:


В нижней части - учет движения денежных потоков, включая все плановые и фактические доходы и расходы, а также затраты на конверты, то есть на ежедневные траты.

Все наличные/безналичные деньги, которые не в резервном фонде я объединил под одним названием - подвижный остаток. Эти деньги я могу разложить по конвертам уже сегодня и хоть на год вперед. Исходя из плановых доходов и плановых расходов на конверты я всегда вижу какой минимальный подвижный остаток у меня будет на руках и когда я смогу уйти "в минус", если вдруг лишусь доходов или просто будет задержка в зарплате.

Кроме того, я всегда могу оценить размер своего капитала на каждый день на год вперед.

Зная величину капитала я могу построить тренд, который мне покажет - превышают ли мои расходы мои доходы и насколько это критично.

И еще одна функция, которая мне очень нравится в Excel - это анализ "Что-если".

Так как все данные в книге завязаны друг на друге в виде математических формул, я могу, поменяв одно значение, например, размер конверта по умолчанию, получить картинку, которая мне покажет долгосрочный прогноз вперед.

А задействуя функцию "Что-если" я могу подобрать величину размера конверта по умолчанию таким образом, чтобы, например, мой минимальный подвижный остаток в течении года не был ниже 20000 рублей.

И если меня устраивает мой тренд, я могу смело руководствоваться величиной размера конверта по умолчанию как эталоном.

Собственно, вот эти 7 показателей на которые я смотрю строя прогнозы и принимая решения о тратах:

  1. Размер конверта по умолчанию - сколько мне можно тратить в неделю, чтобы сохранялся прогноз;

  2. Процент резервного фонда - какой процент от дохода я сразу же перечисляю в резервный фонд;

  3. Процент на дополнительный доход - какой процент от дополнительного дохода (премии и прочие нерегулярные доходы) я должен перечислить в резервный фонд;

  4. Минимальный остаток - минимальный подвижный остаток, начиная с сегодняшнего дня;

  5. Минимальный капитал - минимальный капитал, начиная с сегодняшнего дня;

  6. Обращения к резервному фонду - количество обращений к резервному фонду, когда подвижного остатка недостаточно для плановых трат;

  7. Направление тренда капитала - если тренд отрицательный, значит я трачу больше, чем зарабатываю и нужно обратить на это внимание.

В заключении хочу сказать, что вместо неопределенности в 30% по движению денег, последняя сверка (план-факт) показала точность прогноза в пределах 1-2%.

На этом на сегодня все. В качестве обзора моей текущей аналитики и показателей эффективности управления личными финансовыми потоками, и как пища для размышления Максу и команде сервиса "4 конверта", я думаю пока что вполне достаточно.

Буду рад любым отзывам и комментариям.

Sunday, August 31, 2008

Oracle на Волге

28 августа в отеле Ренессанс в Самаре компания TopS BI совместно с KeyIntegrity, Oracle и HP провела открытый семинар "Oracle на Волге", посвященный технологиям Oracle.





Мой доклад был в технической секции и я рассказывал про BI, способы организации хранилищ данных и про то, как это реализовано в Oracle BI Suite Enterprise Edition (ссылки на презентацию и тезисы доклада в конце поста).

Хочется отметить несколько понравившихся докладов.

Очень понравился доклад Александра Старыгина из HP об инфраструктуре ЦОД нового поколения и о позиционировании HP в этом направлении - предоставление ЦОДа информационной службой предприятия, в виде услуги собственному предприятию. Вообще в вопросах управления ИТ-услугами и виртуализации ЦОДов, которая всячески этому способствует, HP продвинулись очень далеко.

По смежной с моей тематике выступали два докладчика из TopS BI - это Даниил Климов с докладом об инструментарии Oracle по созданию хранилищ данных (у Oracle их целых три: Warehouse Builder, Data Integrator и BI Server) и Юрий Гапанюк с докладом на тему "Методы организации Hyperion с другими информационными системами". Оба доклада порадовали мелкими деталями и практическими примерами, которые позволили понять, как это работает в реальной жизни.

Андрей Гусаков, консультант по технологиям безопасности Oracle СНГ, рассказал об Oracle Identity Management - решению, позволяющему управлять привилегиями пользователей и контролем доступа пользователей к информационным ресурсам предприятия. В двух словах, этот framework, который будет входить в Oracle Fusion Middleware, позволяет построить корпоративный мета-реестр, который призван объединить одновременно все существующие роли всех приложений корпоративной информационной системы (всевозможные LDAP, AD и другие подобные источники), позволяя реализовать корпоративный SSO на своей основе (поправьте меня если я не прав). Помимо возможностей SSO, OIM позволяет, например, вести жизненный цикл учетных записей сотрудников, начиная с момента принятия их на работу и заканчивая их увольнением...

Очень интересный семинар с точки зрения новых знакомств и обмена опытом между коллегами. Помимо компаний-партнеров Oracle присутствовали клиенты и потенциальные заказчики, на которых, кстати говоря, и был ориентирован семинар.