Recital

Login Register

In this article Barry Mavin, CEO and Chief Software Architect for Recital details how to Build C Extension Libraries to use with Recital.

Overview

It is possible to extend the functionaliy of Recital products using "Extension libraries" that can be written in C. These extension libraries, written using the Recital/SDK API, are dynamically loadable from all Recital 9 products. This includes:

  • Recital
  • Recital Server
  • Recital Web

Building C Extension Libraries

You can create C wrappers for virtually any native operating system function and access these from the Recital 4GL. Unlike traditional APIs which only handle the development of C functions that are callable from the 4GL, the Recital/SDK allows you to build Classes that are accessible from all Recital products. e.g. You could create a GUI framework for Linux that handles VFP system classes!

To deploy your C Extension Libraries, copy them to the following location:

Windows:

\Program Files\Recital\extensions

Linux/Unix:

/opt/recital/extensions

Please see the Recital/SDK API Reference documentation for further details.

Sample code

Listed below is the complete example of a C Extension Library.:

////////////////////////////////////////////////////////////////////////////////
#include "mirage_demo.h"  
      
////////////////////////////////////////////////////////////////////////////////
// Declare your functions and classes below as follows:
//
//    Recital Function Name, C Function Name, Type (Function or Class)
//
#define MAX_ELEMENTS    7
static  struct  API_SHARED_FUNCTION_TABLE api_function_table[MAX_ELEMENTS] = {
        {"schar",   "fnSamplesCharacter",   API_FUNCTION},
        {"stype",   "fnSamplesType",           API_FUNCTION},
        {"slog",    "fnSamplesLogical",        API_FUNCTION},
        {"snum",    "fnSamplesNumeric",    API_FUNCTION},
        {"sopen",   "fnSamplesOpen",         API_FUNCTION},
        {"myclass", "clsMyClass",               API_CLASS},
        {NULL,      NULL,                   -1}
};

////////////////////////////////////////////////////////////////////////////////
// Recital API initialization. This should be in only ONE of your C files
// **IT SHOULD NEVER BE EDITED OR REMOVED**  
INIT_API;


///////////////////////////////////////////////////////////////////////
// This is an example of passing a character parameter and returning one.
RECITAL_FUNCTION fnSamplesCharacter(void)
{
    char    *arg1;
    
    if (!_parse_parameters(PCOUNT, "C", &arg1)) { 
        ERROR(-1, "Incorrect parameters");
    }
    
    _retc(arg1);
}


///////////////////////////////////////////////////////////////////////
// This is an example of passing a numeric parameter and returning one.
RECITAL_FUNCTION fnSamplesNumeric(void)
{
    int arg1;
    
    if (!_parse_parameters(PCOUNT, "N", &arg1)) { 
        ERROR(-1, "Incorrect parameters");
    }
    
    _retni(arg1);
}


///////////////////////////////////////////////////////////////////////
// This is an example returns the data type of the parameter passed.
RECITAL_FUNCTION fnSamplesType(void)
{
    char    result[10];

    if (PCOUNT != 1) { 
        ERROR(-1, "Incorrect parameters");
    }
    
    switch (_parinfo(1)) {
        case API_CTYPE:
            strcpy(result, "Character");
            break;
        case API_NTYPE:
            strcpy(result, "Numeric");
            break;
        case API_LTYPE:
            strcpy(result, "Logical");
            break;
        case API_DTYPE:
            strcpy(result, "Date");
            break;
        case API_TTYPE:
            strcpy(result, "DateTime");
            break;
        case API_YTYPE:
            strcpy(result, "Currency");
            break;
        case API_ATYPE:
            strcpy(result, "Array");
            break;
        default:
            strcpy(result, "Unkown");
            break;
    }

    _retc(result);
}


///////////////////////////////////////////////////////////////////////
// This is an example returns "True" or False.
RECITAL_FUNCTION  fnSamplesLogical(void)
{
    char    result[10];
    int     arg1;
    
    if (!_parse_parameters(PCOUNT, "L", &arg1)) { 
        ERROR(-1, "Incorrect parameters");
    }
    
    if (arg1) strcpy(result, "True");
    else strcpy(result, "False");

    _retc(result);
}


///////////////////////////////////////////////////////////////////////
// This example opens a table.
RECITAL_FUNCTION fnSamplesOpen(void)
{
    char    *arg1;
    
    if (!_parse_parameters(PCOUNT, "C", &arg1)) { 
        ERROR(-1, "Incorrect parameters");
    }
    
    if (_parinfo(1) == API_CTYPE) {
        _retni(COMMAND(arg1));
    } else {
        _retni(-1);
    }
}

///////////////////////////////////////////////////////////////////////
// Define the MyClass CLASS using the API macros
///////////////////////////////////////////////////////////////////////
RECITAL_EXPORT int DEFINE_CLASS(clsMyClass)
{
    /*-------------------------------------*/ 
    /* Dispatch factory methods and return */
    /*-------------------------------------*/
    DISPATCH_FACTORY();
 
    /*---------------------------------*/
    /* Dispatch constructor and return */ 
    /*---------------------------------*/ 
    DISPATCH_METHOD(clsMyClass, Constructor);

    /*--------------------------------*/
    /* Dispatch destructor and return */
    /*--------------------------------*/
    DISPATCH_METHOD(clsMyClass, Destructor); 

    /*-----------------------------------*/
    /* Dispatch DEFINE method and return */
    /*-----------------------------------*/
    DISPATCH_METHOD(clsMyClass, Define);

    /*------------------------------*/
    /* Dispatch SET or GET PROPERTY */
    /* method for property NumValue */
    /* then return.                 */
    /*------------------------------*/
    DISPATCH_PROPSET(clsMyClass, NumValue);
    DISPATCH_PROPGET(clsMyClass, NumValue); 

    /*------------------------------*/
    /* Dispatch SET or GET PROPERTY */
    /* method for property LogValue */
    /* then return.                 */
    /*------------------------------*/
    DISPATCH_PROPSET(clsMyClass, LogValue);
    DISPATCH_PROPGET(clsMyClass, LogValue);

    /*-------------------------------*/
    /* Dispatch SET or GET PROPERTY  */
    /* method for property DateValue */
    /* then return.                 */
    /*-------------------------------*/
    DISPATCH_PROPSET(clsMyClass, DateValue);
    DISPATCH_PROPGET(clsMyClass, DateValue);

    /*-------------------------------*/
    /* Dispatch SET or GET PROPERTY  */
    /* method for property TimeValue */
    /* then return.                  */
    /*-------------------------------*/
    DISPATCH_PROPSET(clsMyClass, TimeValue);
    DISPATCH_PROPGET(clsMyClass, TimeValue);
 
    /*-------------------------------*/
    /* Dispatch SET or GET PROPERTY  */
    /* method for property CurrValue */
    /* then return.                  */
    /*-------------------------------*/
    DISPATCH_PROPSET(clsMyClass, CurrValue);
    DISPATCH_PROPGET(clsMyClass, CurrValue);

    /*-------------------------------*/
    /* Dispatch SET or GET PROPERTY  */
    /* method for property CharValue */
    /* then return.                  */
    /*-------------------------------*/
    DISPATCH_PROPSET(clsMyClass, CharValue); 
    DISPATCH_PROPGET(clsMyClass, CharValue);

    /*------------------------------*/
    /* Dispatch SET or GET PROPERTY */ 
    /* method for property ObjValue */ 
    /* then return.                 */
    /*------------------------------*/
    DISPATCH_PROPSET(clsMyClass, ObjValue);
    DISPATCH_PROPGET(clsMyClass, ObjValue);

    /*-----------------------------------*/
    /* If message not found return error */
    /*-----------------------------------*/
    OBJECT_RETERROR("Unknown message type");
}

