Friday, November 8, 2013

Useful FQL examples

I've been exploring the facebook graph API and fql. FQL seems to be a very powerful tool. Here are some of them which I've been using recently:

1. Finding friends user id by looking up his name:

select name, uid from user where strpos(name, "part_of_your_friends_name") >= 0 and uid in (SELECT uid2 FROM friend WHERE uid1=me())

2. Find the id of a group by its name:

select id, name from profile where name="group_name"

3. Find posts of a user in a group:

SELECT post_id, message, created_time  FROM stream WHERE strpos(field_name,'possible_string') >=0 and  source_id=group_Id and actor_id=user_id  and created_time >=unix_timestamp and created_time < unix_timestamp limit A_NUMBER


//will be continued...

note:
To get the unix timestamp you can use this code in Javascript:

var d = new Date();
d.setMonth(d.getMonth() - 3);
three = Math.round(d.getTime() / 1000); //3 months ago

console.log(three);



Thursday, November 7, 2013

Answers to the exercises of the book Natural Language Processing with Python: Chapter 1

from __future__ import division
from nltk.book import *

#author: Anik

Checkout Chapter 2 Excercise Answers

ex 2
print 26**100

ex 3
print ['Monty', 'Python'] * 20

ex 4
print len(text2)
print len(set(text2))

ex 5
romance

ex 6
text2.dispersion_plot(["Elinor", "Marianne", "Edward", "Willoughby"])
Ellenor appears everywhere, and probably Willoughby and Marianne had a relationship

ex 7
print text5.collocations()

ex 8
easy

ex 9
easy

ex 10
my_sent = ["All", "quiet", "on", "the", "western", "front"]
joined =  ' '.join(my_sent)
print joined
print joined.split()

ex 11
phrase1 = ["All", "quiet", "on", "the", "western", "front"]
phrase2 = ["We", "were", "Soldiers"]
print len(phrase1 + phrase2)
print len(phrase1) + len(phrase2)

ex 12
print "Monty Python"[6:12]
print ["Monty", "Python"][1]
second one, tokenized

ex 13
sent = "Flags of our fathers"
print sent.split()
print sent.split()[2][2]

ex 14
sent3 = ['In', 'the', 'beginning', 'God', 'created', 'the', 'heaven', 'and', 'the', 'earth', '.']
indices = [i for i, x in enumerate(sent3) if x == "the"]
print indices

ex 15
bs = [w for w in text5 if w.startswith('b')]
print sorted(bs)

ex 16
print range(10)
print range(10,20)
print range(10, 20, 2)
print range(10, 20, -2)

ex 17
print text9.index('sunset')
print text9[621:644]

ex 18
print sorted(set(sent1+sent2+sent3+sent4+sent5+sent6+sent7+sent8))

ex 19
print len(set([w.lower() for w in text1]))
print len([w.lower() for w in set(text1)])

ex 20
print "ANIK".isupper()
print not "ANIK".islower()
no difference

ex 21
print text2[len(text2)-2:len(text2)]

ex 22
four_letter_words = sorted([w.lower() for w in text5 if len(w) is 4])
print FreqDist(four_letter_words)

ex 23
upper_case_words = [w for w in text6 if w.isupper()]
for word in upper_case_words:
    print word

ex 24
word_list = [w for w in text6 if w.endswith('ize') and 'pt' in w and w.istitle()]
print word_list

ex 25
sent = ['she', 'sells', 'sea', 'shells', 'by', 'the', 'sea', 'shore']
print [w for w in sent if w.startswith('sh')]
print [w for w in sent if len(w) > 4]

ex 26
print (sum([len(w) for w in text1])) / len(text1)

ex 27
def vocab_size(text):
    return len(set([word.lower() for word in text if word.isalpha()]))
print vocab_size(text1)

ex 28
def percent(word, text):
    return 100 * text.count(word) / len(text4)
print str(percent('a', text4)) + '%'

ex 29
too descriptive

Saturday, September 21, 2013

Connect to facebook Graph API with python

Yes, this type of posts are all over the world wide web. However, there are thousands of methods and not all of them are going to work for you. I've tried to find the easiest way to interact with Graph API and that's what I'm going to describe, along with the problems I've faced throughout the process. I've been using PyDev in Eclipse.

1. Get python-facebook sdk. this seems to be the official one. Install it with this command
sudo pip install git+git://github.com/pythonforfacebook/facebook-sdk.git

2. If you have opened up eclipse before this process, you are going to get an import error. PyDev doesn't refresh the PYTHONPATH automatically. You have to got to

File > Properties > Edit the launch configuration > Refresh tab > Check refresh all resources

