Saturday, July 23, 2011

Romania, Banatului Mountains, Rudariei Watermills and Gorge, short briefing

Intro
Banatului Mountains are located in the Eastern Carpathians (or Romanian Carpathians), in the west part of Romania being part of Southern Romanian Carpathians; they are often associated with a subgroup of Western Romanian Carpathians. The region I refer is Almajului Mountains, which are located between the E70 european road (Baile Herculane) and DN57B (Anina, Oravita), at about 60km of Baile Herculane and 40km of Anina, in the Caras-Severin county.

Short Briefing
The Rudariei Watermills are located on the Rudariei Gorge, being developed at the beginning of the 20-es century by the Eftimie Murgu citizens.
There is a number of 22 watermills, most of them still functioning and being protected as Hystorical Monuments. Their mechanism may represent the origin of hydroelectrical power plants, as the water is pressurized with the help of a dam and is redirected via a water chanel under the watermill, where it engages a horizontal wheel system.
Localization Map

Way of access
By road: Timisoara -> Lugoj -> Resita -> Anina -> Bozovici -> Eftimie Murgu;
By road: Drobeta Tr Severin -> Orsova -> Baile Herculane -> Mehadia -> Iablanita -> Eftimie Murgu;

*

Images:
On the way to Rudariei Watermills

Welcome to Eftimie Murgu and Rudariei Watermills

 Eftimie Murgu view

Rudariei Watermills - Short briefing panel

"Firiz" Watermill

"Firiz" Watermill - Process Flow

"Firiz" Watermill - Horizontal Wheel System

"Batolea" Watermill

"Batolea" Watermill - Redirected Water Chanel


 "Indaratnica dintre ape" Watermill

 "Trailoanea" Watermill

 Water Dam to ease the water pressure

 "Viloanea" Watermill and its Water Dam

 "Rosoanea" Watermill and its Water Dam

 "De la tunel" Watermill

 View from Rudariei Gorge

 View from Rudariei Gorge

View from Rudariei Gorge

 
View from Rudariei Gorge

Friday, July 8, 2011

Struts2, Tiles2, Spring, Hibernate, JQuery Plugin - Tabbed Panel

Struts2, Tiles2, Spring, Hibernate, JQuery Plugin - Tabbed Panel

Disclaimer:
All the software applications that appear below represent trademarks and they are the property of their respective owners.
Use and implement my notes in this article at your own risk.

Discussion here:
1. General Considerations;
2. Prerequisites;
3. Tabbed Panel jQuery plugin component;
4. Dynamically add tabs to Tabbed Panel;
5. Struts 2 Actions;
6. DAOs;
7. Annotated Hibernate entities;

1. General Considerations:
So, I decided to put another sample based on the same basis as the previous 5 ones (see the March 2011 blog archive).
This sample is purposed to show how to use the Tabbed Panel component of jQuery plugin and to dynamically add tabs in order to access the countries and cities of a zone.
The sample will be presented somehow in a "top-down" fashion, ie. starting from View, then Controller, then Model components of the MVC web app architecture.


NOTE: if you don't know for example what is "blog" database, or other aspects, then you should read the "Struts2, Tiles2, Spring, Hibernate, JQuery plugin - General Considerations", which is used as a basis for this sample.

2. Prerequisites:
Make sure you have read the "Struts2, Tiles2, Spring, Hibernate, JQuery plugin - General Considerations", and installed and configured all that is written there;

3. Tabbed Panel jQuery plugin component:
The Tabbed Panel if contained in jQuery plugin which is represented by struts2-jquery-plugin-2.5.0.jar, so you have to install it on your local app path.
In order to use the Tabbed Panel from jQuery plugin, you will have to include the following line in your JSP file:
<<
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
>>
Thus, you made the jQuery plugin available to be used in your JSP file; it contains also the Tabbed Panel component.

A Tabbed Panel may be written like this:
<<
    <sj:tabbedpanel id="tabs">
        <sj:tab id="tab1" target="div1" label="tab no 1"/>
        <sj:tab id="tab2" target="div2" label="tab no 2"/>
        <sj:tab id="tab3" target="div3" label="tab no 3"/>
        <div id="div1">
        ...
        </div>
        <div id="div2">
        ...
        </div>
        <div id="div3">
        ...
        </div>
    </sj:tabbedpanel>
