This is quasi-technical.
I am sure I am late to the party on this (as usual) but Yahoo ran a story on Monday about Jonathan Coulton that caught my eye. Interesting story about him that I won't rehash here. I went to his site and listened to a couple of his tunes. Very entertaining. If you are a developer, check out the "Code Monkey" tune.
Thursday, February 28, 2008
Oracle Mix Idea
Good morning and Happy New Year (I can say that in this late February post as I am the first person from our team to post in 2008). Last week I posted an idea on Oracle Mix (a very cool new Oracle site brought to you by the geniuses at Oracle Appslab) regarding converting Application Designer to a Java-based tool. App Designer is currently a Win32 app, requiring MS Windows. I would love to tell you I had great, altruistic means for the post, but truth be told, I just want to run App Designer in Linux. And I am sure that I am not the only one. I am sure there are several kindred spirits out there running Mac and Linux boxes that have at one time or another also wished App Designer was cross-platform.
IMHO, making App Designer platform independent is a good business move. Having an IDE where the customer can decide what platform they want to run it on is a good thing. A company that is not necessarily a Windows shop wouldn't have to sink the extra cash on a virtualization solution or purchase unnecessary extra machines.
Anyway, my $02. If you want to vote on my Mix idea, the url is: https://mix.oracle.com/ideas/18401-make-peoplesoft-application-designer-java-based-and-platform-independent
IMHO, making App Designer platform independent is a good business move. Having an IDE where the customer can decide what platform they want to run it on is a good thing. A company that is not necessarily a Windows shop wouldn't have to sink the extra cash on a virtualization solution or purchase unnecessary extra machines.
Anyway, my $02. If you want to vote on my Mix idea, the url is: https://mix.oracle.com/ideas/18401-make-peoplesoft-application-designer-java-based-and-platform-independent
Tuesday, November 20, 2007
Thunderbird IMAP and attachment issues
We setup the scanner portion of our office printer/scanner/fax machine today. Upon scanning, the printer/scanner/fax images the document, saves it as a PDF and emails out to whomever you picked to send the image to. I received the PDF in my email in my client of choice, Thunderbird (version 2.0.0.9 (20071031) using IMAP) and when attempting to open it, received the following error message from Adobe Acrobat reader:
"The was an error opening this document. The file is damaged and could not be repaired"
I downloaded an alternative Win32 PDF reader, Foxit Reader, and gave that a shot, only to receive a similar message. I contacted a colleague who also received the test message to find out she was able to open the PDF with no issues using Outlook. With that info, I went to my webmail client and was able to open the PDF file with no issue. So the problem was with Thunderbird.
After a quick Google search, I found several postings from other folks with a similar predicament, mostly from attempting to hook Thunderbird to the new released Gmail IMAP ports. I came across the following nugget of information which immediately corrected my problem....
Original source thread
In the "about:config" section of Thunderbird (Tools > Options > Advanced > Config Editor) look for the "mail.imap.fetch_by_chunks" and " mail.server.default.fetch_by_chunks" values and set them to "False".
Mozillazine gives some more information about what this value actually does here
"The was an error opening this document. The file is damaged and could not be repaired"
I downloaded an alternative Win32 PDF reader, Foxit Reader, and gave that a shot, only to receive a similar message. I contacted a colleague who also received the test message to find out she was able to open the PDF with no issues using Outlook. With that info, I went to my webmail client and was able to open the PDF file with no issue. So the problem was with Thunderbird.
After a quick Google search, I found several postings from other folks with a similar predicament, mostly from attempting to hook Thunderbird to the new released Gmail IMAP ports. I came across the following nugget of information which immediately corrected my problem....
Original source thread
In the "about:config" section of Thunderbird (Tools > Options > Advanced > Config Editor) look for the "mail.imap.fetch_by_chunks" and " mail.server.default.fetch_by_chunks" values and set them to "False".
Mozillazine gives some more information about what this value actually does here
Sunday, November 11, 2007
Oracle Mix
Saw on the Oracle AppsLab blog a reference to Oracle Mix. I signed right up because I like the direction Oracle is taking with trying to encourage and foster a tighter sense of community among itself and its users. I am hoping this is one step closer to creating an environment where the community (especially on the apps side) can share and contribute projects openly (i.e., sourceforge).
So if you are interested, invite me to join your group in the Mix.
http://mix.oracle.com
So if you are interested, invite me to join your group in the Mix.
http://mix.oracle.com
OpenWorld 2007 - Day 0
Great day for a drive to San Francisco. Joe took me detour past the old Oracle headquarters in Belmont on Davis Drive where he used to work.
Check-in was a breeze cause we are alum. Oracle doesn't give out much swag at all, go we got the usual book bag, notepad, umbrella and various adverts.
We made it to the keynote at 5:45PM to hear Larry recount the history of Oracle. He even showed a pic of the old offices in Belmont (the ones we toured earlier in the day). Some of the ex-cast of Saturday Night Live (Kevin Nealon, Darrell Hammond, and I can't remember the other one) where there to add some humor to the mix.
The reception after the keynote had the usual food and drink.
Up tomorrow...
08:30-10:15 - Keynote Charles Phillips
11:00-12:00 - Intro to Oracle BI Publisher
12:30-13:30 - Oracle SOA Suite Best Practices
14:00-14:45 - Keynote ?
15:15-16:15 - Highlights of Agile PLM
16:45-17:45 - Ready, Set, XML - Using Oracle XML Data
18:00-19:00 - Keynote ?
19:30- - OTN Night
Check-in was a breeze cause we are alum. Oracle doesn't give out much swag at all, go we got the usual book bag, notepad, umbrella and various adverts.
We made it to the keynote at 5:45PM to hear Larry recount the history of Oracle. He even showed a pic of the old offices in Belmont (the ones we toured earlier in the day). Some of the ex-cast of Saturday Night Live (Kevin Nealon, Darrell Hammond, and I can't remember the other one) where there to add some humor to the mix.
The reception after the keynote had the usual food and drink.
Up tomorrow...
08:30-10:15 - Keynote Charles Phillips
11:00-12:00 - Intro to Oracle BI Publisher
12:30-13:30 - Oracle SOA Suite Best Practices
14:00-14:45 - Keynote ?
15:15-16:15 - Highlights of Agile PLM
16:45-17:45 - Ready, Set, XML - Using Oracle XML Data
18:00-19:00 - Keynote ?
19:30- - OTN Night
Tuesday, November 6, 2007
Oracle OpenWorld 2007
Been buried the last several weeks working on our HCM 8.9 Absence Manage implementation. This project is quite a change from the usual since there hasn't been much technical work to date, most of the time has been focused on validating formulas and other setup data.
I am scheduled to be at OpenWorld next week and am very excited to be attending. There are lots of good sessions held by Oracle and I feel fortunate to be able to attend sessions held by big name folks like Tom Kyte, Jim Marion, Shay Shmeltzer, et al. I also have a list of questions that I hope to get some potential answers too from the experts roaming in the exhibit hall.
The best thing about conferences like this is the energy. You can't help but get excited and energized about technology and the potential it has. Compare this to a typical morgue-like day at work, and I always come back wishing everyday was an OpenWorld day.
I am scheduled to be at OpenWorld next week and am very excited to be attending. There are lots of good sessions held by Oracle and I feel fortunate to be able to attend sessions held by big name folks like Tom Kyte, Jim Marion, Shay Shmeltzer, et al. I also have a list of questions that I hope to get some potential answers too from the experts roaming in the exhibit hall.
The best thing about conferences like this is the energy. You can't help but get excited and energized about technology and the potential it has. Compare this to a typical morgue-like day at work, and I always come back wishing everyday was an OpenWorld day.
Thursday, October 11, 2007
PeopleTools 8.4x - Finding references to a particular record field
Found a feature today that I had never seen before (don't laugh if you've been using it for years). If you bring up a record in Application Designer and right-click on a field there is an option to Find Definition References - Record Field. In the past I had always just opened the field and from the Edit menu selected Find Definition References, which brings back usage of the field on any object (record, page, peoplecode, etc.). The Find Definition References - Record Field limits the search to only the usage of that field on that particular record.
It is always nice to find a feature like this when you really need it...
It is always nice to find a feature like this when you really need it...
Thursday, September 27, 2007
IRC still alive and well
It had been a long time since I'd been on Internet Relay Chat (the real IM), so the other night I fired up Chatzilla and checked out a few channels like #jquery, ##java, ##linux and saw quite a bit of conversations taking place. If anyone reading this knows of good channels related to things like Java, general open source, portals, or enterprise development please drop a comment.
Wednesday, September 26, 2007
Commented out code...please use version control
I had to look through some code today to troubleshoot an issue. The code had tons of comments. You might say, wow that's a good thing right? Wrong, the comments were not comments about what the code was doing (or trying to do). Instead, the comments were commenting out old code dating back who knows how long. This makes the code so difficult to read and understand when the lines of old junk outnumbers the lines of code that is actually live and doing something.
There are so many great, free revision control systems available today (subversion, git, mercuial, bazaar), old code belongs in a revision control system and not in current code.
There are so many great, free revision control systems available today (subversion, git, mercuial, bazaar), old code belongs in a revision control system and not in current code.
Tuesday, September 25, 2007
Dynamic Application Class loading in PeopleSoft
When Application Classes were first introduced in PeopleTools and they included interfaces, I knew that there had to be some way to dynamically load an application class. A lot of my recent work has been in the HR Recruiting module (Candidate Gateway) that delivers hundreds of classes.
Quite a few of the classes handle things like page layout and validation, things we definitely wanted to modify. They even delivered a lot of "factory" like classes that their code calls and all it does is return an object of a certain type. It seemed like a perfect setup for being able to customize the look and feel and behavior by simply supplying custom application classes. However, the implementation classes are hardcoded in the factory methods. So while there is a way to substitute the implementation of a certain class it still requires a modification to delivered code.
The Approvals Framework, on the other hand, is a perfect example of how application classes should be used. It is completely built around the concepts of dynamically loading classes at runtime based on values entered in setup tables. No code modifications are required, you just create your class and enter the fully qualified name in a setup table. The framework looks up the class you specify, loads it up dynamically at runtime and then calls the methods on it.
An example (code changed to protect the innocent):
The framework can then lookup the class name in a setup table and call the methods it provides. It knows what methods it can call based on the fact that my class must extend a class they know about (BaseEventHandler).
PeopleSoft, which knows nothing about my custom class, is able to load it up and use it. This is a very powerful and elegant way to provide custom functionality without requiring anything more than an entry in a setup table. Unfortunately, I haven't yet seen many places where this type of extensibility is used in PeopleSoft 8.9.
Quite a few of the classes handle things like page layout and validation, things we definitely wanted to modify. They even delivered a lot of "factory" like classes that their code calls and all it does is return an object of a certain type. It seemed like a perfect setup for being able to customize the look and feel and behavior by simply supplying custom application classes. However, the implementation classes are hardcoded in the factory methods. So while there is a way to substitute the implementation of a certain class it still requires a modification to delivered code.
The Approvals Framework, on the other hand, is a perfect example of how application classes should be used. It is completely built around the concepts of dynamically loading classes at runtime based on values entered in setup tables. No code modifications are required, you just create your class and enter the fully qualified name in a setup table. The framework looks up the class you specify, loads it up dynamically at runtime and then calls the methods on it.
An example (code changed to protect the innocent):
class MyEventHandler extends BaseEventHandler
method onApprove();
method onDeny();
...
...
end-class;
...
The framework can then lookup the class name in a setup table and call the methods it provides. It knows what methods it can call based on the fact that my class must extend a class they know about (BaseEventHandler).
Local string &clazz = /* sql lookup here */;
Local BaseEventHandler &object;
&object = CreateObject(&clazz) as BaseEventHandler;
&object.onApprove();
PeopleSoft, which knows nothing about my custom class, is able to load it up and use it. This is a very powerful and elegant way to provide custom functionality without requiring anything more than an entry in a setup table. Unfortunately, I haven't yet seen many places where this type of extensibility is used in PeopleSoft 8.9.
Sunday, September 23, 2007
Notepad++ 4.3 released
Notepad++, my favorite text editor, released version 4.3 this week. Looks like mostly bug fixes and a few new features.
AJAX and PeopleSoft
After Ethan sent me the link to the PeopleSoft Auto-Save with Ajax post on the ITToolbox site I was inspired to try AJAX on a PeopleSoft page (and excited to try the jQuery library for the first time as it looked very cool). The blog post on the ITToolbox site had some great javascript code, but offered no details on how the whole thing was put together. Below are the exact steps I took to add AJAX to a page in PeopleSoft.
Before I get started I want to point out that I decided against trying the auto-save feature. While I think that this type of feature would be extremely useful in some use cases, I feel the Component you implement it with must be designed for it. Auto-saves should be saved as drafts and should not effect the current data stored in the tables. When the user actually clicks some sort of Save button, only then should the auto-saved data replace the data that existed before.
To simply my AJAX/PeopleSoft experience I decided to just create a dynamic DIV on an existing page. The DIV is updated periodically by sending an AJAX request to an IScript function which returns HTML that is placed directly into the DIV. This was done with PeopleTools 8.46.17.
Step 1.
I opened the Page I wanted to AJAX-ify and added an HTML Area control to the top of the page (specifically I added DERIVED_PTP.HTMLAREA).
Step 2.
I downloaded jQuery 1.2.1. I grabbed the "packed" version which is the smallest weighing in at only 26kb. As the ITToolbox entry hinted at, I tried adding the downloaded contents to an HTML object. However, when I tried to save the object in Application Designer I got the following error:
Object size exceeds 32K limit. Proceed with Save?
It let me save it anyway so I named the HTML object FR_JQUERY. When I opened up the page I received several javascript errors and when I looked at the cache javascript file that was created I found it was truncated. This happened when I used the code from the ITToolbox site:
In order to make it work I added the contents of the packed jquery.js to a Message Catalog Entry (more details below).
Step 3.
I created an HTML object named FR_ISSUE_LOG_SRCH_DHTML with my code and a bind variable that I would later replace with the jQuery library. Here's the HTML object code:
FR_ISSUE_LOG_SRCH_DHTML HTML Object
Step 4.
On the Page Activate event I added the following code to populate the HTMLAREA field I had previously added to the Page.
What is noteable here is that the entire contents of the jquery.js file are stored in the Message Catalog and placed in the HTMLAREA using the %bind(:1) substitution variable. In our environment we can not easily added files to the webserver directory, so this provided a nice solution that did not require me to add any files to the webserver.
Step 5.
Finally, I created an IScript function that simply does a SQL Fetch for all rows entered in our custom table for the particular user viewing the page.
This was just an experiment on my part and only rates a 1 out of 10 on the coolness meter. My primary motivation was just to see how feasible it was to use AJAX on a PeopleSoft page. I was quite happy to find that it was easier than I expected (save for my little issue with placing the jquery.js code on the page). Also, I was able to dabble a lot with jQuery and find that it makes DOM manipulation and AJAX very easy and I will find a use for it in my next project.
Unlike the ITToolbox post, I was not attempting to interact with the component processor. Trying to involve actions by submitting the form information to the component processor and doing partial page updates is fairly complex and in my opinion looks like it can be prone to error. For the next couple of projects I think I'll stick to IScript type page refreshes to build my comfort level until a point when I am ready to do field validation and auto-saves.
Before I get started I want to point out that I decided against trying the auto-save feature. While I think that this type of feature would be extremely useful in some use cases, I feel the Component you implement it with must be designed for it. Auto-saves should be saved as drafts and should not effect the current data stored in the tables. When the user actually clicks some sort of Save button, only then should the auto-saved data replace the data that existed before.
To simply my AJAX/PeopleSoft experience I decided to just create a dynamic DIV on an existing page. The DIV is updated periodically by sending an AJAX request to an IScript function which returns HTML that is placed directly into the DIV. This was done with PeopleTools 8.46.17.
Step 1.
I opened the Page I wanted to AJAX-ify and added an HTML Area control to the top of the page (specifically I added DERIVED_PTP.HTMLAREA).
Step 2.
I downloaded jQuery 1.2.1. I grabbed the "packed" version which is the smallest weighing in at only 26kb. As the ITToolbox entry hinted at, I tried adding the downloaded contents to an HTML object. However, when I tried to save the object in Application Designer I got the following error:
Object size exceeds 32K limit. Proceed with Save?
It let me save it anyway so I named the HTML object FR_JQUERY. When I opened up the page I received several javascript errors and when I looked at the cache javascript file that was created I found it was truncated. This happened when I used the code from the ITToolbox site:
<script src="%JavaScript(FR_JQUERY)"></script>
In order to make it work I added the contents of the packed jquery.js to a Message Catalog Entry (more details below).
Step 3.
I created an HTML object named FR_ISSUE_LOG_SRCH_DHTML with my code and a bind variable that I would later replace with the jQuery library. Here's the HTML object code:
FR_ISSUE_LOG_SRCH_DHTML HTML Object
<div id="new-issues">
</div>
%Bind(:1)
<script type="text/javascript">
var pollInterval = 15000;
function getIssues()
{
$("#new-issues").load("/psc/pshome/.../WEBLIB_..IScript_...");
setTimeout("getIssues()", pollInterval);
}
getIssues();
$("#new-issues").css({
left:"600px",
position: "absolute",
width: "250px",
fontSize: "9px",
padding: "2px",
});
</script>
Step 4.
On the Page Activate event I added the following code to populate the HTMLAREA field I had previously added to the Page.
Local string &jquery = MsgGetExplainText(31000, 3, "message not found");
DERIVED_PTP.HTMLAREA.Value = GetHTMLText(HTML.FR_ISSUE_LOG_SRCH_DHTML, &jquery);
What is noteable here is that the entire contents of the jquery.js file are stored in the Message Catalog and placed in the HTMLAREA using the %bind(:1) substitution variable. In our environment we can not easily added files to the webserver directory, so this provided a nice solution that did not require me to add any files to the webserver.
Step 5.
Finally, I created an IScript function that simply does a SQL Fetch for all rows entered in our custom table for the particular user viewing the page.
This was just an experiment on my part and only rates a 1 out of 10 on the coolness meter. My primary motivation was just to see how feasible it was to use AJAX on a PeopleSoft page. I was quite happy to find that it was easier than I expected (save for my little issue with placing the jquery.js code on the page). Also, I was able to dabble a lot with jQuery and find that it makes DOM manipulation and AJAX very easy and I will find a use for it in my next project.
Unlike the ITToolbox post, I was not attempting to interact with the component processor. Trying to involve actions by submitting the form information to the component processor and doing partial page updates is fairly complex and in my opinion looks like it can be prone to error. For the next couple of projects I think I'll stick to IScript type page refreshes to build my comfort level until a point when I am ready to do field validation and auto-saves.
Subscribe to:
Posts (Atom)