Sep 17

GNOME Do Preview.png Gnome-Do, 一款快速启动软件,专为Gnome开发的,与Windows下很多软件相比,我最喜欢它的插件功能。通过激活相应插件,可以实现很多功能。

安装Gnome-Do很简单,在Ubuntu源中已经有了,当然,也可以自己去官方站点上下载。

装好以后先设置一下快捷键,我设置的<Super>+Space。每次按下快捷键就可以看见Gnome-Do的窗口了。

Continue reading »

written by Kyle Wu \\ tags: , , ,

Jul 27

最初知道Pidgin是开始使用Ubuntu,很喜欢这种IM集成的软件,可以同时登陆GTalk,MSN等主流的即时通讯。今天碰巧在网上看到Pidgin可以支持Twitter,于是搜到了这款Pidgin插件,Microblog-Purple

Microblog-Purple是针对LibPurple开发的软件(如Pidgin,Finch)开发的插件,使用Google Code提供的SVN服务进行版本控制。

我使用的是Pidgin Portable的版本,也就是PortableApp.com开发的版本,绿色版本。这款插件也提供了针对Pidgin Portable的安装包,在Microblog-Purple主页的右方,可以找到下载链接,我所下载到的是microblog_.0.2.2_for_pidgin_portable_2.5.x-1.exe

运行后选择Pidgin的安装目录即可。

运行Pidgin就可以在新建的窗口找到Twitter选项了,同时,插件也提供了很多设置选项,最好将Use HTTPS的勾选上。

现在Twitter被墙掉了,所以要连接上Twitter,需要简单的修改一下Host文件。

在Host文件中添加如下内容

128.121.146.228 twitter.com
128.121.146.228 www.twitter.com
128.121.146.101 assets0.twitter.com
128.121.146.101 assets1.twitter.com
128.121.146.101 static.twitter.com
128.121.146.229 assets2.twitter.com
128.121.146.229 assets3.twitter.com
65.74.185.41 twitter.zendesk.com
65.74.185.41 help.twitter.com

Twitter账户设置好后,每隔60s(默认设置),就会抓取一次Twitter消息,如果有新消息,将自动弹出。

Pidgin真的是款很好的软件,市面上已经有很多类似软件了,但我感觉,Pidgin还是最好的一款。

written by Kyle Wu \\ tags: , ,

Jun 03

5月35日前夕,Twitter终于未能幸免,诸位同学只能扒着墙头去看twitter了。一些垃圾话我就不重复了,说出来也是没有用的。

http://dabr.co.uk/ 现在这个开源的twitter web客户端还能够使用,有国外php空间的也可以自己搭建一个来使用,强烈推荐。

written by Kyle Wu \\ tags: ,

Apr 04

What is Twitter4J?

Twitter4J是TwitterAPI的一个Java库。使用Twitter4J,你可以方便的将你的应用程序与Twitter服务结合。

How to use Twitter4J?

首先,从Twitter4J的网站上下载最新的Twitter4J的jar包。点这里可以进入下载界面。

下载完成后,让我们打开Eclipse,新建一个Java工程,不要忘记将Twitter4J的jar包加入Library中,见下图。

接下来我们可以创建一个net.kylewu.twitter.TwitterMain类,用来程序主流程。代码如下(代码比较多,折叠起来了,点箭头就可以看到完整的了)。

package net.kylewu.twitter;

import java.util.List;
import java.util.Scanner;

import twitter4j.DirectMessage;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Tweet;
import twitter4j.Twitter;
import twitter4j.TwitterException;

/**
 * The main class of twitter client
 *
 * @author Kyle Wu
 *
 */

public class TwitterMain {

    public static void print(String string) {
        System.out.println(string);
    }

