Git Product home page Git Product logo

plus1-android-sdk's People

Contributors

dheadjesus avatar dovg avatar ivaravko avatar klestoff avatar thest1 avatar zlex avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

plus1-android-sdk's Issues

intent-filter

В обновлённом SDK 2.3.0 появилось требование добавить intent-filter. Не ясно куда именно. У меня в приложении порядка 80 разных Activity. Реклама может динамически появляться в любых из них. Так куда же именно мне добавить intent-filter?

java.lang.NullPointerException at ru.wapstart.plus1.sdk.MraidView$MraidWebViewClient.onPageFinished (MraidView.java:424)

Наше приложение за последние 5 дней упало 700 раз по следующей причине:

java.lang.NullPointerException:
at ru.wapstart.plus1.sdk.MraidView$MraidWebViewClient.onPageFinished (MraidView.java:424)
at com.android.webview.chromium.WebViewContentsClientAdapter.onPageFinished (WebViewContentsClientAdapter.java:449)
at com.android.org.chromium.android_webview.AwContentsClient$AwWebContentsObserver$1.run (AwContentsClient.java:73)
at android.os.Handler.handleCallback (Handler.java:733)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:146)
at android.app.ActivityThread.main (ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative (Method.java:-2)
at java.lang.reflect.Method.invoke (Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1099)
at dalvik.system.NativeStart.main (NativeStart.java:-2)

Падает на самых разных моделях устройств, но версия Android везде 4.4.2.
Сам воспроизводить не пробовал.
Версия Wapstart SDK 2.3.2
Спасибо!

setRemoveBannersOnPause(true)

Если во время анимации рекламного объявления перейти на другую Activity либо вернуться на предыдущую при setRemoveBannersOnPause(true) возникает ошибка.

11-26 22:00:24.947: E/webview(19206): java.lang.Throwable: Error: WebView.destroy() called while still attached!
11-26 22:00:24.947: E/webview(19206): at android.webkit.WebViewClassic.destroy(WebViewClassic.java:2152)
11-26 22:00:24.947: E/webview(19206): at android.webkit.WebView.destroy(WebView.java:642)
11-26 22:00:24.947: E/webview(19206): at ru.wapstart.plus1.sdk.Plus1AdAnimator.removeAllBanners(Plus1AdAnimator.java:104)
11-26 22:00:24.947: E/webview(19206): at ru.wapstart.plus1.sdk.Plus1BannerView.removeAllBanners(Plus1BannerView.java:134)
11-26 22:00:24.947: E/webview(19206): at ru.wapstart.plus1.sdk.Plus1BannerAsker.onPause(Plus1BannerAsker.java:100)
11-26 22:00:24.947: E/webview(19206): at com.ugarsa.youcinema.MainActivity.onPause(MainActivity.java:169)
11-26 22:00:24.947: E/webview(19206): at android.app.Activity.performPause(Activity.java:5235)
11-26 22:00:24.947: E/webview(19206): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1233)
11-26 22:00:24.947: E/webview(19206): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3050)
11-26 22:00:24.947: E/webview(19206): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3019)
11-26 22:00:24.947: E/webview(19206): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2997)
11-26 22:00:24.947: E/webview(19206): at android.app.ActivityThread.access$800(ActivityThread.java:141)
11-26 22:00:24.947: E/webview(19206): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267)
11-26 22:00:24.947: E/webview(19206): at android.os.Handler.dispatchMessage(Handler.java:99)
11-26 22:00:24.947: E/webview(19206): at android.os.Looper.loop(Looper.java:137)
11-26 22:00:24.947: E/webview(19206): at android.app.ActivityThread.main(ActivityThread.java:5103)
11-26 22:00:24.947: E/webview(19206): at java.lang.reflect.Method.invokeNative(Native Method)
11-26 22:00:24.947: E/webview(19206): at java.lang.reflect.Method.invoke(Method.java:525)
11-26 22:00:24.947: E/webview(19206): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-26 22:00:24.947: E/webview(19206): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-26 22:00:24.947: E/webview(19206): at dalvik.system.NativeStart.main(Native Method)

Решилось добавлением mCurrentView.removeAllViews() в removeAllBanners()

