Code Monkey home page Code Monkey logo

rssant's Introduction

蚁阅 ( RSSAnt )

让 RSS 更好用,轻松订阅你喜欢的博客和资讯

主要特点

  • 全平台,无广告,无推荐,专注阅读
  • 支持全文阅读,支持播客和视频内容
  • 智能查找订阅源,智能裂图修复
  • 支持夜间模式,全球 RSS 均可订阅
  • 开源,开箱即用,也支持自己部署

开箱即用地址: https://rss.anyant.com

蚁阅会员

蚁阅按订阅制收费,因为订阅更新需要服务器资源,免费无法持续提供稳定服务。

会员版 免费版 开源版
订阅数量 不限 不限 不限
使用方式 开箱即用 开箱即用 自己部署维护
全部功能 支持 试用30天 支持
技术支持 优先 常规 常规

会员版价格:5元/月 或者 30元/年
充值入口在【账号设置】页面,欢迎充值会员,支付蚁阅服务器费用!

蚁阅兑换码

在博客,公众号,论坛社区上推荐蚁阅,可联系我获取超级兑换码。
如果你喜欢蚁阅,不妨也推荐给更多人,非常感谢!

给蚁阅提供反馈和建议,报 Bug 等等,也可以获得兑换码。
如有任何疑问和建议都欢迎与我联系!

作者近况

很高兴你能看到这里,在2021年初,我开始全职独立开发,踏上了创业之路。考虑到恰饭问题,我开启了新的项目,蚁阅暂时处于维护状态,新功能要再搁置一段时间了。

我会每两周写一篇文章,记录创业的过程,欢迎关注Guyskk的博客自宅创业系列。

反馈与协作

蚁阅主仓库托管在 码云 上,GitHub 主要作为镜像仓库。

码云和 GitHub 均可提交 Issue:

码云和 GitHub 也均可提交 Pull Request:

如果你有码云账号,建议到码云提交 Pull Request。
非常感谢你的支持!

部署文档

蚁阅基于Docker部署,服务器环境要求:

第一步,准备配置文件

配置文件保存为 ~/rssant/rssant.env,按照注释说明修改。

# 默认关闭DEBUG,请勿在开发测试之外开启DEBUG
RSSANT_DEBUG=0

# 请随机生成一个字符串
RSSANT_SECRET_KEY=SECRET

# 应用的访问地址
RSSANT_ROOT_URL=http://localhost:6789

# 检查订阅的时间间隔,默认30分钟
RSSANT_CHECK_FEED_MINUTES=30

# 请前往GITHUB设置页面申请,不需要Github登录可留空
# GitHub OAuth callback:
# http://<你的域名>/api/v1/accounts/github/login/callback/
RSSANT_GITHUB_CLIENT_ID=
RSSANT_GITHUB_SECRET=

# SMTP邮件功能,不需要注册功能可留空
RSSANT_ADMIN_EMAIL=
RSSANT_SMTP_ENABLE=false
RSSANT_SMTP_HOST=smtp.qq.com
RSSANT_SMTP_PORT=465
RSSANT_SMTP_USE_SSL=true
RSSANT_SMTP_USERNAME=
RSSANT_SMTP_PASSWORD=

# RSS代理功能,可留空
# 参考项目 cloudflare_worker/rssant 目录下的说明部署代理
RSSANT_RSS_PROXY_ENABLE=false
RSSANT_RSS_PROXY_URL=
RSSANT_RSS_PROXY_TOKEN=

# 为保障网络安全,默认不允许订阅局域网地址,如有需要可设置为true
# RSSANT_ALLOW_PRIVATE_ADDRESS=true

# 以下配置保持不动
RSSANT_SCHEDULER_NETWORK=rssant
RSSANT_PG_DB=rssant
RSSANT_PG_HOST=localhost
RSSANT_PG_USER=rssant
RSSANT_PG_PASSWORD=rssant

第二步,启动服务

将以下脚本保存为 ~/rssant/start.sh,其中端口 6789 可改为自定义端口。

#!/bin/bash

docker volume create rssant-data || true
docker volume create rssant-postgres-data || true
docker volume create rssant-postgres-logs || true

docker rm -f rssant || true
docker run -ti --name rssant -d \
    -p 6789:80 \
    --env-file ~/rssant/rssant.env \
    -v rssant-data:/app/data \
    -v rssant-postgres-data:/var/lib/postgresql/11/main \
    -v rssant-postgres-logs:/var/log/postgresql \
    --log-driver json-file --log-opt max-size=50m --log-opt max-file=10 \
    --restart unless-stopped \
    guyskk/rssant:latest

