wvector / appupdate Goto Github PK
View Code? Open in Web Editor NEW🚀 Android 版本更新 🚀 a library for android version update 🚀
🚀 Android 版本更新 🚀 a library for android version update 🚀
贴个重定向后才是下载地址的网址:http://openbox.mobilem.360.cn/index/d/sid/3282847
new UpdateAppManager.Builder()
//必须设置,当前Activity
.setActivity(activity)
//必须设置,实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Urls.UPDATA_APP)
//以下设置,都是可选
//设置请求方式,默认get
.setPost(false)
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度
//.hideDialogOnDownloading(false)
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
//.setTopPic(R.mipmap.top_8)
//为按钮,进度条设置颜色,默认从顶部图片自动识别。
//.setThemeColor(ColorUtil.getRandomColor())
//设置apk下砸路径,默认是在下载到sd卡下/Download/1.0.0/test.apk
.setTargetPath(path)
//设置appKey,默认从AndroidManifest.xml获取,如果,使用自定义参数,则此项无效
//.setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
//不显示通知栏进度条
//.dismissNotificationProgress()
//是否忽略版本
//.showIgnoreVersion()
.build()
//检测是否有新版本
.checkNewApp(new UpdateCallback() {
/**
* 解析json,自定义协议
*
* @param json 服务器返回的json
* @return UpdateAppBean
*/
@OverRide
protected UpdateAppBean parseJson(String json) {
UpdateAppBean updateAppBean = new UpdateAppBean();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray array = jsonObject.optJSONArray("list");
for (int i = 0; i < array.length(); i ++){
JSONObject obj = array.getJSONObject(i);
if (i == 0){
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(obj.optString("versionNo"))
//(必须)下载地址
//.setApkFileUrl(obj.optString("updateUrl"))
.setApkFileUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk")
//(必须)更新内容
.setUpdateLog(obj.optString("updateMemo"))
//大小,不设置不显示大小,可以不设置
//.setTargetSize(jsonObject.optString("target_size"))
//设置md5,可以不设置
//.setNewMd5(jsonObject.optString("new_md51"))
//是否强制更新,可以不设置
//.setConstraint(obj.optString("isUpdate").equals("y"));
.setConstraint(true);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}
/**
* 网络请求之前
*/
@Override
public void onBefore() {
}
/**
* 网路请求之后
*/
@Override
public void onAfter() {
}
/**
* 没有新版本
*/
@Override
public void noNewApp() {
}
/**
* 自定义更新对话框
* */
@Override
protected void hasNewApp(UpdateAppBean updateApp, final UpdateAppManager updateAppManager) {
super.hasNewApp(updateApp, updateAppManager);
// String message = updateApp.getUpdateLog();
// boolean isFroce = updateApp.isConstraint();
// DialogUtil.showDiglogNoDismiss(activity, "有新本更新", message, isFroce ? "" : "取消", "升级", isFroce, new DialogUtil.CallBack() {
// @OverRide
// public void onDefault() {
// updateAppManager.download();
// }
// });
}
});
请问这个是干什么的
提示网络问题之类的
Process: tsinghua.com.villageassistantclick, PID: 13145
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NoClassDefFoundError: okhttp3.internal.http.HttpEngine
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:219)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
at okhttp3.RealCall.execute(RealCall.java:60)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
at rx.Subscriber.setProducer(Subscriber.java:209)
at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
at rx.Subscriber.setProducer(Subscriber.java:205)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.Observable.unsafeSubscribe(Observable.java:8666)
at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
在三星手机上会报错:API 18
Unable to get provider com.vector.update_app.UpdateFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.vector.update_app.UpdateFileProvider" on path: /data/app/com.redocn.redocn-1.apk
new UpdateAppManager.Builder()
//必须设置,当前Activity
.setActivity(activity)
//必须设置,实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Urls.UPDATA_APP)
//以下设置,都是可选
//设置请求方式,默认get
.setPost(false)
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度
//.hideDialogOnDownloading(true)
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
//.setTopPic(R.mipmap.top_8)
//为按钮,进度条设置颜色,默认从顶部图片自动识别。
//.setThemeColor(ColorUtil.getRandomColor())
//设置apk下砸路径,默认是在下载到sd卡下/Download/1.0.0/test.apk
.setTargetPath(path)
//设置appKey,默认从AndroidManifest.xml获取,如果,使用自定义参数,则此项无效
//.setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
//不显示通知栏进度条
//.dismissNotificationProgress()
//是否忽略版本
//.showIgnoreVersion()
.build()
//检测是否有新版本
.checkNewApp(new UpdateCallback() {
/**
* 解析json,自定义协议
*
* @param json 服务器返回的json
* @return UpdateAppBean
*/
@OverRide
protected UpdateAppBean parseJson(String json) {
UpdateAppBean updateAppBean = new UpdateAppBean();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray array = jsonObject.optJSONArray("list");
for (int i = 0; i < array.length(); i ++){
JSONObject obj = array.getJSONObject(i);
if (i == 0){
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(obj.optString("versionNo"))
//(必须)下载地址
//.setApkFileUrl(obj.optString("updateUrl"))
.setApkFileUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk")
//(必须)更新内容
.setUpdateLog(obj.optString("updateMemo"))
//大小,不设置不显示大小,可以不设置
//.setTargetSize(jsonObject.optString("target_size"))
//设置md5,可以不设置
//.setNewMd5(jsonObject.optString("new_md51"))
//是否强制更新,可以不设置
.setConstraint(obj.optString("isUpdate").equals("y"));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}
/**
* 网络请求之前
*/
@Override
public void onBefore() {
}
/**
* 网路请求之后
*/
@Override
public void onAfter() {
}
/**
* 没有新版本
*/
@Override
public void noNewApp() {
}
/**
* 自定义更新对话框
* */
@Override
protected void hasNewApp(UpdateAppBean updateApp, final UpdateAppManager updateAppManager) {
super.hasNewApp(updateApp, updateAppManager);
// String message = updateApp.getUpdateLog();
// boolean isFroce = updateApp.isConstraint();
// DialogUtil.showDiglogNoDismiss(activity, "有新本更新", message, isFroce ? "" : "取消", "升级", isFroce, new DialogUtil.CallBack() {
// @OverRide
// public void onDefault() {
// updateAppManager.download();
// }
// });
}
为什么我的gradle无法编译通过呢,下面是我添加的语句
compile 'com.qianwen:update-app:3.3.7'
compile 'com.qianwen:okhttp-utils:3.8.0'
建议在点击升级按钮后,加上权限判断
不用点升级,直接后台下载,下载完之后会弹出提示安装的dialog
”update": "Yes"的时候,就更新。如果下载了更新,并安装了,点更新的话还是会继续弹窗提示有更新?
而不是提示“已经是最新版本”。
虽然隐藏了关闭按钮,但是返回键还是可以关闭对话框
github不知道为什么截图上传不了,我把图片放到百度知道了
百度知道截图链接
谢谢开源这个好用的库,发现一个小问题,设置的背景图片之后,弹出升级提示的背景经常能看到由默认的红色背景变成我设置的那个背景
小米偶尔会出这个问题 我自己的OPPO没出现这个问题 请教一下 怎么解决?
RT^.^
因为有些公司,前期写的接口,可能并没有做MD5校验
使用原有的弹窗点击取消后望能增加操作,或者检测到弹窗被取消。
Didn't find class "com.vector.update_app.UpdateFileProvider" on path: DexPathList[[zip file "/data/app/com.pancool.ymi-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.pancool.ymi-2, /system/lib]]
可以提供获取当前apk 的MD5值的方法,然后与下载的文件的MD5值进行对比,这样就完美了..
源码里面的manifest里面设置的MD5值是死的,估计是想让我们替换为自己的md5值吧,而且服务器如果不返回MD5值的话,建议使用另外的方式去判断当前APK和新的APK的区别,谢谢大佬
只剩下红色的按钮。
部署服务器后台的代码后,找不到mobileVersionManger/login.html
然后拿sample里的url测试,发现sample里的url只是指向了github里更新的json文件,不管本地版本号是多少,都会返回此json文件并更新。
请求:
OkGo: --> GET https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/json/json.txt?key2=value3&appKey=ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f&appVersion=0.8.3&key1=value2 http/1.1
返回:
OkGo: body:{
"update": "Yes",
"new_version": "0.8.3",
"apk_file_url": "https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk",
"update_log": "1,添加删除信用卡接口。\r\n2,添加vip认证。\r\n3,区分自定义消费,一个小时不限制。\r\n4,添加放弃任务接口,小时内不生成。\r\n5,消费任务手动生成。",
"target_size": "5M",
"new_md5":"295687E756F569C7159974DD493489A5",
"constraint": false
}
正常:
{
"update": "No",//没有新版本
}
求可以自定义下载进度条
千匍,您好
最近在使用您开发的升级库遇到一点小问题,在测试的时候,我使用的是
华为Che1-CL10的手机
点击更新APP(默认),就是最简单的更新按钮,控制台提示
我看了一下您的代码,在UpdateAppManager.java中,第140行的verify()函数
有一个preSuffix验证,限定了下载路径必须是要以"/storage/emulated"开头的
这里修改一下会不会好一些,
通过判断是否装载了SD卡会不会好一些,否则有些手机就没法下载了。
在Android8.0里下载完成后没法跳到安装界面
从这里下载的DEMO,在AS里可以编译运行,但是把编译过后的APK安装包手动放到手机里安装就会报错,报错如下:
08-24 09:30:46.441 9399-9399/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.vector.appupdatedemo, PID: 9399
java.lang.RuntimeException: Unable to instantiate application com.vector.appupdatedemo.App: java.lang.ClassNotFoundException: Didn't find class "com.vector.appupdatedemo.App" on path: DexPathList[[zip file "/data/app/com.vector.appupdatedemo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4576)
at android.app.ActivityThread.access$1500(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5310)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vector.appupdatedemo.App" on path: DexPathList[[zip file "/data/app/com.vector.appupdatedemo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newApplication(Instrumentation.java:1002)
at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4576)
at android.app.ActivityThread.access$1500(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5310)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Suppressed: java.lang.ClassNotFoundException: com.vector.appupdatedemo.App
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
在强制更新的情况下,我写的逻辑是,在oncreate方法里面调接口看有没有版本更新,如果有,就在本地存放一个true,没有就存放false,我在onResume方法里面,获取存放的这个值。如果是最新版本(已更新,没有最新版会存放false),更新弹窗就不出来了,如果不是最新版本,弹窗还照样出来。
No doubt this is great library ever, I'm using dropbox to update.txt but library assign appKey and version associate with link. Dropbox just handle following link, How I manage this condition? Please help me
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: <-- 400 https://dl.dropboxusercontent.com/s/3ah4tgrwd361uu9/update.txt?appKey=null&version=23.6002817 (7383ms)
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: server: nginx
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: date: Wed, 02 Aug 2017 18:16:18 GMT
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: content-type: text/html
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: x-dropbox-request-id: 5cd5db4b86c5f15d656d799827f2fee5
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: x-robots-tag: noindex, nofollow, noimageindex
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp:
静默下载,关闭更新弹窗 再点击更新 一直显示 “app正在更新” DownloadService.isRunning一直 true
直接让后台通过update在判断更新,如果我已经是最新的apk,每次进去还是会提示这个鬼东西,感觉还是使用版本判断比较靠谱!
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1842)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:650)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:609)
at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:205)
at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:171)
at com.vector.update_app.UpdateDialogFragment$4.onFinish(UpdateDialogFragment.java:312)
at com.vector.update_app.service.DownloadService$FileDownloadCallBack.onResponse(DownloadService.java:256)
at com.vector.appupdatedemo.http.UpdateAppHttpUtil$3.onResponse(UpdateAppHttpUtil.java:102)
at com.vector.appupdatedemo.http.UpdateAppHttpUtil$3.onResponse(UpdateAppHttpUtil.java:89)
at com.zhy.http.okhttp.OkHttpUtils$5.run(OkHttpUtils.java:256)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5315)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
at dalvik.system.NativeStart.main(Native Method)
你好,无意间发现这个库,非常感谢你提供这么方便的库,不过今天下载你的demo尝试时:点击下载,然后按home键返回桌面做其他的事,在下载完了之后就会出现这个异常。
定位错误出现在demo中的UpdateDialogFragment的312行
@Override
public boolean onFinish(File file) {
if (!UpdateDialogFragment.this.isRemoving()) {
dismiss();
}
return true;
}
中的dismiss();
测试时用的华为和小米,系统版本分别是4.4和5.0,两者都会出现这种情况。你可以试一下。
使用了同样的数字签名,
但是安装时,提示:该文件包与现有文件包存在冲突。必须手动删除原来的app,才能安装新的app
检查是否有新版本的功能,是不是没必要做在类库里?类库只需要提示框、下载、安装这些功能就好
在下载过程中 是否能关闭dialog 让在后台下载
我修改了源码 在下载中 关闭dialog 但是在下载中的时候 页面滑动非常卡顿 不知道为什么
没有 忽略此版本更新 这功能,或者更新对话框上可以加个 忽略此版本 按钮就更好了
url中存在下划线,好像就会报这个异常。
at okhttp3.Request$Builder.url(Request.java:143)
at com.zhy.http.okhttp.request.OkHttpRequest.initBuilder(OkHttpRequest.java:49)
at com.zhy.http.okhttp.request.OkHttpRequest.(OkHttpRequest.java:39)
at com.zhy.http.okhttp.request.GetRequest.(GetRequest.java:15)
at com.zhy.http.okhttp.builder.GetBuilder.build(GetBuilder.java:31)
at com.mengtai.athome.common.utils.UpdateAppHttpUtil.download(UpdateAppHttpUtil.java:97)
打印出来的日志显示成功,但界面提示“更新新版本出错,未知异常 code=200”
日志如下(为了防止攻击,我在http:// 后面加了空格):
08-08 14:10:22.169 20642-20698/? I/okHttp: <-- 200 OK http:// 3a3g.cn/app-1.1.apk (23ms)
08-08 14:10:22.169 20642-20698/? I/okHttp: Date: Tue, 08 Aug 2017 06:10:13 GMT
08-08 14:10:22.169 20642-20698/? I/okHttp: Server: Apache/2.4.25 (Win64) PHP/5.6.30
08-08 14:10:22.169 20642-20698/? I/okHttp: Accept-Ranges: bytes
08-08 14:10:22.169 20642-20698/? I/okHttp: ETag: W/"2355487-1502168009865"
08-08 14:10:22.169 20642-20698/? I/okHttp: Last-Modified: Tue, 08 Aug 2017 04:53:29 GMT
08-08 14:10:22.169 20642-20698/? I/okHttp: Content-Type: application/vnd.android.package-archive
08-08 14:10:22.169 20642-20698/? I/okHttp: Content-Length: 2355487
08-08 14:10:22.169 20642-20698/? I/okHttp: Keep-Alive: timeout=5, max=99
08-08 14:10:22.169 20642-20698/? I/okHttp: Connection: Keep-Alive
08-08 14:10:22.169 20642-20698/? I/okHttp:
08-08 14:10:22.170 20642-20698/? I/okHttp: body: maybe [file part] , too large too print , ignored!
08-08 14:10:22.170 20642-20698/? I/okHttp: <-- END HTTP
很好的更新库,但是能够支持自定义返回 json 格式就更好了。例如开放 json-> model 的解析接口。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.