>>
So, you have a tabbedpanel identified by "tabs" which contains 3 tabs, each tab with the title "tab no x" and the tab content specified in the associated DIV HTML element (div1, div2, div3). The functioning is somehow like this: when the user clicks on a tab, then all the DIVs are hidden and only the associated DIV is displayed.

4. Dynamically add tabs to Tabbed Panel
We assume we have a generated select HTML element that contains the list of zones; then, we have a tabbedpanel container in which we'll dinamically render the tabs containing countries and their cities.
The JSP code is:
<<
            <s:select id="selectZones" list="selectZones" listKey="cod" listValue="name" />
            <tr><td colspan="2"><sj:tabbedpanel id="tabbedCountries"></sj:tabbedpanel></td></tr>
>>
, where selectZones is the list of zones rendered by the default action and "tabbedCountries" is the tabbedpanel container.
Then, to render the tabs into "tabbedCountries", we'll use a jQuery function, named "populateTabs()" to which we send the value of the "selectZones" select:
<<
function populateTabs(selectZoneValue) {
    for (var k = $('#tabbedCountries').tabs('length') - 1; k >=0 ; k--)
        $('#tabbedCountries').tabs("remove", k);
    $.ajax({
        url: "selectCountries.action?code_zone=" + selectZoneValue,
        type: "POST",
        async: false,
        dataType: "json",
        success: function(data){
            var tab_counter = 2;
            for (var i = 0; i < data.length; i++) {
                var $tabs = $('#tabbedCountries').tabs({
                    tabTemplate: '<li><a href="#tabs_'+tab_counter+'">'+data[i].value+'</a></li>',
                    add: function(event, ui) {
                        var contentCity = "";
                        $.ajax({
                            url: "selectCities.action?code_country=" + data[i].key,
                            type: "POST",
                            async: false,
                            dataType: "json",
                            success: function(dataj){
                                for (var j = 0; j < dataj.length; j++)
                                    contentCity += dataj[j].value + "<br />";
                            }
                        });
                        $(ui.panel).append('<p>'+contentCity+'</p>');
                    }
                });
                var tab_title = data[i].key + ":"+data[i].value || 'Tab '+tab_counter;
                $tabs.tabs('add', '#tabs_'+tab_counter, tab_title);
                tab_counter++;
            }
         }
    });
}
>>
This function is called twice when jQuery loads:
- first, when the "selectZones" select is rendered, to initially render the tabbedpanel with initial selected value of "selectZones" select;
- second, at "selectZones" select change event;
<<
$(function() {
    $("#selectZones").unbind("change");
    populateTabs($("#selectZones").val());
    $("#selectZones").change(function() {
        populateTabs($(this).val());
    })
});
>>
Some things regarding the populateTabs() function:
- initially, it is assured that the "tabbedCountries" tabbedpanel container does not contain any tabs; this is important as the appending of a new country tab to be made at its associated zone;
- we call by AJAX an action that will return the countries list as a JSON object and we render a "tabTemplate" that contains the tab title and the link to the associated DIV content;
- on the "add" method of tabbedCountries.tabs we call another AJAX that will render the cities of the associated country;
- finally, we append the country and its cities to the tab associated DIV content;
- we increment the tab_counter, first initialized to 2, which is used internally by "tabbedCountries" to keep the index of tabs;

5. Struts 2 Actions:
There are 2 types of actions here:
- one that HTML renders the zones list;
- two that JSON renders the countires and cities list; these two are the same, so, I'll put the code just for the countries;
For the zones it is used the "blog-struts" package
<<
@ParentPackage("blog-struts")
>>
This will use the Struts "blog-struts" package defined in struts.xml, ie. it will extend the "struts-default" package of the Struts2; the "struts-default" package may also render tiles type results.

To populate the zones, you will use this code:
<<
@Override
    @Action(value="/index", results={
        @Result(name="success", location="page.selectzones", type="tiles"),
        @Result(name="input", location="page.empty", type="tiles")
    })
    public String execute() {
        try {
            setSelectZones((List<Zone>)zoneDAO.findAll());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return ActionSupport.INPUT;
        }
        return ActionSupport.SUCCESS;
    }
