(持续更新2013.12.23)deepin的天气插件开发者对天气插件若干常见问题的说明
Tofloor
poster avatar
yuanchenglu
deepin
2013-06-27 19:56
Author
首先,我的邮箱:yuanchenglu@linuxdeepin.com
有问题,请先在论坛上提出,如果我超过3天(含周六周日)没有回复,可以直接邮箱给我,邮箱时请尽量以word形式,名称:bug_天气插件_一直加载中.doc。("一直加载中",就是bug内容概述)。谢谢哦~~大家都理解的,规范的文档,是表达问题和解决问题的基础,同时也是能力的体现。
这个贴我会持续更新天气插件的问题,不论是大家反馈的,还是我已经解决的bug。

                 因为天气插件2.0版本内部测试已经完成,即将对外发布,刚刚写周报时发现已修复32个新bug。。。。就不一一列举了,所以之前的bug,应该都已经不存在。
DeepinScreenshot20131108171703.png
但是为了对没有升级的LD用户负责,故我把2013.11.08号之前搜集的bug放在最后,且会用分割线分割开,2.0版本的bug和解决办法,我会写在分割线上面,请广大LD爱好者谅解哦~
先放一张图给大家看看:
DeepinScreenshot20131108171227.png


1.yahoo不提供国内城市搜索功能了,所以大家在添加国内城市,输入时,没有返回结果。
大家可到http://weather.yahoo.com/  里面进行验证。
对于这个bug,我需要再次更换api了(之前一次更换是由国家气象台api-->yahoo api)。正在修复中,请各位LD用户谅解。。。。


--------------------------------------------------以下为天气插件1.0版本的bug--------------------------------------------------------------------------------------------
废话再不说了,直入正题:
一.天气插件的开启和关闭方法:
a.开启:
sudo apt-get install dconf-tools
gsettings set com.deepin.dde.desktop enabled-plugins '["clock","weather"]'
当然,你直接进dconf进入对应项输入也可以。
B.关闭:
方法一:
直接在天气插件右上角点击关闭按钮
方法二:
gsettings set com.deepin.dde.desktop enabled-plugins '[]'
注:方法二的关闭后,仍有轮廓在,这是一个bug。请大家先在轮廓的右上角点击关闭按钮,以免影响正常使用。这个bug,会马上修复。对了,再说一句,欢迎bug,欢迎发闹骚~~
(此bug已于20130628修复!)

二、某些城市,某些时刻,一直“加载中。。。。。”
DeepinScreenshot20130627120019.png
此问题的解释,详细见此贴,我解释的很详细了。
http://www.linuxdeepin.com/forum/23/14329
对了,以后大家发贴时,标题可以直接是bug名,尽量不要是“×××挂掉” “××××不正常”   “××××不能正常运行”等模糊的标题..........
大致解释一下吧:
原因:
你短时间内(10分钟等)请求的天气数据次数(就是你选择的城市,点击的次数)过多,国家气象局会封锁您的ip一段时间,时间不等。
国家气象局这个城市的数据正好在你请求的这段时间出问题了。这个就更是RP了。
解决方案1:
进入终端
killall desktop
killall desktop
desktop

解决方案2:
重新选择此城市。
注:当你选择此城市后,会后台自动刷新数据。

说明:方案1、2都不能从根本上解决问题。长期解决方案见下。

解决方案3:
程序里,虽然已经对这种情况做了处理,会显示最近一次接受到的数据,但是还是有bug。可能有人会说,要达到的效果是:当出现任何不正常的情况,都会显示当前城市接受的最近一次的数据。
但是这又有一个问题:如果你上次看这个城市的天气是三天之前,那么那个数据对今天是没有任何意义的,不准确,如果这样,天气预报插件就没有存在的意义了。。。。

大家知道的,现在的天气预报本来就不准。。。。。。这也是国家气象局的数据为何一个小时返回一次。为了保证数据的准确性,现在的天气插件每隔10分钟后台自动刷新数据一次,所以大家可以放心,数据永远是最新的。

终极解决方案:
对于数据不正常造成的困扰,抱歉啊,等我们linuxdeepin做了自己的天气数据接口,就不会有这样蛋疼的问题了。没办法,免费用 别人的,是这样的,望理解。

三:天气插件的温度那显示“暂无”,但是六天的详细天气信息那都是有温度的。
DeepinScreenshot20130627120341.png
详情见这个链接的27楼:
http://www.linuxdeepin.com/forum/6/14100?start=20
注:
天气插件显示了两个信息:
实时天气
未来六天天气

