Setup Oracle Enterprise Linux for Public Yum Server

In order to get the lastest packages for Oracle Enterprise Linux, I need to set my yum to point to your oracle public yum server.

1. check your Oracle Enterprise Linux version

[henry@localhost ~]$ rpm -qf /etc/enterprise-release 
enterprise-release-5-0.0.22
[henry@localhost ~]$ cat /proc/version
Linux version 2.6.18-194.17.1.0.1.el5 (mockbuild@ca-build9.us.oracle.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Wed Sep 29 15:40:03 EDT 2010

2. su root and wget

[root@localhost /]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# wget http://public-yum.oracle.com/public-yum-el5.repo
--2013-11-05 13:46:17--  http://public-yum.oracle.com/public-yum-el5.repo
Resolving public-yum.oracle.com... 184.29.106.66, 184.29.106.34
Connecting to public-yum.oracle.com|184.29.106.66|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4307 (4.2K) [text/plain]
Saving to: `public-yum-el5.repo'

100%[========================================>] 4,307       --.-K/s   in 0s      

2013-11-05 13:46:17 (323 MB/s) - `public-yum-el5.repo' saved [4307/4307]

3. Make sure enable the release based on your version (in my case el5_latest)

[root@localhost yum.repos.d]# vi public-yum-el5.repo 
[el5_latest]
name=Oracle Linux $releasever Latest ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

4. Test: get any package if you want

[root@localhost yum.repos.d]# yum install freeglut-devel

Prototype for Real Time Data Streaming (Data Push) Part 3

This is the part 3 of the series. Here are the other parts of the series.

Prototype for Real Time Data Streaming (Data Push) Part 1: maven2 generated Jetty based application

Prototype for Real Time Data Streaming (Data Push) Part 2: multi-channel subscription based web application

Prototype for Real Time Data Streaming (Data Push) Part 3: channel feeder java based application

In the previous blogs, I have shown how to create a web based application to allow users to subscribe multiple channels on jetty embedded server. However, they still cannot see any data from those channels because there is no data being fed onto them.

In the following, I will show how to create a java application to feed data onto the channel.

ChannelFeeder.java

The ChannelFeeder is the generic middle man program. It reads from input and sends it immediately to the designate channel. It requires a named channel as an input argument (such /123. /sar. etc) which were defined in part 2.

ChannelFeeder.java

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import org.cometd.bayeux.Channel;
import org.cometd.bayeux.Message;
import org.cometd.bayeux.client.ClientSessionChannel;
import org.cometd.bayeux.client.ClientSession;
import org.cometd.client.BayeuxClient;
import org.cometd.client.transport.ClientTransport;
import org.cometd.client.transport.LongPollingTransport;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.http.HttpBuffers;
import org.eclipse.jetty.util.component.AbstractLifeCycle;

public class ChannelFeeder { 
    private static String CHANNEL;
    private static final ClientSessionChannel.MessageListener DevListener = new DevListener();

    private static class DevListener implements ClientSessionChannel.MessageListener
    {
        public void onMessage(ClientSessionChannel channel, Message message)
        {
            // Here we received a message on the channel
            System.out.println("Sending:"+message.getData().toString());
        }
    }

    public static void main(String[] args) throws Exception {
        try { 

        if(args.length == 1)
        {
            CHANNEL = (args[0].charAt(0) == '/') ? args[0] : '/'+args[0];
        }
        else
        {    
            System.out.println("Enter new channel name");
            System.exit(1);
        } 

        // Create (and eventually setup) Jetty's HttpClient
        <span style="color:#ff0000;">HttpClient httpClient = new HttpClient();</span>

        // Setup Jetty's HttpClient
        <span style="color:#ff0000;">httpClient.start();</span>

        // Prepare the transport    
        Map&lt;String, Object&gt; options = new HashMap&lt;String, Object&gt;();
        ClientTransport transport = LongPollingTransport.create(options, httpClient);

        //ClientSession client = new BayeuxClient("http://localhost:8080/cometd", transport);
        <span style="color:#ff0000;">final BayeuxClient client = new BayeuxClient("http://localhost:8080/DeviceMonitor/cometd", transport);
</span>
        // Setup the BayeuxClient<span style="color:#ff0000;">
        client.getChannel(Channel.META_CONNECT).addListener(new ClientSessionChannel.MessageListener()</span>
        {
            public void onMessage(ClientSessionChannel channel, Message message)
            {
                //connected.set(message.isSuccessful());
            }
        });
<span style="color:#ff0000;">        client.getChannel(Channel.META_HANDSHAKE).addListener(new ClientSessionChannel.MessageListener()</span>
        {
            public void onMessage(ClientSessionChannel channel, Message message)
            {
                //connected.set(false);
            }
        });

<span style="color:#ff0000;">        client.handshake();</span>

        boolean handshaken = client.waitFor(1000, BayeuxClient.State.CONNECTED);
        if (handshaken)
        {
            // subscribe to the channel to normal (broadcast) channels
<span style="color:#ff0000;">            client.getChannel(CHANNEL).subscribe(DevListener);</span>

<span style="color:#ff0000;">            // the follow are commented out because we don't want to publish anything here.</span>
<span style="color:#ff0000;">            // We just want to pipe it from the input</span>
            // publish data to the normal channels
            //Map&lt;String, Object&gt; data = new HashMap&lt;String, Object&gt;();
            // Fill in the data. Publishing data on a channel is an asynchronous operation.
            //client.getChannel(CHANNEL).publish(data);
            //Map&lt;String, Object&gt; data = new HashMap&lt;String, Object&gt;();
            //data.put("name", "\"DevClient\"");

            //client.getChannel(CHANNEL).publish(data);

            System.out.println("Ready... (\"q\" to exit)");
            final BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));
            do {
                final String userInput = inReader.readLine();
                if (userInput == null || "q".equals(userInput)) {
                    break;
                }

                //connection.write(userInput);

                <span style="color:#ff0000;">client.getChannel(CHANNEL).publish(userInput);</span>
            } while (true);
        }

<span style="color:#ff0000;">        client.disconnect();
        client.waitFor(1000, BayeuxClient.State.DISCONNECTED);</span>

        } catch (IOException e) {
            e.printStackTrace();
        }

    } //end of main
} // end of class