3. Now, you would need an access token to interact with the Graph API. Usually this is done with a browser requesting with app id and secret token and then facebook returns an access token. That's a bit tricky, I was looking for an easier method. However, for testing purpose, facebook also gives access tokens directly.
Go to this link : https://developers.facebook.com/tools/explorer and click on generate access token. It shall ask for the permissions you want to have in your application and then generate an access token for you. However, It's temporary and shouldn't be hard coded in your application forever.

4. Paste the following code in your editor. Among tons of others, I've found this one little and easy.
import facebook
token = 'your secret token'
graph = facebook.GraphAPI(token)
profile = graph.get_object("me")
friends = graph.get_connections("me", "friends")
friend_list = [friend['name'] for friend in friends['data']]
print friend_list

And see the output in console, a nice list of your friends. Remember two points:

  1. If it fails to find 'facebook' module, you might need to restart eclipse.
  2. If it fails to find Graph API, re-install facebook module. You can remove it by issuing
    pip freeze
    to get the actual python-facebook module name and then
    pip uninstall that-module
     

Tuesday, July 2, 2013

Oh My Zsh! for Linux Users

If you use linux and do not use zsh then you are missing something you don't want to miss. Actually I'm grateful to my senior for introducing it to me.

Oh My Zshell is a project for extending and beautifying zshell. Follow that link and don't ever look back to any other shells. :)

For installation and usage:

http://railscasts.com/episodes/308-oh-my-zsh
http://www.stevendobbelaere.be/installing-and-configuring-the-oh-my-zsh-shell/

Screenshot of my current shell, using guake and oh-my-zshell :



Sunday, June 9, 2013

Restore missing "Create New Document" and extend it's functionality in ubuntu 13.04 Nautilus context menu

Hi,

One of the reported bugs of 13.04 is that, the creating blank document menu item is missing in nautilus context menu. It's restoration instruction was found in this link .

You just have to create an empty document inside your Templates folder in home directory and the missing menu item would be restored.

Now you can leverage the templates folder's functionality by adding different types of file schemas. For example you can create files with .txt, .html, .sh, .sql extensions and add appropriate template codes inside. For example, I have these files in this folder with those extensions and with the following contents:

untitled.txt
//nothing

untitled.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">

    <title>Title Goes Here</title>
</head>
<body>
<p>This is my web page</p>
</body>
</html>


bash.sh
#!/bin/bash
//nothing

obsql.sql
CREATE TABLE prefix_table_name
(
  prefix_table_name_id character varying(32) NOT NULL,
  ad_org_id character varying(32) NOT NULL,
  ad_client_id character varying(32) NOT NULL,
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,
  created timestamp without time zone NOT NULL DEFAULT now(),
  createdby character varying(32) NOT NULL,
  updated timestamp without time zone NOT NULL DEFAULT now(),
  updatedby character varying(32) NOT NULL,
  
  
  CONSTRAINT prefix_table_name_key PRIMARY KEY (prefix_table_name_id),
  CONSTRAINT prefix_table_name_ad_client FOREIGN KEY (ad_client_id)
      REFERENCES ad_client (ad_client_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT prefix_table_name_ad_org FOREIGN KEY (ad_org_id)
      REFERENCES ad_org (ad_org_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
You can add any number of file types as you want.

Tuesday, June 4, 2013

Regular Commands in Linux

Hi,

Most of the time you may notice that you are having to give some regular commands in terminal when you start working in the morning. For example, in my case-opening up chrome, pgadmin, springsource toolsuite, skype, firefox, guake. Initially I had to click a few shortcuts or enter commands in the terminal. Then I've searched for a quicker and easier way and came up with this:

1. Opened up a text file in gedit/sublime-text.
2. Wrote this line:
#!/bin/bash
guake & /home/anik/ides/springsource/sts-3.1.0.RELEASE/STS & pgadmin3 & firefox & skype
3. Saved it as regularCommands.sh
4. Pasted the file inside /bin folder of the file system.
Then I was able to open up a terminal and just put "regularCommands" without the quotes or even omitting the ".sh" and all those programs were starting up one after another. Saves me time and energy.
Hope that helps. :)


Monday, April 29, 2013

2.1.3 Working with Filters and Servlets

Filters are java classes that can dynamically intercept requests, manipulates them and manipulates response before sending it back to the client.

Sometimes, it may be necessary to do the same thing in different servlets. In those cases, a filter may be defined and reuse it for all of them.

Tasks that a filter can perform includes
  • Authentication Filter
  • Image Conversion 
  • Data Conversion
  • Encryption 
  • Cache

To explain this concept, we shall create a servlet and two filters. Then we would see how can we call the first filter before the servlet is called, then the servlet and lastly the final filter would be called.

Code of servlet:
@WebServlet(name = "helloWorld", urlPatterns = "/helloWorld")
public class helloWorld extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                      response.getWriter().println("This line is from servlet");
    }
}
Then the code of first filter:
@WebFilter(filterName = "HelloAppenderFilter", urlPatterns = "/*")
public class HelloAppenderFilter implements Filter {
    private FilterConfig filterConfig = null;

    public void destroy() {
        filterConfig = null;
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        resp.getWriter().println("Hello (from filter 1)");
        chain.doFilter(req, resp);


    }

    public void init(FilterConfig config) throws ServletException {
        this.filterConfig = config;
    }

}
Second filter:
@WebFilter(filterName = "WorldAppenderFilter", urlPatterns = "/*")
public class worldAppenderFilter implements Filter {
    private FilterConfig filterConfig;
    public void destroy() {
        filterConfig = null;
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        chain.doFilter(req, resp);
        resp.getWriter().println("World (from filter 2)");
        

    }

    public void init(FilterConfig config) throws ServletException {
        this.filterConfig = config;
    }

}
If we check the url patterns of the both filters, we shall find no difference. Then how do we control the order of execution of these filters? Well, the answer lies in the web.xml file.
 
        HelloAppenderFilter
        /*
    
    
        WorldAppenderFilter
        /*
    
 

2.1.2 Sessions and Servlets

Purpose of using session is the same as of using cookies. The primary difference is, cookies are stored in client browser where sessions are stored in the server.



Sessions can be managed in four methods
  • Cookies
  • URL rewriting
  • Hidden form fields
  • SSL

Examples of these method would come later. For now, we shall use the servlet api to operate on a very simple session.


@WebServlet(name = "SessionServlet", urlPatterns = "/sessionTest")
public class SessionServlet extends HttpServlet {
    int counter = 0;
       public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
           response.setContentType("text/html;charset=UTF-8");
           PrintWriter out = response.getWriter();
           HttpSession mySession = request.getSession(true);

           synchronized (this){
               out.println(mySession.getId());
               out.println("
You have visited this page "+(++counter));
               out.println((counter == 1) ? "time":"times");
               if(counter % 5  == 0) mySession.invalidate();
           }

           out.close();
    }

}
In this code snippet, the retrieved which was associated with the request object. The boolean true means that a new session would be created if there is none in existence.

Saturday, April 27, 2013

2.1.1 Cookies and Servlets

As Http is a stateless protocol, it doesn't remember client information between request intervals. Each request is new to him. But in some kind of applications like shopping card apps, website tracking, visitor profile generation it is necessary that the server does remember information about the client.

Cookie is small amount of data captured by the server and stored in the client end. Each time the client visits a website, server checks if there is any cookie present in the clients end and then responses accordingly.

  • There are 6 parameters that can be passed to a cookie:
  • The name of the ccookie
  • The value of the cookie
  • The expiration date of the cookie
  • The path the cookie is valid for
  • The domain for a secure connection to exist to use the cookie
Again, there are two types of cookies:
  • Permanent/Persistent Cookies-Cookies are not destroyed after closing the browser.
  • Session/ Transient Cookies-in this case, cookies are destroyed after the browser is closed.

Ok, let's move on to create and retrieve some cookie on our own. We shall create a cookie that accepts user input and remembers it for a specified time. When the client visits the page within this time, the information is shown to him. 

First, let's set the cookie.

@WebServlet(name = "SetCookieServlet", urlPatterns = "/setCookie")
public class SetCookieServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        Cookie songCookie = new Cookie("songCookie", "Welcome to the Hotel California!");
        songCookie.setMaxAge(10);              //in seconds
        response.addCookie(songCookie);       //important! This line actually transfers the cookie to the browser

    }
}

Now, in another servlet, we shall retrieve the cookie value.

@WebServlet(name = "GetCookieServlet", urlPatterns = "/getCookie")
public class GetCookieServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("songCookie")) {
                    out.println(cookie.getValue());
                }
            }
        }

    }
}


Hit the url /setCookie once. This will create the cookie which will be alive for 10 seconds. By this time, hit the url /getCookie. You should see the title of one of my most favorite songs.
 

Wednesday, April 24, 2013

Setting up the development environment for Java EE 6 with Intellij Idea and Glassfish.

You would need four things mainly:
  • Java EE SDK
  • Integrated Development Environment
  • Application Server
  • Database
1. Java EE SDK

Select your appropriate one from this link and then install it after downloading.

2. Integrated Development Environment

Sun recommends NetBeans for EE 6 development. It's free for both commercial and non-commercial use. However, I'm suggesting you to use Intellij Idea, which is arguably the best IDE for software development.
Download Intellij from this link. You might download the free trial of the ultimate edition and then register it later. Install it after running and following the on-screen instructions. This link might be helpful.

3. Application Server

I suggest you configure two application servers for development and test each of them. Namely, Glassfish 3 and JBoss 7. You would get a better idea about servers them from these so question 1 and so question 2. The bottom line is, JBoss and Glassfish are the two most popular app server. Though JBoss is supposed to be fast, it lacks JEE6 spec support compared to Glassfish. So, for now, let's just stick to Glassfish.
I suggest you take some time and configure glassfish according to this guide.

4. Database

Postgresql or Mysql would be fine.
sudo apt-get install postgresql-9.1
sudo apt-get install mysql-server
 
That's all for now.


2.1 Servlets

I do not intend to write a comprehensive post that would describe the servlet technology as a whole. It's just not possible. Great books with numerous pages are already written on each of the tech stack of JEE 6. Servlets are no exceptions. So, I would try to capture the basic idea of these things.

Overview:

Servlets are pieces of program that run in server to handle clients requests. Unlike the web servers, Servlets can access DAL, convert the resultset into browser readable format. Servlets can handle multiple client requests efficiently as they are not run as processes rather, as threads.

Let's look at an example of a servlet.
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet(name = "WelcomeServlet", urlPatterns = "/welcome")
public class WelcomeServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {

        response.getWriter().println("welcome to the hotel california!");

        response.getWriter().close();

    }

}

}
You might notice that the line
@WebServlet(name = "WelcomeServlet", urlPatterns = "/welcome")
defines the servlets name and url pattern that it would serve. For example, if your project's root is localhost:8080/myapp, then this servlet can be called by the url localhost:8080/myapp/welcome. It is possible to override this url pattern annotation by modifying the web.xml file found in WEB.INF folder. If we add these lines in web.xml
    
        HelloServlet
        servlets.HelloServlet
    

    
        HelloServlet
        /hello
    
then the servlet's name would be overridden and it would be called by "/hello".





Monday, April 22, 2013

1. Introduction to Java EE 6

Throughout this series I will be discussing the basic technology stack of JEE6. The discussion will contain brief overview, usage and small programming example.


I assume you have basic knowledge about what enterprise application is or what Java EE 6 is up to. I will be focusing on the tech stack of it.

Basically, there are four tiers of technology that enterprise java uses.

Web Applications Technologies

  • Java Servlet
  • JavaServer Pages [JSP]
  • JavaServer Pages Standard Tag Library [JSTL]
  • JavaServer Faces [JSF]
  • Facelets
Enterprise Applications Technologies
  • Enterprise JavaBeans [EJB]
  • Java Persistence API [JPA]
  • Java Transaction API [JTA]
  • Java Message Service [JMS]
  • Java EE Connector Architecture
  • Java Mail
Web Services Technologies
  • SOAP and RESTful
  • Java API for XML Registries [JAXR]
Security Technologies
  • JACC
  • JASPIC
So, sit tight, and learn with me. The best is yet to come. :)
 

Motivations Behind Choosing Enterprise Java

Hello there!

Actually, this is not going to be reasons appreciated or accepted by all. It's just the reasons I've decided to give Java Enterprise 6 a go. At least before Ruby On Rails or Django.

1. Since the early days of my programming, I've been using Java SE, C/C++ or PHP. The syntactical structure are somewhat same in these languages. Brackets, semi-colons are must and these sort of things. That's why it seemed somewhat awkward to me when I saw the syntax of python or ruby. I thought to myself, 'How the hell these people manage to maintain OOP!'. Maybe I didn't dig deep enough. But still, why won't you say the type of a variable while you are declaring it! One or two words too much for you? :)

2. If I make a mistake in my code, I like it better appear at compile time. So, Java got my preference over ruby or python.

3. I found a ocean of Q/A or comparison posts in the internet about the productivity issue of JavaEE 6 and ruby or python. Both have some valid grounds of argument. The bottom line of these posts was this:' Java EE is for very big enterprise applications where security, scalability, maintainability are deciding factors. Frameworks like Ruby on Rails or Django are for startups, where quick output counts." My philosophy is, If you know how to build a Titanic, then you can quickly build one or two ships by applying some new tricks.

4. Productivity is an issue in enterprise java. All those compilation, deployment and then seeing the output takes a large amount of time. Though JRebel and Play framework are trying to minimize this, it's still a lot. However, as I said earlier, first I need to learn how to build a Titanic. So I'm not taking it as a factor right now.

5. Finally, I just want to harness the monstrous power of astronomically big Java EE 6 and feel myself stronger. :)

So, plain and simple, not (Rails, Django, JRebel, Play,  Spring), just Java Enterprise Edition 6.

I will get them later, after I acquire some destructive power from Java EE 6. :)