October 29, 2010

More mysterious Skype chat commands

Today I've been curious if there were any more hidden chat commands besides the currently well known IRC-like Skype chat commands. So I decided to inspect the executable once more (I did it already once with only little success) and surprisingly I almost instantly found something completely new to me.

A quick search on the internet also turned up nothing comparable and quick try&error also revieled not much information for most of them so the following table mainly consists of questionmarks. I tried to come up with a description where the commands reveiled a bit, but since I found absolutely no additional information for those all the meaning is just guesswork from me.

Of course I'll update this posting every time I find out something new or somebody gives me hints on this.

Update 2012-11-18 - Added infos on /fork from commenters, added bunch of new commands found in recent Skype 6 version

CommandDescription
/dbghelpOutputs a list of (debug?) commands but without description.
/showmembersLists all members of the chat with their currently assigned role.
/showstatusPrints some infos about the current conversation. Conversation convoi id, Consumption horizon, History date and Message count.
/showactivemembers?
/shownameDisplays the name of the original conversation. Required when querying the Skype database file.
/showchatforms?
/showpendingmessages?
/infoDisplays the current and maximum number of chat participants.
/fm?
/verifyShows some text about missing messages on my computer. Maybe checks the message-database for validity.
/showaccsel?
/showaccfocus?
/accselect?
/debug?
/debugmsg?
/golive [token](since Skype4?) Opens a management window in a group conversation which allows to handle conference calls. The sense of the (optional) token is not yet clear to me but seems to give you a link which you can share to others and allow them to join the conference.
/fork [skypename/s](since Skype5?) Duplicates the current group chat leaving out the contacts which are added to this command.
/fork [skypename/s](since Skype5?) Duplicates the current group chat leaving out the contacts which are added to this command.
/setupkey [key] [value]? Sets the "key" to a certain "value" or unsets it if no value given. Purpose currently unknown.
/setupkey! [key]? Deletes the "key". Purpose currently unknown.
/showplacesDisplays a list of the currently online Skype instances using this Skype name (and have Skype version >=6 or recent mobile versions).
/remotelogoutLogs out all other currently online Skype instances which are using this Skype name (and have Skype version >=6 or recent mobile versions).
/rsql? sends this into the chat but does NOT show help like any other random /-command...
/set listeners [value]? probably another list of skype-ids which are only listeners/spectators in this chat. Changes also the output of /showmembers, but real effect still untested.
/get listenersShows the list of listeners set with previous command.
/ignore?

Random/Unsorted additional findings

  • The name of a chat (/showname) is composed of the initial creator of the group-conversation (who gets the role CREATOR and is indicated with '#' in the chat-name) and a hash.
    • If the group-chat evolved from a chat with another person, this person is also part of the name (with the role ADMIN and the '$' sign as indicator in the chat-name).
  • Consumption horizon (/showstatus) seems to be the time when the last message was received from any chat-member.
  • Message count (/showstatus) is the number of messages displayed in the current window.

October 15, 2010

The university is dead, long live the university

Yep, it's done. As said last month, I've finished my bachelors exam two weeks ago. Unexpected for me was, that I finished this whole degree with good success.

But there wasn't much time to relax because last week my next step in education happened, the start of the Masters Degree Programme for Advanced Security Engineering. I mainly chose this degree because in my opinion it is the final part which finishes my education in IT which is already going on for many years.

This degree will cover the timespan of the upcoming two years and I hope that I will learn even more new stuff about IT, engineering and even some management topics than I have learned during the course for my bachelors degree. The topics of this and last week were already very promising and interesting and the first exercises have been assigned.

Looking forward for new stuff :)

October 2, 2010

Java Tip #9: Use CollectionUtils for evaluation and manipulation of Collections

After quite some time this is another instance of the Java Tips. It's an addition to the Apache Commons related framework tips which are guiding into the direction that as a developer you should take advantage of existing and proven frameworks and know their features to leverage your development efficiency. This time complexity of the given example is a bit higher than in the previous tips.


Advice

Use Apache CollectionUtils for evaluation and manipulation of Collections.

Code-Example

A short spoiler for the following code: This is a routine which checks a given set of categories against a set of category-permissions for a user. The result is a set of categories, which the user is allowed to access.

Before

...
public boolean hasPermissionsToAccessCategory(String category) {
    return (this.permissions != null && this.permissions.contains(category));
}
...

...
public Set<String> getCategoriesAllowedToViewBySearchFilter() {
    Set<String> result = null;
    if ((this.filter != null && this.filter.getCategory() != null) && (!this.filter.getCategory().isEmpty())) {
        result = new HashSet<String>();
        for (String category : this.filter.getCategory()) {
            if (this.hasPermissionsToAccessCategory(category)) {
                result.add(category.toString());
            }
        }
        if(result.size() == 0) {
            result = null;
        }
    } else {
        result = this.getAllCategories();
    }

    return result;
}
....

After

...         
public Set<String> getCategoriesAllowedToViewBySearchFilter() {
    Set<String> result = null;
    if (this.filter != null &&
        this.permissions != null &&
        CollectionUtils.isNotEmpty(this.filter.getCategory())) {

        // get only categories, which are both in permissions and filter categories
        result = new HashSet<String>(CollectionUtils.intersection(this.permissions, this.filter.getCategory()));

        // if no results, return null
        if(result.isEmpty()) {
            result = null;
        }
    } else {
        result = this.getAllCategories();
    }

    return result;
}
...

Benefit

Huge readability gain and a safety gain. The code and intention is much clearer here and also has a smaller footprint. The maintainability has been raised because for a developer not familiar with the routine it needs a bit of brainpower to find out what the initial code really does. The removal of the additional method and usage of CollectionUtils.intersection() makes it much easier to understand, how the two sets are compared to each other to retrieve the correct results.

Remarks

None if you are initially writing similar logic. If you're refactoring a method which seems to be better off with framework-provided functionality be careful and think over it a second time. Re-evaluate the code until you're really sure because it's easy to overlook a small detail which changes the results for a certain special case.