////////////////////////////////////////////////////////////////////////////////
// Define METHOD handlers
////////////////////////////////////////////////////////////////////////////////
DEFINE_METHOD(clsMyClass, Constructor) 
{
        struct example_data *objectDataArea;

        /* Allocate memory for objects objectData area */
        objectDataArea = (struct example_data *) 
           malloc(sizeof(struct example_data));
        if (objectDataArea == NULL) return(-1);
    
        /* Assign the default property values */
        strcpy(objectDataArea->prop_charvalue, "Test API object");
        objectDataArea->prop_numvalue = 15.2827;
        objectDataArea->prop_logvalue = 'F';
        strcpy(objectDataArea->prop_datevalue, DATE_DATE());
        strcpy(objectDataArea->prop_timevalue, DATE_DATETIME());
        strcpy(objectDataArea->prop_currvalue, "15.2827");
        strcpy(objectDataArea->object_name, "APIobject");
        objectDataArea->prop_objvalue 
             = OBJECT_NEW(objectDataArea->object_name, "exception", NULL);
    
        /* Set the object objectData area */
        OBJECT_SETDATA((char *)objectDataArea);
    
        return(0);
}
  
DEFINE_METHOD(clsMyClass, Destructor) 
{
        struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

        if (objectData != NULL) {
            if (objectData->prop_objvalue != NULL) 
              OBJECT_DELETE(objectData->prop_objvalue);
            free(objectData);
            objectData = NULL;
        }
        return(0);
}

DEFINE_METHOD(clsMyClass, Define) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct      API_EXPRESSION result;
    char        buffer[512];
    int         rc;

/* Check the object class */
    OBJECT_GETPROPERTY(objectData->prop_objvalue, "class", buffer);
    rc = OBJECT_GETARG(buffer, &result);
    if (result.errno == 0 && result.type == 'C' 
        && strcmp(result.character, "Exception") == 0) { 
        switch (OBJECT_GETARGC()) {
            case 1: 
                rc = OBJECT_GETPARAMETER(1, &result);
                if (result.errno == 0 && result.type == 'C') {
                    OBJECT_SETARG(buffer, &result);
                    rc = OBJECT_SETPROPERTY(objectData->prop_objvalue,
                         "message", buffer);
                }
                break;
            case 2: 
                rc = OBJECT_GETPARAMETER(2, &result);
                if (result.errno == 0 && result.type == 'N') {
                    OBJECT_SETARG(buffer, &result);
                    rc = OBJECT_SETPROPERTY(objectData->prop_objvalue,
                         "errorno", buffer);
                }
         }
    }

    result.type = 'L';
    result.logical = (rc == 0 ? 'T' : 'F');  
    OBJECT_RETRESULT(&result);
}

////////////////////////////////////////////////////////////////////////////////
// Define GET property handlers
////////////////////////////////////////////////////////////////////////////////
DEFINE_PROPERTYGET(clsMyClass, NumValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('N', objectData->prop_numvalue);
}

DEFINE_PROPERTYGET(clsMyClass, LogValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('L', objectData->prop_logvalue);
}  

DEFINE_PROPERTYGET(clsMyClass, DateValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('D', objectData->prop_datevalue);
}

DEFINE_PROPERTYGET(clsMyClass, TimeValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('T', objectData->prop_timevalue);
}

DEFINE_PROPERTYGET(clsMyClass, CurrValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('Y', objectData->prop_currvalue);
}

DEFINE_PROPERTYGET(clsMyClass, CharValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('C', objectData->prop_charvalue);
}

DEFINE_PROPERTYGET(clsMyClass, ObjValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();

    if (objectData == NULL) return(-1);

    OBJECT_RETPROPERTY('O', objectData->prop_objvalue);
} 


////////////////////////////////////////////////////////////////////////////////
// Define SET property handlers
////////////////////////////////////////////////////////////////////////////////
DEFINE_PROPERTYSET(clsMyClass, NumValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct API_EXPRESSION result;
    int rc = OBJECT_ERROR;

    OBJECT_GETVALUE(&result);
    if (result.errno == 0 && result.type == 'N') {
        objectData->prop_numvalue = result.number;
        rc = OBJECT_SUCCESS;
    }

    return(rc);
}

DEFINE_PROPERTYSET(clsMyClass, LogValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct API_EXPRESSION result;
    int rc = OBJECT_ERROR;

    OBJECT_GETVALUE(&result);
    if (result.errno == 0 && result.type == 'L') {
        objectData->prop_logvalue = result.logical;
        rc = OBJECT_SUCCESS;
    }

    return(rc);
}

DEFINE_PROPERTYSET(clsMyClass, DateValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct API_EXPRESSION result;
    int rc = OBJECT_ERROR;
    OBJECT_GETVALUE(&result);
    if (result.errno == 0 && result.type == 'D') {
        strcpy(objectData->prop_datevalue, DATE_DTOS(result.date));
        rc = OBJECT_SUCCESS;
    }

    return(rc);
}

DEFINE_PROPERTYSET(clsMyClass, TimeValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct API_EXPRESSION result;
    int rc = OBJECT_ERROR;

    OBJECT_GETVALUE(&result);
    if (result.errno == 0 && result.type == 'T') {
        strcpy(objectData->prop_timevalue, DATE_TTOS(result.datetime));
        rc = OBJECT_SUCCESS;
    }

    return(rc); 
}

DEFINE_PROPERTYSET(clsMyClass, CurrValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct API_EXPRESSION result;
    int rc = OBJECT_ERROR;

    OBJECT_GETVALUE(&result);
    if (result.errno == 0 && result.type == 'Y') {
        strcpy(objectData->prop_currvalue, CURR_YTOS(result.currency));
        rc = OBJECT_SUCCESS;
    }

    return(rc);
}

DEFINE_PROPERTYSET(clsMyClass, CharValue)  
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    struct API_EXPRESSION result;
    int rc = OBJECT_ERROR;

    OBJECT_GETVALUE(&result);
    if (result.errno == 0 && result.type == 'C') {
        strcpy(objectData->prop_currvalue, result.character);
        rc = OBJECT_SUCCESS;
    }

    return(rc);
}

