Power Outage this morning

Written by klee on March 24th, 2010

Nothing like getting a foot of snow, then having the power go out to start your day! Luckily, my employer saw the wisdom in closing today.

I had to pick up one of my kids from the local theater last night. When I dropped him off, there was just the start of a little rain. When I picked him up, I had chains on the tires. A good thing as there were several cars that has slid off into ditches on the way. Front wheel drive with chains beats 4WD every time. Even though it is Spring, Winter just isn’t that far away, especially when you live close to 7,000 ft in elevation.

The power went out twice this morning. I have an older TripLite UPS on my server. By the time I got down to the basement, everything was off. At some point, I really need to hook up the cable from the ups to my server that notifies when power is going down and to shut down nicely.

I was lucky in that nothing was really corrupted. I have about four years of half.com history of the top 200 book lists that I have been scrapping with a perl script. Originally, I was going to use the data to create lists of books that are valuable, and hopefully can be found at local library book fairs. Although I thought this was a good idea, it never amounted to much. I still keep track of the top 200 list.

I’ll post a picture of my server in the basement later for anyone that wants to see my setup!

Servers

My server room

 

Oracle Portlets with multiple datasources

Written by klee on March 12th, 2010

I just finished creating an updated portlet for work. There were two changes that were needed, data from two different database instances and the format was changed to use <dt> and <dd> tags. This allows for a rolling scrollable format to be defined by a cascading style sheet.

I thought this would take a couple of hours, so estimated this at about four hours to complete. Now I’m finished, and it is six hours after starting. So what went wrong? The biggest mistake that I made was not really understanding what happens when the files are bundled up for deployment. When creating the two separate model projects, I used the same name for the package name. I was using different names for the model projects, so no problem, right? Wrong! When the files get packaged, the package names are used in a combined classes directory. Since I have two different bc4j.xcfg files defined, one of them gets clobbered and I get an obscure jbo oracle error.

If you are using multiple models in a project, just use a unique package name for each one, and things will go much better for you! Though, it might still take six hours instead of two…

 

WPTouch Plugin installed

Written by klee on February 22nd, 2010

For those that use an iPhone or iTouch, I have installed the WPTouch Plugin. This should make viewing much more better!

 

RMOUG Presentation, Part 2

Written by klee on February 18th, 2010

ScreenToaster video of Ubuntu Install and Oracle XE

 

RMOUG Presentation, Part 1

Written by klee on January 31st, 2010

For RMOUG (February 17 – 18, 2010) this year, I have a presentation called, “APEX – Moves from the Garage to the Basement”. I wasn’t sure if my presentation would be accepted based on the title. Who knew? The title is actually supposed to be a play on the real life story of HP starting their business in the Garage. For developer’s today, the same can be accomplished with a spare PC, Internet connection, and a few pieces of software including ApEx. To get this really going, I added information on setting up dyndns with a cable modem, which is the setup I personally have, and seems fairly common. This can be extended to most any broadband setup as well. The idea of the basement came from my own setup as well. I have a 24 port gigabit switch in my basement, so I setup a small table that has an old PC and a UPS next to the router.

I also have a domain name and use the custom dyndns service for less than 30 dollars (US) a year. An extra bonus, is Mail for Google Apps. I run the server from by basement, but have all of my mail routed through Google. That isn’t part of the presentation, but thought I would add that. Google, for me, just can’t be beat when used as a spam filter. I used to run my own mail server with postfix and spam-assassin. I just couldn’t keep up with the new ways I was getting spam, and really didn’t appreciate what was coming through and available to my kids. Using Google as a filter has solved this issue about 99.999 percent of the time.

I will add postings of how I set this up soon. Right now, the latest Ubuntu LTS server has been released, and I need to check this out with another virtual machine install. As for that, if anyone wants to know, I use both VMWare and VirtualBox. I had almost made the switch to VirtualBox completely, but am waiting to see what the fallout of this software will be with the Sun acquisition by Oracle. I have always though Oracle’s VM Software was lacking, so it will be interesting to see what develops! I wish I could be testing ApEx 4.0 as well with the new server VM. That will have to wait for another post when the software becomes available to the general public.

 

First week of training on UCM Admin down, one week of Site Studio training to go!

Written by klee on January 23rd, 2010

