Monday, September 20, 2010

How to view the MANIFEST.MF file of a jar

If you do not work with the command line with jars a lot it is easy to forget what the options are. I was surprise to learn that if you do a search for "How to view the MANIFEST.MF file of a jar" you do not find anything that simply tells you how (or even how to in a round about way). I hope this post will solve that.

Say you have a jar file like http.jar from the NetBeans Flower Store example.

View contents of jar

If you want to view the contents of the jar simply use jar tf  jar
mike@mike-laptop:~$ jar tf /home/mike/NetBeansProjects/FlowerRest/build/web/WEB-INF/lib/http.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/sun/
com/sun/net/
com/sun/net/httpserver/
com/sun/net/httpserver/spi/
com/sun/net/httpserver/spi/HttpServerProvider$1.class
com/sun/net/httpserver/spi/HttpServerProvider.class
com/sun/net/httpserver/HttpServer.class
com/sun/net/httpserver/HttpsServer.class
com/sun/net/httpserver/HttpHandler.class
com/sun/net/httpserver/HttpContext.class
com/sun/net/httpserver/HttpsConfigurator.class
com/sun/net/httpserver/HttpExchange.class
com/sun/net/httpserver/Filter$Chain.class
com/sun/net/httpserver/Filter.class
com/sun/net/httpserver/Authenticator$Result.class
com/sun/net/httpserver/Authenticator$Failure.class
com/sun/net/httpserver/Authenticator$Success.class
com/sun/net/httpserver/Authenticator$Retry.class
com/sun/net/httpserver/Authenticator.class
com/sun/net/httpserver/HttpsParameters.class
com/sun/net/httpserver/Headers.class
com/sun/net/httpserver/HttpPrincipal.class
com/sun/net/httpserver/HttpsExchange.class
com/sun/net/httpserver/BasicAuthenticator.class
com/sun/net/httpserver/Base64.class
sun/
sun/net/
sun/net/httpserver/
sun/net/httpserver/ChunkedOutputStream.class
sun/net/httpserver/ExchangeImpl.class
sun/net/httpserver/Request$ReadStream.class
sun/net/httpserver/Request$WriteStream.class
sun/net/httpserver/Request.class
sun/net/httpserver/HttpConnection.class
sun/net/httpserver/LeftOverInputStream.class
sun/net/httpserver/PlaceholderOutputStream.class
sun/net/httpserver/ServerImpl$DefaultExecutor.class
sun/net/httpserver/ServerImpl$Dispatcher.class
sun/net/httpserver/ServerImpl$Exchange$LinkHandler.class
sun/net/httpserver/ServerImpl$Exchange.class
sun/net/httpserver/ServerImpl$ServerTimerTask.class
sun/net/httpserver/ServerImpl$1.class
sun/net/httpserver/ServerImpl.class
sun/net/httpserver/TimeSource.class
sun/net/httpserver/HttpContextImpl.class
sun/net/httpserver/SSLStreams$Parameters.class
sun/net/httpserver/SSLStreams$WrapperResult.class
sun/net/httpserver/SSLStreams$BufType.class
sun/net/httpserver/SSLStreams$EngineWrapper.class
sun/net/httpserver/SSLStreams$InputStream.class
sun/net/httpserver/SSLStreams$OutputStream.class
sun/net/httpserver/SSLStreams$1.class
sun/net/httpserver/SSLStreams.class
sun/net/httpserver/ContextList.class
sun/net/httpserver/Event.class
sun/net/httpserver/AuthFilter.class
sun/net/httpserver/SelectorCache$1.class
sun/net/httpserver/SelectorCache$SelectorWrapper.class
sun/net/httpserver/SelectorCache$CacheCleaner.class
sun/net/httpserver/SelectorCache.class
sun/net/httpserver/WriteFinishedEvent.class
sun/net/httpserver/HttpError.class
sun/net/httpserver/DefaultHttpServerProvider.class
sun/net/httpserver/FixedLengthInputStream.class
sun/net/httpserver/UndefLengthOutputStream.class
sun/net/httpserver/Code.class
sun/net/httpserver/ServerConfig.class
sun/net/httpserver/StreamClosedException.class
sun/net/httpserver/UnmodifiableHeaders.class
sun/net/httpserver/HttpExchangeImpl.class
sun/net/httpserver/HttpsExchangeImpl.class
sun/net/httpserver/HttpServerImpl.class
sun/net/httpserver/HttpsServerImpl.class
sun/net/httpserver/ChunkedInputStream.class
sun/net/httpserver/FixedLengthOutputStream.class

