Archive for category develop

使用dropbox api来备份

最近发现越来越多的app集成dropbox来读取和保存文件了。我重新考虑了一下我的备份blog数据库的策略。之前我是直接在服务器上运行一个dropbox客户端来进行备份数据库,这样其实相当的浪费服务器资源。当然直接运行一个dropbox是比较简单,只要把保存到dropbox的文件夹下面即可。

不过为了不浪费服务器资源,我看了一下dropbox的api文档,写了一个简单的脚本来上传文件到dropbox。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#author: juntao liu
import sys
import json
from dropbox import client, rest, session

#app key and secret
APP_KEY = 'your app key'
APP_SECRET = 'your app secret key'

#access type 'dropbox' or 'app_folder'
ACCESS_TYPE = 'app_folder'

#TOKEN_FILE save token for next time access
TOKEN_FILE = 'your token file path'

class DPClient:
    client = None

    def __init__(self, app_key, app_secret, access_type='app_folder'):
        self.sess = session.DropboxSession(app_key, app_secret, access_type)
        self.request_token = self.sess.obtain_request_token()

    def build_authorize_url(self):
        # Make the user log in and authorize this token
        return self.sess.build_authorize_url(self.request_token)

    def token_from_dropbox(self):
        #This will fail if the user didn't vist the authorize url and hit 'Allow'
        self.access_token = self.sess.obtain_access_token(self.request_token)

        self.key = self.access_token.key
        self.secret = self.access_token.secret

        self.client = client.DropboxClient(self.sess)

    def token_from_file(self, file_path):
        try:
            d = json.loads(file(file_path).read())
            self.sess.set_token(d['key'], d['secret'])
        except:
            return False
        self.client = client.DropboxClient(self.sess)
        return True

    def save_token(self, file_path):
        d = {'key': self.key, 'secret': self.secret}
        file(file_path, 'w+').write(json.dumps(d))

    def upload_file(self, full_path, rename='', overwrite=True):
        from os import path
        if not client:
            print 'dropbox client not exists'
            return

        if not path.exists(full_path):
            print 'file not exists'
            return

        f = open(full_path)
        if not rename:
            filename = path.basename(full_path)
        else:
            filename = rename
        self.client.put_file(filename, f, overwrite)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "./upload_dp.py <file>"
        sys.exit(1)

    dp = DPClient(APP_KEY, APP_SECRET)
    if not dp.token_from_file(TOKEN_FILE):
        print "url:", dp.build_authorize_url()
        print "please authorize in the browser. After you're done, press enter"
        raw_input()
        dp.token_from_dropbox()
        dp.save_token(TOKEN_FILE)
    dp.upload_file(sys.argv[1])

很简单的程序,就像我说的很简单的目的只是为了上传文件。
默认DPClient上传文件会覆盖同名文件,并且使用传入的文件名作为上传的文件名。更多的功能请参考Dropbox的开发者网站:https://www.dropbox.com/developers

,

No Comments

用iCal的数据填充pomodoro

最近一段时间一直使用wunderlist管理todolist。使用番茄工作法工作。我用的是pomodoro这款番茄工作法软件。

我遇到的一个需求是想让wunderlist和pomodoro可以协同起来。很简单的需求,这都是由于pomodoro上的一个功能勾起来的。pomodoro它可以从thingsomnifocus(这是两款mac上很出名的日程管理软件,价格相当贵)里面获取出当天的日程安排填充到欲执行的工作安排里。

既然pomodoro没有提供这个功能,那么只要自己动手解决了。在applescript editor里面看了一下,pomodoro提供了

start text: Pomodoro name

的接口,可以设定一个pomodoro名字运行。不过天不遂人愿,wunderlist居然没有提供任何applescript可以操作的接口。

等wunderlist改版那要猴年马月。而且最近对于wunderlist提供功能一点小不满意,索性重新转到iCloud的reminder得了。reminder唯一的小遗憾是只能在apple设备上或者pc浏览器上使用。