DEFINE_PROPERTYSET(clsMyClass, ObjValue) 
{
    struct example_data *objectData = (struct example_data *)OBJECT_GETDATA();
    OBJECT  objvalue;
    int rc = OBJECT_ERROR;

    if (OBJECT_GETTYPE() == 'O') {
        objvalue = OBJECT_GETOBJECT(); 
        objectData->prop_objvalue = OBJECT_ASSIGN(objvalue, objectData->object_name);
        rc = OBJECT_SUCCESS;
    }

    return(rc);
}
Published in Blogs
Read more...

In this article Barry Mavin, CEO and Chief Software Architect for Recital provides details on how to use the Recital Universal .NET Data Provider with the Recital Database Server.

Overview

A data provider in the .NET Framework serves as a bridge between an application and a data source. A data provider is used to retrieve data from a data source and to reconcile changes to that data back to the data source.

Each .NET Framework data provider has a DataAdapter object: the .NET Framework Data Provider for OLE DB is the OleDbDataAdapter object, the .NET Framework Data Provider for SQL Server is the SqlDataAdapter object, the .NET Framework Data Provider for ODBC is the OdbcDataAdapter object, and the .NET Framework Data Provider for the Recital Database Server is the RecitalDataAdapter object.

The Recital Universal .NET Data Provider can access any data sources supported by the Recital Database Server. It is not restricted to only access Recital data. It can be used to access server-side ODBC, JDBC and OLE DB data sources also.

Core classes of the Data Provider

The Connection, Command, DataReader, and DataAdapter objects represent the core elements of the .NET Framework data provider model. The Recital Universal .NET Data Provider is plug compatible with the .NET Framework Data Provider for SQL Server. All SQL Server classes are prefixed with "Sql" e.g. SqlDataAdaptor. To use the Recital Universal Data Adaptor, simply change the "Sql" prefix to "Recital" e.g. RecitalDataAdaptor.

The following table describes these objects.

Object Description
RecitalConnection Establishes a connection to a specific data source.
RecitalCommand Executes a command against a data source.
RecitalDataReader Reads a forward-only, read-only stream of data from a data source.
RecitalDataAdapter Populates a DataSet and resolves updates with the data source.

Along with the core classes listed in the preceding table, a .NET Framework data provider also contains the classes listed in the following table.


Object Description
RecitalTransaction Enables you to enlist commands in transactions at the data source.
RecitalCommandBuilder A helper object that will automatically generate command properties of a DataAdapter or will derive parameter information from a stored procedure and populate the Parameters collection of a Command object.
RecitalParameter Defines input, output, and return value parameters for commands and stored procedures.

The Recital Universal .NET Data Provider provides connectivity to the Recital Database Server running on any supported platform (Windows, Linux, Unix, OpenVMS) using the RecitalConnection object. The Recital Universal .NET Data Provider supports a connection string format that is similar to the SQL Server connection string format.

The basic format of a connection string consists of a series of keyword/value pairs separated by semicolons. The equal sign (=) connects each keyword and its value.

The following table lists the valid names for keyword values within the ConnectionString property of the RecitalConnection class.


Name Default Description
Data Source
-or-
Server
-or-
Servername
-or-
Nodename
  The name or network address of the instance of the Recital Database Server which to connect to.
Directory   The target directory on the remote server where data to be accessed resides. This is ignored when a Database is specified.
Encrypt
-or-
Encryption
false When true, DES3 encryption is used for all data sent between the client and server.
Initial Catalog
-or-
Database
  The name of the database on the remote server.
Password
-or- Pwd
  The password used to authenticate access to the remote server.
User ID
-or-
uid
-or-
User
-or-
Username
  The user name used to authenticate access to the remote server.
Connection Pooling
-or-
Pool
false Enable connection pooling to the server. This provides for one connection to be shared.
Logging false Provides for the ability to log all server requests for debugging purposes
Rowid true When Rowid is true (the default) a column will be post-fixed to each SELECT query that is a unique row identifier. This is used to provide optimised UPDATE and DELETE operations. If you use the RecitalSqlGrid, RecitalSqlForm, or RecitalSqlGridForm components then this column is not visible but is used to handle updates to the underlying data source.
Logfile   The name of the logfile for logging
Gateway  

Opens an SQL gateway(Connection) to a foreign SQL data source on the remote server.
Using Gateways, you can transparently access the following local or remote data sources:

  • Recital
  • Oracle
  • ODBC (Server-side ODBC data sources)
  • JDBC (Server-side JDBC data sources)
  • ADO (Use this to connect to SQL Server and other Native Windows OLEDB data sources)
  • MySQL
  • PostgreSQL

The gateway can be specified in several formats:
servertype@nodename:username/password-database
e.g.
oracle@nodename:username/password-database
mysql@nodename:username/password-database
postgresql@nodename:username/password-database
-or-
odbc:odbc_data_source_name_on_server
oledb:oledb_connection_string_on_server
jdbc:jdbc_driver_path_on_server;jdbc:Recital:args


Populating a DataSet from a DataAdaptor

The ADO.NET DataSet is a memory-resident representation of data that provides a consistent relational programming model independent of the data source. The DataSet represents a complete set of data including tables, constraints, and relationships among the tables. Because the DataSet is independent of the data source, a DataSet can include data local to the application, as well as data from multiple data sources. Interaction with existing data sources is controlled through the DataAdapter.

A DataAdapter is used to retrieve data from a data source and populate tables within a DataSet. The DataAdapter also resolves changes made to the DataSet back to the data source. The DataAdapter uses the Connection object of the .NET Framework data provider to connect to a data source and Command objects to retrieve data from and resolve changes to the data source.

The SelectCommand property of the DataAdapter is a Command object that retrieves data from the data source. The InsertCommand, UpdateCommand, and DeleteCommand properties of the DataAdapter are Command objects that manage updates to the data in the data source according to modifications made to the data in the DataSet.

The Fill method of the DataAdapter is used to populate a DataSet with the results of the SelectCommand of the DataAdapter. Fill takes as its arguments a DataSet to be populated, and a DataTable object, or the name of the DataTable to be filled with the rows returned from the SelectCommand.

The Fill method uses the DataReader object implicitly to return the column names and types used to create the tables in the DataSet, as well as the data to populate the rows of the tables in the DataSet. Tables and columns are only created if they do not already exist; otherwise Fill uses the existing DataSet schema.

Examples in C#:
////////////////////////////////////////////////////////////////////////
// include the references below
using System.Data;
using Recital.Data;

////////////////////////////////////////////////////////////////////////
// The following code example creates an instance of a DataAdapter that 
// uses a Connection to the Recital Database Server Southwind database 
// and populates a DataTable in a DataSet with the list of customers. 
// The SQL statement and Connection arguments passed to the DataAdapter 
// constructor are used to create the SelectCommand property of the DataAdapter.
public DataSet SelectCustomers()
{
	RecitalConnection swindConn = new
		RecitalConnection("Data Source=localhost;Initial Catalog=southwind");
	RecitalCommand selectCMD = new
		RecitalCommand("SELECT CustomerID, CompanyName FROM Customers", swindConn);
	selectCMD.CommandTimeout = 30;
	RecitalDataAdapter custDA = new RecitalDataAdapter();
	custDA.SelectCommand = selectCMD;
	swindConn.Open();
	DataSet custDS = new DataSet();
	custDA.Fill(custDS, "Customers");
	swindConn.Close();
	return custDS;
}