feed.bash

This is a wrapper shell script to make our test easy. The execution is like

./feed.bash 123

This will allow you to key in anything from the screen, and the result will be sent to the channel 123. If the user choose channel 123 from the web browser, it will subscribe to it and see whatever you type from that onward.

./feed.bash stopwatch is to activate Stopwatch.java program. It just a count-down second by second java program. I will provide this program in another blog.

./feed.bash sar will pipe unix ‘sar -u 2 10000’ command output to the ‘sar’ for those subscribers where they can watch real time feed from remote browser. This will apply for the rest option like iostat, vmstat and ifstat.

All of these are just the simulation of the devices. The likely application for these technologies are for field devices in transportation systems, the appliance devices in home automation etc.

#! /bin/bash
if [ $# -ne 1 ]
then
    echo "$0 channel_name"
    exit 1
fi

export CHANNEL=$1

export CLASSPATH=bayeux-api-2.4.1.jar:cometd-java-client-2.4.1.jar:cometd-java-common-2.4.1.jar:jetty-client-8.0.1.v20110908.jar:jetty-http-8.0.1.v20110908.jar:jetty-util-8.0.1.v20110908.jar:jetty-io-8.0.1.v20110908.jar:slf4j-api-1.6.4.jar:slf4j-simple-1.6.4.jar:.

cd ~/test/mvn/DevClient

case "${CHANNEL}" in
     123)
           java -cp ${CLASSPATH} ChannelFeeder ${CHANNEL}
           ;;
     stopwatch)
           <span style="color:#ff0000;">java Stopwatch</span> | java -cp ${CLASSPATH} ChannelFeeder ${CHANNEL}
           ;;
     sar)
           <span style="color:#ff0000;">sar -u 2 10000</span> | java -cp ${CLASSPATH} ChannelFeeder ${CHANNEL}
           ;;
     iostat)
           <span style="color:#ff0000;">iostat -xtc 2</span> 10000 | java -cp ${CLASSPATH} ChannelFeeder ${CHANNEL}
           ;;
     vmstat)
           <span style="color:#ff0000;">vmstat 2 10000</span> | java -cp ${CLASSPATH} ChannelFeeder ${CHANNEL}
           ;;
     ifstat)
           <span style="color:#ff0000;">ifstat</span> | java -cp ${CLASSPATH} ChannelFeeder ${CHANNEL}
           ;;
     *)
           echo "Channel not defined."
           exit
           ;;
