Saturday, 16 July 2016

Findbug : Unusual equals method (EQ_UNUSUAL)

I came across this find bug issue in my code recently. It appeared on the all the equals methods that had overidden the objects equals. The equals method that was there look fine to me.

Definition of the issue.

http://findbugs.sourceforge.net/bugDescriptions.html#EQ_UNUSUAL
This class doesn't do any of the patterns we recognize for checking that the type of the argument is compatible with the type of the this object. There might not be anything wrong with this code, but it is worth reviewing.


What patterns does find bug look for? 

Here is the source code for the equals pattern detection.


In the method visit() there is a nested if else statement. This method is checking what equals pattern was found by method sawOpcode(). At the end of the nested if statement is this code:


 else {  
         if (AnalysisContext.currentAnalysisContext().isApplicationClass(getThisClass())) {  
           bugReporter  
           .reportBug(new BugInstance(this, "EQ_UNUSUAL", Priorities.NORMAL_PRIORITY).addClassAndMethod(this));  
 }  

This code will flag the "Unusual equals method" issue since it has checked your code against every pattern it knows.

Does your code have an issue?

Probably not since it has checked all other possible issues you could of had with your code. Like the 2 issues below. It will make you think about your equals method thought. Wondering for ages why FindBug does not like your equals method.

Some patterns it is looking for

Patterns it does not like
EQ_ALWAYS_FALSE and EQ_ALWAYS_TRUE pattern is when it is returning a boolean and the previous opcode was ICONST_0 or ICONST_1. That means the equals method always returns the same boolean regardless of input so this is flagged as EQ_ALWAYS_FALSE or EQ_ALWAYS_TRUE in findbug.

EQ_GETCLASS_AND_CLASS_CONSTANT is when you are comparing the class to another class but you are using the class name instead of "this" variable. Subclasses will be broken if they are inherit this equals.


Patterns findbug likes in an equals method
A method call to compare
An Instanceof check
A method call to getClass

Saturday, 9 July 2016

Hand carving your own wireless configurations

After Debian 6 "squeeze" network manager does not handle interfaces that  are in /etc/network/interfaces by default. You update the network manager configuration to inform it to handle those interfaces. Network Manager is included in many Linux distros. Its reason for living is to make Linux networking just work.

Network Manager will infinitely display a loading logo sign in Gnome if it does not handle the wireless interface.

There is no fun network manager handling all the juicy configuration.


What is involved when making your own wireless configurations:
  • Scanning all the wireless networks on the command line using iw
  • Looking at the details of wireless access point I want to connect to. I need to know if the authentication process it uses such as if its PSK (Pre shared key) or EAP (Extensible Authentician Protocol). I also need to know if there is a cipher required on top of the protocol.
  •  Once you have the information you can then add it to the wpa_supplicant.
 wpa_supplicant is just for the WPA protocol. For the WEP (Wired Equivalant Protocol) you use another application.  Reason is that nobody wants to touch the WEP application again. No one is using it because of the way you can sniff the packets and figure out the pre shared key being used which makes WEP unsecured.

Network Manager code

https://wiki.gnome.org/Projects/NetworkManager/Hacking

You can browse the code to see how it decides what information it needs for every network configuration.

What are the cipher used for?

TKIP and CCMP are used to encrypt your data from the computer to access point. They make sure no see what you are browsing. They use the pre shared key to encrypt the data to the router.



Here is an example of wireless printout from iwlist. It is a WPA2 router.
      Cell 06 - Address: 5C:DC:96:56:4F:F3  
           Channel:11  
           Frequency:2.462 GHz (Channel 11)  
           Quality=54/70 Signal level=-56 dBm   
           Encryption key:on  
           ESSID:"SSID"  
           Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s  
                24 Mb/s; 36 Mb/s; 54 Mb/s  
           Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s  
           Mode:Master  
           Extra:tsf=0000000b307e393e  
           Extra: Last beacon: 28ms ago  
           IE: Unknown: 000B4254487562352D4A354A37  
           IE: Unknown: 010882848B962430486C  
           IE: Unknown: 03010B  
           IE: Unknown: 0706474220010D14  
           IE: Unknown: 2A0106  
           IE: Unknown: 2F0106  
           IE: IEEE 802.11i/WPA2 Version 1  
             Group Cipher : CCMP  
             Pairwise Ciphers (1) : CCMP  
             Authentication Suites (1) : PSK  

 Information you need from this print out
  • ESSID
  • Group Cipher
  • Pairwise Cipher
  • Authentication Suites
You can then add this to /etc/wpa_supplicant/wpa_supplicant.conf
 network={  
     ssid="SSID"  
     key_mgmt=WPA-PSK  
     pairwise=CCMP   
     group=CCMP  
     psk=<your psk passphrase produced by wpa_passphrase>  
     priority=1  
 }  


That is a general over view to make your own wireless configurations.

I GIT you now

My relationship with GIT is a love/hate relationship. Comparing it with SVN I have all love for GIT.

I remember the first time setting up SVN that I wanted to use with my project. I did not want the project online and I did not have a running server so I had to host the repository on my computer.  On my windows machine I thought this would be no problem but from memory you could not have the client and repository on the same machine with out a hack. SVN did not like the way I was going to set it up. I just remember giving up on SVN then.

Then came GIT with its local check in which I thought was a god send. Now development was easier to keep track of.

GIT is at version 2.9.0 now and it has a lot of features. If you look through the man pages for GIT there is a lot of options. This makes it very powerful but also colossal. Like my oven that has 20 different features, I only use 2 of them from day to day. I do not use all the  fancy features of GIT.

I like the positive flow of GIT. When all you checkins are correct. I just hate when I have a negative flow. A negative flow is when you have messed up a commit message, accidentally checked in, merged from the work branch etc. They are simple negative flows. There are harder negative flows to come back from which you need google and some one that deeply knows git.

I was at a conference recently and there was a GIT presentation. The presenter focused how to fix negative flows to return to a positive flow. Most presentations about GIT are what it is and what it does. This was a refreshing presentation. What was thought provoking was even though GIT was improving all the time the foundation GIT is built on has not changed. Blob objects, tree objects and commits are the foundation. Understand those deeply and you can figure out how to come back to a positive flow. You just need to find the command that allows to do it. Instead of not know how to come back and finding a post to explain it to you along with the command to do it.

In the future I will post my GIT negative flow conquests.