////////////////////////////////////////////////////////////////////////
// The following example uses the RecitalCommand, RecitalDataAdapter and 
// RecitalConnection, to select records from a database, and populate a 
// DataSet with the selected rows. The filled DataSet is then returned. 
// To accomplish this, the method is passed an initialized DataSet, a 
// connection string, and a query string that is a SQL SELECT statement
public DataSet SelectRecitalRows(DataSet dataset, string connection, string query) 
{
	RecitalConnection conn = new RecitalConnection(connection);
	SqlDataAdapter adapter = new RecitalDataAdapter();
	adapter.SelectCommand = new RecitalCommand(query, conn);
	adapter.Fill(dataset);
	return dataset;
}
Published in Blogs
Read more...
The first step is to create an Apple Disk Image File (DMG) distribution in a GUI tool, I used DMG Packager.
Then create a directory that will contain all the files that you want included in the DMG file. The best way to do this is to mount the DMG file you created and copy the files into this directory. Then move the .app file created by BitRock into this directory.
Then run the hdiutil utility to create a DMG file
$hdiutil create /tmp/tmp.dmg -ov -volname "RecitalInstall" -fs HFS+ -srcfolder "/tmp/macosxdist/" 
Finally call hdutil to convert the writable, to a compressed (and such not writable) DMG
$hdiutil convert /tmp/tmp.dmg -format UDZO -o RecitalInstall.dmg
So now each time before you build a new distribution with the above commands, just move the new .app file into the directory containing the files to be added to the DMG file.
I've already added this to the makefile so after BitRock creates the .app file the hdiutil command is called to automatically generate the new DMG file.
Published in Blogs
Read more...

Warnings

This is a sample info message. Use <p class="gkInfo1">Your info message goes here!</p>.

This is a sample tips message. Use <p class="gkTips1">Your tips goes here!</p>.

This is a sample warning message. Use <p class="gkWarning1">Your warning message goes here!</p>.

This is a sample info message. Use <p class="gkInfo2">Your info message goes here!</p>.

This is a sample tips message. Use <p class="gkTips2">Your tips goes here!</p>.

This is a sample warning message. Use <p class="gkWarning2">Your warning message goes here!</p>.

This is a sample info message. Use <p class="gkInfo3">Your info message goes here!</p>.

This is a sample tips message. Use <p class="gkTips3">Your tips goes here!</p>.

This is a sample warning message. Use <p class="gkWarning3">Your warning message goes here!</p>.

This is a sample info message. Use <p class="gkInfo4">Your info message goes here!</p>.

This is a sample tips message. Use <p class="gkTips4">Your tips goes here!</p>.

This is a sample warning message. Use <p class="gkWarning4">Your warning message goes here!</p>.

This is a sample info message. Use <p class="gkInfo5">Your info message goes here!</p>.

This is a sample tips message. Use <p class="gkTips5">Your tips goes here!</p>.

This is a sample warning message. Use <p class="gkWarning5">Your warning message goes here!</p>.

Headers

This is heading 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer semper egestas nunc in volutpat. Fusce adipiscing velit ac eros tempor iaculis. Phasellus venenatis mollis augue, non posuere odio placerat in. Etiam volutpat ultrices lectus. Fusce eu felis erat. Donec congue interdum elit, sed ornare magna convallis lacinia. In hac habitasse platea dictumst. Mauris volutpat consectetur accumsan.

This is heading 2

Cras diam justo, sodales quis lobortis sed, lobortis vel mauris. Sed a mollis nunc. Quisque semper condimentum lectus, eget laoreet ipsum auctor et. Quisque sagittis luctus augue, id fringilla enim euismod quis. Nullam blandit, elit at euismod rutrum, tortor nibh posuere mauris, in volutpat diam ante ac dui. Sed velit massa, imperdiet placerat tristique et, consectetur a lorem. Praesent aliquet turpis in quam tempor eu pulvinar nibh luctus.

This is heading 3

Vivamus rhoncus arcu sit amet est tristique convallis nec vel eros. Vestibulum euismod luctus velit quis porta. Aliquam varius placerat mauris sed vehicula. Integer porta facilisis sapien, in tempus lorem mattis molestie. Suspendisse potenti. Praesent quis diam non dolor convallis mattis eu id nulla.

This is heading 4

Proin urna erat, egestas vel consectetur at, accumsan at purus. Donec est risus, facilisis dignissim placerat nec, euismod lacinia nisi. Nam ac sem sed quam sollicitudin condimentum et eu neque. Nunc enim urna, ultricies ac mollis pretium, imperdiet hendrerit massa. Sed eleifend felis sed tellus cursus lacinia. Aenean venenatis aliquet euismod. Nam quis turpis tellus, vitae malesuada neque.

This is a headline.

This is a subheadline.

Use <p class="gkHeadling">for headline</p>.Use <p class="gkSubHeadline">for subheadline</p>.Proin urna erat, egestas vel consectetur at, accumsan at purus. Donec est risus, facilisis dignissim placerat nec, euismod lacinia nisi. Nam ac sem sed quam sollicitudin condimentum et eu neque. Nunc enim urna, ultricies ac mollis pretium, imperdiet hendrerit massa. Sed eleifend felis sed tellus cursus lacinia. Aenean venenatis aliquet euismod. Nam quis turpis tellus, vitae malesuada neque.

This is a small headline

This is a large headline

Use <p class="gkHeadling">for headline</p>.Use <p class="gkSubHeadline">for subheadline</p>.Proin urna erat, egestas vel consectetur at, accumsan at purus. Donec est risus, facilisis dignissim placerat nec, euismod lacinia nisi. Nam ac sem sed quam sollicitudin condimentum et eu neque. Nunc enim urna, ultricies ac mollis pretium, imperdiet hendrerit massa. Sed eleifend felis sed tellus cursus lacinia. Aenean venenatis aliquet euismod. Nam quis turpis tellus, vitae malesuada neque.

Icon set 1

This is a sample audio message. Use <p class="gkAudio">Your audio message goes here!</p>.

This is a sample webcam message. Use <p class="gkWebcam">Your webcam goes here!</p>.

This is a sample email message. Use <p class="gkEmail">Your email message goes here!</p>.

This is a sample creditcard message. Use <p class="gkCreditcard">Your creditcart message goes here!</p>.

This is a sample feed message. Use <p class="gkFeed">Your feed goes here!</p>.

This is a sample help message. Use <p class="gkHelp">Your help message goes here!</p>.

This is a sample images message. Use <p class="gkImages">Your images message goes here!</p>.

This is a sample lock message. Use <p class="gkLock">Your webcam goes here!</p>.

