Category: Programming

  • Clipboard Image Save Application

    I was having trouble getting the Google Android SDK to save screenshots for me, leaving me with the only way to save them being to open MS Paint and go through the processes there to save them. Somehow, doing this only once was enough to make me want to write a better solution, so my less than half-hour solution to the problem was writing this basic application in C#. Its not complicated or particularly intelligent, but if you click in the gray box with an image on the clipboard it will paste it and save it.

    If anyone wants this overly simplified substitute pasting into Paint, you can grab it from http://users.pcfire.net/~curtis/software/ClipboardSaver.msi. It only works on Windows and will probably only install on a 64-bit Windows.

    image

    image

  • GITI: Example of Dependency UI

    A major assignment might look something like this with its components in place:

    image

     

    The individual assignments themselves are barely different from a stand-alone assignment (as they should be), except that they point to the larger assignment. For now the reference to the major assignment is by number, but I intend to use a database query to retrieve the assignment name in the future.

    image

  • GITI: Analyzing Old UI

    This morning I decided that today is the day to begin working in GITI again, primarily adding functionality that I feel will be crucial to the structure of graduate school work. The feature I intend to add is assignment dependency, which essentially means that major assignments could be broken down into smaller assignments that could have independent due dates and assignment information. 

    The first thing I decided was that for initial UI I would use only existing GITI pages, and not create a new workflow of any type, given the impending implementation of v3’s framework. The existing pages in GITI that would be used are the basic assignment edit and assignment view pages. The pages would simply receive new queries to handle the change. Starting this process I discovered something I had forgotten… the edit page is absolute crap. The edit page received no major help after being moved to v2, it still retains a lot of v1’s style, especially the gross overuse of the plain text field…. even though those fields now get translated before going to the database. One of the least sensible things about the form itself is the way that files are handled. The field implies it takes multiple files… it doesn’t, but the overall file record system does, so its one of those things where the user interface is awful for a feature that isn’t so bad (it tracks filenames for assignments, increasing the efficiency of organization).

    image

    Surprisingly, that complicated input comes with a pretty clean-looking output:

    image

    In this particular example, the fields that aren’t used are simply not displayed, but for the edit form, that simplistic approach doesn’t work, since GITI isn’t psychic and does not know what the user needs.

    I am going to have to clean things up if they are going to make any sense to the overall workflow of an assignment in GITI.

  • GITI’s Next Upgrade

    I’ve been putting off the upgrade to GITI v3 for a while now. Chris has written an absolutely beautiful background framework upon which I can build the new version of GITI, but unfortunately, things just haven’t been clicking with me. I was talking with Chris last night about the end of the semester (which only differs slightly from the end of the known universe), and it was discussed that perhaps GITI needs a few updates for handling the complexities of graduate school work, and perhaps I need something to do to keep myself occupied in the awkward gap between academic activities (I think most people call it “Summer break”). So, a plan has been devised.

    I am not quite ready to move on to version 3 of GITI, it is simply too hard and there is no motivation to do so as long as v2 works fine. Last night I just happened to recall that v2 didn’t just poof into existence, it happened as a gradual transition. Sure, I had the new v2 interface ready and had already given thought to the way it would work, but it didn’t really get off the ground by cold-converting modules. GITI v2 came into being as a very slow migration from v1, in a little phase I referred to last night as GITI 1.5. I barely remembered it because it was short lived. It was just the process of getting used to calling commands and not files (utilizing the, at the time, new interface table). At some point in there, I also dabbled in dynamic menu generation. Switching from static menus and static links is really no different than switching from manual database calls to a database-driven framework. The entire process is aimed at making the modules easier to use and maintain, and to speed up the implementation of new modules.

    The motivating factor for leaving v1 behind was simply productivity. There was no room to move anymore and the only options for additional menu items was to add new pages. It was also determined that the old system didn’t allow for working between modules very well, resulting in an overall slow experience. Frames just didn’t work. My motivations for moving to v3 aren’t as significant. I feel that I need to move so that some of the older code can be weeded out and so that some of the inconsistent behaviors of the modules can be resolved into a unified process. I learned things while writing v2 that made its newer modules better than the old, and while I’m sure that the same will happen to v3, it will be nice to at least start with all of the new functionality implemented from the beginning.

    One issue I didn’t have for v2, but have for v3 is Chris. Chris is difficult when it comes to programing. I cannot get away with some of my sloppy short-cuts and so much has to be discussed with him as a result of his vision for v3 (as the creator of the framework, he has the right to have his ideal methods considered). The biggest issue I’ve had so far with him is in the use of “cross-module” modules, or as I like to think of them “system modules”. These are modules that have functions across GITI, but may or may not have a purpose of their own. My favorite of these is ItemJournal. It has its own interface and its own data, but it also has a cross-module component that allows other modules to call it for the purposes of storing relevant data. I consider it to be indispensible. Chris considers it to be clutter. This also goes back to some of his concerns over data ownership and “where things are stored”. Things like the ‘fields’ table is horrendous for this, since it stores everything from constants for days of the week, to information about a user’s preference for what modules appear on the welcome screen. It is just a heaping mess. Maybe its what works, maybe it isn’t. Its an issue that has to be discussed and battled on.

    No matter what the issues, on April 30th I’m going to give v3’s conversion a shot. I’m going to start work in v2 to prepare the existing modules for moving to v3, and perhaps get a chance to utilize the new database structure that has been written for some of the modules. It is a complete pain in the ass to re-write my queries with a new table structure in mind, but I think module-by-module, it will be doable. With all of this considered, I should be done with v3 shortly before I have to utilize GITI Doc v3 to write my doctoral dissertation.

  • Rethinking “Instructor Hold”

    image

    Ever since I met Sarah Scott at UNC-Charlotte, I have had to consider the option of a situation where an assignment entered into GITI might not work out exactly as planned, and then the “Instructor Hold” status was born. Internally the status was originally called “scott” (valid codes were “yes”, “no”, “drop”, “inc” and “scott”). Originally the code had to be implemented in short order, due to the time constraints of being in the middle of the semester when realizing that sometimes assignments would end up in an unknown state because of instructor error or oversight. Most often the hold occurs when an assignment comes to its due date and either a rubric has not been issued or there is some other limitation to completing the assignment. In these cases the instructor is the only one who can really provide a resolution (either by giving a new date, or my dropping the assignment). The way that statuses are implemented is a really bad hold-over from GITI v1. First of all, the field is really called “complete”. I suppose originally it was a binary field that expected to know if the assignment had been finished. Over time it grew to have other meanings, including to accept the idea of dropping assignments from grade calculation. The second issue is simply the fact that “hold” and “drop” do not effectively relate the status of the assignment, they are supplemental information not related to the completeness of the assignment. Also, GITI does not presently recognize the idea of an assignment in-progress (something as a grad student I will likely appreciate).

    I am considering reworking the entire assignment-control system and making it better at handling a student’s needs. I will correct the issues stated above, including adding the ability to enter an assignment, have it marked as “complete”, but also allow it to be dropped from the grade matrix. I will also implement the “Instructor Hold” properly, including prompting the student for the reason for the hold. Finally, the system was NEVER designed for the types of assignments thrown at it. It was originally designed for “homework” (as its table name in the database proclaims), so short-term assignments. The idea was to enter assignments from school and have the electronic record at home. To greater support other assignment types I intend to add the ability to set up time requirements on the items. Assignments that might not be due for another week, but have a greater time requirement (papers, projects, study for tests), would appear before assignments that are due on the same day, or perhaps even earlier, in the list. This would allow for the budgeting of time for the assignments until such time as a GITI’s schedule utility can be fully integrated to with other modules to assist in scheduling discreet blocks of time to work on the assignments.

    As I approach the end of GITI’s useful life for me (for education anyway), I am seeing a lot of things that need to be done to make it useful for other people who may use it in the future. I used to spend my summers and breaks working on code for GITI, making it better for the future semester, but that hasn’t happened in the last year and I fear that the overall success of GITI is in jeopardy because of it (for GITI, success = being able to be used by someone other than the creator). 

  • Early Grade Madness

    image

    So far in this course I have 2 grades, an autobiography discussion post and an extra credit assignment which involved replying to the instructor’s message. GITI’s calculation of such grades is a bit imprecise.  If 100 is an A+, and 92 is an A, what is 600? In this particular course the grading is based on a points rubric, something that GITI doesn’t quite have a grasp on. GITI does better at a weighted course, where it will provide the final average in this situation as only 105%, not 600%. For a points based system the correct score at the moment should be something like 6%, also not 600%. GITI currently interprets points-based courses as being only out of their existing, scored material, to help correctly construct an average for a class, which assists in determining outcomes. Being told that 6% of a course’s points have been obtained is rather clumsy.  GITI has operated its points-based system this way since it was created (and for 2 years it only supported points).

    I suppose the proper course of action is to list the amount of points that have been earned as well as the present average based on work completed. Ah, more coding work for the weekend.

  • Security Concerns

    I have never been one for much security when it comes to my technology. I like to keep my network secure, but I’m not one to necessarily have a lot of different passwords or use things like virus scanners or firewalls (outside of a firewall router). This makes me a not very good person for doing things like figuring out how the access rights side of GITI will operate when considering external uses of data via the SecretKey system. At this time there is exactly one SecretKey application, and it isn’t even really part of GITI, it is an adjacent application under the pcfire.net domain that just happens to have the same users as GITI, and therefore can use the SecretKey system without using the whole GITI login routine. In addition, I wanted the application to be something that could be accessed without having to be greeted with a credentials prompt every time it is accessed. I’m told that allowing a page to be accessed with a plain text password is bad, as it compromises everything, so I’m using the keys.

    My concern now turns to the aspect of key security. Is one key good enough? Basically the way things work now is that each user is issued a key and with that key they can theoretically access limited GITI resources. The key is supposed to be used in a condition where the data is not sensitive and where things are read-only. For the current implantation there is a non-sensitive use where the data is pretty much one-way. There is only an input, not a modify, and thus no records to corrupt. Of course I log the IP addresses used for access so in the event of a problem it is possible to drop rows from the database made from any IP address not owned by the owner of the account. This being said, if the key is compromised, it is easy enough to have GITI to reset (“roll”) the key, but then all other services that use the key must be updated. I find myself wondering if each service should be able to be assigned a GITI key independently. Currently Google assigns a unique API key to each service that it “authorizes”, but it is a standard OpenID implementation, so I’m not sure how much stock I put in that process. It does seem rational though, to be able to use multiple keys and cancel them at will. I have considered using a different key for each service, allowing the user to issue however many keys they want or just leaving it as is, with each user having one key.  Oh so much to consider.

  • Personal Journaling

    I have many times in my past thought of starting a personal journal. I started at first a long time ago with a paper journal, and considered keeping a word processing document, but nothing ever seemed to work for me. In August 2004 with the opening of this blog I got a little closer to being able to do what I wanted to do, at least on the external perspective. I still do not have anything personal. I tried to do it in GITI for a personal way, but I just could never remember to write stuff and it just didn’t quite seem as together and coherent as I would like. I am now considering writing a software that will reside on a desktop computer, but will be able to write information somewhere that GITI can access it. The reason I feel I need to write my own software for this is that I want to keep more information in a journal than just a daily narrative and other plain text information. I want to be able to store sample photos from the day, and maybe a tracklog and other information that seems relevant to the events of the day. In some ways it would be nice to form my daily journal entries from a variety of little pieces of information and just have them grouped by the date. Those pieces include:

    • Text of day’s activities
    • Report of what is on the calendar
    • Collection of status posts and their timestamps
    • Photo(s) selected from the day, if available
    • Tracklog from the day, if available
    • Recipes for foods I create that day

    In some ways social media stuff handles a lot of this, except for the more private aspects, but I do not want something like a journal stuck in the cloud. I want control of the information and I do not want to be bound to some type of information system that can loose data, change control or in some other way be subverted by an outside force. This is probably crazy and excessive, but it will give me something to work on in my spare time.

  • A Thought on Status

    I have been thinking about my “status” architecture for GITI. At present I can tell GITI my status directly, through the UI, or by sending it an email (must be done from my phone at this time, as it only accepts 1 address). GITI will in turn post to Twitter, which Facebook picks up on. I was just thinking the other day that it seems that this practice may have become quickly outdated. While being totally out of contact I post status updates by emailing GITI, what about when I don’t have my phone close, but I am near somewhere with WiFi and have the iPod with me? It would make most sense to open the Twitter app on the device and post my status there, and let it be disseminated out, but what about GITI? What happens to GITI’s records? They are forgotten and so is any web app that uses my status from GITI. Perhaps the key here is to let GITI check Twitter and sync my statuses for me.

  • Hidden Features in GITI

    Sometimes I get distracted, so distracted in fact that I forget to do things that one might consider important, especially when writing code. It would seem that about a year ago when I wrote code for adding batches of assignments to GITI I thought far enough ahead to add a “batch stamp” to the assignment records so that assignments added together could be traced together. The failing here is that when I remembered to write the code to make the stamp I failed to remember to write the proper code to actually use the stamp for anything in the UI itself. Chris accidentally added a batch of assignments to the wrong course (nothing wrong with it, I did it at least 5 times when I first started using the batch add system), and short of checking all of their little boxes on the pending assignment page and doing a bulk change there is no good way to assign them to a different course (and at this moment, I try to recall if it will change the course serial number or just the course code on the assignment). So, oops… I forgot to write the code to call back a batch of assignments. I guess I add that to my list of bugs to workout as Education crosses over to the v3 platform.