docker logs --tail 1000 -f rssant

先执行 sed -i 's/\r//' ~/rssant/start.sh 处理脚本换行符,再启动服务 bash ~/rssant/start.sh,当看到下面的日志时,服务就启动好了。

# 初始化数据库的日志
I 2019-12-22 11:01:36 scripts.django_db_init:26   extension hstore created
I 2019-12-22 11:01:36 scripts.django_db_init:33   create admin user
I 2019-12-22 11:01:36 scripts.django_db_init:41   update site info
I 2019-12-22 11:01:36 scripts.django_db_init:53   create github social app
# 程序正常运行中的日志
I 2019-12-22 13:16:08 rssant_harbor.actors.rss:418  delete 0 old feed creations
I 2019-12-22 13:16:08 rssant_harbor.actors.rss:423  retry 0 status=UPDATING feed creations
I 2019-12-22 13:16:08 rssant_harbor.actors.rss:429  retry 0 status=PENDING feed creations

执行 docker exec -ti rssant supervisorctl status, 以下进程状态说明一切正常:

api                              RUNNING   pid 9, uptime 0:10:03
async-api                        RUNNING   pid 10, uptime 0:10:03
harbor                           RUNNING   pid 11, uptime 0:10:03
initdb                           EXITED    Dec 22 01:15 PM
nginx                            RUNNING   pid 15, uptime 0:10:03
postgres                         RUNNING   pid 17, uptime 0:10:03
scheduler                        RUNNING   pid 19, uptime 0:10:03
worker                           RUNNING   pid 21, uptime 0:10:03

访问 http://localhost:6789/admin/ 用户名: admin 密码: admin
点击页面右上角 "CHANGE PASSWORD" 修改密码。

大功告成,返回首页即可开始使用了!

如需停止服务,执行: docker rm -f rssant
如需备份数据,备份 rssant-postgres-data 这个卷即可,其他卷可忽略。

开发环境

系统级依赖

后端

安装依赖

git clone [email protected]:anyant/rssant.git
cd rssant
pyenv virtualenv -p python3.8 3.8.6 rssant
pyenv local rssant
pip install -r requirements.txt

启动数据库

bash ./scripts/postgres_start.sh

初始化数据库

python manage.py migrate
python manage.py runscript django_db_init

开多个终端,分别启动以下服务

python manage.py runserver 6788

python -m rssant_async.main

python -m rssant_scheduler.main --concurrency 10

python -m rssant_harbor.main --concurrency 10

python -m rssant_worker.main --concurrency 10

访问 http://127.0.0.1:6788/doc/v1/ 账号: admin 密码: admin

访问 http://127.0.0.1:6788/docs/v1/#api-v1-feed-import-create
点击 Interact,输入任意博客地址,例如: https://www.ruanyifeng.com/blog/ , 然后提交。
请求应当正常返回,后台任务控制台会输出查找订阅的日志信息。

测试

pytest

打包

docker build -t rssant/api:latest .

前端

git clone [email protected]:anyant/rssant-web.git
cd rssant-web
npm install
npm run serve

访问 http://127.0.0.1:6789/ 即可看到前端页面。

打包

docker build -t rssant/web:latest .

guyskk/rssant

打包

bash ./box/build.sh

运行

bash ./box/run.sh

rssant's People

Contributors

dependabot[bot] avatar guyskk avatar jasonqiao36 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rssant's Issues

文章排序问题

提个小建议,文章排序按照最新的在上面,个人感觉这样比较符合阅读习惯

往下滑可以用懒加载,一次性加载十条左右

Consider switching from lxml's clean_html for enhanced security (and possibly performance)

I'd like to bring to your attention that we are discussing the possibility of removing lxml's clean_html functionality from lxml library. Over the past years, there have been several concerning security vulnerabilities discovered within the lxml library's clean_html functionality – CVE-2021-43818, CVE-2021-28957, CVE-2020-27783, CVE-2018-19787 and CVE-2014-3146.

The main problem is in the design. Because the lxml's clean_html functionality is based on a blocklist, it's hard to keep it up to date with all new possibilities in HTML and JS.

Two viable alternatives worth considering are bleach and nh3. Here's why:

bleach:

  • Bleach is a widely adopted Python library specifically designed for sanitizing and cleaning HTML input.
  • It has a strong track record in terms of security – it's allowed-list-based.
  • It was deprecated in January but it will still receive security updates, support for new Pythons and bugfixes, see upstream issue.

nh3:

  • nh3 is Python binding for the ammonia library. Ammonia is written in Rust and it's also allowed-list-based.
  • Thanks to the Rust backend, nh3 is also significantly faster than bleach.
  • Rust backend is nothing to be afraid of. nh3 uses the latest PyO3 compatible with Python 3.12 and provides wheels built on top of compatible ABI for different architectures and platforms.

We'll probably move the cleaning part of the lxml to a distinct project first so it will still be possible to use it but better is to find a suitable alternative sooner rather than later.

Let me know if we can help you with this transition anyhow and have a nice day.

部署的时候增加代理的部署

现在手头有台服务器,部署着自己的博客,想要同时在服务器部署博客和 rssant,理想状态是可以访问类似 blog.com/rssant/** 就可以代理到 rssant

这块有办法做么?

我推测 # 应用的访问地址 RSSANT_ROOT_URL=http://localhost:6789 改为 http://localhost:6789/rssant ,但是本地尝试了还是不行

Initial Update

The bot created this issue to inform you that pyup.io has been set up on this repo.
Once you have closed it, the bot will open pull requests for updates as soon as they are available.

导入rss问题

导入rss后,有些一时不能识别出来,但是能不能也在订阅页面上显示,可以放在一个未完全识别或者识别中模块里面,这样就能知道哪些没有识别出来

是否可以增加调节文字大小的功能

目前蚁阅在手机端上显示的字体偏小,特意对比了其他几款类似的产品,蚁阅显示的字是最小的。特别是在看英文字体的时候,看的特别累。

无法使用hosts域名添加feed

使用dokcer部署rssant和rsshub,并让这两个container处于同一network下,可以通过container的名称进行访问,但是rssant无法添加类似这类hosts的rss订阅。
image

不能按照时间倒序吗?

每个种子里的信息不能按照时间倒序吗?最新的在最上面,内容太多,旧的基本就不看了。

几条建议

  1. 倒叙
    首先就是时间倒叙,旧的一般很少看了,现在还要使劲向下滑
  2. 图片放大
    文章中一些小图不方便看,可以添加个点击放大的功能
  3. 图片的Lazyload
    对于流量党来说有大用,以及关闭图片显示
  4. 点击预览打开全部文章
  5. 分组
    这个对于订阅比较多的人来说作用很大

部分rss乱码

https://yufree.cn/cn/index.xml
我订阅了这个rss 然后
image

打开原页面是正常的

传递全文

某些rrs源由于本身问题点开的文章只会显示标题,如果能有传递原文的功能那就太棒了。例图:
Screenshot_20200819-022503

提供默认预览功能

  1. 当前好像只是全部显示标题,能否提供设置,默认提供预览部分内容的样式,就是点一下之后的效果。

image

主要是防止部分标题党,或者标题信息不太明显的。

  1. 还有就是这个订阅源好像很奇怪。

第56期:

image

第 57 期:

image

可以看出 57 期的这个介绍并没有在预览中显示,而且在 56 期与 57 期原文链接中,我也没有找到该段总结说明语句。

期待效果,所有的默认显示预览,预览中显示 57 期中类似的总结说明语句。

建议

可以隐藏已读(旧的太多看起来不是太美观)

部署启动后无法修改密码

如题,admin 登录进去的,没有看到 CHANGE PASSWORD 这个字眼,密码要如何修改?

PS:能否在账号页新增一个改密的功能,输入旧密码,改密为新密码,这样

历史文章丢失

我订阅的文章意外丢失,丢失的文章被更久远的文章替换

如图:19年的文章被改成15年的(但日期仍然显示19年),15-19年这段时间的文章直接丢失了

image

分组后建议增加设置,允许rss合并显示

目前分组后部分rss源仍然会被折叠,推测是根据干货程度值来自动判断的?
建议增加选项,允许用户手动设置分组中的rss条目合并显示,类似于将rss源加入“品读”之后的形式,自动将多个源的内容合并在一个列表中显示,阅读起来会更方便些,避免层层跳转。

关于首屏

你好,开发者。我个人觉得底部分为已阅、未读、收藏 首页是类似于层级分类或许会高效一些 参考 reeder4。仅个人习惯。Uploading 79774614...

docker部署出错

按照文档操作,没有改任何参数。

环境debian10 Docker version 20.10.5, build 55c4c88

$ bash ~/rssant/start.sh
rssant-data
rssant-postgres-data
rssant-postgres-logs
Error: No such container: rssant
a70cdaa90c13fca8240931318a3921302f990fe7f9a2415e5bb29b06e5411f71
2021-04-17 03:31:47,689 INFO Set uid to user 0 succeeded
2021-04-17 03:31:47,760 INFO RPC interface 'supervisor' initialized
2021-04-17 03:31:47,760 CRIT Server 'inet_http_server' running without any HTTP authentication checking
2021-04-17 03:31:47,760 INFO RPC interface 'supervisor' initialized
2021-04-17 03:31:47,760 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2021-04-17 03:31:47,760 INFO supervisord started with pid 1
2021-04-17 03:31:48,763 INFO spawned: 'api' with pid 10
2021-04-17 03:31:48,764 INFO spawned: 'async-api' with pid 11
2021-04-17 03:31:48,765 INFO spawned: 'harbor' with pid 12
2021-04-17 03:31:48,767 INFO spawned: 'initdb' with pid 13
2021-04-17 03:31:48,769 INFO spawned: 'nginx' with pid 14
2021-04-17 03:31:48,772 INFO spawned: 'postgres' with pid 15
2021-04-17 03:31:48,775 INFO spawned: 'scheduler' with pid 16
2021-04-17 03:31:48,778 INFO spawned: 'worker' with pid 18
+ /app/box/bin/wait-initdb.sh
+ rm -f /app/data/initdb.ready
2021-04-17 03:31:48,789 INFO success: initdb entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
+ /app/box/bin/wait-initdb.sh
+ /app/box/bin/wait-initdb.sh
+ /app/box/bin/wait-initdb.sh
+ su - postgres -c 'while true; do /usr/bin/pg_isready; status=$?; if [[ $status -eq 0 ]]; then break; fi; sleep 1; done;'
+ /usr/sbin/nginx -g 'daemon off;'
+ /app/box/bin/wait-initdb.sh
++ ls -A /var/lib/postgresql/11/main
+ '[' '!' '' ']'
+ echo 'copy postgresql init data to mounted volume'
copy postgresql init data to mounted volume
+ cp -r /var/lib/postgresql/11/init/PG_VERSION /var/lib/postgresql/11/init/base /var/lib/postgresql/11/init/global /var/lib/postgresql/11/init/pg_commit_ts /var/lib/postgresql/11/init/pg_dynshmem /var/lib/postgresql/11/init/pg_logical /var/lib/postgresql/11/init/pg_multixact /var/lib/postgresql/11/init/pg_notify /var/lib/postgresql/11/init/pg_replslot /var/lib/postgresql/11/init/pg_serial /var/lib/postgresql/11/init/pg_snapshots /var/lib/postgresql/11/init/pg_stat /var/lib/postgresql/11/init/pg_stat_tmp /var/lib/postgresql/11/init/pg_subtrans /var/lib/postgresql/11/init/pg_tblspc /var/lib/postgresql/11/init/pg_twophase /var/lib/postgresql/11/init/pg_wal /var/lib/postgresql/11/init/pg_xact /var/lib/postgresql/11/init/postgresql.auto.conf /var/lib/postgresql/11/main
/var/run/postgresql:5432 - no response
+ rm -f /var/lib/postgresql/11/main/postmaster.pid
+ /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
2021-04-17 03:31:48.913 UTC [40] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2021-04-17 03:31:48.913 UTC [40] LOG:  listening on IPv6 address "::", port 5432
2021-04-17 03:31:48.919 UTC [40] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-04-17 03:31:48.933 UTC [41] LOG:  database system was shut down at 2020-04-19 06:34:02 UTC
2021-04-17 03:31:48.939 UTC [40] LOG:  database system is ready to accept connections
/var/run/postgresql:5432 - accepting connections
2021-04-17 03:31:49,888 INFO success: api entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-04-17 03:31:49,889 INFO success: async-api entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-04-17 03:31:49,889 INFO success: harbor entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-04-17 03:31:49,890 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-04-17 03:31:49,890 INFO success: postgres entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-04-17 03:31:49,890 INFO success: scheduler entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-04-17 03:31:49,891 INFO success: worker entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
+ su - postgres -c 'psql -f /app/box/initdb.sql'
CREATE ROLE
CREATE DATABASE
+ python manage.py runscript django_pre_migrate
Traceback (most recent call last):
  File "manage.py", line 4, in <module>
    import rssant_common.django_setup  # noqa:F401
  File "/app/rssant_common/django_setup.py", line 27, in <module>
    _django_setup()
  File "/app/rssant_common/django_setup.py", line 23, in _django_setup
    django.setup()
  File "/usr/local/lib/python3.7/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/usr/local/lib/python3.7/site-packages/django/conf/__init__.py", line 79, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.7/site-packages/django/conf/__init__.py", line 66, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.7/site-packages/django/conf/__init__.py", line 157, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/app/rssant/settings/__init__.py", line 1, in <module>
    from .settings import *  # noqa: F401,F403
  File "/app/rssant/settings/settings.py", line 16, in <module>
    from rssant_config import CONFIG as ENV_CONFIG
  File "/app/rssant_config/__init__.py", line 1, in <module>
    from .env import CONFIG
  File "/app/rssant_config/env.py", line 185, in <module>
    CONFIG = load_env_config()
  File "/app/rssant_config/env.py", line 182, in load_env_config
    return EnvConfig(configs)
  File "/usr/local/lib/python3.7/site-packages/validr/model.py", line 160, in __init__
    raise ModelInvalid(errors)
validr._exception_c.ModelInvalid: 
+---------------+---------------------------------+
| Key           | Error                           |
+---------------+---------------------------------+
| rss_proxy_url | invalid or incorrect url format |
+---------------+---------------------------------+

其中rss_proxy_url没有改配置,enable值为false

列表可以不跳回最新文章位置吗?

很高兴可以提一个使用习惯的issue: 在看完历史订阅后又重新返回了列表底部, 需要重新上滑到刚刚位置继续翻阅历史订阅.

如果是数量本身很少的博主还好, 即时类消息的订阅 (如V2ex最热主题) 操作复杂度太高了. 需要不断地上滑才能返回刚刚看的位置

不知道开发者或其他用户有没有相同的经历? 未来这样的操作能不能得到些许改善?

总之先谢谢开发者的开发. 蚁阅真的很方便.

2KpbkQ.png

2Kp7Tg.png

添加API

如Fever, Tiny Tiny RSS 或 FreshRSS 这样的API,方便使用阅读器查看文章。

希望能支持订阅文章的检索

有好多文章之前看过, 想找下却发现无能为力
建议增加搜索功能, 远期还可以以此作为入口, 增加智能标签, 分析文章类型, 命中指定标签自动分类等功能, 让Rss阅读更贴心智能!

希望能够添加收藏到 pocket 的功能

如题,比较喜欢将各个平台需要稍后阅读的文章都统一丢到 pocket 里,然后找个时间一起看完,这样就不用频繁在各个平台间来回切换了

Considering an alternative to pynliner

Hello!

I noticed that rssant uses pynliner where the last commit was in Jan 2017, so pynliner, unfortunately, looks abandoned. Therefore I'd like to propose replacing it with css-inline (that I authored) or some other maintained alternative (e.g. premailer).

css-inline is significantly faster - a sample HTML from templates/email/reset_password.html is processed locally in ~140µs vs. ~28ms with pynliner vs. ~2ms with premailer. Though, it adds a dependency on the Rust toolchain for some users (where wheels aren't provided, like arm64) and generally supports fewer architectures than lxml-based libraries (pynliner & premailer). However, I don't know whether it is a concern. The replacement itself would look like this:

from css_inline import inline

inline(html, remove_style_tags=True)

+ it might require changing the order of rendering for mako templates (pynliner doesn't transform Mako's syntax as css-inline does)

Let me know what do you think :) If you'll be ok with replacing pynliner, I'd be happy to submit a PR

增加快捷键等

现在在用一个非常强大的免费app叫NetNewsWire,可以按B直接在后台浏览器打开,还有个选项(像书本一样的图标)可以进入在rss内直接阅读全文的模式。当然也有局限性,它只能在苹果生态使用。
除此外,蚁阅有个最麻烦的也是不人道的地方,就是点了文章标题显示的是文章片段,还得一个个点进去看。
应该有个选项就是点了文章就是全文。
最好再有个选项是直接列出今天没看的新鲜文章。然后点标题就是全文。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.