>>

Here:
"selectZones" is the Java List which will be rendered by the "selectZones" select HTML element;
"zoneDAO" is the DAO (see "6. DAOs") managed by Spring over the Hibernate entities which contains methods as "findAll()" in order to obtain zones data from database;

Also, you may observe here annotations to define the "success" and "input" results (overcomes) of the action.

In the same action you should define getters and setters for "List<Zone> displayZoneList".


For the countries it is used the "blog-json" package
<<
@ParentPackage("blog-json")
>>
This will use the Struts "blog-json" package defined in struts.xml, ie. it will extend the "json-default" package of the Struts2; "json-default" uses "struts2-json-plugin-2.2.1.jar" to render a JSON result.

To populate the countries, you will use this code:
<<
@Override
    @Action(value="/selectCountries", results={
        @Result(name="success", type="json", params={"root", "selectCountryList"}),
        @Result(name="input", location="/jsp/empty.jsp")
    })
    public String execute() {
        try {
            if (code_zone != null && code_zone.trim().length() > 1) {
                    List<Country> listCountries = (List<Country>)countryDAO.findByProperty("zone.cod", getCode_zone());
                    selectCountryList = new ArrayList<KeyValuePairBean>();
                    for (Country country : listCountries) {
                        selectCountryList.add(new KeyValuePairBean(country.getCod(), country.getName()));
                    }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return ActionSupport.INPUT;
        }
        return ActionSupport.SUCCESS;
    }
>>

Here:
"code_zone" is a String to which is passed the selected value of the "selectZones" select HTML element;
"selectCountryList" is the Java List which will be rendered on the respective tab of the "tabbedCountries" tabbedpanel;
"countryDAO" is the DAO (see "6. DAOs") managed by Spring over the Hibernate entities which contains methods as "findByProperty()" in order to obtain countries data from database;

Also, you may observe here annotations to define the "success" and "input" results (overcomes) of the action.

In the same action you should define getters and setters for "List<Country> selectCountryList" and for the "code_zone" String.

NOTE: to see how the Struts 2 Actions are accessed, and how their results are rendered, checkout also the "struts.xml" and "tiles.xml" files.

6. DAOs
DAOs, namely Data Access Objects, are used by Spring to obtain data from database via Hibernate.
DAOS are part of the business layer of a database web app.
A DAO class extends in this case the "HibernateDaoSupport" and contains methods to access the database via annotated Hibernate entities.
Any DAO should be described as a bean in the "applicationContext.xml" file in order to be seen by the sessionFactory; for example, for zones:
<<
    <bean id="ZoneDAO" class="blog.hibernate.dao.ZoneDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
>>

From Java point of view, a DAO should use a session manager, in this case, "HibernateDaoSupport" which is a Spring class that manages Hibernate sessions over annotated entities.

NOTE: a method that uses Hibernate session to get data from database uses HQL (Hibernate Query Language); to understand the HQL syntax you should google for HQL documentation.

7. Annotated Hibernate entities
An annotated entity is a POJO class that describes a database table by means of annotations.
It represents the Model from the MVC architecture.
For example, for the database table "zone", it was defined the Zone.java entity class; to refer table "zone" from database "blog", annotations are placed at the top of the class definition:
<<
@Entity
@Table(name = "zone", catalog = "blog")
>>
, while for each of table "zone" fields, there are specified on their value getters: primary key, foreign key, column name, field length, aso, if they exist.
Here are some examples of annotations, taken from Zone.java:
<<
    @Id
    @GeneratedValue
    @Column(name = "cod", unique = true, nullable = false, length = 4)
>>
<<
    @Column(name = "name", nullable = false, length = 45)
>>
<<
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "zone")
>>

NOTE: if MyEclipse is used as IDE, you may generate both DAO and entity for each table by using Hibernate Reverse Engineering perspective.

Struts2, Tiles2, Spring, Hibernate, JQuery - DisplayTag Plugin

