Saturday, March 5, 2016

Development Tools - beyond JDeveloper and SQLDeveloper

Environment / assumptions for this post:
  • Windows 7+ desktop

Here are a few tools I've been using day to day that have come in very useful during normal development activities. I'm sure there are many alternatives to each of these, but these are either my favourites or maybe just what I've gotten used to.

Note: for useful programs equivalent to those below, checkout my post on the Linux Desktop in the workplace.

Cygwin

Cygwin is a collection of GNU and Open Source tools - basically Linux on Windows. If you have to use Windows for development and your servers are Linux based, then Cygwin can be greatly helpful. I love to use it for troubleshooting remote JVMs with JConsole, and use it for ssh shell access to the servers.
Cygwin terminal on Windows 7 - remotely connected to Linux
server with SSH and showing JConsole

Notepad++

Runner-up: Textpad
This is a great text editor - free, governed by GPL. Every day I take advantage of features like:

  • all the usual multiple tabs, syntax highlighting, multiple encodings, etc.
  • good regex support
  • if you close the program, you can restart with all your files/tabs intact even if they weren't saved 
  • even for searching the contents of files in a directory hierarchy
Notepadd++ - multiple tabs, and lots more


WinMerge

This is an Open Source diff / merge tools for Windows. Very nice, you can compare individual files or whole directories, ignoring certain files if you like. You can also just cut&paste into left/right windows.
WinMerge - diff / merge tool for Windows

WinDirStat

Open Source directory statistics viewer. Similar to KDirStat or QDirStat on Linux. Comes in really handy when you have a small SSD drive and are running out of space.
WinDirStat - directory statistics viewer

DJ Java Decompiler

Sometime you have to go to greater lengths than normal to troubleshoot issues. In those cases, being able to decompile classes is very useful, and this is probably the best program to do it. An earlier release is free, but the latest is $20US although it has a trial version.
DJ Java Decompiler

LdapAdmin

The Ldap Admin tool is also free, and allow you to connect to any Ldap server including Oracle OID. It is a nice way to search and verify things if OIDDAS isn't available, or you don't feel like using command-line tools.
Ldap Admin tool - connect to Ldap directories

VLC Media Player

Every developer needs to drown out their co-workers occasionally.  :)  For such times, VLC comes in handy - it is open source and multi-platform.
VLC Media Player

Snipping Tool

Believe it or not, even some people who have been using Windows for years may not realize that a very useful accessory tool is included with Windows - the Snipping Tool. There are better tools out there but this one is right there ready to go.
Microsoft's Snipping Tool

IrfanView

This is freeware, so free for personal or educational use but otherwise $12US. I suppose there are newer free image viewers, but I've been using this for a long time and I'm used to it. Very small and fast, easy to do simple manipulations. It is found here.
IfranView - nice little fast image viewer


Wednesday, February 24, 2016

ADF 12.2.1 - ExportCollectionActionListener exports column headings incorrectly after ordering columns

Update March 2017: this bug is still NOT FIXED. The Oracle Bug does not have a Fix Version.

Environment / assumptions for this post:

  • JDeveloper 12.2.1.0
  • Windows 7
  • Custom Fusion Web Application
This is admittedly a fairly low priority issue for us, but under the right circumstances it could be a big deal - if you export data from tables a lot.

In a nutshell: if you reorder a column in an af:table and then export the data via ExportCollectionActionListener, the data will be correct but the column headers will be the original header order.

To illustrate, I created a simple Test Case to submit to Oracle. 

Step 1 - simple table using a ViewObject that points to a simple basic database Table

Original table of data with Export button


Step 2 - Export the data and open in Microsoft Excel, looks fine

Data looks fine in Microsoft Excel

Step 3 - Re-order a column by dragging

Drag the order of columns - swap Firstname and Lastname

Step 4 - Export again - column headers wrong!

Second Export to Excel - data is correct but column headers are same as original

For reference, the Oracle BUG is #22791014.


Monday, January 18, 2016

Troubleshooting Fusion Middleware applications - configuring SSH on Windows

Environment / assumptions for this post:

  • Windows 7 desktop
  • Oracle Enterprise Linux 7.2
  • Cygwin with SSH packages