说了这么多反正就是我从wunderlist转到reminder了。
我还改动了日程安排的方式:
1、任何想到的todo都记录到reminder中。
2、当天需要行动的todo都变成一个allday event放到calender。
3、当天做的事情都变成event写到calendar里面

然后我写了一个applescript脚本。当需要工作(广义的)的时候就是取出当天的allday event让我选择,然后以这个作为pomodoro name开始一个番茄钟。
附上源码:

	tell application "iCal"
		--获取当天的allday events
		set now to (current date)
		set nowTime to time of now
		set nowDate to now - (nowTime)
		set event_lists to (events whose start date = nowDate and allday event = true) of calendars

		set event_list to {}
		repeat with this_list in event_lists
			repeat with this_event in this_list
				set event_list to event_list & summary of this_event
			end repeat
		end repeat

	end tell
	set selected_event to {choose from list event_list}

	tell application "Pomodoro"
		set pomodoro to selected_event
		if selected_event = {false} then
			set pomodoro to ""
		end if
		start pomodoro
	end tell

, ,

No Comments

python2.5支持ssl

更具python官方文档 http://docs.python.org/library/ssl.html。ssl是在2.6版本才开始直接支持的。所以想要在python中使用ssl需要自己编译、安装才行。

首先下载最新的python ssl 库 http://pypi.python.org/pypi/ssl/
然后需要 python-dev、libssl-dev、libbluetooth-dev这几个开发包。还有一个必备条件是需要GCC编译环境。
在以上三个开发包都已经安装的情况下,在解压出来的ssl文件夹里面执行 python setup.py install。
如果没有任何error发生的话,你就已经可以使用python ssl了。

,

No Comments

iOS上的push notification

晚上简单了解了以下iOS(iPhone, iPad, iPod touch)上的push notification机制。

其实平时我说的push notification里面包含了两个东西,一个是local notification,另外一个史push notification。
local notification与push notification除了前者是本地程序发起的,后者是有远程服务器发起的之外,其他的表现形式——对用户来说——都是一样的。他们都是为了程序不再前台运行的时候通知用户的。

local notification是程序使用iOS的API注册一个定时的“通知消息”,到指定时间就会把该“通知消息”推送到屏幕上给用户(如果注册该notification的程序不在前台运行了)。
push notification是程序注册接受消息,然后当iOS从远程服务器接收到该程序的推送消息,再行推送消息到屏幕。

local notification实际上是确定的,push notification则是依赖于远程服务器并且不确定什么时候会有的。

我理解的push notification是这么一个过程,iOS底层始终有一个连接保持与远程notification 服务器的连接。当有消息要推送给用户的时候,远程服务器就在该连接里面发送消息。iOS底层接受到该消息,然后推送到用户屏幕。

2 Comments

ituango第二期

ituango的中文名是爱团购。我真不怎么喜欢这个中文名,这话我想说很久了。

第二期的api已经上周就已经架设好了,就等客户端这边完工了,预计在年前会release版本的。
顺便说一下,iphone上的第一版居然还在审核中,这真是让人疯狂的。symbian上的版本我几乎没动过,想要quit,想想太丢人了。半途而废会让我难受的,如果有任何人会期待symbian版的话,说声抱歉,我尽量做。

第二期的UI基调基本不变,不过在第一期的基础上扩展了不少功能,这也得多谢几位给我们提意见的朋友。
我们主要增加了:
1、详情查看。可以在详情中看到图片了,而且可以方便的分享给你的朋友们。并且支持短网址。
2、分类查看。可以查看不同类别的团购,当然还是可以一次看全部的。
3、收藏。当时没有时间细看的可以收藏起来,等到有时间的时候在自己查看。
4、评论。本来我是不想加上的,被说服的。随着ituango用户量增加,肯定会有人去过这个商家,这样可以给其他用户提供一些参考,貌似有点道理。
5、商户地址、地图。可以看到商户的地址并且可以直接调用地图查看(如果存在地址的话)。

