经过了一个月的学习与工作,开源夏令营进入中期检查阶段,我所做的项目也有了初步的成果,下面对这段时间的工作进行一个总结。
一、完成的工作
前半部分时间是对提案的进一步调研,经过跟之前版本ubuntu lens的比较,了解到unity-scope已经从lens变为了scope,导致之前比较方便快捷生成lens的singlet无法使用,现有的方式是采用C++和ubuntu sdk,或者是python和vala语言,我对python比较熟悉一些,所以我采用了14.04所支持的以python编写的scope。
之后对scope进行资料的搜集,这方面的中文资料基本没有,英文也没有成熟的文档可以借鉴,所以只能从源码入手,在launchpad上搜unity-scope有很多,但是大部分都是之前版本的ubuntu,参加价值并不大,经过一番搜索以后决定采用导师之前写的unity-china-photo-scope,一个在搜狗上搜索图片,并且显示在dash面板的scope。
经过对源码的阅读和相关库的资料的查阅,最终在上周完成了代码的改写,但是几番测试一直没有结果,单独对模块测试发现数据处理等过程并没有问题,可能是与D-BUS通信有问题,虽然导师提了很多建议,也进行了许多尝试,但是还是不行。
今天下午调试的时候我想能不能再借鉴一些别的scope呢,于是找到了unity-isgd-scope,一个利用isgd提供的接口将url简化的scope,这个跟我的项目的思路差不多,都是利用接口获取数据,然后显示出来,一番考虑以后决定对尝试改写这个的代码。经过对其源码的阅读,发现这个的思路清晰了许多,可能是因为我在上一个源码上下了比较多的功夫,所以读起这个来顺畅了很多。经过一晚上的奋斗,终于是初步有了成果。如下图所示:
可以看到,显示了teen这个单词的翻译结果。
二、问题与解决
数据处理的过程并不复杂,调用
<span style="font-size:14px;"> response = urllib.request.urlopen(search_url).read()
myresults = json.loads(response.decode("utf-8"))</span>
然后再对json数据进行解析即可,
<span style="font-size:14px;">def search(query, filters):
'''
Search for help documents matching the search string
'''
results = []
search_url = SEARCH_URI % query
response = urllib.request.urlopen(search_url).read()
try:
myresults = json.loads(response.decode("utf-8"))
except:
myresults = None
# Only add a result if it's a webpage
web_explains = ''
basic_explains = ''
if myresults['web'] != {}:
items_web = myresults['web'][0]
for i in items_web['value']:
web_explains += ' '
web_explains += i
items_basic = myresults['basic']
query = myresults['query']
basic_explains = ''
for k in items_basic ['explains']:
basic_explains += ' '
basic_explains += k
explains = web_explains+'\n'+basic_explains
results.append({'uri': query,
'icon': "file://" + PROVIDER_ICON,
'category': 0,
'title': query,
'comment': explains})
#results.append({'uri':query, 'web_explains':web_explains,'basic_explains':basic_explains})
return results</span>
其中results即为存储结果的列表,并作为其他函数的参数传入
比较困难的是如何将结果显示在dash界面上,一开始调试的时候调用daemon没有结果回应,然后我就又找了一个类似结构的scope,发现
有个函数没有处理过程,只有返回值,于是我也这样写
<span style="font-size:14px;"> def do_activate(self, result, metadata, identifier):
return Unity.ActivationResponse()</span>
果然这次就返回了结果,思考了一下是因为以前的代码在调用回调函数的时候传入了 参数,而我的代码中正好那个参数用不到,所以造成了返回值错误。
三、总结与心得
首先得感谢史晶导师的悉心指导,给予我在关键方向上的指导。阅读英文文档,阅读大量的源码,让我提取有用资料和具体实现方面有个相当大的成长。并且经过这次比较纠结跌宕的选择, 我有所感悟,就是有的时候一心钻牛角尖并不能解决问题,当发现这条路走不通的时候要看看附近有没有别的路可以到达相同的目的地,不经过尝试不知道这个方案行不行,只有真正去做了,才能比较出哪个才是最合适的。
四、下阶段的计划
下一阶段将继续完善功能,争取添加本地词典,和实现划词查询。