UCM Admin Training with Jason Stortz

 

Favorite Linux Command

Written by klee on December 31st, 2009
find . -name ".svn" -exec rm -rf {} \;
 

RMOUG 2010 – February 17 – 18, 2010

Written by klee on October 25th, 2009

I will be presenting a fun session titled, “ApEx – From the Garage to the Basement”. This session will discuss how entrepreneurs can build a working environment for ApEx development in their basement with an old PC and Internet connection. In the past where companies like HP started in the garage; today, we have developers creating applications using a PC tucked away in the basement.

Hopefully, this presentation will be a fun time for all. Hope to see you there!

 

Steps taken to increase performance in Moodle using Oracle database

Written by klee on September 29th, 2009

This may be a little off topic, but I was on a team to help resolve a performance issue with Moodle using Oracle for the backend database. The following is part of the solution that was found.

Changing the CLOB datatype to VARCHAR2(4000) in the m_config database table provided the most help. The following links were the resources I found to point this out.

http://tracker.moodle.org/browse/MDL-16955
http://moodle.org/mod/forum/discuss.php?d=87509#p389413

Using SQLDeveloper, I performed the following actions to the data after stopping the Apache Web server.

create table m_config_original as (select * from m_config);
drop table m_config;
CREATE TABLE M_CONFIG
(
ID NUMBER(10,0) NOT NULL ENABLE,
NAME VARCHAR2(255 BYTE) NOT NULL ENABLE,
VALUE VARCHAR2(4000 BYTE) NOT NULL ENABLE
);
insert into m_config (select * from m_config_original);

Restart the Apache web server

With this single change, the pages displayed in 2/3 less time based on
the original display time. This was a significant amount – 15 seconds
down to 5 seconds.

Additional Notes:
Before applying the changes to the m_config table, I needed to determine
if the oci8 driver was the main problem. I was able to verify that the
OCI8 driver was not the issue by running the following test page on the
moodle server. Here is the PHP code:

<?php

# Sample code for make connection with Oracle Database and send simple DDL,DML and query commands from oci8 extension.
# Database instance: fuju
# host name :  fuju.exzilla.net
# lintener port number : 1521
# user : scott
# Password : tiger
# You can connect to database server from this program without setting tnsnames.ora.
# fuju at exizilla dot net, Jan10,2002
# Modified from original of " http://www.php.net/manual/en/function.ocilogon.php "

print "<HTML><PRE>";
# Sample connection string, use your own values before testing
# $db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = fuju.exzilla.net)(PORT = 1521)))(CONNECT_DATA=(SID=fuju)))";
$c1 = ocilogon("username","password",$db);
$c2 = ocilogon("username","password",$db);

function create_table($conn)
{ $stmt = ociparse($conn,"create table hellotable (hellocol varchar2(64))");
ociexecute($stmt);
echo $conn." created hellotable\n\n";
}

function drop_table($conn)
{ $stmt = ociparse($conn,"drop table hellotable");
ociexecute($stmt);
echo $conn." dropped hellotable\n\n";
}