No Comments

QT学习资料

QT教程整理 http://www.thisisqt.com/forum/viewthread.php?tid=270

Qt Creator系列教程 http://www.yafeilinux.com/?page_id=3

官方QT for Symbian http://wiki.forum.nokia.com/index.php/Category:Qt_for_Symbian

No Comments

Qt Symbian HTTP遇到的怪事

我觉得自己用qt开发净遇到怪事,想来还是对开发环境不熟悉造成的。

今天参考QT的示例写一个请求HTTP数据类,发现提示 这几个头文件不存在。仔细看了示例中的pro项目文件才知道原来QT使用网络需要在项目文件中的QT配置项加上network支持,如下:
QT += network

于是可以再模拟器上编译通过。

在真机调试的时候发现又不能编译通过,编译报错 这几个头文件找不到。在详细compile output中看到是以上三个不能在预设的include path中找到,那很明显就是for Symbian 编译没有包含网络的那些头文件。又是在google上一通乱找,知道是要在配置文件中的symbian sectioin中加上
TARGET.CAPABILITY += NetworkServices

奇怪的还是编译不过,而且报错也相同。并且在compile output中输出的include path和没加 NetworkServices是相同的。我也没有在搜索引擎中找到任何有用的信息。
而且我在QT for Nokia的文件夹下面搜索到上面三个头文件是存在于 \NokiaQtSDK\Symbian\SDK\include\QtNetwork 目录下的,果然不包含在include path中。

没法子了只能通过比较Symbian上的QT网络示例来找问题了,在nokia qt网站上找了Httpremote这个示例。对照了一番项目配置,一样啊,可是为毛人家就是可以编译通过在手机上跑呢?

我在他的项目文件下搜索了一番,发现他的编译生成makefile文件里面是存在\NokiaQtSDK\Symbian\SDK\include\QtNetwork这个include path的,然后在我的项目文件夹下没有任何一个文件包含前面那个目录。等等,我的项目文件夹下没有makefile文件存在?这个简单,在qt creater中项目上右键run qmake,生成makefile。打开makefile,发现有\NokiaQtSDK\Symbian\SDK\include\QtNetwork目录存在了,于是编译通过。

————————————————————————————
奇怪的是为什么没有生成makefile,没有makefile他又是怎么编译的呢?这个有待我去仔细了解一下使用QT(qt creater)的编译流程是怎么样的。
虽然遇到不少问题,不过有问题就能激发人解决问题的兴趣。在解决问题的过程中可以学到很多东西。

No Comments

团购信息聚合-ituango

呃,这是个软文。

第一次在点评网参加过团购之后,我对于团购的兴趣就起来了。之后发现有tuan.hao12.com3的团购信息聚合,更让我连续几天会浏览该网站。由于我本身不喜欢泡在网页上,当时就想是不是有一个手机客户端的团购信息聚合软件呢。当然在android market上有找到,只不过我觉得没有满足我的要求。做一个合意软件的想法从此而来,该想法酝酿许久之后终于在某次imtkoo内部讨论中决定做出来。
目前ituango的第一版进度基本完了预期。今天已经确定第二版的功能,我们也会尽快开发。

以下是ituango支持的平台情况:
魅族M8:market审核中,可以下载安装。
android:可以market安装,可以下载安装。

iphone/ipad: market审核中,尚未提供越狱下载。
windows phone 7:登陆market中,未开放下载。
symbian s60v5: 未开放下载。

以下是从主页上抄了下面的介绍,有兴趣的话可以打开ituango主页瞧瞧。我个人更喜欢提供反馈意见。

爱团购介绍
“爱团购”是由iMTKoo开发的一款集合国内团购信息的手机客户端应用软件,它能让您随时随
地通过手机查看团购信息。 本软件将终身免费开放,欢迎用户下载使用。

0.9.9版本特点
1.支持查看各大城市团购信息;
2.专业的UI设计为用户呈现最佳体验;
3.全文字展示更快更省流量。