Struts2, Tiles2, Spring, Hibernate, JQuery - DisplayTag Plugin

Disclaimer:
All the software applications that appear below represent trademarks and they are the property of their respective owners.
Use and implement my notes in this article at your own risk.

Discussion here:
1. General Considerations;
2. Prerequisites;
3. DisplayTag Plugin;
4. Linking DisplayTags;
5. Struts 2 Actions;
6. DAOs;
7. Annotated Hibernate entities;

1. General Considerations:
So, I decided to put another sample based on the same basis as the previous 5 ones (see the March 2011 blog archive).
This sample is purposed to show how to link 2 DisplayTag plugins together; of course, you may link as many you want if you have a link parameter; the 2 DisplayTags will be populated with records from the tables "zone" and "country" of the "blog" database; you may link for example a 3rd DisplayTag representing table "city" by using cod_country parameter, but this is done in the same manner as linking the countries DisplayTag by the zones one.
The sample will be presented somehow in a "top-down" fashion, ie. starting from View, then Controller, then Model components of the MVC web app architecture.


NOTE: if you don't know for example what is "blog" database, or other aspects, then you should read the "Struts2, Tiles2, Spring, Hibernate, JQuery plugin - General Considerations", which is used as a basis for this sample.

2. Prerequisites:
Make sure you have read the "Struts2, Tiles2, Spring, Hibernate, JQuery plugin - General Considerations", and installed and configured all that is written there;

3. DisplayTag Plugin:
The DisplayTag plugin is represented by displaytag-1.1.1.jar, so you have to install it on your local app path (I had at disposal an older version, available for Struts1, you may check newer versions).
In order to use this plugin, you will have to include the following line in your JSP file:
<<
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
>>
Also, if you want to use it combined with jQuery plugin, you will have to include this:
<<
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
>>
Thus, you made the DisplayTag and jQuery plugins available to be used in your JSP file.

A DisplayTag used for zones will look like:
<<
            <display:table name="displayZoneList"
                id="row"
                requestURI="displayZone.action"
                style="border-width:0;background-color:#a1a5a9; width: 100%; "
                cellspacing="1" cellpadding="0" class="simpletable"
                decorator="blog.decorators.SimpleDecorator"
                export="false"
                pagesize="10">
                <display:column sortable="true"
                    class="tableCell"
                    title="Nr."
                    style="text-align: center;">
                    <s:property value="#attr.row_rowNum" />
                </display:column>
                <display:column sortable="true"
                    class="tableCell"
                    title="Code"
                    style="text-align: center;">
                        <s:property value="#attr.row.cod" />
                </display:column>
                <display:column sortable="true"
                    class="tableCell"
                    title="Zone"
                    style="text-align: center;">
                        <s:property value="#attr.row.name" />
                </display:column>
                <display:column sortable="false"
                    class="tableCell"
                    title="Countries"
                    style="text-align: center;"       
                    media="html"
                    onclick="this.parentNode.className = 'row_selected'">
                    <sj:a id="aa_%{#attr.row.cod}" href="#">countries</sj:a>
                </display:column>
                <display:setProperty name="paging.banner.include_first_last" value="true" />
                <display:setProperty name="paging.banner.placement" value="bottom" />
            </display:table>
>>
Some things here:
- the rendered ID attribute for the HTML object will be "row"; all the date will be then accessed by using "#attr.row".
- the "name" attribute ("displayZoneList") of DisplayTag will represent the Java list used as data source for DisplayTag;
- the "requestURI" attr tells DisplayTag the action that contains the data source list;
- the "decorator" attr is used to CSS stylize the table rows of DisplayTag; it is given by the SimpleDecorator Java class (will put the class code later);
- the DisplayTag has 4 columns: Nr (current record number), Code (the Zone code), Zone (the Zone name), Countries (link to the Countries of a Zone);
- properties regarding table pagination.

The SimpleDecorator class:
<<
package blog.decorators;