原因:
国家气象台没有提供某些地区的实时天气,所以只能显示暂无。包括国家气象台官网,都是暂无实况。不是它不想提供,而是提供不了。。。。 这个原因,你们都懂的。
DeepinScreenshot20130627115301.png

四、关于高温预警、阴雨提醒等
有很多用户要求以上两个贴心功能。 在此向大家说声抱歉。 平时上班太忙,以后大家对天气插件的要求也只能周六周日休息时间写了。

五、天气插件显示的日期不正确
问题原文:
天气彩蛋无法正确显示我所在的江门地区的正确日期,如今天是7月30号周二,但彩蛋依然显示日期为七月29号,周一。在论坛上找不到相应的解决办法

解答:当没有网络时,天气插件的数据为之前有网络时最新的数据。包括日期哦

六、天气插件行为
问题描述:
“启动到桌面以后,发现天气插件显示的温度有一瞬间是0,合理的行为是加载上一次的位置和温度”
问题解答:
先说说天气插件现在的情况:

1. 现在已经将显示的 “00” 改为 空了  (7.24号已经修正)

2.“合理的行为是加载上一次的位置和温度” 这点我很赞同。

还是先说说现在的逻辑:

1. 刚开机肯定要先下载最新天气数据

2.下载过程中  天气显示的是 空 , 日期那显示的是 “正在加载中”

3.如果没网络,或者国家气象台服务器返回数据不正确,那么显示的是最近一次的天气数据(含日期),所以当断网时,日期可能跟当时的时间是不一样的。

再说说为何不在下载最新天气数据时便显示最近一次天气数据,而是显示 “正在加载中....”

原因:

1.给用户提示:

想想如果直接显示上次数据,那么用户看到的便开始就是 昨天的天气数据,然后瞬间变为了最新的,天气数据一下子变了,用户会想:是不是数据有问题,怎么1s前和1s后的数据会不一样呢(天气插件是桌面一启动用户就会看到的,这个过程是极有可能发生的),我还能相信这个天气预报吗?

2. 显示“正在加载中....”的时间时很短的,肯定在0.5s之内,当然,有可能一个月你会看到某一次“正在加载中....”显示了1s中。

七、刚开机时可以往插件上拖动文件
这个bug已于20130816修复

八、国家气象台不给力啊
今天国家气象台不给力2013.10.13,周日
天气插件显示的日期和数据还是2013.10.12,周六的数据,请不要怀疑你的网络坏了,也不要怀疑天气插件挂了,是国家气象台“放假”一天了。。。。
有图有真相。。。
请大家谅解。。。。。
:roll:
DeepinScreenshot20131013214100.png

因国家气象台API信息老旧一直持续到今天20131016,所以决定采用yahoo api。
新版本即将发布。。。。  最近有桌面其他要弄。。。。 请大家见谅。。。。
Reply Favorite View the author
All Replies
1 / 2
To page
cxbii
deepin
2013-06-27 20:43
#1
顶置哈~
Reply View the author
a287740928
deepin
2013-06-27 21:52
#2
提个小建议,想看未来几天天气的时候,能不能点击左边的天气那里,因为右边一个城市更改和未来天气,容易误点,不太容易操作!不知道大家有没有同感
Reply View the author
ahyanglf
deepin
2013-06-30 03:25
#3
这个是好东东啊

开发者辛苦
Reply View the author
yuanchenglu
deepin
2013-07-01 17:36
#4
提个小建议,想看未来几天天气的时候,能不能点击左边的天气那里,因为右边一个城市更改和未来天气,容易误点,不太容易操作!不知道大家有没有同感

很好的建议,现在城市更改和未来天气div之间没有间距所以很容易误点。谢谢提建议哦~~
Reply View the author
yuanchenglu
deepin
2013-07-01 17:37
#5
这个是好东东啊

开发者辛苦

不辛苦,为linuxdeepin 爱好者服务是我们的义务~~~~
Reply View the author
finding006
deepin
2013-07-07 06:04
#6
好东西要支持。
Reply View the author
qingkejin
deepin
2013-09-23 21:11
#7
[quote]提个小建议,想看未来几天天气的时候,能不能点击左边的天气那里,因为右边一个城市更改和未来天气,容易误点,不太容易操作!不知道大家有没有同感