public void removeAllBanners() {
stopLoading();
clearAnimation();

    if (mCurrentView != null) {
        mBaseView.removeView(mCurrentView);
        mCurrentView.removeAllViews();
        mCurrentView.destroy();
        mCurrentView = null;
    }
}

Отрисовывается два баннера вместо одного

Скриншот есть здесь http://vk.com/topic-26062647_29171362

На самом деле на экране только один баннер. И кликнуть можно только по одному баннеру. Если кликнуть по второму, то кликнется не баннер, а view которое под ним.

Сами воспроизвести не можем поэтому всё только со слов пользователей.

Пока что получается, что воспроизводится только на Android 4.0.4. У меня такого устройства нет, и эмулятор только 4.0.3, может поэтому не удаётся воспроизвести.

Пока что получается, что воспроизводится только тогда, когда баннер расположен не в самом низу экрана, а чуть выше. Под ним есть ещё одно view, которое на скриншоте не видно потому что перекрыто непонятным дубликатом баннера. То есть верхний баннер настоящий, нижний - дубликат. Похоже на глюк отрисовки WebView.

Понятно что всё очень расплывчато и данных наверное недостаточно чтобы исправить. Пока что мне придётся просто удлить рекламу с тех экранов, где это воспроизводится. Но прежде решил спросить у вас, может вы уже сталкивались и что-то посоветуете.

Wapstart SDK 2.2.3

SDK падает из-за hardwareAccelerated="true"

Шаги воспроизведения:

  1. По почте я вам высылал слегка модифицированный проект Bart, который вы распространяете в качестве примера использования SDK. Нужно его собрать. В проект внесены следующие изменения: Добавлена пустая TestActivity и кнопка на главной активити, которая открывает эту TestActivity. В манифест добавлено android:hardwareAccelerated="true". Чтобы собрать проект с этим новым параметром в файле project.properties указано target=android-17.
  2. Запустить проект на устройстве с Android 4.
  3. На главном экране нажать кнопку Click Me, откроектся пустой экран, закрыть его кнопкой Назад. Снова Click Me, снова назад. И так далее. После нескольких повторений приложение упадёт. Повторений потребуется от 2 до 20.

Приложение падает и в других ситуациях. Но описанная выше ситуация воспроизводит проблему наиболее стабильно.

Вероятно проблема в android:hardwareAccelerated="true". Учитывайте пожалуйста, что в новых проектах этот аттрибут включен по умолчанию http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel.

Баг для нас критичен. Из-за него мы пока что полностью отключили показ рекламы wapstart в своём приложении. Ждём любых комментариев/рекомендаций.

Вот лог падения:

06-03 09:56:21.494: D/KeyguardViewMediator(215): setHidden false
06-03 09:56:21.494: I/GATE(18868): DEV_ACTION_COMPLETED
06-03 09:56:21.501: D/webviewglue(18868): nativeDestroy view: 0x14d8d78
06-03 09:56:21.501: D/webviewglue(18868): nativeDestroy view: 0x1924c08
06-03 09:56:21.501: D/webviewglue(18868): nativeDestroy view: 0x14dab20
06-03 09:56:21.501: D/Plus1AdAnimator(18868): showAd method fired
06-03 09:56:21.501: D/BartActivity(18868): OnImpressionListener was touched
06-03 09:56:21.509: D/WebView(18868): start-WebView::drawGL functor operator called
06-03 09:56:21.509: D/WebView(18868): exit(0) - WebView::drawGL functor operator exit
06-03 09:56:21.509: A/libc(18868): Fatal signal 11 (SIGSEGV) at 0x019142d0 (code=2)
06-03 09:56:22.009: I/DEBUG(16400): SET
06-03 09:56:22.017: I/DEBUG(16400): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-03 09:56:22.017: I/DEBUG(16400): Build fingerprint: 'samsung/espresso10rfxx/espresso10rf:4.0.4/IMM76D/P5100XWBLF3:user/release-keys'
06-03 09:56:22.017: I/DEBUG(16400): pid: 18868, tid: 18868 >>> ru.wapstart.plus1.bart <<<
06-03 09:56:22.017: I/DEBUG(16400): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 019142d0
06-03 09:56:22.017: I/DEBUG(16400): r0 0192a940 r1 00000000 r2 bebdf100 r3 00000000
06-03 09:56:22.017: I/DEBUG(16400): r4 016ba808 r5 019142d0 r6 0192a940 r7 bebdf5a0
06-03 09:56:22.017: I/DEBUG(16400): r8 00000000 r9 56e75b68 10 5899effc fp bebdf5e4
06-03 09:56:22.017: I/DEBUG(16400): ip 40b91608 sp bebdf100 lr 40b81909 pc 019142d0 cpsr 60000010
06-03 09:56:22.017: I/DEBUG(16400): d0 0000032042960000 d1 0000001944480000
06-03 09:56:22.017: I/DEBUG(16400): d2 000001e041c80000 d3 000002f043f00000
06-03 09:56:22.017: I/DEBUG(16400): d4 3f800000e0000000 d5 41c8000043f00000
06-03 09:56:22.017: I/DEBUG(16400): d6 000002a5000001e0 d7 0000004b00000140
06-03 09:56:22.017: I/DEBUG(16400): d8 000000004435c000 d9 44a0000000000000
06-03 09:56:22.017: I/DEBUG(16400): d10 0000000000000000 d11 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d12 0000000000000000 d13 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d14 0000000000000000 d15 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d16 41d46b04f960f862 d17 3fe07c30d306a2b1
06-03 09:56:22.017: I/DEBUG(16400): d18 411f716000000000 d19 c0247ae140000000
06-03 09:56:22.017: I/DEBUG(16400): d20 0000000000000000 d21 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d22 0000000000000000 d23 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d24 3ff99999a0000000 d25 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d26 bf50624de0000000 d27 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): d28 0000000000000000 d29 3ff0000000000000
06-03 09:56:22.017: I/DEBUG(16400): d30 0000000000000000 d31 0000000000000000
06-03 09:56:22.017: I/DEBUG(16400): scr 20000013
06-03 09:56:22.025: I/InputReader(215): Touch event's action is 0x0 (deviceType=0) [pCnt=1, pending(waiting finished signal)=0, s=0.6021 ]
06-03 09:56:22.025: I/InputDispatcher(215): Delivering touch to current input target: action: 0x0
06-03 09:56:22.025: I/InputDispatcher(215): Delivering touch to current input target: action: 0x0
06-03 09:56:22.095: I/InputReader(215): Touch event's action is 0x1 (deviceType=0) [pCnt=1, pending(waiting finished signal)=1, s=]
06-03 09:56:22.197: I/DEBUG(16400): #00 pc 019142d0 [heap]
06-03 09:56:22.197: I/DEBUG(16400): #1 pc 00013906 /system/lib/libhwui.so
06-03 09:56:22.197: I/DEBUG(16400): #2 pc 0000cb50 /system/lib/libhwui.so
06-03 09:56:22.197: I/DEBUG(16400): #3 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.197: I/DEBUG(16400): #4 pc 0000ccc6 /system/lib/libhwui.so
06-03 09:56:22.197: I/DEBUG(16400): #5 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #6 pc 0000ccc6 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #7 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #8 pc 0000ccc6 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #9 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #10 pc 0000ccc6 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #11 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.205: I/DEBUG(16400): #12 pc 0000ccc6 /system/lib/libhwui.so
06-03 09:56:22.212: I/DEBUG(16400): #13 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.212: I/DEBUG(16400): #14 pc 0000ccc6 /system/lib/libhwui.so
06-03 09:56:22.212: I/DEBUG(16400): #15 pc 00011514 /system/lib/libhwui.so
06-03 09:56:22.212: I/DEBUG(16400): #16 pc 00059f34 /system/lib/libandroid_runtime.so
06-03 09:56:22.212: I/DEBUG(16400): #17 pc 0001ed30 /system/lib/libdvm.so (dvmPlatformInvoke)
06-03 09:56:22.212: I/DEBUG(16400): #18 pc 00058fec /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
06-03 09:56:22.212: I/DEBUG(16400): code around pc:
06-03 09:56:22.212: I/DEBUG(16400): 019142b0 019648d0 00580a3c 0193ebd8 01770948 .H..<.X.....H.w.
06-03 09:56:22.212: I/DEBUG(16400): 019142c0 015ed870 00000000 00000000 00003031 p.^.........10..
06-03 09:56:22.220: I/DEBUG(16400): 019142d0 00000048 00000041 01987588 017d2918 H...A....u...)}.
06-03 09:56:22.220: I/DEBUG(16400): 019142e0 019142ec 00000000 00000000 00700061 .B..........a.p.
06-03 09:56:22.220: I/DEBUG(16400): 019142f0 006c0070 00630069 00740061 006f0069 p.l.i.c.a.t.i.o.
06-03 09:56:22.220: I/DEBUG(16400): code around lr:
06-03 09:56:22.220: I/DEBUG(16400): 40b818e8 ef32f7f4 a9059a21 f7fd6f10 a821f809 ..2.!....o....!.
06-03 09:56:22.220: I/DEBUG(16400): 40b818f8 f8acf7fc 46306831 688d466a 47a82100 ....1h0FjF.h.!.G
06-03 09:56:22.220: I/DEBUG(16400): 40b81908 b1984605 a9194638 5a15ed9d 4a16eddd .F..8F.....Z...J
06-03 09:56:22.220: I/DEBUG(16400): 40b81918 4a17ed9d 3a18eddd 5a19ed8d 4a1aedcd ...J...:...Z...J
06-03 09:56:22.220: I/DEBUG(16400): 40b81928 4a1bed8d 3a1cedcd f922f7fd 69836820 ...J...:..". h.i
06-03 09:56:22.220: I/DEBUG(16400): memory map around addr 019142d0:
06-03 09:56:22.220: I/DEBUG(16400): 013b6000-01627000 [heap]
06-03 09:56:22.220: I/DEBUG(16400): 01627000-019bf000 [heap]
06-03 09:56:22.220: I/DEBUG(16400): 10000000-10001000
06-03 09:56:22.220: I/DEBUG(16400): stack:
06-03 09:56:22.220: I/DEBUG(16400): bebdf0c0 56e75b68
06-03 09:56:22.220: I/DEBUG(16400): bebdf0c4 5899effc /system/framework/framework.odex
06-03 09:56:22.220: I/DEBUG(16400): bebdf0c8 016ba808 [heap]
06-03 09:56:22.220: I/DEBUG(16400): bebdf0cc bebdf0e0 [stack]
06-03 09:56:22.220: I/DEBUG(16400): bebdf0d0 0192a940 [heap]
06-03 09:56:22.220: I/DEBUG(16400): bebdf0d4 bebdf5a0 [stack]
06-03 09:56:22.220: I/DEBUG(16400): bebdf0d8 00000000
06-03 09:56:22.220: I/DEBUG(16400): bebdf0dc 40b7fa17 /system/lib/libhwui.so
06-03 09:56:22.220: I/DEBUG(16400): bebdf0e0 0176eb50 [heap]
06-03 09:56:22.220: I/DEBUG(16400): bebdf0e4 bebdf184 [stack]
06-03 09:56:22.220: I/DEBUG(16400): bebdf0e8 0192a940 [heap]
06-03 09:56:22.228: I/DEBUG(16400): bebdf0ec 40b7da63 /system/lib/libhwui.so
06-03 09:56:22.228: I/DEBUG(16400): bebdf0f0 016ba808 [heap]
06-03 09:56:22.228: I/DEBUG(16400): bebdf0f4 bebdf174 [stack]
06-03 09:56:22.228: I/DEBUG(16400): bebdf0f8 df0027ad
06-03 09:56:22.228: I/DEBUG(16400): bebdf0fc 00000000
06-03 09:56:22.228: I/DEBUG(16400): #1 bebdf100 000001e0
06-03 09:56:22.228: I/DEBUG(16400): bebdf104 00000019
06-03 09:56:22.228: I/DEBUG(16400): bebdf108 00000320
06-03 09:56:22.228: I/DEBUG(16400): bebdf10c 0000004b
06-03 09:56:22.228: I/DEBUG(16400): bebdf110 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf114 3f800000
06-03 09:56:22.228: I/DEBUG(16400): bebdf118 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf11c 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf120 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf124 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf128 3f800000
06-03 09:56:22.228: I/DEBUG(16400): bebdf12c 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf130 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf134 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf138 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf13c 3f800000
06-03 09:56:22.228: I/DEBUG(16400): bebdf140 00000000
06-03 09:56:22.228: I/DEBUG(16400): bebdf144 43f00000 /dev/ashmem/dalvik-heap (deleted)
06-03 09:56:22.236: I/DEBUG(16400): bebdf148 41c80000 /dev/ashmem/dalvik-heap (deleted)
06-03 09:56:22.236: I/DEBUG(16400): bebdf14c 00000000
06-03 09:56:22.236: I/DEBUG(16400): bebdf150 3f800000
06-03 09:56:22.236: I/DEBUG(16400): bebdf154 0176eb50 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf158 01699280 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf15c 0176eb50 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf160 016ba8a4 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf164 40b812bd /system/lib/libhwui.so
06-03 09:56:22.236: I/DEBUG(16400): bebdf168 016ba8a4 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf16c 40b81405 /system/lib/libhwui.so
06-03 09:56:22.236: I/DEBUG(16400): bebdf170 016ba808 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf174 43f00000 /dev/ashmem/dalvik-heap (deleted)
06-03 09:56:22.236: I/DEBUG(16400): bebdf178 41c80000 /dev/ashmem/dalvik-heap (deleted)
06-03 09:56:22.236: I/DEBUG(16400): bebdf17c 44480000 /dev/ashmem/dalvik-heap (deleted)
06-03 09:56:22.236: I/DEBUG(16400): bebdf180 42960000 /dev/ashmem/dalvik-heap (deleted)
06-03 09:56:22.236: I/DEBUG(16400): bebdf184 0176eb50 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf188 00000000
06-03 09:56:22.236: I/DEBUG(16400): bebdf18c 017cc748 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf190 016ba808 [heap]
06-03 09:56:22.236: I/DEBUG(16400): bebdf194 00000000
06-03 09:56:22.236: I/DEBUG(16400): bebdf198 00000023
06-03 09:56:22.236: I/DEBUG(16400): bebdf19c 40b7ab53 /system/lib/libhwui.so
06-03 09:56:23.517: W/SignalStrength(215): getGsmLevel=2
06-03 09:56:23.517: W/SignalStrength(215): getLevel=2 (SignalStrength: 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 gsm|lte 2)
06-03 09:56:23.517: W/SignalStrength(215): getGsmDbm=-97
06-03 09:56:23.517: W/SignalStrength(215): getDbm=-97
06-03 09:56:23.517: W/SignalStrength(215): getGsmAsuLevel=8
06-03 09:56:23.517: W/SignalStrength(215): getAsuLevel=8
06-03 09:56:23.525: W/SignalStrength(291): getGsmLevel=2