There it is the MANIFEST.MF file, I've highlighted it in red.

Get MANIFEST.MF from jar

To extract the MANIFEST.MF file simply use jar xf  jar META-INF/MANIFEST.MF
mike@mike-laptop:~$ jar xf /home/mike/NetBeansProjects/FlowerRest/build/web/WEB-INF/lib/http.jar META-INF/MANIFEST.MF

View MANIFEST.MF from jar

To view the file use cat META-INF/MANIFEST.MF or edit META-INF/MANIFEST.MF in Windows.
mike@mike-laptop:~$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.5.0 (Sun Microsystems Inc.)

Easy enough.  The xf option on the jar, extracts the file so you may want to delete the extracted META-INF/MANIFEST.MF afterwards.

Tuesday, September 14, 2010

Complex SQL Updates with the Case Statement

One of the most important rules-of-thumb for database performance and data quality is to do as much as you can in as few transactions as possible.  When making Updates to data sometimes you need to do different things based on different conditions.  In order to make these complex Updates and to do them in as few transaction as possible, you'll need some way to make a decision.  One way to make a decision in SQL is by using the Case statement.

Given the following table:
idcountrystatezip
2USAIL60191
3UKAA0
5USACA90210
7UK?99999

Say the state and zip columns are now made nullable so that garbage data will stop being put into it (e.g., UK having state AA and ?, and zip of 0 and 99999).  You'll want to correct the data you have so that you no longer have garbage data in the table.  To do so what you'll want to do is null the state and zip when the country is not USA.


update location
  set
    state = case
      when country = 'USA' then state
      when country <> 'USA' then null
    end,
    zip = case
      when country = 'USA' then zip
      when country <> 'USA' then null
    end


or you can do


update location
  set
    state = case
      when country = 'USA' then state
      else null
    end,
    zip = case
      when country = 'USA' then zip
      else null
    end


or you can replace null with ''.


The table should look like this now:
idcountrystatezip
2USAIL60191
3UK(null)(null)
5USACA90210
7UK(null)(null)

You can also used any other value you can obtain from the table in the Update statement, like this.

Given the following table again:
idcountrystatezip
2USAIL60191
3UKAA0
5USACA90210
7UK?99999

We can do something like this (assuming that state and zip are Character data types).

update location
  set
    state = case
      when country = 'USA' then state
      when country <> 'USA' then country
    end,
    zip = case
      when country = 'USA' then zip
      when country <> 'USA' then country
    end


The table should look like this now:
idcountrystatezip
2USAIL60191
3UKUKUK
5USACA90210
7UKUKUK

Remember if you can picture what you want the data to look like then you can do it in SQL, it is a declarative programming language after all.

Saturday, September 11, 2010

Tracking New Referrals Traffic Through Google Analytics

If you read this blog on a regular basis (thank you) you might notice two tags at the bottom of the site.  These tags have placed this blog on two different blog referral sites.  Since I use Google Analytics to monitor the site, I figured I'd set up Segments to see if the blog referral sites are actually sending traffic to the site.  The goal is for these sites to send 100 new visitors in a month, if they do not then the tags will be removed.

To set up a Segment in Google Analytics you do the following.

1) Click on "Advance Segments" under "My Customizations" on the left.

2) Click the "Create new custom segment" button

3) Drag the "Dimensions" and "Metrics" you want to use to create the Segment


4) Add the Segments to the view by clicking on the "View" button on the top right


5) Now the Segments on show along with everything else on the dashboard.


That is it.  Now I can easily see if these sites are sending any traffic my way.  Feel free to comment.