Saturday, December 13, 2014

Amazon Instant Video on Ubuntu 14.04

From various sources, I was able to play Amazon Instant video in Firefox on Ubuntu 14.04

Here are the commands. Note I already had flash plugin installed for ff and chrome, so I could play videos from youtube but not Amazon Instant video.

sudo add-apt-repository ppa:mjblenner/ppa-hal
sudo apt-get update
sudo apt-get install hal

Thursday, July 17, 2014

Netgear WNDR3700v2 - stuck on firmware 1.0.0.32? Need to downgrade to older firmare?

In my zeal to have the latest greatest router firmware for Netgear WNDR3700v2, 
I jumped to 1.0.0.32. However, I noticed that my Epson Workforce printer stopped 
connecting to the router, so no wireless printing for me. After some time now, 
my wireless network is not stable. Signal strength is awfully weak, and I started 
disconnecting form the router.

So the recourse was to upgrade the firmware. However, if you have 1.0.0.32 then
The instructions are pretty accurate, but they did not work for me.
  1. I used a Mac.
  2. Downloaded TFTP Client. It's a shareware, and it worked like a charm.
  3. I had a difference router ip: 10.0.0.1 and a different password than the default 'password'. I think that was the issue for the posted instructions not to work.
  4. I went to http://routerlogin.net/index.htm use admin and my password, then Maintenance, Backup Settings - Erase. Erase all the settings so now the router IP was 192.168.1.1 and username password: admin/password.
  5. I then use TFTP server: No matter what I did, it won't allow me to upload any firmware. Searching for the issue, 
I found a few posts here and here. 

So these are the following differences:

Finally, the upload succeeded. Now I am back to v1.0.0.12.
Now its to be seen how it will fair! I will venture into other firmwares, but for now my wrestling with this router is at an end.

Thanks to the sources above.

Monday, March 11, 2013

Notepad++ RegEx Search & Replace

Often times we need to search and replace using more than just the default search words. If you are using Notepad++ for some basic code development, it has a nice feature of using regex - for both search & replace. Here is an example & I will probably add a few more as and when I use others.