setPluginsEnabled

В классе adView используется метод setPluginsEnabled для getSetting. Этот метод был удален (не просто пометили как deprecated, а удалили) в 8мой api level. не знаю как такой баг можно было сделать...

я сделал вот так:

    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1) {
        try {

            Method metod = WebSettings.class
                    .getDeclaredMethod("setPluginsEnabled");
            if (metod != null) {
                metod.invoke(getSettings(), true);
            }
        } catch (Exception ex) {

        }
    } else {
        getSettings().setPluginState(PluginState.ON);
    }

Поправьте если не прав

Антивирус

Интересная желоба от пользователя, только с её слов, сами пока не проверяли. Говорит что антивирус Avira сообщает, что в нашем приложении обнаружен adware "Adware/ANDR.WapStart.A.20". Пользователей такое сообщение конечно пугает, они сразу решают что в приложении вирус, который ворует все их пароли.

Вот сама жалоба http://4pda.ru/forum/index.php?s=&showtopic=228851&view=findpost&p=29629818

Креш в onPause

Если onPause вызван до onResume приложение крешится.
Caused by: java.lang.NullPointerException
at ru.wapstart.plus1.sdk.Plus1BannerAsker.removeLocationUpdates(Plus1BannerAsker.java:454)
at ru.wapstart.plus1.sdk.Plus1BannerAsker.onPause(Plus1BannerAsker.java:99)

Нужно добавить проверку: если до этого не инициализировали, то ничего не делать.

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.