1 Comment

qt gui 开发log

首先我得为自己辩解一番,作为一个3年以来没有做过GUI开发的程序员,我那点错误应该可以原谅。

应该说是昨天正式开始qt开发的,对于qt nokia开发我完全不懂,于是从它的教学入手。教你如何进行qt mobile开发的例子是一个实时显示电量变化的程序。一步一步做完这个程序,对于如何搭建一个项目我是了解了。

qt的界面设计是可视化的,也就是把控件拖到界面上就可以了。对于这一个个label、button、listview…..我简直就是一头雾水。按照美工的设计,程序title背景上有一个icon和若干文字。我想法是graphiccontainer控件作为titlebar,然后分别绘制背景图层、icon图层以及文字图层并将这三个合并起来,最后把它刷到graphiccontainer上去。问题是一则我不知道graphiccontainer是否这么使用的,二则也不了解qt上图层的用法。于是我就在找这些资料上面花了3、4个小时的时间。

转机是在下午和benson出去买饮料。我实在为GUI开发头疼的很,觉得问benson在android上是怎么实现的也许能够有启发。他说android上有titlebar的控件,设置一下样式就可以了。我简直有种拨云见日的感觉,qt上虽然没有titlebar这个控件,不过其他的控件排列组合一下不就ok了嘛。于是我改变思路,用三个label搞定,最下面的label是作为titile背景,上面一个label放置icon,另外一个label是文字。还有一些其他界面设计的问题,不过对我来说最难得思路问题解决了。

感觉gui开发还挺有意思的。比如美工设计了一个效果是:按钮按下之后感觉凹进去一个蓝色四角弧形的按钮。我的做法是在按钮背景透明,在按钮后面放置一个隐藏的矩形。当按钮被按下就设置矩形可见,按钮释放就设置矩形不可见。比如换按钮的图片也是一种方法。

目前比较头疼的问题是:屏幕自适应,symbian的模拟中文支持。

,

No Comments

使用nokia qt sdk开发吗

想在symbian平台上做个软件。
看了一下nokia qt sdk。它说提供meamo与symbian s60 平台的开发能力。然后想要让程序跑在symbian上还要安装一些qt的类库,我不知道这是为了调试或者凡是需要跑qt开发的程序就需要在手机上安装类库,这样用户使用起来太麻烦了。或者是打包sis安装文件的时候会带上,这也会增加安装包的体积。待查。

由于nokia qt sdk不提供symbian s40支持,我拿不准是否要选用它而放弃s40平台。这个就取决于s40的用户有多少,会不会使用这个软件了。不过我又有其他考虑,如果为了支持s40而学习nokia那套老的sdk是对时间与精力的浪费,未来s40基本上没有太大作为了。

而在nokia上开发还有另为一个选择是用java,老实说没接触过手机java,也不知道它的能力怎么样。不过我认为一个只是联网然后对数据做一些排版然后显示的程序应该不会对API要求太多,也就是说手机java够用了?前几个周我在一台三星山寨系统的手机上看过它跑Java QQ,感觉还可以。如果用手机java开发(j2me?)的好处是,这个软件可能可以通过简单的修改支持大量的其他平台。这是一个相当可观的数量。(可以交给其他人开发)

综合这些考虑,使用nokia qt sdk开发对未来发展比较有好处,这样可以积累一些s60 native开发的经验。因为s40没什么前途了,手机java限制比较多,nokia未来的meamo平台也是qt的。

——————-
选用nokia qt sdk是早做的决定,写下上面这些文字的时候认真考虑了一下j2me开发。这个需不需要介入呢?用户群虽然很大,但是大部分都是低端用户,由于j2me的能力有限界面恐怕很难做到漂亮。也就是低端手机用户恐怕也不会是我们的用户,而少量的高端用户可能对界面要求比较高。待具体讨论。

,

2 Comments

SetTextSize SetPageWidth