esac
exit 0

Test Drive

The following script should open many tabs in your terminal and feed all the channels. This can use to stress test your machine. For my 2GB machine, I only can run these 6 times, and the system is totally unresponsive after it.

#!/bin/bash
if [ $# -ne 1 ]
then
    echo "$0 Feed_base_dir"
    exit 1
fi
gnome-terminal --tab --title=123 -e "$1/feed 123"  --tab --title=stopwatch -e "$1/feed stopwatch" --tab --title=sar -e "$1/feed sar" --tab --title=iostat -e "$1/feed iostat" --tab --title=vmstat -e "$1/feed vmstat" --tab --title=ifstat -e "$1/feed ifstat"
exit 0

How to connect Blackberry Phone to Ubuntu Linux

RIM only makes a desktop software for Microsoft Windows Platform. For those people running Linux desktop, the following is a guide to make your Linux Desktop to recognize your Blackberry smartphone, charge your battery, backup your device, and sync your data between Evolution Email application and your blackberry.

I tested the following process on my Ubuntu 10.10. with my Blackberry Torch 9800 on Blackberry OS 6.X.

1. Download

Download the following from http://sourceforge.net/projects/barry/files/barry/barry-0.17.1/ubuntu1004/

  • barry-util_0.17.1-0_ubuntu1004_i386.deb
  • barrybackup-gui_0.17.1-0_ubuntu1004_i386.deb
  • libbarry0_0.17.1-0_ubuntu1004_i386.deb
  • opensync-plugin-barry_0.17-0_ubuntu1004_i386.deb

Download libopensync0_0.22-4ubuntu0.1_i386.deb  from https://launchpad.net/ubuntu/lucid/i386/libopensync0/0.22-4ubuntu0.1

2. Install using Ubuntu Software Centre

  • Library: libbarry0_0.17.1-0_ubuntu1004_i386.deb
  • Command Line Utility: barry-util_0.17.1-0_ubuntu1004_i386.deb
  • GTK+ based GUI Backup Tools: barrybackup-gui_0.17.1-0_ubuntu1004_i386.deb
  • OpenSync Framework Library: libopensync0_0.22-4ubuntu0.1_i386.deb 
  • OpenSync: opensync-plugin-barry_0.17-0_ubuntu1004_i386.deb

3. What have been installed?

root@Norhead:~# find / -name ‘*barry*’ -print

/var/lib/dpkg/info/barrybackup-gui.md5sums
/var/lib/dpkg/info/libbarry0.list
/var/lib/dpkg/info/barry-util.conffiles
/var/lib/dpkg/info/barrybackup-gui.list
/var/lib/dpkg/info/barry-util.postinst
/var/lib/dpkg/info/barrybackup-gui.postrm
/var/lib/dpkg/info/libbarry0.shlibs
/var/lib/dpkg/info/barrybackup-gui.postinst
/var/lib/dpkg/info/barry-util.list
/var/lib/dpkg/info/barry-util.md5sums
/var/lib/dpkg/info/libbarry0.md5sums
/var/lib/dpkg/info/libbarry0.postinst
/var/lib/dpkg/info/libbarry0.postrm
/etc/ppp/peers/barry-chinamobile
/etc/ppp/peers/barry-verizon
/etc/ppp/peers/barry-rogers
/etc/ppp/peers/barry-o2ireland
/etc/ppp/peers/barry-sprint
/etc/ppp/peers/barry-optus-au
/etc/ppp/peers/barry-telus
/etc/ppp/peers/barry-kpn
/etc/ppp/peers/barry-orange-spain
/etc/ppp/peers/barry-vodafone-au
/etc/ppp/peers/barry-tmobileus
/etc/ppp/peers/barry-minimal
/etc/ppp/peers/barry-att_cingular
/etc/chatscripts/barry-telus.chat
/etc/chatscripts/barry-orange-spain.chat
/etc/chatscripts/barry-chinamobile.chat
/etc/chatscripts/barry-rogers.chat
/etc/chatscripts/barry-tmobileus.chat
/etc/chatscripts/barry-sprint.chat
/etc/chatscripts/barry-optus-au.chat
/etc/chatscripts/barry-kpn.chat
/etc/chatscripts/barry-vodafone-au.chat
/etc/chatscripts/barry-minimal.chat
/etc/chatscripts/barry-att_cingular.chat
/etc/chatscripts/barry-o2ireland.chat
/etc/chatscripts/barry-verizon.chat
/usr/bin/barrybackup
/usr/lib/libbarrysync.so.17.0.1
/usr/lib/libbarrydp.so.17.0.1
/usr/lib/libbarrydp.so.17
/usr/lib/libbarrybackup.so.17.0.1
/usr/lib/libbarryjdwp.so.17.0.1
/usr/lib/libbarrysync.so.17
/usr/lib/libbarrybackup.so.17
/usr/lib/libbarryjdwp.so.17
/usr/lib/libbarryalx.so.17
/usr/lib/libbarry.so.17.0.1
/usr/lib/libbarryalx.so.17.0.1
/usr/lib/libbarry.so.17
/usr/share/locale/fr/LC_MESSAGES/barry.mo
/usr/share/locale/fr/LC_MESSAGES/barry-backup.mo
/usr/share/man/man1/barrybackup.1.gz
/usr/share/barry
/usr/share/menu/barrybackup-gui
/usr/share/doc/barry-util
/usr/share/doc/barry-util/ppp/barry-telus.chat
/usr/share/doc/barry-util/ppp/barry-chinamobile
/usr/share/doc/barry-util/ppp/barry-verizon
/usr/share/doc/barry-util/ppp/barry-orange-spain.chat
/usr/share/doc/barry-util/ppp/barry-rogers
/usr/share/doc/barry-util/ppp/barry-o2ireland
/usr/share/doc/barry-util/ppp/barry-sprint
/usr/share/doc/barry-util/ppp/barry-chinamobile.chat
/usr/share/doc/barry-util/ppp/barry-optus-au
/usr/share/doc/barry-util/ppp/barry-telus
/usr/share/doc/barry-util/ppp/barry-rogers.chat
/usr/share/doc/barry-util/ppp/barry-tmobileus.chat
/usr/share/doc/barry-util/ppp/barry-kpn
/usr/share/doc/barry-util/ppp/barry-sprint.chat
/usr/share/doc/barry-util/ppp/barry-fido.chat
/usr/share/doc/barry-util/ppp/barry-optus-au.chat
/usr/share/doc/barry-util/ppp/barry-kpn.chat
/usr/share/doc/barry-util/ppp/barry-vodafone-au.chat
/usr/share/doc/barry-util/ppp/barry-orange-spain
/usr/share/doc/barry-util/ppp/barry-minimal.chat
/usr/share/doc/barry-util/ppp/barry-vodafone-au
/usr/share/doc/barry-util/ppp/barry-att_cingular.chat
/usr/share/doc/barry-util/ppp/barry-o2ireland.chat
/usr/share/doc/barry-util/ppp/barry-tmobileus
/usr/share/doc/barry-util/ppp/barry-minimal
/usr/share/doc/barry-util/ppp/barry-verizon.chat
/usr/share/doc/barry-util/ppp/barry-att_cingular
/usr/share/doc/barrybackup-gui
/usr/share/doc/libbarry0
/usr/share/pixmaps/barry_logo_icon.png

root@Norhead:~# find / -name ‘*synctool*’ -print

/etc/bash_completion.d/msynctool

4. Test

Now, it is the fun part. Just connect your Blackberry to the Linux desktop, you will be prompted to “USB” or “Sync Media” or ‘Charge Only’ on your Blackberry device.  Choose one of them, and you can enjoy now. I can charge the battery. I can play mp3 files located on Blackberry through my Linux desktop, and also transfer media files between them.

To backup, start type ‘barrybackup’ in a terminal window and GUI should appear for backup. I can backup my device to .Barry/backup on Linux desktop.

You can do more things. I didn’t test the sync between Evolution Email and Blackberry.  Here is the good guide. Another one is here. But I haven’t tried them all yet, because I pretty much just charge the battery most of time. That’s good enough for me.

How to bind data from database with Java Swing UI

I have the following data in a PostgreSQL database called ‘mydb’ on Linux.

~$ psql mydb
psql (8.4.9)
Type "help" for help.

mydb=# select * from employees;
 id |   lastname   | firstname | department
----+--------------+-----------+------------
  1 | Werner       | Max       |          1
  2 | Lehmann      | Daniel    |          2
  3 | Roetzel      | David     |          1
  4 | Scherfgen    | David     |          2
  5 | Kupfer       | Andreas   |          2
  6 | Scheidweiler | Najda     |          2
  7 | Jueppner     | Daniela   |          4
  8 | Hasse        | Peter     |          4
  9 | Siebigteroth | Jennifer  |          3
(9 rows)

mydb=# select * from departments;
 id |    name    
----+------------
  1 | Management
  2 | R&D
  3 | Marketing
  4 | Accounting
(4 rows)

mydb=# select firstname, lastname, name
mydb-# from employees, departments
mydb-# where employees.department = departments.id;
 firstname |   lastname   |    name    
-----------+--------------+------------
 David     | Roetzel      | Management
 Max       | Werner       | Management
 Najda     | Scheidweiler | R&D
 Andreas   | Kupfer       | R&D
 David     | Scherfgen    | R&D
 Daniel    | Lehmann      | R&D
 Jennifer  | Siebigteroth | Marketing
 Peter     | Hasse        | Accounting
 Daniela   | Jueppner     | Accounting
(9 rows)

mydb=#

The following is the Java program which consists of two parts: the bottom part  (initComponents()) is the UI generated by using the Netbean IDE, and the upper part is the java program (DoConnect() ) to connect to a database mydb in PostgreSQL, and run a query, and then bind the data (first record) to the text fields on the UI.  (Basically, it should work with all the JDBC compliance DB like mysql, derby, Oracle, Sybase, UDB or Microsoft SQL. Just replace the connection string, and put the relevant JDBC driver jar file in the classpath. Also, the compile and execute command are for Linux.)

SimpleForm (Data Binding Using Java Swing)
SimpleForm (Data Binding Using Java Swing)
SimpleForm.java 
/*
 Written by: https://henry416.wordpress.com/
 to compile: javac -cp /usr/share/java/postgresql.jar SimpleForm.java
 to execute: java -cp /usr/share/java/postgresql.jar:. SimpleForm
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;
public class SimpleForm extends javax.swing.JFrame {
    Connection con;
    Statement stmt;
    ResultSet rs;
    /** Creates new form SimpleForm */
    public SimpleForm() {
        initComponents();
        DoConnect();
    }
    public void DoConnect( ) {
        try {
            //connect to the database
            con = DriverManager.getConnection("jdbc:postgresql:mydb","testuser","testpassword");
            // construct a sql statement, execute it and load resultset to rs
            stmt = con.createStatement();
            String sql = "select firstname, lastname, name from employees, departments where employees.department = departments.id";
            rs = stmt.executeQuery(sql);
            // retrieve the fields from rs to txtFields
   rs.next();
            txtFirst.setText(rs.getString("firstname"));
            txtLast.setText(rs.getString("lastname"));
            txtDept.setText(rs.getString("name"));
        }
        catch (SQLException err) {
            JOptionPane.showMessageDialog(SimpleForm.this, err.getMessage());
        }
    }
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new SimpleForm().setVisible(true);
            }
        });
    }
 /*
  The following is GUI generated from Netbean
 */
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        txtFirst = new javax.swing.JTextField();
        txtLast = new javax.swing.JTextField();
        txtDept = new javax.swing.JTextField();
        lblFirst = new javax.swing.JLabel();
        lblLast = new javax.swing.JLabel();
        lblDept = new javax.swing.JLabel();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        lblFirst.setText("First Name:");
        lblLast.setText("Last Name");
        lblDept.setText("Department:");
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(49, 49, 49)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblDept)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(txtDept, javax.swing.GroupLayout.DEFAULT_SIZE, 323, Short.MAX_VALUE)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(txtFirst, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(lblFirst))
                                .addGap(42, 42, 42)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(lblLast)
                                    .addComponent(txtLast, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE))))
                        .addContainerGap(81, Short.MAX_VALUE))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(27, 27, 27)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblFirst)
                    .addComponent(lblLast))
                .addGap(27, 27, 27)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtLast, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtFirst, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(22, 22, 22)
                .addComponent(lblDept)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtDept, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(120, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>

    // Variables declaration - do not modify
    private javax.swing.JLabel lblDept;
    private javax.swing.JLabel lblFirst;
    private javax.swing.JLabel lblLast;
    private javax.swing.JTextField txtDept;
    private javax.swing.JTextField txtFirst;
    private javax.swing.JTextField txtLast;
    // End of variables declaration
}