This is a sample printer message. Use <p class="gkPrinter">Your printer message goes here!</p>.

This is a sample report message. Use <p class="gkReport">Your report message goes here!</p>.

This is a sample script message. Use <p class="gkScript">Your script goes here!</p>.

This is a sample time message. Use <p class="gkTime">Your time message goes here!</p>.

This is a sample user message. Use <p class="gkUser">Your user message goes here!</p>.

This is a sample world message. Use <p class="gkWorld">Your world goes here!</p>.

This is a sample cart message. Use <p class="gkCart">Your cart message goes here!</p>.

This is a sample cd message. Use <p class="gkCd">Your cd message goes here!</p>.

This is a sample chart_bar message. Use <p class="gkChartBar">Your chart_bar goes here!</p>.

This is a sample chart_line message. Use <p class="gkChartLine">Your chart_line message goes here!</p>.

This is a sample chart_pie message. Use <p class="gkChartPie">Your chart_pie message goes here!</p>.

This is a sample clock message. Use <p class="gkClock">Your clock goes here!</p>.

This is a sample cog message. Use <p class="gkCog">Your cog message goes here!</p>.

This is a sample coins message. Use <p class="gkCoins">Your coins message goes here!</p>.

This is a sample compress message. Use <p class="gkCompress">Your compress goes here!</p>.

This is a sample computer message. Use <p class="gkComputer">Your computer message goes here!</p>.

This is a sample cross message. Use <p class="gkCross">Your cross message goes here!</p>.

This is a sample disk message. Use <p class="gkDisk">Your disk goes here!</p>.

This is a sample error message. Use <p class="gkError">Your error message goes here!</p>.

This is a sample exclamation message. Use <p class="gkExclamation">Your exclamation message goes here!</p>.

This is a sample film message. Use <p class="gkFilm">Your film goes here!</p>.

This is a sample folder message. Use <p class="gkFolder">Your folder message goes here!</p>.

This is a sample group message. Use <p class="gkGroup">Your group message goes here!</p>.

This is a sample heart message. Use <p class="gkHeart">Your heart goes here!</p>.

This is a sample house message. Use <p class="gkHouse">Your house message goes here!</p>.

This is a sample image message. Use <p class="gkImage">Your image message goes here!</p>.

This is a sample information message. Use <p class="gkInformation">Your information message goes here!</p>.

This is a sample magnifier message. Use <p class="gkMagnifier">Your magnifier message goes here!</p>.

This is a sample money message. Use <p class="gkMoney">Your money goes here!</p>.

This is a sample new message. Use <p class="gkNew">Your new message goes here!</p>.

This is a sample note message. Use <p class="gkNote">Your note message goes here!</p>.

This is a sample page message. Use <p class="gkPage">Your page goes here!</p>.

This is a sample page_white message. Use <p class="gkPage_white">Your page_white message goes here!</p>.

This is a sample plugin message. Use <p class="gkPlugin">Your plugin message goes here!</p>.

This is a sample accept message. Use <p class="gkAccept">Your accept goes here!</p>.

This is a sample add message. Use <p class="gkAdd">Your add message goes here!</p>.

This is a sample camera message. Use <p class="gkCamera">Your camera message goes here!</p>.

This is a sample brick message. Use <p class="gkBrick">Your brick goes here!</p>.

This is a sample box message. Use <p class="gkBox">Your box message goes here!</p>.

This is a sample calendar message. Use <p class="gkCalendar">Your calendar message goes here!</p>.

Icon set 2

This is a sample audio message. Use <p class="gkAudioIs2">Your audio message goes here!</p>.

This is a sample email message. Use <p class="gkEmailIs2">Your email message goes here!</p>.

This is a sample feed message. Use <p class="gkFeedIs2">Your feed message goes here!</p>.

This is a sample images message. Use <p class="gkImagesIs2">Your images message goes here!</p>.

This is a sample lock message. Use <p class="gkLockIs2">Your lock message goes here!</p>.

This is a sample printer message. Use <p class="gkPrinterIs2">Your printer message goes here!</p>.

This is a sample time message. Use <p class="gkTimeIs2">Your time message goes here!</p>.

This is a sample user message. Use <p class="gkUserIs2">Your calendar message goes here!</p>.

This is a sample world message. Use <p class="gkWorldIs2">Your world message goes here!</p>.

YThis is a sample cart message. Use <p class="gkCartIs2">Your cart message goes here!</p>.

This is a sample cd message. Use <p class="gkCdIs2">Your cd message goes here!</p>.

This is a sample chart line message. Use <p class="gkChartLineIs2">Your chart line message goes here!</p>.

This is a sample chart pie message. Use <p class="gkChartPieIs2">Your calendar message goes here!</p>.

This is a sample clock message. Use <p class="gkClockIs2">Your clock message goes here!</p>.

This is a sample config message. Use <p class="gkCogIs2">Your config message goes here!</p>.

This is a sample computer message. Use <p class="gkComputerIs2">Your computer message goes here!</p>.

This is a sample error message. Use <p class="gkErrorIs2">Your error message goes here!</p>.

This is a sample exclamation message. Use <p class="gkExclamationIs2">Your exclamation message goes here!</p>.

This is a sample movie message. Use <p class="gkFilmIs2">Your movie message goes here!</p>.

This is a sample folder message. Use <p class="gkFolderIs2">Your folder message goes here!</p>.

This is a group calendar message. Use <p class="gkGroupIs2">Your group message goes here!</p>.

This is a sample house message. Use <p class="gkHouseIs2">Your house message goes here!</p>.

This is a sample image message. Use <p class="gkImageIs2">Your image message goes here!</p>.

This is a sample information message. Use <p class="gkInfromationIs2">Your information message goes here!</p>.

This is a sample magnifier message. Use <p class="gkMagnifierIs2">Your magnifier message goes here!</p>.

This is a sample money message. Use <p class="gkMoneyIs2">Your money message goes here!</p>.

This is a sample page message. Use <p class="gkPageIs2">Your page message goes here!</p>.

This is a sample camera message. Use <p class="gkCameraIs2">Your camera message goes here!</p>.

This is a calendar feed message. Use <p class="gkCalendarIs2">Your calendar message goes here!</p>.

This is a sample contact message. Use <p class="gkContactIs2">Your contact message goes here!</p>.

This is a sample facebook message. Use <p class="gkFacebookIs2">Your facebook message goes here!</p>.

This is a sample like it message. Use <p class="gkLikeItIs2">Your like it message goes here!</p>.

This is a sample twitter message. Use <p class="gkTwitterIs2">Your twitter message goes here!</p>.

This is a sample video message. Use <p class="gkVideoIs2">Your video message goes here!</p>.

This is a sample youtube message. Use <p class="gkYoutubeIs2">Your youtube message goes here!</p>.

Icon set 3

This is a sample audio message. Use <p class="gkAudioIs3">Your audio message goes here!</p>.

This is a sample camera message. Use <p class="gkCameraIs3">Your camera message goes here!</p>.

