Recently I have been working on a project that involves extracting a bunch of files from zips. The problem I faced was all the shortcuts within the zips were hard coded to locations, making it impossible for me to move the extracted zip data to wherever I may want. I wanted a native library that could read and modify Windows Shortcuts so I could drop my zip data anywhere; my project is in Java, and its instant cross compatibility was needed. I know all my clients have Java installed, so that made its dependency not a issue. After looking around on the internet and finding several options, including the popular https://github.com/jimmc/jshortcut. Now the downside the this popular jShortcut library is you need a DLL, why you need a DLL to write a binary file, I am not sure. More specifically, you need a DLL for your PCs instruction set, ick! After searching the far reaches of github, and getting to the end of my rope I found https://github.com/kactech/jshortcut, written 5 years ago, and not really popular on github I thought I would give it a try. IT’S AMAZING! With no dependencies, and just a single include, you can write, modify, and create new Windows Shortcuts! There is example code included, and it couldn’t be easier to use. I just wanted to make sure anyone who has had the same problem knows about this great library.
How To Remove Branding From a Dell OEM Server
NOTE: This is for Dell OEM systems only, run at your own risk.
Recently I have RMAed motherboards for non-branded Dell servers. The problem I ran into is I was getting branded system boards back when I had originally had non-branded. The non-branded BIOSes would just be blank with a progress bar instead of having the Dell logo. I ended up spending more time and energy talking to Dell again trying to get boards to my specifications. I was told by several Dell engineers that unfortunately there was no way to fix this other than the factory setting the board up.
Well they were wrong, and because I didn’t find this anywhere online I am going to detail the instructions. Note: this is ONLY for people who need to un-brand systems from Dell, I have done this with 12th Generation servers and nothing else.
- Remove the old motherboard, and install the new motherboard into the chassis
- Now the first thing Dell training says is to set the service tag on the system now, DO NOT DO THIS YET
- If you set the service tag, the unbranding tool will not work. If you have already set the service tag, more than likely by booting to DOS and using ftp://ftp.dell.com/utility/asset_a209.com, then you can still fix this. Boot back to DOS and use the tool again, except with “asset_~1 /s /d”. This is an undocumented feature that will remove the service tag of the box.
- Start up any version of Windows that is at least Windows Vista loaded. I used Windows 8 because you can get a 90 day evaluation for free. And that is enough for me to do what work I need done on the box before handing it over.
- Go to Support.Dell.com, and look up the box by the service tag to get to the OEM support site. If you don’t have the service tag, look up the generic version and get the url, currently for a R720 it looks like this http://www.dell.com/support/troubleshooting/us/en/04/Product/poweredge-r620. Now if you replace “poweredge” with “oth” you get the oem version. So http://www.dell.com/support/troubleshooting/us/en/04/Product/oth-r620”.
- Go to Drivers and Downloads, and find the download for “Identity Module”, I had to switch the OS selector to “Windows Server 2008 x64” to find it. Then hit “Download File”
- Now it will offer ~3 different files, one will be similar to “R620_Identity-Module_Application_WCPFW_WN32_1.01_A00.EXE”, stating “Identity-Module_Application”, download this file.
- Run this in Windows, it will ask if you are sure and just say yes. It can take up to 5 minutes, MAKE SURE NOTHING INTURUPTS THE SERVER IN THIS TIME.
- Reboot the server, and it will come up with the branding again, then it will give a special message once it gets past post similar to “modifying branding”
- The system will reboot again, and the branding is gone
- Now go into the DOS bootable drive, USB works well, and set the service tag for the system.
Now your OEM box that was impossible to unbrand has been unbranded.
Home Repairs and Nest
A little different than the normal tech posts I do, I am going to talk about the week of repairs I have done on my parents house. I came home from college, to find many little items needing fixing around the house. Including the broken dishwasher, now back in January I had a broken drier that after a afternoon with a voltmeter I found the broken part and fixed.
Dishwasher
Being that the dishwasher is over 10 years old with no warranty on it, I thought I would attempt repairs before telling the parents we need a new one. The system was not draining, so I got out the wet dry vac and cleaned all that out. Thats when I learned that it also was not filling and the circulation motor was not working. I am now much more informed of the entire system of my model dish washer, to say the least. I have found in repairing these appliances, and other installations such as the Nest, taking a lot of photos with my phone along the way helps; for if I have to recall which wire goes where, a photo is a life saver.
First I wanted to fix the motor because it smelled like it was burning itself out trying to work. It turned out that several whole almonds had made their way down into the drive of the circulation motor and were causing it to not spin. After several minutes with a screw driver they were removed and the motor was working again. Next water was not entering the system, I ended up replacing the intake valve using my local appliance store (marcone.com, I mention the name simply because of the great service they gave me). The final touch that got the machine working was filling the bottom with a gallon of water and a splash of vinegar. Now the machine is working and running several cycles to make sure it will stay happy for the foreseeable future. The last part I need comes in tomorrow, it is the “non-return intake valve”; a part that makes sure water that is expelled from the system does not return. The old one disintegrated over time.
Nest
Now that we don’t have to clean dishes from hand, I got a new toy for the house. The house was built in 1945, the land used to be a victory garden, and has used the same thermostat for the last 20 years. The house has a heat pump, as well as a oil burning furnace; for this house the furnace is much more efficient on a dollars basis. The problem with ever replacing the thermostat to a new model was that with the two stage heating we didn’t know which models would work with all the settings the old thermostat had. After going through the compatibility checker on the Nest website it said our system would work. And I took it upon myself to try a self installation. In theory the Nest should save power (the internet seems to say it can go up to 20%) as well as give us more convenient control over the system.
Below are some photos of the old Honeywell thermostat, before I did anything I cut power to the house to make sure nothing was live. As I removed the plate of the old thermostat, the wires were clearly labeled. The Nest came with stickers to put on each wire while disconnecting them. Then I just had to put the Nest base in, put all the wires in the holes and turn the power back on. Some of my wires did not have matching places to put them on the new system, but after a quick Google search, I found answers on Nest support forms. The setup was fairly simple, yet I had to go in and tell it what the different wires did and what heating/cooling systems the house had. Over all the setup was not too difficult, just a little nerve racking changing the center for climate control in the house.
The Nest rebooted several times with updates once on the Wifi. One feature my father was insistent on was that it never activate the old heat pump and always use the oil furnace, the online Nest tool let me change this setting easily. So far the system has worked well, but with it being around 70F most of this week we have yet to give it that much to do. If this system works well we may exchange other thermostats in the house for Nests as well. The newer part of the house has radiant heating and in theory Nest knows how to handle that efficiently. I will post some updates as time goes on, I am interested to see how Nest does with the big old house, and the power bill; once it gets up and running it gives power reports for the house, these will be interesting to see.
WQL, SQL Queries for Windows Backend (Part 1)
If you have been writing web apps for a while, or other apps you more than likely have used SQL. SQL allows you to query a database and interact with your applications data. Instead of trying to find a users profile, what if we wanted to find out what a user was printing on their local machine? If there was an easy interface for that, it could make programming for a platform like Windows a lot easier. Well Microsoft years ago added this ability to Windows; the technology is called WQL. This was added with the other components of WMI (Windows Management Instrumentation) at Windows ME. For Windows 9x and NT you can download the WMI core. This article will be a brief over view of what it can do and how you can play around with it.
First like when we looked at LDAP, we want a tool that will let us quickly play around with what is available, and then code that into our application. The tool I use is WMI Explorer, http://www.ks-soft.net/hostmon.eng/wmi/, it provides a easy interface to look at all the data available. With the WMI core it works with everything back to Windows 95! You can download and run the program for free, no installation required. Once open, there is a upper portion of the window that lists all the spaces you can access, these would be the ‘tables’ in SQL. Depending on your version of Windows, there will be separate options available. I have used this interface before for network cards (6to4 Cleaner) and printers.
For this example I will go over to the Win32 framework and access the Win32_Printer ‘table’. I get a list of printers the machine has installed, as well as attributes to each of these printers. Any administrator, or any program attempting to manager printers (I say attempting because printers can he a horrible experience) information – like what port the printer is using – is here, in addition what type of connection this machine has to the printer. At the bottom of the Window there is a Query that is building as you select different fields. This query can be moved into a application later to get the same data in code. WMI Explorer also allows for a user to write Queries directly without this interface; that is the second tab at the top of the window.
One downside I have found in using WMI is the setup process time, in C#/.NET using WMI is easy, but it takes time to start accepting queries. About a year or two ago I was working on querying network card information on Windows Vista. The first call could take a few seconds to respond, after that first call it would speed up, this is just something that has to be accounted for in the applications design. I found running WQL queries in a separate process, and starting them as soon as possible would allow the process to finish before the user needed the data.
I just wanted to get everyone started looking at what is available, in a later article I will go into more depth about programming with this and how you can interact with this data in a C#/.NET program.
Combining CAS and LDAP
After going over CAS and LDAP, I thought I would do an example where both are used together. I have some software like this, it allows users to log in and then LDAP can go and get their full name. The example is mostly the CAS example with some LDAP added on. All I did was add on the LDAP code into the section where a user is logged into CAS. I use CAS to get the username of the user and feed it into LDAP. Below is the new index of the CAS example, nothing else is changed:
<?PHP
//Dan Berkowitz LDAP tutorial, May 2013, Buildingtents.cominclude_once(“./CAS-1.3.2/CAS.php”);
phpCAS::client(CAS_VERSION_2_0,’cas-auth.rpi.edu’,443,’/cas/’);
// SSL!
phpCAS::setCasServerCACert(“./CACert.pem”);//this is relative to the cas client.php fileif (phpCAS::isAuthenticated())
{$LDAPCON = ldap_connect(“ldap.rpi.edu”); //Have to be internal to VCC or VCC firewall will block
$LDAPBIND = ldap_bind($LDAPCON);
$ResultArray = Array();
$filterArray = array(“givenname”, “sn”);
$LDAPSEARCH = ldap_search($LDAPCON, “dc=rpi, dc=edu”, “(uid=” . phpCAS::getUser() . “)”, $filterArray, 0 , 10);
$LDAPRESULTS = ldap_get_entries($LDAPCON, $LDAPSEARCH);
//print_r($LDAPRESULTS);
for ($i = 0; $i < $LDAPRESULTS[“count”]; $i++)
{
$tempRow = Array();
array_push($tempRow, $LDAPRESULTS[$i][“givenname”][0]);
array_push($tempRow, $LDAPRESULTS[$i][“sn”][0]);
array_push($ResultArray, $tempRow);
}
ldap_close($LDAPCON);echo “User:” . phpCAS::getUser();
if (sizeof($ResultArray) == 1)
{
echo ” ” . $ResultArray[0][0] . ” ” . $ResultArray[0][1];
}
echo “<a href=’./logout.php’>Logout</a>”;
}else{
echo “<a href=’./login.php’>Login</a>”;
}
?>
Download: https://github.com/daberkow/daberkow.github.io/blob/master/CASExample.zip
LDAP Authentication RPI Tutorial (Part 3)
Now that we have gone over how to setup LDAP, and went into some more depth about how to search using it, we will now look at actually writing a web page in PHP that uses LDAP. As always, I will be using RPI as my example but this should work for anyone with an LDAP system. (Note to people at RPI, you need to VPN in unless you are in the VCC for this to work, I have had luck with doing this in Lally, but in the Union it failed) The first example will go over how to just use LDAP to return information; the second one will incorporate the CAS example that was done before, and search for the user that logs in, this will be put out in a few days. The LDAP servers I am using do not require authentication, if the one you are using does then you will need to go to http://www.php.net/manual/en/function.ldap-bind.php and look at using authentication on your bind command.
- Within a new PHP document, enter the following line with ‘ldap.rpi.edu’ replaced with your LDAP server. The variable can be named anything as long as you remember it is for the connection.
- “$LDAPCON = ldap_connect(‘ldap.rpi.edu’);”
- Now we have to bind to the server, this is when credentials are given (if needed) and we fully connect. If the server is unreachable, or you are not permitted to connect this is where PHP will throw an error. As you can see, we create a new variable for the binding, and feed in our connection variable.
- “$LDAPBIND = ldap_bind($LDAPCON);”
- We have seen before that LDAP can return vast amounts of information on a single item, and since many servers have a limit on how much they will return it is good practice to filter for just what we want back. Here I will be requesting the “givenname” and “sn” for each user. These items must be put into an array like shown.
- “$filterArray = array(‘givenname’,’sn’);”
- The core of the search is the search command. Here we give all the different compounds we have made and put them together. First, we enter the connection to use; second, we enter the base for the search (described in part 1&2). Following that we enter a filter for how we want to search the directory, this is not the filter we setup one step ago but a filter to tell the central LDAP what we are looking for. I am searching for anyone with a UID that starts with ‘berkod’. Then we enter the filter we setup earlier for the types of data we want returned. The last two settings are setup per instance; start with a 0 or 1 for attributes only filter, 0 means return the full data, 1 means that you just want the type returned if data exists (this is for more of a fast exploratory search). To end the command you enter the number of results that should be returned; 0 is no limit, yet I am hoping to search usernames and get 1 result. I entered 10 just so if more than 1 user exists under my filter I will know.
- $LDAPSEARCH = ldap_search($LDAPCON, “dc=rpi, dc=edu”, “(uid=berkod*)”, $filterArray, 0 , 10);
- The results from the search have to be stored in a separate variable
- $LDAPRESULTS = ldap_get_entries($LDAPCON, $LDAPSEARCH);
- Now for a quick and dirty view of the result you can simply print out the data
- “print_r($LDAPRESULTS);”
- But that just lets you quickly see if you are getting data back, to properly put the data into an array use the following code. This will get the two pieces we requested for each user (“givenname” and “sn”) and store them in an array; then put that array into another array. The final format is $variable[$user][0 for ‘givenname’/ 1 for ‘sn’]. This data can be used by other code or printed out.
-
$ResultArray = Array();for ($i = 0; $i < $LDAPRESULTS[“count”]; $i++){$tempRow = Array();array_push($tempRow, $LDAPRESULTS[$i][“givenname”][0]); // 0 is used because my database just has one item per userarray_push($tempRow, $LDAPRESULTS[$i][“sn”][0]);array_push($ResultArray, $tempRow);}
-
- Then for good practice close the LDAP connection
- “ldap_close($LDAPCON);”
The next post will go over combining CAS and LDAP. Until then thanks for commenting and feel free to ask questions.
References:
LDAP Authentication RPI Tutorial (Part 2)
Last time I spoke of how to setup ldap with PHP and briefly touched on using the “ldapsearch” command. I would like to go more in-depth on “ldapsearch”, and show you how you can use it to craft searches for your PHP application. Specifically for RPI, if the user has a RCS account, they can ssh into “rcs-ibm.rpi.edu” and run the following commands. (RCS-IBM puts you on either clark.server.rpi.edu or lewis.server.rpi.edu, these two have the commands you need on them and run AIX) To briefly review the command:
- First we add the command, then enter the host you are searching, tell the server to try simple anonymous authentication. Next give the server a base to start the search (I am using RPI specific domain components), finally we have to give the heart of our search. I am looking for any Unique ID (username) that starts with “berk”, and ends with anything “*”.
- “ldapsearch -h ‘ldap.rpi.edu’ -x -b ‘dc=rpi, dc=edu’ ‘uid=berk*’”
The main part of the search we will be editing is the ending. Here we specify a filter to find the information we are attempting to access. Each LDAP server has different attributes it can give about each object. For example, the ldap.rpi.edu server gives out “givenName, objectClass, cn(full concatenated name, or common name), sn (surname), loginShell,” and many others; while at the same time “ldap1.server.rpi.edu” returns a much different lists of results.
Finding Which Attributes Will be Returned
The best way to find which fields are available is by doing a search without a filter. Just running the search below will return an unfiltered list of everything in the directory, up till you hit the individual servers limit. I am purposefully not publishing results from these searches for privacy reasons; here is some results for me with some data omitted.
- “ldapsearch -h ‘ldap.rpi.edu’ -x -b ‘dc=rpi, dc=edu’”
- # berkod2, accounts, rpi, edu
dn: uid=berkod2,ou=accounts,dc=rpi,dc=edu
sn: Berkowitz
cn: Berkowitz, Daniel
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: eduPerson
objectClass: rpiDirent
objectClass: mailRecipient
objectClass: organizationalPerson
objectClass: person
uid: berkod2
loginShell: /bin/bash
uidNumber: #####
mailAlternateAddress: berkod2@rpi.edu
givenName: Daniel
gecos: Daniel Berkowitz
rpiclusterhomedir: /home/berkod2
description: PRIMARY-STU
homeDirectory: /home/06/berkod2
gidNumber: ###
Now that we have an idea about the data structure and what this server has on it we can reverse the lookup and tweak it. I know ‘uid’ will be the username, and I can get the users name from that! So using CAS I can log a user in and get their username, then I can lookup there LDAP information. (EXAMPLE 1) If a user enters a name, then a user can search for their UID doing the reverse. (EXAMPLE 2) The wild card can also be used if the full name is not known. (EXAMPLE 3) Last we can use multiple fields, combining these ideas to narrow down the result. (Example 4)
- Example 1
- “ldapsearch -h ‘ldap.rpi.edu’ -x -b ‘dc=rpi, dc=edu’ ‘uid=berkod2’”
- Example 2
- “ldapsearch -h ‘ldap.rpi.edu’ -x -b ‘dc=rpi, dc=edu’ ‘sn=Berkowitz’”
- Example 3
- “ldapsearch -h ‘ldap.rpi.edu’ -x -b ‘dc=rpi, dc=edu’ ‘sn=Berko*’”
- Example 4
- “ldapsearch -h ‘ldap.rpi.edu’ -x -b ‘dc=rpi, dc=edu’ ‘sn=Berko*’ ‘uid=berkod*'”
LDAP Authentication RPI Tutorial (Part 1)
After writing about how to use CAS with PHP, I thought I would write a post about how to use LDAP(Lightweight Directory Access Protocol) at RPI but these methods can be used anywhere. LDAP is a protocol to query user databases, this is a protocol that can be sed along with Active Directory, or another directory system for computers and user accounts. This protocol is widely used to allow different applications to interact with your user database. Here I will be showing how to implement search with LDAP to a web application. This guide will be using LDAP with PHP, this requires the LDAP module to be enabled within PHP; that will be the purpose of this article, then the next one will discuss how to actually query LDAP.
LDAP Linux (Debian/Ubuntu) Install
Linux is easy to get LDAP working with PHP, as long as you have a standard installation of Apache, with PHP 5 working.
- Install the LDAP module onto the machine, using either aptitude or apt-get
- “sudo aptitude install php5-ldap”
- OR “sudo apt-get install php5-ldap”
- PHP should now be able to use LDAP, if it is not working yet, you will need to restart Apache.
- “sudo service apache2 restart”
LDAP Windows (XAMPP) Install
Xampp for Windows comes with LDAP, but there is a bug in their implementation and a file needs to be copied before LDAP will work. I am going to use “C:\xampp”, the default directory for Xampp in this example.
- Go into the PHP folder, C:\xampp\php\
- Edit the file “php.ini” with any text editor
- Find the line “;extension=php_ldap.dll”, and remove the semi-colon. “extension=php_ldap.dll”
- Now if you were to reboot Apache it should be working, but its not! Why not? There is a missing DLL. You need to
copy libsasl.dll from c:\xampp\php\libsasl.dll to C:\xampp\apache\bin\.
- Now restart Apache
LDAP Search
Now that PHP can search LDAP we are going to want to start creating queries in PHP; but it is much easier to tweak the search in the command line, and then put that query into PHP. The following are steps that can be taken on a Linux computer (again Ubuntu/Debian) to install and use a ldap command line search.
- First we need to install the OpenLDAP utilities that will give us the “ldapsearch” command
- “sudo aptitude install openldap-utils”
- OR “sudo apt-get install openldap-utils”
- Now we are making our query
- First we add the command, then enter the host you are searching, tell the server to try simple anonymous authentication. Next give the server a base to start the search (I am using RPI specific domain components), finally we have to give the heart of our search. I am looking for any Unique ID (username) that starts with “berk”, and ends with anything “*”.
- “ldapsearch -h “ldap.rpi.edu” -x -b “dc=rpi, dc=edu” “uid=berk*”
- Now this gives one result, and this can be used to see what data will be returned from this server. You can also try “ldap1.server.rpi.edu” this returns a entirely different list of variables, and sometimes more users.
- If you are interested in researching this command more, die.net has a great resource. http://linux.die.net/man/1/ldapsearch
- Troubleshooting: For those of you here at RPI trying to follow this guide specifically, if you do not get any results or a error connecting, RPI firewalls the LDAP servers heavily. I have found a lot of the time I have to be in the VCC to make this work, you can also VPN in, then your network connection is within the VCC and it will work. I have VPNed in, while on campus in the Union to get LDAP to work.
UPDATE: I added a little about what LDAP is
RPI phpCAS Authentication Tutorial
After much tinkering with RPI’s CAS (Central Authentication System) in PHP, I thought I would put together a guide to make it easy for anyone to put together a site that uses it. This would work for anyone at another location with a CAS server, but this example is for RPI.
- Get the CAS Library
- Download the tar file under “Current Version”
- Extract the contents, using a program such as 7-Zip, and put it in the root of whatever web folder you want
- Download the latest CA bundle for SSL
- http://curl.haxx.se/docs/caextract.html
- Download “cacert.pem”, and put it in root of web project
- Create a index.php, login.php, logout.php
- The index has to load the library, check if the user is logged in, then print out text.
-
<?PHP
include_once(“./CAS-1.3.2/CAS.php”);
phpCAS::client(CAS_VERSION_2_0,’cas-auth.rpi.edu’,443,’/cas/’);
// SSL!
phpCAS::setCasServerCACert(“./CACert.pem”);//this is relative to the cas client.php fileif (phpCAS::isAuthenticated())
{
echo “User:” . phpCAS::getUser();
echo “<a href=’./logout.php’>Logout</a>”;
}else{
echo “<a href=’./login.php’>Login</a>”;
}?>
- First we load the library for CAS from the subfolder
- Then we select which will be our central server
- We have to select our ca bundle, setCasServerCert does this
- Now we have fully loaded and configured the library
- Finally, I can ask CAS if a user has logged in, if so writeout some options, if not others
-
- This is the login page
-
<?PHP
include_once(“./CAS-1.3.2/CAS.php”);
phpCAS::client(CAS_VERSION_2_0,’cas-auth.rpi.edu’,443,’/cas/’);
// SSL!
phpCAS::setCasServerCACert(“./CACert.pem”);//this is relative to the cas client.php fileif (!phpCAS::isAuthenticated())
{
phpCAS::forceAuthentication();
}else{
header(‘location: ./index.php’);
}?>
- Similar setup of authentication as before
- Now we check if the user is NOT authenticated, if the user is not authenticated we force login
- If the user already is logged in, then we redirect to the index
-
- The logout page:
-
<?PHP
include_once(“./CAS-1.3.2/CAS.php”);
phpCAS::client(CAS_VERSION_2_0,’cas-auth.rpi.edu’,443,’/cas/’);
// SSL!
phpCAS::setCasServerCACert(“./CACert.pem”);//this is relative to the cas client.php fileif (phpCAS::isAuthenticated())
{
phpCAS::logout();
}else{
header(‘location: ./index.php’);
}?>
- Same configuration (this can be done by including a core file that everything else calls, but for this example I wanted to keep it simple)
- If they are not logged in, then we push the user back to login
-
That is the basic configuration, the example is available for download below. If there are any questions feel free to post a comment.
Download: https://github.com/daberkow/daberkow.github.io/blob/master/CASExample.zip
Extra Notes:
- If you want to save server space, the docs folder under the CAS folder can be removed
- I have ran into problems with CAS on a Windows Apache server, and CAS on a Linux Apache server reference the CACert.pem file differently
- One example of CAS on Windows is the timetracker software
- One example of CAS on Linux is QuickLogs
QuickLogs v3.3.0 (and quickly v3.3.1) (and then v3.3.2)
Recently there was a big update the to QuickLogs product, on the face of it, it looks like the buttons have been changed a little bit. That is the small part of the upgrade, the main change is how the stats page works. Now the stats page is run by the HighCharts JavaScript engine instead of the PHP libchart that was used in the past. This takes the load of creating charts off of the server, and moves it to JavaScript Also this increases the flexibility to add more charts in the future.
I started the new stats page (v3.3.0) with a drop down to select different types of graphs, the Activities, User, and Overall graphs were used with the drop down. A quick comment made by people at the Helpdesk was “why not use all the space available, I dont like having to navigate again after refreshing.” v3.3.1 brought back the single page, but more importantly sorted the data in the charts. By default Highcharts plots by order the data is put into it; but it was not largest category to smallest. A quick sort was put in, and then we were back to where v3.2 ws with charts but a new engine. The new engine also allows for the charts to be looked at under different time periods instead of only 30 days.
The morning the program moved to version 3.3.2, this was a pure bug fix with CAS having a certificate issue under the login page. At this time, I decided to centralize the CAS information for all pages under the ‘core.php’ page. That way if the certificate moves there is one place to do it.
QuickLogs represents a early version of my app design; these days I tend to make core.php and ajax.php heavy with most of the application functions, and subsequent pages call them with ajax. This is a older app where a lot of the functions are hard coded in the page. I have started migrating to using a wrapper on MySQL like I have with the time cards app. But I only changed it on functions I was modifying so most of QuickLogs remains doing manual queries.
Looking to the future there are many ideas for QuickLogs, yet little time to compete them. One person suggested a achievement system for different things you can do at work. Another suggestion was a Nemesis a person who is right ahead of you for tickets, and having competition. The final suggestion was for some different types of charts. I wanted to do charts, I just have to find time.
At this point, QuickLogs is going on the shelf. (Unless I get a itch to add more charts) I am shifting to more time on Time Tracker and getting this product finished, before I leave RPI. Documentation for both products should be updated soon as well.