Search for a hex color code (#000FF0) and remove the # sign or make it 000FF0.
Search: #(\w{6})
 - () : Marks the group. Here this will be the 1st so group 1.
- \w : Any character
- {6} : Limits the count to 6 characters
Replace: $1
 - The first matched group identified about.

Other serious choices would be sed on the unix shell. 

Friday, August 17, 2012

Spring MVC - Convention over Configuration w/o Confusion?

Convention over configuration is an essential feature of Spring MVC and it does save some unnecessary coding effort, but I have more than one case where it can get really messy debugging issues.
Here is a simple example: URL app/contact - worked before invoking list method as the only GET method w/o any method level mapping - catch all after the controller mapping.

Beginning 3.1 it will not & throws a 404. But app/contact/list works & will invoke this GET method (IRRESPECTIVE OF THE METHOD NAME), as long it is the only catch-all GET method.

So you could even name it as fooBar and the same URL will invoke it. If however you get confident that the catch-all GET method will always be called for the GET and the URL won't matter, you are right but then the RequestToViewNameMapping goes out the window for the desired view; instead it will look for foorBar.jsp
Something to watch out for!
@Controller
@RequestMapping("contact")
public class ContactController{

@RequestMapping(method = RequestMethod.GET)
 public List<contact> list() {
  logger.info("default method list");
  return contactService.list();
 }
}
Note the mapping generated for this method: INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/contact/*],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.util.List com.aj.recipes.web.ContactController.list()

Wednesday, August 15, 2012

Spring Converter/ConversionService Example

Spring MVC provides so many cool features to make the controller code as minimal as possible. Converter & the ConversionService is one such feature that will be invoked by the framework to carry out type conversions. I have been looking for a decent example & stackoverflow came to the rescue.

I want to add some more information to the solution. As per the Spring documentation here a URI template variable gets translated to the target object using the Converter/ConversionService. I tried to use a `@RequestParam("id") @ModelAttribute("contact") Contact contact`, but I was getting an `IllegalStateException: Neither BindingResult nor plain target object for bean name 'contact' available as request attribute` for not having the model object `contact` in my view edit.jsp. This can be easily resolved by declaring a `Model model` and `model.addAttribute(contact);`. However, there is an even better way; using the URI template variable. It's strange why `@RequestParam` did not work. DID NOT WORK
    @RequestMapping("edit") //Passing id as .. edit?id=1
 public String editWithConverter(@RequestParam("id") @ModelAttribute("contact") Contact contact){
  logger.info("edit with converter");
   return "contact/edit";
 }
WHAT WORKED
    @RequestMapping("edit/{contact}") //Passing id as .. edit/1
 public String editWithConverter(@PathVariable("contact") @ModelAttribute("contact") Contact contact){ // STS gave a warning for using {contact} without @PathVariable 
  logger.info("edit with converter");
   return "contact/edit";
 }

So what does this thing do
.. a link like `...edit/1` implicitly invokes the converter for String '1' to Contact of id '1' conversion, and brings this contact object to the view. No need for `@InitBinder` and since its a `Converter` registered with the `ConversionService` I can use this **anywhere I want - implicitly or explicitly**.

Converter:
public class StringToContactConverter implements Converter <String, Contact > {
 private static final Logger logger = LoggerFactory
   .getLogger(StringToContactConverter.class);
 @Autowired
 private ContactService contactService;
 public void setContactService(ContactService contactService) {
  this.contactService = contactService;
 }
 @Override
 public Contact convert(String id) {
  logger.info("Converting String to Contact");
  Contact contact = contactService.getContact(Long.parseLong(id));
  return contact;
 }
}
Configuration: servlet-context.xml
<annotation-driven conversion-service="conversionService"/>

<beans:bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" >
<beans:property name="converters">
<beans:list>
<beans:bean class="com.aj.recipes.web.convert.StringToContactConverter">
</beans:bean></beans:list>
</beans:property>
</beans:bean>

Thursday, May 3, 2012

Javascript Constructor & Namespacing

Namespacing is an obvious requirement for any JS applications in the enterprise world - apps. with several functions & data sets. Keeping data/functions i.e., objects in the global namespace would otherwise require being very creative with var names.
The following code demonstrates how to create a name space as well as constructors for JS Objects.

var a = {};
a.b = {};
a.b.C = function(){
    console.log("Constructor called!!");
    this.value="a.b.C";
    this.toString = function(){return this.value};
}

//console.log(b) // ReferenceError: b is not defined
console.log(a.b) // Object { C=function()}

var aa = new a.b.C();
console.log("Value: " + aa.toString()); // Constructor called!! 
                                        // Value: a.b.C

Thursday, April 5, 2012

ToDo App - jQuery UI

I have been playing around with Jquery UI and finally got some time to create a stand alone app. It's a GTD like app, of my personal taste. I use it home/work for personal tasks management. It may eventually hit the Chrome store, but I need to iron out some more kinks. I used to use task on cygwin, see my blog on this, but it certainly lacks in UI.

Features Include:
  • Uses jStorage for local storage: So tasks are available even after browser restart.
  • Keyboard Shortcuts - q  and Q to either quickly add a task or a form driven interface. Quick Add (q) follows some cryptic format but lets users "quickly" add a task. e.g., Something important ^t @Work #Feb 5 !H
  • Today/Next/Someday - Tabs can be navigated using arrow keys. 
  • Sortable tasks - This is the jquery ui sortable; lets users drag the tasks based on the order in which they want to perform.
  • Completed Tasks get nicely stricken out for that sense of accomplishment :D
Few enhancements that are still in the making:
  • Allow drag-n-drop across panes.
  • In-place editing of tasks : description/context/due/priorities
  • Log of completed/deleted tasks
This app was inspired by the so many good GTD apps available on Chrome Store or Mac OS X & the iOS.