This is a sample lock message. Use <p class="gkLockIs3">Your lock message goes here!</p>.

This is a sample user message. Use <p class="gkUserIs3">Your user message goes here!</p>.

This is a sample cart message. Use <p class="gkCartIs3">Your cart message goes here!</p>.

This is a sample chart bar message. Use <p class="gkChartBarIs3">Your chart bar message goes here!</p>.

This is a sample config message. Use <p class="gkConfigIs3">Your config message goes here!</p>.

This is a sample configuration message. Use <p class="gkConfig2Is3">Your configuration message goes here!</p>.

This is a sample computer message. Use <p class="gkComputerIs3">Your computer message goes here!</p>.

This is a sample coffe message. Use <p class="gkCoffeIs3">Your coffe message goes here!</p>.

This is a sample cross message. Use <p class="gkCrossIs3">Your cross message goes here!</p>.

This is a sample error message. Use <p class="gkErrorIs3">Your error message goes here!</p>.

This is a sample house message. Use <p class="gkHouseIs3">Your house message goes here!</p>.

This is a sample information message. Use <p class="gkInformationIs3">Your inforation message goes here!</p>.

This is a sample magnifier message. Use <p class="gkMagnifierIs3">Your magnifier message goes here!</p>.

This is a sample page message. Use <p class="gkPageIs3">Your page message goes here!</p>.

This is a sample lock message. Use <p class="gkLockIs3">Your lock message goes here!</p>.

This is a sample camera message. Use <p class="gkCameraIs3">Your camera message goes here!</p>.

This is a sample star message. Use <p class="gkStarIs3">Your star message goes here!</p>.

This is a sample telephone message. Use <p class="gkTelephoneIs3">Your telephone message goes here!</p>.

Tooltips

Here are some examples of a ClassicThis is just an example of what you can do using a CSS tooltip, feel free to get creative and produce your own!, CriticalCriticalThis is just an example of what you can do using a CSS tooltip, feel free to get creative and produce your own!, HelpHelpThis is just an example of what you can do using a CSS tooltip, feel free to get creative and produce your own!, InformationInformationThis is just an example of what you can do using a CSS tooltip, feel free to get creative and produce your own! and WarningWarningThis is just an example of what you can do using a CSS tooltip, feel free to get creative and produce your own! CSS powered tooltip. This is just an example of what you can do so feel free to get creative and produce your own!

Highlights

This is a highlight phrase. Use <span class="gkHighlight1">Your highlight phrase goes here!</span>.

This is a highlight phrase. Use <span class="gkHighlight2">Your highlight phrase goes here!</span>.

This is a highlight phrase. Use <span class="gkHighlight3">Your highlight phrase goes here!</span>.

This is a highlight phrase. Use <span class="gkHighlight4">Your highlight phrase goes here!</span>.

Code

Below is a sample of <pre> or <div class="gkCode1">

#wrapper {
position: relative;
float: left;
display: block;
}

Below is a sample of <div class="gkCode2">

#wrapper {
position: relative;
float: left;
display: block;
}

Below is a sample of <div class="gkCode3"><h4>Name of your file</h4>Here goes your code</div>



File

#wrapper {
position: relative;
float: left;
display: block;
}

Unordered lists

Types of unordered lists

<ul class="gkBullet1">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkBullet2">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkBullet3">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkBullet4">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkCircle1">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkCircle2">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkSquare1">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkSquare2">

  • Element 1
  • Element 2
  • Element 3

<ul class="gkSquare3">

  • Element 1
  • Element 2
  • Element 3

Ordered lists

Types of ordered list:

<ol class="gkRoman">

  1. Element
  2. Element
  3. Element
  4. Element

<ol class="gkDec">

  1. Element
  2. Element
  3. Element
  4. Element

<ol class="gkAlpha">

  1. Element
  2. Element
  3. Element
  4. Element

<ol class="gkDecimalLeadingZero">

  1. Element
  2. Element
  3. Element
  4. Element

<div class="gkNumber1"><p><span>here goes a number</span>and here text of element</p>

01 Element

02 Element

<div class="gkNumber2"><p><span>here goes a number</span>and here text of element</p>

01 Element

02 Element

Abbrs and acronyms

This is a sample of an abbreviation Dr. Use <abbr title="Here goes full word or phrase">here goes an abbreviation</abbr>

This is a sample of an acronym NATO. Use <acronym title="Here goes full phrase">here goes an acronym</abbr>

Definition lists

Below are samples of definition lists

<dl class="gkDef1"><dt>Here goes the word you're about to define</dt><dd>Here goes definition</dd></dl>

Butter
it is a dairy product made by churning fresh or fermented cream or milk. It is generally used as a spread and a condiment, as well as in cooking applications such as baking, sauce making, and frying. Butter consists of butterfat, water and milk proteins.
Dairy milk
is an opaque white liquid produced by the mammary glands of mammals (including monotremes). It provides the primary source of nutrition for newborn mammals before they are able to digest other types of food.

<dl class="gkDef2"><dt>Here goes the word you're about to define</dt><dd>Here goes definition</dd></dl>

Butter
it is a dairy product made by churning fresh or fermented cream or milk. It is generally used as a spread and a condiment, as well as in cooking applications such as baking, sauce making, and frying. Butter consists of butterfat, water and milk proteins.
Dairy milk
is an opaque white liquid produced by the mammary glands of mammals (including monotremes). It provides the primary source of nutrition for newborn mammals before they are able to digest other types of food.

<dl class="gkDef3"><dt>Here goes the word you're about to define</dt><dd>Here goes definition</dd></dl>

Butter
it is a dairy product made by churning fresh or fermented cream or milk. It is generally used as a spread and a condiment, as well as in cooking applications such as baking, sauce making, and frying. Butter consists of butterfat, water and milk proteins.
Dairy milk
is an opaque white liquid produced by the mammary glands of mammals (including monotremes). It provides the primary source of nutrition for newborn mammals before they are able to digest other types of food.

Legends

Legend

This is a sample legend note. Use <div class="gkLegend1"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Legend

This is a sample legend note. Use <div class="gkLegend2"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Legend

This is a sample legend note. Use <div class="gkLegend3"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Legend

This is a sample legend note. Use <div class="gkLegend4"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Legend

This is a sample legend note. Use <div class="gkLegend5"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Legend

This is a sample legend note. Use <div class="gkLegend6"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Legend

This is a sample legend note. Use <div class="gkLegend7"> <h4> Title </h4> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p> </div>.

Dropcaps

This is a sample text with Dropcap. Use <p> <span class="gkDropcap1">t</span> to make the first letter larger. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue. Duis quis quam sed purus porta eleifend. Vivamus ullamcorper est id libero aliquam ullamcorper. Donec eget dignissim augue. Donec ante felis, aliquam ut consequat eget, lobortis dapibus risus. Aliquam laoreet enim et lectus ornare hendrerit. Aliquam rhoncus enim libero. Morbi aliquam, nibh mattis feugiat dapibus, nisi massa adipiscing justo, sit amet condimentum urna ipsum et lacus. Nam fermentum, eros quis ullamcorper convallis, libero mauris lacinia eros, sed tempus leo lorem vitae purus. Nunc a malesuada felis. Cras ultrices sapien eu nisi elementum non blandit urna sodales. Duis accumsan cursus massa, eu facilisis diam porta ut..</p>.