function insert_data($conn)
{ $stmt = ociparse($conn,"insert into hellotable
values('$conn' || ' ' || to_char(sysdate,'DD-MON-YY HH24:MI:SS'))");
ociexecute($stmt,OCI_DEFAULT);
echo $conn." inserted hellotable\n\n";
}

function delete_data($conn)
{ $stmt = ociparse($conn,"delete from hellotable");
ociexecute($stmt,OCI_DEFAULT);
echo $conn." deleted hellotable\n\n";
}

function commit($conn)
{ ocicommit($conn);
echo $conn." committed\n\n";
}

function rollback($conn)
{ ocirollback($conn);
echo $conn." rollback\n\n";
}

function select_data($conn)
{ $stmt = ociparse($conn,"select * from hellotable");
ociexecute($stmt,OCI_DEFAULT);
echo $conn."----selecting\n\n";
while (ocifetch($stmt))
echo $conn." <".ociresult($stmt,"TEST").">\n\n";
echo $conn."----done\n\n";
}

# start Main program
echo "<h3> Start :: Simple oci8 extension functions test </h3><p><hr><p>";

create_table($c1);
insert_data($c1);   // Insert a row using c1
insert_data($c2);   // Insert a row using c2

select_data($c1);   // Results of both inserts are returned
select_data($c2);

rollback($c1);      // Rollback using c1

select_data($c1);   // Both inserts have been rolled back
select_data($c2);

insert_data($c2);   // Insert a row using c2
commit($c2);        // commit using c2

select_data($c1);   // result of c2 insert is returned

delete_data($c1);   // delete all rows in table using c1
select_data($c1);   // no rows returned
select_data($c2);   // no rows returned
commit($c1);        // commit using c1

select_data($c1);   // no rows returned
select_data($c2);   // no rows returned

drop_table($c1);
print "</PRE></HTML>";

echo "<hr><h3> End :: Simple oci8 extension functions test </h3>";

?>

This test confirmed that the OCI8 driver was functioning correctly and
was not the problem.

With this change, performance improved by reducing the time to display pages by 67%!

 

Using JSTL Exception Handling in JDev 10.1.2 Portlet

Written by klee on June 19th, 2009

The following is a portlet I recently updated for Oracle Portal. The dates were not formatting properly, so I added a JSTL catch tag. This also uses choice tags which help when you need an else tag after an if tag.

<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<%@ taglib uri="http://xmlns.oracle.com/adf/ui/jsp/adftags" prefix="adf"%>

<%@page contentType="text/html; charset=UTF-8"%>
<%@page import="oracle.portal.provider.v2.http.HttpCommonConstants"%>
<%@page import="oracle.portal.provider.v2.render.PortletRenderRequest"%>
<%@page import="oracle.portal.provider.v2.render.http.HttpPortletRendererUtil"%>
<%@page import="oracle.portal.provider.v2.url.UrlUtils"%>

<adf:uimodelreference
model="htdocs_busroutesportlet_BusRoutesPortletShowPageUIModel" />
<jsp:useBean id="now" class="java.util.Date" />

<script type="text/javascript"
src="/BusRoutes2009Portlet/scripts/busroutes2009.js"></script>

<c:set var="nowdate" scope="page"><fmt:formatDate value="${now}" /></c:set>
<c:set var="school" scope="page" value="" />

<%
PortletRenderRequest pReq =
(PortletRenderRequest)
request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST);

String paramNameSchool = "sch";
String sSQLQuery = "";
String paramNameSubmit = "submit";

String qualParamNameSchool =
HttpPortletRendererUtil.portletParameter(pReq, paramNameSchool);
String qualParamNameSubmit =
HttpPortletRendererUtil.portletParameter(pReq, paramNameSubmit);

String sSchoolValue = pReq.getQualifiedParameter(paramNameSchool);

String formName = UrlUtils.htmlFormName(pReq,"busroutes_form");

pageContext.setAttribute("school",(Object)sSchoolValue);
%>

<script>
var sSch = <%=sSchoolValue%>;
</script>

<c:set var="sch"><%=sSchoolValue%></c:set>

<form name=<%=formName %> method="POST"
action="<%= UrlUtils.htmlFormActionLink(pReq,UrlUtils.PAGE_LINK) %>">
<%= UrlUtils.htmlFormHiddenFields(pReq,UrlUtils.PAGE_LINK, formName) %>
Select School and press submit to see schedule.
Click on column heading to sort.<br />
<br />
School:
<select name="<%=qualParamNameSchool%>" id="ctlSchool">
<option value="0" >-- Select a School --</option>
<c:forEach var="row" items="${bindings.SchoolsView1.rangeSet}">
<c:choose>
<c:when test="${sch == row.Id}">
<option value="<c:out value="${row.Id}"/>" selected="selected">
<c:set var="mapurl" scope="page">
<c:out value="${row.MapUrl}" />
</c:set>
<c:set var="websiteurl" scope="page">
<c:out value="${row.WebsiteUrl}" />
</c:set>
<c:set var="schooltype" scope="page">
<c:out value="${row.TypeId}" />
</c:set>
</c:when>
<c:otherwise>
<option value="<c:out value="${row.Id}"/>">
</c:otherwise>
</c:choose>
<c:out value="${row.School}" />
</option>
</c:forEach>
</select>
<br />
<br />
<input type=submit name="<%= qualParamNameSubmit %>" value="submit" />
</form>

<br />
<br />