public class SimpleDecorator extends org.displaytag.decorator.TableDecorator {
    public String addRowClass() {
        return "dt_" + String.valueOf(getListIndex() % 2);
    }
}
>>
It extends the "org.displaytag.decorator.TableDecorator" and rewrites the "addRowClass" method, returning a string that will be find in the associated CSS file, which will contain:
<<
...
.tableCell {
    color:#00366C;
    background-color: #f2f8ff;
    font-weight: normal;
    font-family: verdana;
    font-size: 10px;
}

tr.dt_0 td.tableCell {
    color: #00366C;
    background-color: #F2F8FF;
    font-weight: normal;
    font-family: verdana;
    font-size: 10px;
}

tr.dt_1 td.tableCell {
    color: #00366C;
    background-color: #D2E8FF;
    font-weight: normal;
    font-family: verdana;
    font-size: 10px;
}
...
>>

4. Linking DisplayTags
Linking the Zones and Countries makes use of the "cod_zone" parameter.
The DisplayTag for countries looks like:
<<
            <display:table name="displayCountryList"
                id="rowCountry"
                requestURI="displayCountry.action"
                style="border-width:0;background-color:#a1a5a9; width: 100%; "
                cellspacing="1" cellpadding="0" class="simpletable"
                decorator="blog.decorators.SimpleDecorator"
                export="false"
                pagesize="10">
                <display:column sortable="true"
                    class="tableCell"
                    title="Nr."
                    style="text-align: center;">
                    <s:property value="#attr.rowCountry_rowNum" />
                </display:column>
                <display:column sortable="true"
                    class="tableCell"
                    title="Code"
                    style="text-align: center;">
                        <s:property value="#attr.rowCountry.cod" />
                </display:column>
                <display:column sortable="true"
                    class="tableCell"
                    title="Country"
                    style="text-align: center;">
                        <s:property value="#attr.rowCountry.name" />
                </display:column>
                <display:setProperty name="paging.banner.include_first_last" value="true" />
                <display:setProperty name="paging.banner.placement" value="bottom" />
            </display:table>
>>
Note: The ID (rowCountry) is different than the zones one (row).
Then, the link is done by jQuery on the "countries" link (sj:a tag) of Zones DisplayTag:
<<
$(function() {
    $("a[id^='aa_']").each(function() {
        $(this).unbind("click");
        $(this).click(function(){
            $.ajax({
                url: "displayCountry.action?code_zone=" + $(this).attr("id").substring("aa_".length),
                type: "POST",
                async: false,
                dataType: "html",
                success: function(data){
                    $("#divCountries").html(data);
                  }
            });
        });
    })
});
>>

5. Struts 2 Actions:
A JQuery autocompleter is rendered by various type of sources: Java list, JSON, JavaScript array, aso.
If you want to use JQuery Ajax capabilities, then you should render a JQuery autocompleter by using JSON type source.
When using Struts, the results are rendered by using Struts Actions, which represent the level of Controller from MVC architecture.
So, the Struts action should return a JSON type result.
To be sure of this, you have to include this annotation to your struts action:
<<
@ParentPackage("blog-struts")
>>
This will use the Struts "blog-struts" package defined in struts.xml, ie. it will extend the "struts-default" package of the Struts2; the "struts-default" package may also render tiles type results.

To populate for example the zones, you will use this code:
<<
    @Override
    @Action(value="/index", results={
        @Result(name="success", location="page.displayzone", type="tiles"),
        @Result(name="input", location="page.empty", type="tiles")
    })
    public String execute() {
        try {
            setDisplayZoneList((List<Zone>)zoneDAO.findAll());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return ActionSupport.INPUT;
        }
        return ActionSupport.SUCCESS;
    }
>>

Here:
"displayZoneList" is the Java List which will be rendered by the DisplayTag;
"zoneDAO" is the DAO (see "6. DAOs") managed by Spring over the Hibernate entities which contains methods as "findAll()" in order to obtain zones data from database;

Also, you may observe here annotations to define the "success" and "input" results (overcomes) of the action.

In the same action you should define getters and setters for "List<Zone> displayZoneList".

Same you should do for countries and cities.
NOTE: to see how the Struts 2 Actions are accessed, and how their results are rendered, checkout also the "struts.xml" and "tiles.xml" files.