This is a sample text with Dropcap. Use <p> <span class="gkDropcap2">t</span> to make the first letter larger. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue. Duis quis quam sed purus porta eleifend. Vivamus ullamcorper est id libero aliquam ullamcorper. Donec eget dignissim augue. Donec ante felis, aliquam ut consequat eget, lobortis dapibus risus. Aliquam laoreet enim et lectus ornare hendrerit. Aliquam rhoncus enim libero. Morbi aliquam, nibh mattis feugiat dapibus, nisi massa adipiscing justo, sit amet condimentum urna ipsum et lacus. Nam fermentum, eros quis ullamcorper convallis, libero mauris lacinia eros, sed tempus leo lorem vitae purus. Nunc a malesuada felis. Cras ultrices sapien eu nisi elementum non blandit urna sodales. Duis accumsan cursus massa, eu facilisis diam porta ut..</p>.

This is a sample text with Dropcap. Use <p class="gkDropcap3"> <span class="gkDropcap3">t</span> to make the first letter larger. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue. Duis quis quam sed purus porta eleifend. Vivamus ullamcorper est id libero aliquam ullamcorper. Donec eget dignissim augue. Donec ante felis, aliquam ut consequat eget, lobortis dapibus risus. Aliquam laoreet enim et lectus ornare hendrerit. Aliquam rhoncus enim libero. Morbi aliquam, nibh mattis feugiat dapibus, nisi massa adipiscing justo, sit amet condimentum urna ipsum et lacus. Nam fermentum, eros quis ullamcorper convallis, libero mauris lacinia eros, sed tempus leo lorem vitae purus. Nunc a malesuada felis. Cras ultrices sapien eu nisi elementum non blandit urna sodales. Duis accumsan cursus massa, eu facilisis diam porta ut..</p>.

Floated blocks

Below are samples of text in which part of it is displayed in a separate block

<p> Here goes main part of the text <span class="gkBlockTextLeft">Block of text</span>rest of the text</p>

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue. Duis quis quam sed purus porta eleifend.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue.Donec eget dignissim augue. Donec ante felis, aliquam ut consequat eget, lobortis dapibus risus. Aliquam laoreet enim et lectus ornare hendrerit. Aliquam rhoncus enim libero. Morbi aliquam, nibh mattis feugiat dapibus, nisi massa adipiscing justo, sit amet condimentum urna ipsum et lacus. Nam fermentum, eros quis ullamcorper convallis, libero mauris lacinia eros, sed tempus leo lorem vitae purus. Nunc a malesuada felis. Cras ultrices sapien eu nisi elementum non blandit urna sodales. Duis accumsan cursus massa, eu facilisis diam porta ut. Morbi cursus est vel velit hendrerit dictum.

<p> Here goes main part of the text <span class="gkBlockTextRight">Block of text</span>rest of the text</p>

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue. Duis quis quam sed purus porta eleifend.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue.Donec eget dignissim augue. Donec ante felis, aliquam ut consequat eget, lobortis dapibus risus. Aliquam laoreet enim et lectus ornare hendrerit. Aliquam rhoncus enim libero. Morbi aliquam, nibh mattis feugiat dapibus, nisi massa adipiscing justo, sit amet condimentum urna ipsum et lacus. Nam fermentum, eros quis ullamcorper convallis, libero mauris lacinia eros, sed tempus leo lorem vitae purus. Nunc a malesuada felis. Cras ultrices sapien eu nisi elementum non blandit urna sodales. Duis accumsan cursus massa, eu facilisis diam porta ut. Morbi cursus est vel velit hendrerit dictum.

<p> Here goes main part of the text <span class="gkBlockTextCenter">Block of text</span>rest of the text</p>

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue. Duis quis quam sed purus porta eleifend.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum condimentum pulvinar justo, sed faucibus ligula feugiat ac. Morbi quis enim nulla, vel congue augue.Donec eget dignissim augue. Donec ante felis, aliquam ut consequat eget, lobortis dapibus risus. Aliquam laoreet enim et lectus ornare hendrerit. Aliquam rhoncus enim libero. Morbi aliquam, nibh mattis feugiat dapibus, nisi massa adipiscing justo, sit amet condimentum urna ipsum et lacus. Nam fermentum, eros quis ullamcorper convallis, libero mauris lacinia eros, sed tempus leo lorem vitae purus. Nunc a malesuada felis. Cras ultrices sapien eu nisi elementum non blandit urna sodales. Duis accumsan cursus massa, eu facilisis diam porta ut. Morbi cursus est vel velit hendrerit dictum.

Other span blocks

This is a sample pin note. Use <span class="gkClear">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkClear-1">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkClear-2">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-1">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-2">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-3">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-4">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-5">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-6">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

This is a sample pin note. Use <span class="gkColor-7">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer urna. Aenean tristique. Fusce a neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </span>

Blockquotes

This is a sample quote text. Use < blockquote > Your quoted text goes here!< /blockquote >
This is a sample quote text. Use< blockquote><div class="gkBlockquote1"><div> Your quoted text goes here!< /div>< /div>< /blockquote >
This is a sample quote text. Use< blockquote><div class="gkBlockquote2"><div> Your quoted text goes here!< /div>< /div>< /blockquote >
This is a sample quote text. Use< blockquote><div class="gkBlockquote3"><div> Your quoted text goes here!< /div>< /div>< /blockquote >
This is a sample quote text. Use< blockquote><div class="gkBlockquote4"><div> Your quoted text goes here!< /div>< /div>< /blockquote >

Tables

Table Header (thead)
Table Footer (tfoot)
Column 1 Column 2
Cell 3 - part of tbody Cell 4 - part of tbody
Cell 5 - part of tbody Cell 6 - part of tbody
Cell 7 - part of tbody Cell 8 - part of tbody

Table Header (thead)
Table Footer (tfoot)
Column 1 Column 2
Cell 1 - part of tbody Cell 2 - part of tbody
Cell 3 - part of tbody Cell 4 - part of tbody
Cell 5 - part of tbody Cell 6 - part of tbody

 

 

Template additional styles

In order to get the video you have to use code like this:


<a class="gk_video_frame" href="http://www.vimeo.com/16274294" rel="mediabox[720 410]">
    <img src="/images/stories/demo/demo_video_1.png" border="0" alt="Video 1" />
    <span class="gk_vframe">Frame</span> 
    <span class="gk_voverlay">Overlay</span> 
    Watch the video 
</a>

As a href attribute you set the video address. In the rel attribute you can specify the video size. Image element is the thumbnail in the frame.

You can also create a blocks with icons. The structure is always similar - you have to change only second class near gk_block:


<div class="gk_block tablet">
<h3><a href="#">Mobile Ready</a></h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum</p>
</div>

Available blocks styles with classes:

android

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

blackberry

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

calendar

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

chat

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

clock

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

cog

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

firefox

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

info

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

mac

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

mail

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

mobilephone

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

phone

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

recycledbag

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

shoppingcart

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

tablet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

user

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis erat elit. Donec pretium condimentum

Published in Blogs
Read more...
A number of people have complained about data loss after a system crash when using Ext4.  A bug report was logged. According to multiple posts by a developer of Ext4, Theodore Tso, this is due to differences in approach to security and performance issues between the two file systems.

Ext3 commits writes to disk within approximately 5 seconds - Ext4 can take from 40-150 seconds.  In addition, if a system is using Ext3 and crashes before the commit takes place you will still have the previous contents of a file where under Ext4 the file will be empty.  Theodore Tso feels that this is a failure at the application level and that the file system is behaving as designed and as specified by the POSIX spec (which apparently does not specify what is supposed to happen when a system is not shut down cleanly).  His solution to the issue is to suggest proper use of fsync() and lists various scenarios/examples in post 54 of the bug report (linked above).  In addition he wrote a patch that recognize the rename() situation mentioned in his post 54 yet retains the normal Ext4 behaviors and performance in the majority of cases.  Also a more "proper" solution has been provided which allows the behavior of Ext3 to be retained under Ext4 by mounting it with alloc_on_commit.

A somewhat related topic is the use of on-board caching by hard drives.  This behavior can be modified on most drives by using hdparm.
Published in Blogs
Read more...

We are pleased to announce the release of Recital 10.0.3.

Here is a brief list of features and functionality that you will find in the 10.0.3 release.

  • New Commands:
    - SET TMPNAMPATH ON|OFF
    - REMOVE TABLE
  • New Functions:
    - CURSORGETPROP()
    - CURSORSETPROP()
    - CURVAL()
    - GETFLDSTATE()
    - OLDVAL()
    - TABLEREVERT()
    - TABLEUPDATE()
    - SETFLDSTATE()
  • Enhanced Functions:
    - TMPNAM() - additional parameter to specify the return of basename only
    - MAILATTACH() - parameter changed from array to filename to allow directory and file extension to be specified
  • Enhancements:
    - DO level increased from 32 to 64.
  • Fixes:
    - Delay exiting Recital after SYS(3) or SYS(2015)
    - SET SOFTSEEK issue when search key above first record in index
    - Compilation error with REPLACE command after UDF call
    - FETCH INTO memvars error
    - END TRANSACTION at command prompt error
    - ROLLBACK locking error
    - Linux ODBC Driver undefined symbol error
    - RELEASE variable with same name as variable in calling program issue
    - SQLCODE() issue on non-gateway data access
    - Issuing two SQLEXEC() calls error
    - LASTSEQNO() in workareas > 1 error
    - SET RELATION to detail table in workarea 1 issue
    - LIST STATUS on empty table delay
    - SET AUTOCATALOG alias entries error
    - ADD OBJECT in DEFINE CLASS error
    - DEACTIVATE WINDOW error
    - SORT error
    - Other reported bugs
Published in Blogs
Read more...

SE Linux is a feature of the Linux kernel that provides mandatory access control. This policy based access control system grants far greater control over the resources on a machine than standard Linux access controls such as permissions.

Many modern Linux distributions are shipping with SELinux enabled by default, Fedora 14 and Rhel 6 both install with it enabled.

When you run Recital Web on a SELinux enabled machine and navigate to the default.rsp page you will see something similar to the screen shot below.

1
If you launch the SELinux troubleshooter you will see the following problem.

SELinux is blocking the apache server from accessing the Recital server running on port 8001.

2
To manage you SELinux policy you must have the policycoreutils package group installed. The policycoreutils contains the policy core utilities that are required for basic operation of a SELinux system.

If you wish to use a GUI tool, you must install the policycoreutils-gui package.

At the command prompt execute the following:

As root

$ yum install policycoreutils

$ semanage port -a -t http_port_t -p tcp 8001

$ service recital restart

$ service httpd restart 
 

We use the semanage command here to allow the http server access to port 8001. Once you have completed the steps detailed above you can go and navigate back to the default.rsp page in your borwser, where you will find the permission denied message is now replaced by the default.rsp page.


4
SELinux does a great job of restricting services and daemons so rather than simply disabling it, why not work with it!

When it comes to security, every little bit helps...

Published in Blogs
Read more...
TIP
To access the menu bar in Recital, press the / key.

Full details on Recital Function Keys can be found in the Key Assist section of the Help menu, or in our documentation wiki here.
Published in Blogs
Read more...

Recital is a rich and versatile product with many ways to do the same thing. Developers usually write code in the way that they are accustomed to without paying much attention to how this will perform in a multi-user environment with large amounts of users and transactions. The best way to optimize Recital applications is to use the built-in tuning capabilities introduced in Recital 10.

Published in Blogs
Read more...
Recital on Linux 64 bit requires certain 32 bit libraries for installation and/or operation.  It also needs to be installed and configured as the root user, or using sudo for those systems without a root login.

For systems that do not have the xterm libraries installed, please install these to use xterm, or set the DB_TERM environment variable to start Recital from a terminal:
DB_TERM=gnome-terminal; export DB_TERM

This setting can be added to the /opt/recital/conf/recital.conf (text) file to make it available system-wide.

Please note that the Recital ODBC Driver for Linux requires a 32 bit ODBC Driver Manager.

Centos 6:

sudo yum install zlib-devel.i686 pam-devel.i686
(and accept dependencies)
Then run the installer in text mode
sudo ./recital-10.0.3-linux32.bin --mode text
Run Recital with sudo the first time, to set the system filetype compatiblity settings.
sudo recital
After saving the compatibility settings, quit to exit, then run Recital as your preferred user.
> quit
$ recital

RedHat / Fedora family:

sudo yum install zlib-devel.i686 pam.i686
(and accept dependencies)
Then run the installer in text mode
sudo ./recital-10.0.3-linux32.bin --mode text
Run Recital with sudo the first time, to set the system filetype compatiblity settings.
sudo recital
After saving the compatibility settings, quit to exit, then run Recital as your preferred user.
> quit
$ recital

 Ubuntu family:

sudo apt-get install ia32-libs 
In later versions of Ubuntu, ia32-libs is obsolete. The following package should be installed:
sudo apt-get install lib32z1
Ubuntu 12.04 and above also require the following:
sudo apt-get install libpam0g:i386
Then run the installer in text mode
sudo ./recital-10.0.3-linux32.bin --mode text
Run Recital with sudo the first time, to set the system filetype compatiblity settings.
sudo recital
After saving the compatibility settings, quit to exit, then run Recital as your preferred user.
> quit
$ recital

Published in Blogs
Read more...

Copyright © 2025 Recital Software Inc.

Login

Register

User Registration
or Cancel