Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐙🐶技术讨论区 #9

Open
bambooom opened this issue Dec 9, 2015 · 16 comments
Open

🐙🐶技术讨论区 #9

bambooom opened this issue Dec 9, 2015 · 16 comments
Assignees

Comments

@bambooom
Copy link
Collaborator

bambooom commented Dec 9, 2015

  • 在这个issue下进行技术讨论 有任何疑问在这里提出
    • 有脑洞也可以提出
    • 提出之后再想能不能实现 怎么实现
    • 需要马上解决的问题微信/slack联系
    • 在此处增加问题索引

问题索引

  1. 一键添加项目功能
  2. github API 学习笔记
  3. 部署sae第三包出现问题
  4. 如何提升访问速度
@bambooom
Copy link
Collaborator Author

bambooom commented Dec 9, 2015

20151209 @bambooom

  • 今天突然有个想法
    • 一个输入框 提交一个仓库的地址可以直接在网站添加项目页面
    • 免去手动添加的麻烦
    • 不知道是否有可行性

  • 考虑之后应该可行
  • 分解为大致以下几个点
    • /project页面设置输入框form
      • POST读取之后可直接跳转新项目页面
      • 添加必须为仓库地址
        • 若格式不对要提示错误
    • 新项目网址为/project/<projectname>
      • 展示页面内容为后期内容
      • 模板需要用到 Template Inheritance
        • 在已有的bootstrap模板上修改
    • POST读取的为url地址, 从地址中读取项目名字
      • 之后抓取数据可能也可以此为接口
  • 修改模板为可复用

@bambooom bambooom mentioned this issue Dec 9, 2015
@bambooom
Copy link
Collaborator Author

转自 #14 (comment)

GitHub API 学习笔记

by @hysic

我先抛砖引玉~

  • github API, 本身提供了许多, 我看了第一个 PyGithub, 教程风格不喜欢, 遂尝试用 requests 库直接get.
  • api 所有 URL 都以 https://api.github.com 开头, 后面以一定格式跟上你想获取的用户名, 仓库名, 以及你想获取的参数.

获取 commit 数

  • 比如我想获取 Octopuppy/Octodog 仓库下每个贡献者的 commit 数, 参考这个页面的说明, 代码如下:
import requests
url = "https://api.github.com/repos/Octopuppy/Octodog/stats/contributors"
r = requests.get(url)
# r.json() 返回所有的 contributors
for person in r.json():
    # person 类型为 dict, keys有 "author", "total", "weeks"
    # "author"的 value 又是一个 dict, "login" 对应的是作者的名字
    print person["author"]["login"] + ":" + str(person["total"])
  • 输出如下
hysic:1
bambooom:6

_这个结果只给出了 master 分支的 commit 数, 并没有考虑 pull requests 的数目, 这个数目与 pulse 页面给出的数目相同. 我理想的数据就是 pulse 页面柱状图中的commit 数.(_待解决*)

获取(首页显示的)commit 数

import requests
url = "https://api.github.com/repos/Octopuppy/Octodog/commits"
r = requests.get(url).json()
print len(r)
  • 这样运行结果是 12, 与仓库首页显示的是一致的.
  • 获取所有分支的 commit 数可以参考这个链接, 但这样给出很多 commit 都是重复的.

获取仓库的 star/watch/fork 数目

import requests
url = "https://api.github.com/repos/Octopuppy/Octodog"
r = requests.get(url).json()
print "Octodog repo has been stared by %d times, watched by %d times, and forked by %d times." % (r["stargazers_count"], r["watchers_count"], r["forks_count"])
  • 输出为:
Octodog repo has been stared by 8 times, watched by 8 times, and forked by 1 times.

其他

  • 此外还可以获得的数据有: 代码增减行数, 每周 commit 次数, 每小时 commit 次数等.

@bambooom
Copy link
Collaborator Author

部署代码到sae遇到问题 - 第三方包

  • 已按照官方说明 直接将第三方依赖包装在vendor文件夹上传
  • 网页打开出现如下error
    1

File "/usr/local/sae/python/lib/python2.7/posixpath.py", line 269, in expanduser
userhome = pwd.getpwuid(os.getuid()).pw_dir
AttributeError: 'module' object has no attribute 'getuid'

  • 搜索之后得知 getuid 是Unix系统才有的获取用户目录参数, 而posixpath.py本身也应该是Unix系统才会使用的程序, windows环境应该为 ntpath.py
  • 此处所谓的os环境并不是本地环境, 而是sae云端环境
  • 往上一个Traceback发现使用了函数 os.path.expanduser, 官方文档解释此函数也是会根据操作系统不同返回不同值.
  • 找到本地 ../python2.7/os.py 打开看到

os.path is one of the modules posixpath, or ntpath

  • 那么问题来了, 从使用了posixpath.py来反推, os被判断为unix系统
  • 然后使用getuid() 却报错, 说不存在这个attribute........也就是说os是windows........
  • 所以这特喵的是个什么bug????
  • 好吧, 我再认真看了下 os.py是如何判断是什么系统的, 代码大概是这样的
import sys, errno

_names = sys.builtin_module_names

...