    public static void main(String[] args) {

        if (args.length &lt; 2) {
            print("Usage: java net.kylewu.twitter.TwitterMain ID Password");
            System.exit(-1);
        }

        String strTip = "=========================\n"
                + "Please select what you want to do:\n"
                + "1. Updating status\n" + "2. Getting Timeline\n"
                + "3. Sending Direct Messages\n"
                + "4. Receiving Direct Messages\n" + "5. Search for Tweets\n"
                + "6. Asynchronous API\n"
                + "0. Exit\n" +
                "=========================";

        // Twitter class is the one you may want to look first
        Twitter twitter = new Twitter(args[0], args[1]);

        Scanner scanner = new Scanner(System.in);

        while (true) {
            print(strTip);

            String select = scanner.nextLine();

            if (select.compareTo(TwitterAction.UPDATE.toString()) == 0) {

                // get message
                print("Please input message you want to update:");
                String message = scanner.nextLine();

                try {
                    // update here
                    Status status = twitter.update(message);
                    print("Successfully updated the status to ["
                            + status.getText() + "].");
                } catch (TwitterException e) {
                    print("Error occured when updating");
                    e.printStackTrace();
                }

            } else if (select.compareTo(TwitterAction.GETTIMELINE.toString()) == 0) {

                try {
                    // get friend time line here
                    List statuses = twitter.getFriendsTimeline();
                    print("Showing friends timeline.");
                    for (Status status : statuses) {
                        print(status.getUser().getName() + ":"
                                + status.getText());
                    }
                } catch (TwitterException e) {
                    print("Error occured when getting friends timeline");
                    e.printStackTrace();
                }

            } else if (select.compareTo(TwitterAction.SENDDIRECTMSG.toString()) == 0) {

                print("Please input id you want to send to :");
                String id = scanner.nextLine();
                print("Please input message you want to send to :");
                String message = scanner.nextLine();
                try {
                    // send direct message here
                    twitter.sendDirectMessage(id, message);
                    print("Successfully send message to " + id + ".");
                } catch (Exception e) {
                    print("Error occured when sending direct message");
                    e.printStackTrace();
                }

            } else if (select.compareTo(TwitterAction.RECVDIRECTMSG.toString()) == 0) {

                try {
                    // receive direct message here
                    List list = twitter.getDirectMessages();
                    print("There are " + list.size() + " messages");
                    for (DirectMessage dm : list) {
                        print("Sender:" + dm.getSenderScreenName());
                        print("Text:" + dm.getText() + "\n");

                    }
                } catch (Exception e) {
                    print("Error occured when receiving direct message");
                    e.printStackTrace();
                }
            } else if (select.compareTo(TwitterAction.SEARCHFORTWEETS
                    .toString()) == 0) {

                try {
                    // search for tweets
                    Query query = new Query("wenwu");
                    QueryResult result = twitter.search(query);
                    print("hits:" + result.getTotal());
                    for (Tweet tweet : result.getTweets()) {
                        print(tweet.getFromUser() + ":" + tweet.getText());
                    }

                } catch (Exception e) {
                    print("Error occured when searching for tweets");
                    e.printStackTrace();
                }
            } else {
                // exit
                System.exit(0);
            }

        }
    }
}

接下来创建一个net.kylewu.twitter.TwitterAction的Enum,主要是对各种消息进行枚举。代码如下。

package net.kylewu.twitter;

/**
 *
 * @author Kyle Wu
 *
 */

public enum TwitterAction {
    UPDATE(1),
    GETTIMELINE(2),
    SENDDIRECTMSG(3),
    RECVDIRECTMSG(4),
    SEARCHFORTWEETS(5);

    final private int type;

    private TwitterAction(int type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return String.valueOf(this.type);
    }

    public int getType() {
        return this.type;
    }

}

好了,我们运行一下,功能很简单是吧,当然代码也很简单。Twitter4J已经为我们做了很多事情,我们所要做的仅仅是调用Twitter类提供的一些方法。后面我还会发布一篇Twitter4J探秘,让我们从内部看看Twitter4J是如何帮助我们的:-)

哪位朋友用Twitter4J做了好的应用,别忘记告诉我一声哦。

written by Kyle Wu \\ tags: ,

Apr 03

What is Twitpic?

Twitpic是一个利用Twitter网络的图片分享网站。

How to use Twitpic?

使用你的Twitter账号登陆Twitpic。界面很清爽,不是么?点击页面上方的Upload photo就可以上传图片了,同时也可以随同图片发布一下信息。
Twitpic支持在线上传,同时也支持手机上传(点击页面上方Settings便可以看到使用方法),并提供API供用户使用。作为开发者,只需要关注API页面,Twitpic提供的功能非常简单,但很实用。

Twitpic作为一个依托于Twitter的具有优秀创意的应用,具有很好的前景,喜欢同好友分享图片的同学不要忘记Twitpic

written by Kyle Wu \\ tags: ,