使用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
《改变心理学的40项研究》
1 通过对割裂脑病人的研究,左右脑是拥有独立思考的能力的。不过由于左右脑拥有的功能不同,所以我们需要一个联通的大脑。
2 研究发现丰富环境下的老鼠比贫瘠环境下的老鼠拥有更重、更厚的大脑皮层,更大的大脑神经元。
3 具有相同遗传基因的人(同卵双胞胎),即便分开抚养并且生活条件大相径庭,他们长大成人以后不仅在外表上极为相似,而且其基本心理和人格也惊人的相似。
4 感知深度的能力是天生的。
5 知觉恒常性中的大小恒常性(近大远小)是后天经验的。
6 人需要梦。如果做梦被剥夺,那么它会反弹。
7 梦是一种生理需求。
8 催眠让被试产生了一种期望,这种期望促使被试以与期望相一致的方式表现某种行为。
9 经典条件反射(巴甫洛夫条件反射学说)可以解释许多人类行为
10 人类所有的行为起源于学习和条件反射(比如:情绪)
11 迷信行为与其他任何一种行为一样,很容易用操作性条件反射原理解释
12 儿童会模仿作为榜样的成人的行为
13 教师的期望效应对学生的在校表现会产生长期的潜在影响
14 每个人都有他的某个智力技能强项。多元智力理论
15 尽管内部过程无法法直接观察,但我们可以通过分析可观察的行为而客观、科学地将其推断出来
16 记忆是什么时候用,什么时候重组的。相当不可靠。
17 爱除了食物还要接触安慰(拥抱)
18 智力或认知的发展在很大程度上是一个渐进过程,不能跳跃
19 道德价值观是一个渐进过程。
20 当我们拥有控制力时,我们便是更快乐和更有成就的人
21 人类性反应的过程研究
22 人类脸部表情全球通用
23 《社会再适应评定量表》与健康
24 改变自己的原有行为或观点来降低认知失调
25 内控与外控行为。I-E量表
26 双性化与BSRI量表。
27 个体的特殊行为模式与健康有关
28 个人主义与集体注意(文化)对人心理与生理都有影响。
29 做出心理诊断是更具病人所处的环境或场合而不是病人本身所具有的特征。(标签化的人)
30 应对焦虑的防御机制:压抑、退行、投射、反向作用和升华作用
31 习得性抑郁,当你发现你的行动是徒劳的(你没法控制)。
32 高密度环境(拥挤)对人有不良影响。
33 心理学治疗的方法之间没有太过显著的差别(针对个人特征而言可能某类治疗会更有效)。
34 系统脱敏疗法,接近你所恐惧的,你会慢慢适应它,摆脱它的。
35 罗夏墨迹测试,反映了你当前的心理特征,不过他不是也反映了心理治疗师的吗?
36 TAT测试,为画编个故事。貌似比罗夏墨迹测试靠谱点,不过还是存在一样的问题。
37 人的言行是不一的,嘴上说不吃KFC,不喝蒙牛了。当下就忘了。
38 从众。
39 人越多你就会觉得自己的责任越少,做出行动的可能性越低。
40 在情景的压迫下,我们会盲目的听从“权威”做明明自己认为错误的事情。
PS:
LOL,《改变心理学的40项研究》这书绝对推荐每个人都看看。心理学还是比较现实的能够直接改变生活的知识。
django有内存泄露?
写了一个抓app store数据的小爬虫。这玩意是为了配合原来的项目使用的,所以我直接用了该项目的django配置,为了使用数据库模块嘛。没想到还没跑多少数据我就发现爬虫的内存居然飙升到900MB+了。难道有什么bug会内存泄露?
我仔细看了一下代码,很简单的东西,多线程使用urllib获取app store数据,然后用django的db models把数据保存到数据库。看不出问题,只好直接动手了,首先把保存数据那块给屏蔽了;然后跑了一遍,完全木有内存泄露,仔细查看了一遍保存数据库的代码,完全木有问题。
没办法了,只好google “django models memory leak”,元凶终于付出水面,原来是我在本地由于开了django的DEBUG模式,所以django会把所有sql查询的数据都缓存起来。去掉debug模式就一切ok。
https://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory
用iCal的数据填充pomodoro
Posted by juntao in applescript, software on 01/12/2011
最近一段时间一直使用wunderlist管理todolist。使用番茄工作法工作。我用的是pomodoro这款番茄工作法软件。
我遇到的一个需求是想让wunderlist和pomodoro可以协同起来。很简单的需求,这都是由于pomodoro上的一个功能勾起来的。pomodoro它可以从things和omnifocus(这是两款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
刚刚读完《谣言》
今天中午加晚上大概花了1个半小时不到的时间看完这本信息量相当之少的书——《谣言》。
看完之后比较怀疑自己怎么会选了这本书。在豆瓣搜了一下,原来我买错了,本来是想买《谣言——世界最古老的传媒》。可能是360buy半价买书那会没有注意。(话说还买重了几本书)
不管如何,我看完了它。全书大概就是讲了谣言——其实更贴切的应该换成流言吧——传播过程与如何规避之。我觉得看第一章与最后的结语完全够了。中间的大部分是废话,流程大概是这样的,提出一个问题,然后描述这个问题,最后这章结束了。
总结是:
谣言传播的过程——社会流爆和群体极化
规避谣言的危害——寒蝉效应与去除偏见
我的理解:
社会流爆有点像跟风的意思,大家都相信这个流言,于是你也信了,作者对这个的定义还加了一些从众压力与情感压力。
群体极化大概就是一群想法意见相似的人更容易采信与他们的看法类似的流言。并且这个群体在一起的时候更容易加强。
寒蝉效应其实国人是很明白的,看一下各个网站那阉割自己的行为就是了。
去除偏见就显而易见了。
钱松今日喜结良缘
恭喜钱松今天结婚,祝早生贵子、白头携老。(PS:肚子里面已经有了。哈哈)
如今钱松结婚之后我们大学宿舍也就小虎同学没有结婚了。赶紧加油啊。
new server, new start
new server, new start 简写成NSNS。嗯哼,我故意的。
之前使用的VPS过期了,又重新租了新的VPS。一年又过去了,与之前没什么变化,还是没有好好些BLOG。
开始总是容易的,可是要完成一件事情是难的。
Read《番茄工作法》
最近工作有点昏昏沉沉的,集中不了注意力。昨天上午看到電腦玩物上的Pomodo7o 善用Windows 7工作列進度條特效執行番茄鐘工作法才了解到有这么一种“番茄工作法”。
简单的说,番茄工作法就是把你的时间分成30分钟为一个单位的小块,然后其中25分钟是工作时间,5分钟是休息时间。在这25分钟的工作时间内你需要尽力去完成你预先分配给自己的工作,也就是在这25分钟之内集中你的注意力。你必须要强迫自己集中注意力,不能够去做预先规定的事情以外的事情。
当然事实上我们在这25分钟只能可能会遇到“外部”以及“内部”的打断:当遇到“内部”打断,譬如肚子饿了,渴了之类的你记录下来然后等这一个番茄时间之后再做;当遇到”外部“打断,譬如同事问你问题、来电话之类就诚恳的要求他们等到番茄时间结束。当然如果真的有重要的事情你就放弃当前这个番茄时间,为那件重要的事情重新开始一个番茄。
当番茄时间结束的时候你就必须停掉手下的工作休息5分钟,就算还有几分钟就能做完事情也这样。如果在番茄时间结束之前就完成了工作,那么就复习之前所学或者检查你的工作。
番茄工作法的官方网站是 http://www.pomodorotechnique.com/。
它提供了中文的pdf文档。点我下载。
番茄工作法的规则:
一个番茄时间共 30 分钟,包括 25 分钟的工作时间和 5 分钟的休息时间。(2.1)
每四个番茄时间过后,停止你的工作,进行一次较长时间的休息,大约 15 到 30 分钟。(2.1.2)
一个番茄时间是不可分割的,不存在半个番茄时间或一刻钟的番茄时间。(2.1.1)
一旦开启番茄计时器,就必须要坚持到底。
如果你当真要打断当前番茄数时间,无论是你挡不住诱惑,还是真的发生了紧急的 事情,你只需要做一件事:把当前的番茄时间作废,就算马上就要响铃了也是一样, 然后在表中对应处标上点号。这时候你不能画“x”。(2.2.2)
如果你在番茄计时器响起前就完成了手头的工作,你可以利用剩余的一部分番茄时 间,复习一遍之前所学的,或检查一下所做的工作,这样可以使你得到一点小小的 提高,记录一下你所做的事情,直到铃声响起。(2.1.3)
“保护你的番茄”,(2.2.3)明确地告知想要打断你的人,并商量推迟他的请求。
如果一项任务的估测值大于 5 到 7 个番茄,那么就打散它。(2.3、3.11、4.2)复杂的工作应该被分割为小的事情。
如果一项任务的估测值小于一个番茄,就把几个小任务组合成一个大任务。(2.3、4.2)
一个番茄一个番茄地连续下去,就会成功。
下一个番茄时间会做得更好。
instapaper for ios
上上周由于要开发测试我把itouch拿回来了。对于ios上的instapaper应用我是眼馋很久了。这次狠狠心花了4.99美刀买了下来。
我一直是把instapaper的文章发送到kindle上看的。我也很习惯。老实说我是比较想体验instapaper上新加不久的分享功能。
instapaper原有的功能不必细表了,就是从instapaper网站上把你收藏的网页内容拉倒设备上,然后你就可以在手机上(ipad?)阅读了。当然instapaper对于用户的阅读体验把握相当的好。
一、全文分享
在instapaper里面标记文章为like只之后他就会自动把文章共享到你的twitter,facebook,evernote这些上去了。特别的是它会把全文发送到evernote上去,如此针对一些技术性文章我就收藏起来了。
如果不想标记like只是想分享文章。当然instapaper也提供了直接的分享方法。只要选择share按钮就可以了。
二、文章片段分享
只要简单的在instapaper浏览文章的时候在文章中选择你想要的文字然后在弹出的菜单中选择share就可以共享这段文字了。并且也会带上原文链接,就算想看原文,循着链接就可以了。
ps:由于ios的先天性缺陷(没有真真的后台运行),每次只能在instapaper打开的时候才能同步下来文章。
对于我这个itouch用户实在是太不有爱了。幸好我随时可以手机wifi共享给touch用。
instapaper还有个有趣的地方,就是我如果share的时候没有网络,它会在我联网的时候share出去。
我觉得这点比twitter的发送失败就放到draft中让用户重新发送好多了。
《少有人走的路》
我相信除非存在智力障碍,不然只要花时间学习,就没什么问题解决不了。
me:必须也要明白,有些问题不关乎能否有能力解决,而是是否值得花时间学习解决。
人人都有这样的倾向:问题一旦出现,就要立刻解决,不然他们就好思绪混乱、寝食难安,这样的心态显然不切实际,但是一厢情愿地等待问题自行消失,这种心态更为可怕,通常不会带来任何好处.
问题没有消失,它们继续存在,它们是妨碍心灵成长的永远的障碍。
只有解决”忽视问题”这一问题,他才能继续解决其他问题,才能走向下一步
现在承受痛苦,将来就可得到更大的满足感;而不谋求解决问题,将来的痛苦会更大,延续的时间也更长。
问题拖得越久,就越是难以应付,甚至积重难返,解决起来自然更加艰难。
不能及时解决人生的难题,它们会像山一样横huan在我们眼前。
趋利避害,逃避责任,这种心理趋向令人遗憾。有时甚至达到可笑的程度。
人生一世,正确评估自己的角色,判定该为何人、何事负责,即是我们的责任,也是无法逃避的问题。
人人都需要多年经验,让心智不断成熟,才能正确认识自己,客观评定自己和他人应该承担的责任。
“你不能解决问题,你就会成为问题。”
逃避自由???
我的时间是我品德责任,如何安排时间,应有我自行负责,而且只有我本人才有权处理优先次序。
我们力图把责任推给别人或组织,就意味着我们甘愿处于附属地位,把自由和权利拱手交给命运。
作为成年人,整个一生充满选择和决定的机会。他们接受这一事实,就会变成自由的人;无法接受这种事实,永远都会感到自己是个牺牲品。
尊重事实
一旦新的咨询与过去的观念发生冲突,需要对地图大幅度修正,我们就会感到恐惧,宁可对新的咨询视而不见。
我们的态度也变得相当其他—不只是被动抗拒新的咨询,甚至指责新的咨询混淆是非,说它们是异端邪说,是来自邪恶势力。
把产生于童年时期,并似乎一直适用的对于现实的观念和反应(它们通常具有特殊的意义,甚至具有挽救生命的重要性),不恰当地转移到成年人的世界里,这就是心理学上的”移情”。
me:移情,站在他人的视角观察以及思考。
逃避现实的痛苦和不幸,是人类的天性,只用通过自律,才能逐渐克服现实的痛苦。我们必须尊重事实,尽量这会带来痛苦,当远比我们的个人利益和暂时的舒适更为重要。我们必须淡化暂时的不适之感,应该追求真理而不是幻想,并愿意承受所有的痛苦。要让心灵获得成长,让心智走向成熟,就要竭尽全力,永远尊重事实,乃至献身真理。
只有让接受挑战成为习惯,心理治疗才能够真正成功。
首先,永远不要说假话,避免黑色谎言。
其次,要牢牢记住:一般说来,不说出全部真相,基本上就等于说谎;非得保留真相,那一定是情非得已,且是出于重大道德因素的考虑。
第三,不可因个人自私自利的欲望,将部分真相隐瞒下来。
第四,只有在对对方确有好处的情况下,才可有选择地隐瞒部分真相。
第五,尽可能忠实地评估对方的需要。
第六,评估他人对事实的需要,在于对方能否借助我们提供的事实,使心灵获得成长。





Recent Comments