6. DAOs
DAOs, namely Data Access Objects, are used by Spring to obtain data from database via Hibernate.
DAOS are part of the business layer of a database web app.
A DAO class extends in this case the "HibernateDaoSupport" and contains methods to access the database via annotated Hibernate entities.
Any DAO should be described as a bean in the "applicationContext.xml" file in order to be seen by the sessionFactory; for example, for zones:
<<
    <bean id="ZoneDAO" class="blog.hibernate.dao.ZoneDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
>>

From Java point of view, a DAO should use a session manager, in this case, "HibernateDaoSupport" which is a Spring class that manages Hibernate sessions over annotated entities.

NOTE: a method that uses Hibernate session to get data from database uses HQL (Hibernate Query Language); to understand the HQL syntax you should google for HQL documentation.

7. Annotated Hibernate entities
An annotated entity is a POJO class that describes a database table by means of annotations.
It represents the Model from the MVC architecture.
For example, for the database table "zone", it was defined the Zone.java entity class; to refer table "zone" from database "blog", annotations are placed at the top of the class definition:
<<
@Entity
@Table(name = "zone", catalog = "blog")
>>
, while for each of table "zone" fields, there are specified on their value getters: primary key, foreign key, column name, field length, aso, if they exist.
Here are some examples of annotations, taken from Zone.java:
<<
    @Id
    @GeneratedValue
    @Column(name = "cod", unique = true, nullable = false, length = 4)
>>
<<
    @Column(name = "name", nullable = false, length = 45)
>>
<<
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "zone")
>>

NOTE: if MyEclipse is used as IDE, you may generate both DAO and entity for each table by using Hibernate Reverse Engineering perspective.

Monday, June 27, 2011

Lake Of Tears - Arenele Romane 25-06-2011

Lake Of Tears - Arenele Romane 25-06-2011
(Illwill Tour, 2011)


The LoT concert took place in Bucharest, Arenele Romane and started at 19:00 with Tiarra - a symphonical metal romanian band founded in 2004; then, at 20:00 it was Abigail's turn - a progressive metal band founded in 1994, performing also their best song "Sonnet".

At 21:00, for about 2 hours, Lake Of Tears was on stage! They started with "Taste of Hell", then "Illwill" song which was very well supported by the public. LoT played almost all the songs from their last album "Illwill" (UNSANE, House of the Setting Sun, Parasites, Out of Control, Crazyman, aso), a good album which revives the thrash of '90-es, combined with older songs like: "Boogie Bubble", "Cosmic Weed", "As Daylight Yields", "Headstones", and ended with "So Fell Autumn Rain", "Forever Autumn" and "Burn Fire Burn"; indeed a very good concert.

*
Next, images from the concert:

The Scene - Arenele Romane

 Abigail enters

 Abigail

 ...

 ...

 ...

 Abigail ends

*


 Lake of Tears

 ...

 ...

 ...

 ...

...

Thursday, June 23, 2011

Romania, North-West of Gorj County

(a 2-day car travel mini-guide)


Intro:
The Gorj County is located in the North-West part of Oltenia region of Romania; the town residence of this county is Targu-Jiu. It may be mentioned that all the North part of Gorj county is full of beautiful touristic objectives, as for example the "Pestera Muierii" Cave, "Pestera Polovragi" Cave, "Cheile Oltetului" Gorges, the "Parang" Mountains (highest peak Parangu-Mare, 2519m alt.), or Constantin Brancusi sculptures at Targu-Jiu ("Poarta Sarutului", "Masa Tacerii", "Coloana Infinitului"), but I will resume next to a mini-guide of the North-West region, at West of Targu-Jiu, located along the 67D national road; I recently visited 4 of these objectives in a 2-day travel by car; the 4 objectives visited are circled with green color in the map below, while the rest of objectives are circled with red:


N-W part of Gorj County Objectives map:

The 4 objectives visited:
- Cheile Sohodolului Gorges;
- Tismana Monastery;
- Ponoare Natural Bridge and Cave;
- Cerna-Sat - Cheile Bobotului and Cheile Corcoaiei Gorges;