很好的建议,现在城市更改和未来天气div之间没有间距所以很容易误点。谢谢提建议哦~~[/quote]
有同感,加油哦,很好用的小插件呢~~~
Reply View the author
MephistoCK
deepin
2013-09-25 16:04
#8
: 非常感谢,好东西啊,支持大神
Reply View the author
jd808
deepin
2013-10-11 07:56
#9
变这样啦
我猜测是我电脑启动的时候,没有网络,我是无线网卡,连网比较慢
Reply View the author
yuanchenglu
deepin
2013-10-11 17:47
#10
抱歉啊,我不小心把develop的东西和到master分支了,这是还未完成的功能

马上修复。。。。。
Reply View the author
yuanchenglu
deepin
2013-10-11 17:58
#11
已经修复好了,等下周三向外网推送更新时,您更新一下就可以啦~  

谢谢你的bug反馈~  感谢有你~
Reply View the author
ahyanglf
deepin
2013-10-14 06:02
#12
ui插件和资源管理器感觉不是很协调,期待改进
Reply View the author
jd808
deepin
2013-10-24 00:48
#13
哥们,能不能再加个网卡流量和CPU,内侧的小桌面软件,不大,就跟360那个流量监控浮标差不多打即可
双手奉上代码(偶不懂写界面)
  1. import time
  2. class system_monitoring:
  3.     """系统监控"""
  4.    
  5.     def _read_cpu_usage(self):
  6.         """Read the current system cpu usage from /proc/stat."""
  7.         try:
  8.             fd = open("/proc/stat", 'r')
  9.             lines = fd.readlines()
  10.         finally:
  11.             if fd:
  12.                 fd.close()
  13.         for line in lines:
  14.             l = line.split()
  15.             if len(l) < 5:
  16.                 continue
  17.             if l[0].startswith('cpu'):
  18.                 return l
  19.         return []
  20.       
  21.     def get_cpu_usage(self):
  22.         """
  23.         get cpu avg used by percent
  24.         """
  25.         cpustr=self._read_cpu_usage()
  26.         if not cpustr:
  27.             return 0
  28.         #cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
  29.         usni1=int(cpustr[1])+int(cpustr[2])+int(cpustr[3])+int(cpustr[5])+int(cpustr[6])+int(cpustr[7])+int(cpustr[4])
  30.         usn1=int(cpustr[1])+int(cpustr[2])+int(cpustr[3])
  31.         #usni1=int(cpustr[1])+int(cpustr[2])+int(cpustr[3])+int(cpustr[4])
  32.         # self.sleep=2
  33.         time.sleep(0.1)
  34.         cpustr=self._read_cpu_usage()
  35.         if not cpustr:
  36.             return 0
  37.         
  38.         usni2=int(cpustr[1])+int(cpustr[2])+float(cpustr[3])+int(cpustr[5])+int(cpustr[6])+int(cpustr[7])+int(cpustr[4])
  39.         usn2=int(cpustr[1])+int(cpustr[2])+int(cpustr[3])
  40.         cpuper=(usn2-usn1)/(usni2-usni1)
  41.         return 100*cpuper
  42.    
  43.     def memory_stat(self):  
  44.         """
  45.         内存信息 / meminfo
  46.         返回dict
  47.         """
  48.         mem = {}  
  49.         f = open("/proc/meminfo")  
  50.         lines = f.readlines()  
  51.         f.close()  
  52.         for line in lines:  
  53.             if len(line) < 2: continue  
  54.             name = line.split(':')[0]  
  55.             var = line.split(':')[1].split()[0]  
  56.             mem[name] = int(var) * 1024.0  
  57. #        mem['MemUsed'] = mem['MemTotal'] - mem['MemFree'] - mem['Buffers'] - mem['Cached']
  58.         mem['MemUsed'] = (mem['MemTotal'] - mem['MemFree'])
  59.         return mem
  60.    
  61.     def tcp_stat(self):  
  62.         """
  63.         TCP链接数量 / snmp
  64.         返回dict
  65.         """
  66.         mem = {}  
  67.         f = open("/proc/net/snmp")  
  68.         lines = f.readlines()  
  69.         f.close()
  70.         keys=[]
  71.         value=[]
  72.         returnvalue={}
  73.         for line in lines:  
  74.             if len(line) < 2: continue
  75.             if line.find("Tcp") !=-1:  
  76.                 tcpvalue=line.replace("Tcp: ", "")
  77.                 if(len(keys)==0):
  78.                     keys=tcpvalue.split(" ")
  79.                 else:
  80.                     value=tcpvalue.split(" ")
  81.         
  82.         for i in range(len(keys)):
  83.             returnvalue[keys[i].replace("\n", "")]=int(value[i].replace("\n", ""))
  84.             
  85.         return returnvalue
  86.    
  87.     def cpu_stat(self):  
  88.         """
  89.         CPU信息 / cpuinfo
  90.         返回list,每核心一dict
  91.         """
  92.         cpu = []  
  93.         cpuinfo = {}  
  94.         f = open("/proc/cpuinfo")  
  95.         lines = f.readlines()  
  96.         f.close()  
  97.         for line in lines:  
  98.             if line == '\n':  
  99.                 cpu.append(cpuinfo)  
  100.                 cpuinfo = {}  
  101.             if len(line) < 2: continue  
  102.             name = line.split(':')[0].rstrip()  
  103.             var = line.split(':')[1]  
  104.             cpuinfo[name] = var  
  105.         return cpu
  106.    
  107.     def load_stat(self):  
  108.         """
  109.         负载信息 / loadavg
  110.         返回dict
  111.         """
  112.         loadavg = {}  
  113.         f = open("/proc/loadavg")  
  114.         con = f.read().split()  
  115.         f.close()  
  116.         loadavg['lavg_1']=con[0]  
  117.         loadavg['lavg_5']=con[1]  
  118.         loadavg['lavg_15']=con[2]  
  119.         loadavg['nr']=con[3]  
  120.         loadavg['last_pid']=con[4]  
  121.         return loadavg
  122.    
  123.     def uptime_stat(self):  
  124.         """
  125.         运转时间 / Uptime
  126.         返回dict
  127.         """
  128.         uptime = {}  
  129.         f = open("/proc/uptime")  
  130.         con = f.read().split()  
  131.         f.close()  
  132.         all_sec = float(con[0])  
  133.         MINUTE,HOUR,DAY = 60,3600,86400  
  134.         uptime['day'] = int(all_sec / DAY )  
  135.         uptime['hour'] = int((all_sec % DAY) / HOUR)  
  136.         uptime['minute'] = int((all_sec % HOUR) / MINUTE)  
  137.         uptime['second'] = int(all_sec % MINUTE)  
  138.         uptime['Free rate'] = float(con[1]) / float(con[0])  
  139.         return uptime  
  140.    
  141.     def net_stat(self):  
  142.         """
  143.         获取网卡流量信息 /proc/net/dev
  144.         返回dict,单位byte
  145.         """
  146.         net = []  
  147.         f = open("/proc/net/dev")  
  148.         lines = f.readlines()  
  149.         f.close()  
  150.         for line in lines[2:]:  
  151.             con = line.split()  
  152.             intf = dict(  
  153.                 zip(  
  154.                     ( 'interface','ReceiveBytes','ReceivePackets',  
  155.                       'ReceiveErrs','ReceiveDrop','ReceiveFifo',  
  156.                       'ReceiveFrames','ReceiveCompressed','ReceiveMulticast',  
  157.                       'TransmitBytes','TransmitPackets','TransmitErrs',  
  158.                       'TransmitDrop', 'TransmitFifo','TransmitFrames',  
  159.                       'TransmitCompressed','TransmitMulticast' ),  
  160.                     ( con[0].rstrip(":"),int(con[1]),int(con[2]),  
  161.                       int(con[3]),int(con[4]),int(con[5]),  
  162.                       int(con[6]),int(con[7]),int(con[8]),  
  163.                       int(con[9]),int(con[10]),int(con[11]),  
  164.                       int(con[12]),int(con[13]),int(con[14]),  
  165.                       int(con[15]),int(con[16]), )  
  166.                 )  
  167.             )  
  168.       
  169.             net.append(intf)  
  170.         return net
  171.     def disk_stat(self):
  172.         """
  173.         磁盘空间使用
  174.         使用内置python内置函数,返回dict,单位byte
  175.         """
  176.         import os  
  177.         hd={}  
  178.         disk = os.statvfs("/")  
  179.         hd['available'] = disk.f_bsize * disk.f_bavail  
  180.         hd['capacity'] = disk.f_bsize * disk.f_blocks  
  181.         hd['used'] = disk.f_bsize * disk.f_bfree  
  182.         return hd  
  183.    
  184.     def readfile(self):  
  185.         fd = open("/proc/net/dev", "r")   
  186.         title1={}
  187.         title2={}
  188.         ethdev1={1:{},2:{},3:{},4:{},5:{}}
  189.         ethdev2={1:{},2:{},3:{},4:{},5:{}}
  190.         i=0
  191.         
  192.         # face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  193.         #wlan1: 663187459  479168    0    0    0     0          0         0 41997208  384688    0    0    0     0       0          0
  194.         for line in fd.readlines():
  195.             line=line.replace("|",' ').replace(":",'')
  196.             field = line.split()
  197.             if(i==0):
  198.                 i+=1
  199.                 continue
  200.             if(i==1):
  201.                 nextdata=0
  202.                 for j in range(len(field)):
  203.                     if(field[j]=="multicast"):
  204.                         nextdata=1
  205.                         
  206.                     if(nextdata==0):
  207.                         title1[j]=field[j]
  208.                     else:
  209.                         title2[j]=field[j]
  210.             else:
  211.                 for j in range(len(field)):
  212.                     if(j                        ethdev1[i][title1[j]]=field[j]
  213.                     else:
  214.                         ethdev2[i][title2[j]]=field[j]
  215.             i+=1
  216.         recv=0
  217.         send=0
  218.         for k in ethdev1:
  219.             if(len(ethdev1[k])<1):
  220.                 continue
  221.             tname=ethdev1[k]["face"].replace("0",'').replace("1",'').replace("2",'').replace("3",'').replace("4",'').replace("5",'').replace("6",'').replace("7",'').replace("8",'').replace("9",'').replace("10",'')
  222.             if(tname in ["wlan","eth"]):
  223.                 if(int(ethdev1[k]["bytes"])>recv or int(ethdev2[k]["bytes"])>send):
  224.                     recv=int(ethdev1[k]["bytes"])
  225.                     send=int(ethdev2[k]["bytes"])
  226. #         return {"recv":int(recv)/1024,"send":int(send)/1024}
  227.         fd.close()
  228.         return (recv, send)
  229.       
  230.       
  231.     def count(self):
  232.         """双网卡流量(秒)"""
  233.         (recv, send) = self.readfile()  
  234.         time.sleep(1)  
  235.         (new_recv, new_send) = self.readfile()
  236.         return {"recv":int((new_recv -recv)/1024),"send":int((new_send - send)/1024)}
  237. system_monitoring=system_monitoring()
  238. while True:
  239.     time.sleep(1)
  240.     print("CPU%:",round(system_monitoring.get_cpu_usage(),2),"均衡负载%:",system_monitoring.load_stat()["lavg_5"])
  241.     memory_stat=system_monitoring.memory_stat()
  242.     print("内存:",int(memory_stat['MemUsed']/1024),"内存%:",round(memory_stat['MemUsed']/memory_stat["MemTotal"],2))
  243.     print("网卡流量:",system_monitoring.count())
  244.     print("\n\n")
  245. #print(system_monitoring.cpu_stat())
  246. #print(system_monitoring.load_stat())
  247. #print(system_monitoring.uptime_stat())
  248. #print(system_monitoring.net_stat())
  249. #print(system_monitoring.disk_stat())
Copy the Code
Reply View the author
jd808
deepin
2013-10-24 01:09
#14
翻了你的代码,原来是js写的啊
Reply View the author
yuanchenglu
deepin
2013-11-09 22:32
#15
翻了你的代码,原来是js写的啊


欢迎你们广大开发者开发桌面插件,你可以按照chrome插件的app写,写了后我帮你移植到linuxdeepin的桌面上哈。我的qq653426595

完整的DDE插件开放平台文档,正在开发中,请大家耐心等待并支持
Reply View the author
egfree
deepin
2013-11-23 18:45
#16
桌面插件什么时候才能有一个专门的GUI进行管理啊。毕竟不是每个人都记得住这些命令的
Reply View the author
ahyanglf
deepin
2013-11-26 17:19
#17
建议把图标下面加上汉字说明,因为有时候还是不清楚具体的天气
Reply View the author
cxbii
deepin
2013-12-05 17:10
#18
建议把图标下面加上汉字说明,因为有时候还是不清楚具体的天气
请在天气状态下悬停鼠标
Reply View the author
158******66
deepin
2014-01-11 07:55
#19
2.0 什么时候放出来啊,还有我关闭天气就不知道哪里能重新打开了,
设置里面也太简陋了
Reply View the author
fredy4212
deepin
2014-01-17 05:34
#20
2.0 什么时候放出来啊,还有我关闭天气就不知道哪里能重新打开了,
设置里面也太简陋了
其實這功能當時僅作為一個彩蛋,因此沒有開關介面,但未來會提供
Reply View the author
1 / 2
To page