<table border="0" id="urls">
<tbody>
<tr>
<td>
<c:choose>
<c:when test="${not empty mapurl}">
<a href="<c:out value="${mapurl}"/>"
target="_blank">
<font class="titleorimageid1siteid53">
Bus Route Map
</font>
</a>
</c:when>
<c:otherwise>
&nbsp;
</c:otherwise>
</c:choose>
</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>
<c:choose>
<c:when test="${not empty websiteurl}">
<a href="<c:out value="${websiteurl}"/>"
target="_blank">
<font class="titleorimageid1siteid53">
School Web Site
</font>
</a>
</c:when>
<c:otherwise>
&nbsp;
</c:otherwise>
</c:choose>
</td>
</tr>
</tbody>
</table>

<br />
<br />

<c:set var="vo" scope="page" value="${bindings.BRView_2009_1.viewObject}" />
<%
try {
Object o = pageContext.getAttribute("vo");
oracle.jbo.ViewObject vo = (oracle.jbo.ViewObject)o;
String sWhereClause = "SCHOOL_ID = "   sSchoolValue   " ";

vo.setWhereClause(sWhereClause);
sSQLQuery = vo.getQuery();

vo.executeQuery();
System.out.println("Query: "   vo.getQuery());
System.out.println("sSchoolValue: "   sSchoolValue);
} catch (Exception e) {
System.out.println("Error:"   e.getMessage());
System.out.println("sSchoolValue = "   sSchoolValue);
}
%>

<br />
<br />

<table id="example" class="tablesorter" border="1" width="100%">
<thead>
<tr>
<th style="text-align: center"><c:out value="Route" /></th>
<c:choose>
<c:when test="${schooltype == 3}">
<th style="text-align: center"><c:out value="Route Animal" /></th>
</c:when>
<c:otherwise>
<th style="text-align: center">&nbsp;</th>
</c:otherwise>
</c:choose>
<th><c:out value="Stop" /></th>
<th style="text-align: center"><c:out value="AM" /></th>
<th style="text-align: center"><c:out value="PM" /></th>
<th style="text-align: center"><c:out value="Start Date" /></th>
<th style="text-align: center"><c:out value="Stop Date" /></th>
</tr>
</thead>
<tbody>
<c:forEach var="Row" items="${bindings.BRView_2009_1.rangeSet}" >
<c:catch var="errorvalue">
<fmt:parseDate value="${Row['StartServiceDate']}"
var="startdate"
pattern="MM-dd-yyyy" />
<fmt:parseDate value="${Row['StopServiceDate']}"
var="stopdate"
pattern="MM-dd-yyyy" />
</c:catch>

<c:if test="${not empty startdate}">
<c:set var="startdatedisplay" scope="page">
<fmt:formatDate value="${startdate}" />
</c:set>
</c:if>

<c:if test="${not empty stopdate}">
<c:set var="stopdatedisplay" scope="page">
<fmt:formatDate value="${stopdate}" />
</c:set>
</c:if>

<tr>
<td align=center><c:out value="${Row['Route']}" />&nbsp;</td>
<c:choose>
<c:when test="${schooltype == 3}">
<td align=center>
<img src="someurl.retrieve_image?p_id=<c:out value="${Row['ImageId']}" />"
alt="no image" /></td>
</c:when>
<c:otherwise>
<td align=center>&nbsp;</td>
</c:otherwise>
</c:choose>
<td><c:out value="${Row['Stop']}" />&nbsp;</td>
<td align=center><c:out value="${Row['Am']}" />&nbsp;</td>
<td align=center><c:out value="${Row['Pm']}" />&nbsp;</td>
<c:choose>
<c:when test="${now ge startdate}">
<td align=center>&nbsp;</td>
</c:when>
<c:when test="${now lt startdate}">
<td align=center style="color: blue;">
<c:out value="${startdatedisplay}" />&nbsp;
</td>
</c:when>
<c:otherwise>
<td align=center><c:out value="${startdatedisplay}" />&nbsp;</td>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${now lt stopdate}">
<td align=center style="color: red;">
<c:out value="${stopdatedisplay}" />&nbsp;
</td>
</c:when>
<c:otherwise>
<td align=center><c:out value="${stopdatedisplay}" />&nbsp;</td>
</c:otherwise>
</c:choose>
</tr>
</c:forEach>
</tbody>
</table>

<br />
<br />