My work machine was and still is on the venerable Windows 7, but this applies to Windows 8/10 just as well. All of our Dev / Test / Production environments are Oracle Enterprise Linux based, and we have many applications deployed to Weblogic 12c.  Although we can sometimes rely on Nodemanager and Enterprise Manager for restarts and things like checking log files, it is sometimes easier to do things manually from the command line. Occasionally some creative use of 'grep' is invaluable in finding specific issues.

In any case, there are many ways to configure ssh for this, but I'll just focus on two: the easy way and the long way.

Easy Way - PuTTY

A simple install and go client like PuTTY is very quick and easy. Download here. Also available as part of the download are scp and sftp clients. There's also MobaXterm and many others.



Longer Way - Cygwin

Again, not so much hard but longer - although worth it in the end! Cygwin is a bunch of Open Source tools that give Linux functionality to Windows. You download an installer, then selectively choose the packages you like. There are tons of websites and blogs that describe in graphic detail how to install and configure Cygwin. Apart from basic ssh sessions, you can also do things like start an X server and launch programs from a remote server i.e. using your own monitor as the display. This can be very helpful - see my other post on this.

First, download and install Cygwin. Search for and select the openssh package and finish the install.  Any required dependencies will automatically be chosen for you.  Lots of default base install stuff will come along as well - things like bash, less, grep, etc etc.
Note: you can go back to the cygwin install directory at any time and re-run the installer to install additional packages.

Cygwin Setup
Cygwin initial setup - search for ssh and select the openssh package.
Under your cygwin folder, you'll have a home directory. Mine looks like:

c:\cygwin64\home\jjames


To start a session, just find the Cygwin Terminal under the Windows menu if you chose to create it there. The first time you run it, the usual login scripts will be created such as .profile and .bash_rc. You can then ssh to one of your servers. The very first time you do so, you will get a message about authenticity - just type yes and the file "known_hosts" under a new folder .ssh will be created.

$ ssh oracle@hostname
The authenticity of host 'hostname (192.168.1.1)' can't be established.
RSA key fingerprint is SHA256:ABCDEFT9OlFlKy9YIv4Fsj0RXCldRbv4MKMxab8P5iw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hostname,192.168.1.1' (RSA) to the list of known hosts.
oracle@hostname's password:

At this point, you can stop - no more is required. 

There are other cool things you can do though, such as generating a public/private key pair, and other misc config that will help with things like X forwarding.  See my post about running a remote JConsole on your local X server.

Public/private key pair

Next, you will want to generate a public/private key pair. This will allow you to embed the key in the authorized_hosts file in your home directory on a remote server without having to enter a password, or by entering the same password i.e. you could use the same password for many servers without changing your actual password on each machine. So you do this by running ssh-keygen as follows:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jjames/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jjames/.ssh/id_rsa.
Your public key has been saved in /home/jjames/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:us/XYZABCDEFPW12345ZAeW+aUBKpBunYxLix+d58KI jjames@myhost
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|  x  s      .    |
|       o   o     |
|  . . o o o o .  |
| . e . *So = . . |
|  . + B.t . = .+ |
|   . j.=  . .=+o+|
|      -oo.o.Boo+o|
|     ..+o..o.oo..|
+----[SHA256]-----+

jjames@myhost ~
$

Two files are generated: id_rsa and id_rsa.pub which are the private and public keys respectively. Add the value in the public key file to each remote server in ~/.ssh/authorized_hosts.

Misc Config

Finally, you can optionally put other configuration in the config file. My config file contains many entries that look like this:

host dev
 hostname development.company.com
 user oracle
 ForwardX11Trusted yes
 ForwardX11 yes
 ServerAliveInterval 300 
 ForwardAgent yes

An explanation is as follows:

host dev - in my case, 'dev' is just an alias, it can be whatever you want.
hostname development.company.com - the server
user oracle - the server login
ForwardX11Trusted yes - set this for X11 forwarding
ForwardX11 yes - set this for X11 forwarding
ServerAliveInterval 300 - seconds before sending a null packet to keep the connection alive
ForwardAgent yes - this is about forwarding authentication when you log in from one machine to another. There is a good guide here.