The other unvisited objectives:
- Hobita - home of Constantin Brancusi, the most known romanian sculptor (see the "Poarta Sarutului", "Masa Tacerii", "Coloana Infinitului" sculptures at Targu-Jiu);
- "Pestera Gura Plaiului" Cave;
- "Pestera Cioaca cu Brebenei" Cave;
- "Pestera Closani" Cave;
- "Lacul Valea lui Ivan" Lake;

Of course, there are other objectives around, but the ones above may be reached by car in a short visit; if you intend to follow treking/hiking routes, there are a lot of routes here from: Cerna-Sat, Tismana, Closani, Bilta, Pestisani, aso.

*

Next, the 4 visited locations.

1. Cheile Sohodolului Gorges:
Briefing: At North of Runcu village, Cheile Sohodolului Gorges are maybe the most spectacular gorges from Romania formed by Sohodol river.

Images from Cheile Sohodolului Gorges:


...

...

...

...

...

...

  River passes the rock

  River passes the rock

...

 River passes the rock

  River passes the rock

  River passes the rock

...

...

 Cute dogs on the way

...

 The ring

Little caves

...

2. Tismana Monastery:
Briefing: Tismana Monastery is one of the most important monasteries of Romania, maybe the most important from the south part of Romania; Tismana served as settlement for Tudor Vladimirescu, a known romanian revolutionary.

Images from Tismana Monastery:

 Entry

...

Front view
Inside Tismana

Inside Tismana

Inside Tismana - Cactuses collection

 Lateral entry to the caves at Tismana

 Lateral view
 Tismana caves

Priest buildings


3. Ponoare Natural Bridge and Cave:
Briefing: The Natural Bridge at Ponoare, known as "Podul lui Dumnezeu" is the biggest natural bridge from Romania and second from Europe; it served for high auto traffic, but nowadays is under repairing; the bridge formed when the "Pestera Podului" or "Pestera Ponoare" cave collapsed; the cave has 2 entries and a total length of 734m; at the second entry of the cave, or at the exit as some say, there is sometimes formed the Zaton lake, especially when high rains. Under the "Pestera Ponoare" cave there is another one known as "Pestera Bulba" cave (5000m length); the Zaton lake looses its water in the "Pestera Bulba" cave, when in warm season that is why it is also called the "Lacul Fantoma" (Phantom Lake).


Images from Ponoare:

 Welcome to Ponoare village

 View from the "Podul lui Dumnezeu" natural bridge

 "Podul lui Dumnezeu" natural bridge

 "Podul lui Dumnezeu" natural bridge

 "Pestera Podului" or "Pestera Ponoare" cave first entry

"Pestera Podului" or "Pestera Ponoare" inside the cave

 "Pestera Podului" or "Pestera Ponoare" stairs inside the cave


4. Cerna-Sat Gorges:
Briefing: The access to Cerna_sat is made via DN67D, at aprox 60km from Baia de Arama and 25km from Baile Herculane on a forest road which was asphalted in the past. At the entry on this road are located the "Cheile Bobotului" Gorges on Cerna river; after these gorges on Cerna, at about 15km you enter the Cerna-Sat village where you'll find here a nice village with various mountain routes; after the village you arrive to Cheile Corcoaiei Gorges also on Cerna river, which are short but very spectacular; then, at 3 km from Cheile Corcoaiei you'll find the "Valea lui Ivan" Lake.

Images from Cerna-Sat:

 Cheile Bobotului Gorges overall view

 Cheile Bobotului Gorges

 Cheile Bobotului Gorges

View from the Cerna-Sat way

River passes under natural bridge on the Cerna-Sat way

 View from the Cerna-Sat way 

 View from the Cerna-Sat way 

 View from the Cerna-Sat way 

 Chalet on the Cerna-Sat way 

Cerna-Sat camping

 Cerna-Sat overall view of Cerna Valley

 Cerna-Sat - view to Cheile Corcoaiei Gorges entry

 Cheile Corcoaiei Gorges entry

 Cheile Corcoaiei Gorges entry

 Cheile Corcoaiei Gorges

 Cheile Corcoaiei Gorges

 Cheile Corcoaiei Gorges

 Cheile Corcoaiei Gorges

Cheile Corcoaiei Gorges

 
 Cheile Corcoaiei Gorges