if 'posix' in _names:
    name = 'posix'
    linesep = '\n'
    from posix import *
    try:
        from posix import _exit
    except ImportError:
        pass
    import posixpath as path

    import posix
    __all__.extend(_get_exports_list(posix))
    del posix

elif 'nt' in _names:
    name = 'nt'
    linesep = '\r\n'
    from nt import *
    try:
        from nt import _exit
    except ImportError:
        pass
    import ntpath as path

    import nt
    __all__.extend(_get_exports_list(nt))
    del nt
  • 大概我猜是说os是通过system里面内置库名字列表里面是否包含所需库,来判断操作系统.....
  • 但是我在自己本地的python文件库里面两个都搜到了.........这到底是怎么判断出来的?

20151216

  • 已解决,更换plotly登录方法

@junjielizero
Copy link

sae 貌似不支持I/O读写,我估计os模块触动了I/O读写,所以就不能用了

@bambooom
Copy link
Collaborator Author

@junjielizero 嗯差不多是这样~我尝试了修改第三方库里的代码 直接把 os.path.expanduser 里的 os.path 写成 ntpath 重新跑,这一部分就没报错了,然后终于是报出IOerror。。。。
所以上面那个问题一个是sae本身的确有bug,另一个主要矛盾就是我装的这个第三方库的确需要I/O读写。。。于是怀着杯具的心情去睡了,想着得换个PaaS平台了。。。
又引发疑问,是不是PaaS平台都不支持I/O?

@junjielizero
Copy link

@bambooom 那不能将本地东西上传到网上某个地方吗?

@bambooom
Copy link
Collaborator Author

@junjielizero 不行呐,不是我本地有的东西,是第三方包自己跑的时候相当于缓存之类的东西吧?这个还不太确定

@ZoomQuiet
Copy link
Collaborator

@bambooom 试都没试过怎么知道是否可用?!
另外, PaaS 平台的 Python 一般都经过定制,和官方有点不同的,
这种技术细节问题,应该去哪儿咨询?

@bambooom
Copy link
Collaborator Author

@ZoomQuiet 好的,我再试试,以及睡之前已发邮件咨询sae官方。。。:joy:

@bambooom
Copy link
Collaborator Author

@junjielizero 突然有点没理解,你说的把本地什么东西上传到网上某个地方?

@junjielizero
Copy link

@bambooom I/O读写应该涉及读取本地文档之类的东西,将本地文档放到网上,读取是网上的东西,估计能绕过I/O问题

@bambooom
Copy link
Collaborator Author

@junjielizero 但是我理解这个是这样的,是第三方包需要读写临时文件,不是我写的里面需要读写,我最多找到 这里 写的

本地文件系统只读。应用可以读取本应用目录,Python标准库下的内容,如需读写临时文件建议使用StringIO或者cStringIO来替代。

所以我觉得修改第三方包里的代码换成使用StringIO来读写临时文件比较靠谱。。。

@bambooom
Copy link
Collaborator Author

我发现自己简直太蠢了...............................................................orz
原来一直没有找到真正的主要矛盾...................................................................献上我的膝盖orzzzz

  • 其实是这样的, 这个第三方包要求使用api登录连接web server使用, 有两种方法
    • 一种是直接在本地创建, 所以相当于本地写入一个file, 所以才用I/O读写
    • 但另外一种是类似 py.sign_in(username, api_key) 这样类似联网登录就好了
  • 为何有两种方法, 用哪种方法更好暂时不讨论, 但我一开始用了第一种方法, 完全忘记有第二种方法了...........然后还一直以为是module内部进程的时候需要写临时文件..........
  • 已经改成第二种方法登录, 然后就没有报错了................浪费我好多时间 😭😭😭😭😭

总结: 认真看每条Traceback, 想想Traceback之间的逻辑关系, 是否真的有错误, 是否可以避开先

@bambooom
Copy link
Collaborator Author

如何提升访问速度

  • api访问github速度很慢,当然也有网速慢的原因
  • 导致画图速度很慢
  • 发现sae有TaskQueue功能,先设置了最大并发队列,希望可以提升一部分速度
  • 一个脑洞是使用缓存/kvdb存储github stats,cron定时更新缓存/kvdb,画图时从缓存/kvdb获取数据,是否更快?
  • 以上想法需要验证是否可行

@ZoomQuiet
Copy link
Collaborator

2015-12-17 9:50 GMT+08:00 Bamboo = 竹子 [email protected]:

如何提升访问速度

api访问github速度很慢,当然也有网速慢的原因

  • 慢的真正原因是什么!? 什么更加优雅的解决方案?

导致画图速度很慢
发现sae有TaskQueue功能,先设置了最大并发队列,希望可以提升一部分速度
一个脑洞是使用缓存获取github stats,cron定时更新缓存/kvdb,画图时从缓存/kvdb获取数据,是否更快?
以上想法需要验证是否可行


Reply to this email directly or view it on GitHub.

Life's Pathetic, Let's Pythonic! 人生苦短, Python是岸!
俺: http://zoomquiet.io
授: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过!备份不做,十恶不赦!
KM keep growing environment culture which promoting organization be learnning!

@bambooom
Copy link
Collaborator Author

@ZoomQuiet 不明白该怎么判断慢的原因在哪里。。。大妈可否再给点hint~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants