GithubHelp home page GithubHelp logo

kanghanbin.github.io's People

Contributors

kanghanbin avatar

Stargazers

 avatar

Watchers

 avatar  avatar

kanghanbin.github.io's Issues

方舟编译器的引发的学习惨案 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/07/31/%E6%96%B9%E8%88%9F%E7%BC%96%E8%AF%91%E5%99%A8%E7%9A%84%E5%BC%95%E5%8F%91%E7%9A%84%E5%AD%A6%E4%B9%A0%E6%83%A8%E6%A1%88/#more

昨天公司给了部p30,开机体验了下,确实不错。运存8g+内存128g+cpu麒麟980搭载EMUI9.1,重点是华为公布的方舟编译器。并向业界开源改工程,于是赶紧上网学习了下关于Android ART JVM的知识,也可以给别人吹吹牛逼方舟编译器到底干了个啥。简介方舟编译器可供开发者在开发环境一次性的将高级语言编译为机器码,手机安装应用程序后可全速运行程序,带来效率上的极大提升。根据华为实验室的测

Android中IPC机制之Messenger | Kanghanbin's Blog

https://kanghanbin.github.io/2019/08/20/Android%E4%B8%ADIPC%E6%9C%BA%E5%88%B6%E4%B9%8BMessenger/#more

前言Messenger翻译为“信使”,顾名思义,可以在不同进程中传递Message对象。Messenger是一种轻量级IPC方案,底层实现也是AIDL,只是对AIDL做了封装。Messenger的使用相对于AIDL方便多,因为Messenger是Android系统中自带的类,服务端和客户端都不用创建AIDL文件。Messenger会持有一个Handler,这个Handler用于处理接受到的信息,在

Android Handler 的工作原理解析 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/09/16/Android-Handler-%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/#more

前言提到Handler大家应该都不会陌生,它是安卓中消息机制的主要核心类,配合MessageQueue和Looper一起使用构成了我们所熟悉的Android消息机制。Handler的主要工作是将一个任务切换到指定的线程去执行,因为Android中规定访问UI只能在主线程中进行,如果在子线程中访问UI,会抛出异常。而Android中不建议在主线程执行耗时操作否则会造成ANR,所以说。系统提供Hand

aidl的学习记录 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/08/14/aidl%E7%9A%84l%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/

一、aidl简介aidl(Android Interface Definition Language ),安卓接口定义语言,在 Android 中,每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自己的操作,都在自己的那片狭小的空间里过完自己的一生。每个进程之间都你不知我,我不知你,就像是隔江相望的两座小岛一样,都在同一个世界里,但又各自

Git团队协作常见命令的记录 | Kanghanbin's Blog

https://kanghanbin.github.io/2016/10/27/Git%E5%9B%A2%E9%98%9F%E5%8D%8F%E4%BD%9C%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E7%9A%84%E8%AE%B0%E5%BD%95/#more

一、Git简介一个分布式版本管理系统,重点在分布式,CVS和SVN都是集中式版本控制系统,那么问题来了,分布式和集中式有何区别呢? 先说集中式版本控制系统,版本库是集中存放在**服务器的,而干活的时候,用的都是自己的电脑,所以要先从**服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给**服务器。**服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改

带你初识kotlin(五) | Kanghanbin's Blog

https://kanghanbin.github.io/2019/06/03/%E5%B8%A6%E4%BD%A0%E5%88%9D%E8%AF%86kotlin-%E4%BA%94/

介绍集合是大多数编程语言的常见概念通常包含相同类型的一些(数目也可以为零)对象。集合中的对象称为元素或条目。 集合类型Kotlin标准库提供了基本集合类型的实现:集合,列表和映射。 一对接口代表每种集合类型: A read-only interface that provides operations for accessing collection elements. A mutable in

Activity的生命周期和启动模式 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/08/09/Activity%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%92%8C%E5%90%AF%E5%8A%A8%E6%A8%A1%E5%BC%8F/#more

activity的生命周期正常情况下activity的生命周期如下图所示:整个生命周期,onCreate 和onDestroy,onStart和onStop,onResume和onPause都是一一配对的。问题当前Activity为A,用户打开新的ActivityB,B的onResume和A的onPause方法那个先执行?当启动一个新的activity是,旧的activity的onPause会先执

带你初识Kotlin(二) | Kanghanbin's Blog

https://kanghanbin.github.io/2017/08/07/%E5%B8%A6%E4%BD%A0%E5%88%9D%E8%AF%86Kotlin-%E4%BA%8C/

上一节 简单认识了下kotlin的基本类型和常用流程控制,这节继续学习一、Kotlin 变量声明首先,kotlin变量的声明必须使用关键字var或valvar: 用此关键字声明的变量表示可变变量,即可读且可写。相当于Java中普通变量val: 用此关键字声明的变量表示不可变变量,即可读且不可写。相当于Java中用final修饰的变量1.1基础用法:关键字 变量名:数据类型 = xxxeg://立即

recycleview滚动到指定item,并显示在顶部 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/11/05/recycleview%E6%BB%9A%E5%8A%A8%E5%88%B0%E6%8C%87%E5%AE%9Aitem%EF%BC%8C%E5%B9%B6%E6%98%BE%E7%A4%BA%E5%9C%A8%E9%A1%B6%E9%83%A8/

项目中要实现这种效果:右边的recycleview需要跟随左边的菜单栏的选择而滚动到指定item,并将该item置顶。其实这种需求很常见。下面来看具体实现代码:1.滚动到指定item代码: private boolean needScroll; private int postion; private void smoothScrollRecycleviewtoPositionTop(int p

带你初识kotlin(四) | Kanghanbin's Blog

https://kanghanbin.github.io/2019/05/31/%E5%B8%A6%E4%BD%A0%E5%88%9D%E8%AF%86kotlin-%E5%9B%9B/#more

这一节主要学习高阶函数及其涉及到的一系列函数头等函数头等函数(first-class function)是指在程序设计语言中,函数被当作头等公民。这意味着,函数可以作为别的函数的参数、函数的返回值,赋值给变量或存储在数据结构中。 Kotlin 函数都是头等的,这意味着它们可以存储在变量与数据结构中、作为参数传递给其他高阶函数以及从其他高阶函数返回。可以像操作任何其他非函数值一样操作函数。高阶函数高

kotlin Coroutines in Android App | Kanghanbin's Blog

https://kanghanbin.github.io/2019/06/27/kotlin-Coroutines-in-Android-App/#more

What are Coroutines?拆开Coroutines 这个单词来看 Coroutines = Co + Routines 在这里,Co意味着合作,而Routines意味着功能。这意味着当函数相互合作时,我们将其称为协同程序Introduction可以将coroutine视为轻量级线程。与线程一样,协同程序可以并行运行,彼此等待并进行通信。协同程序的最大优点是非常便宜,几乎是免费的:我们

关于recycleview的快速添加弹窗不关闭,列表数据实时展示问题 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/09/04/%E5%85%B3%E4%BA%8Erecycleview%E7%9A%84%E5%BF%AB%E9%80%9F%E6%B7%BB%E5%8A%A0%E5%BC%B9%E7%AA%97%E4%B8%8D%E5%85%B3%E9%97%AD%EF%BC%8C%E5%88%97%E8%A1%A8%E6%95%B0%E6%8D%AE%E5%AE%9E%E6%97%B6%E5%B1%95%E7%A4%BA%E9%97%AE%E9%A2%98/#more

需求来源目前做的是一个采集的App,配合金种子云平台的安卓采集端,有个界面是需要实现快速采集,每次采集完成后采集弹框不消失,还要动态去更新背后的recycleview,然而弹框 + 软键盘的展示使得Recycleview的可见区域很小。初步实现界面展示:动态效果:具体实现对应xml代码如下,不多做解释:<?xml version="1.0" encoding="utf-8"?> <Li

评论页面的实现 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/09/20/%E8%AF%84%E8%AE%BA%E9%A1%B5%E9%9D%A2%E7%9A%84%E5%AE%9E%E7%8E%B0/

一、效果图展示 二、思路分析首先,上效果图,这样的评论界面很常见,日常新闻,社交等类的app中都有评论功能,今天就来看看怎么实现? 实现这种效果并不难,首先最外层肯定是Recycleview,然后设置他的Adapter来实现,重点在于Adapter的实现。 三、准备1.首先,得有一个评论javaBean类,用来封装评论信息,当然这些信息在开发中都是从服务器端获取的,这个类为CommentBean,

解决Android Studio依赖库版本不一致的问题 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/05/08/%E8%A7%A3%E5%86%B3Android-Studio%E4%BE%9D%E8%B5%96%E5%BA%93%E7%89%88%E6%9C%AC%E4%B8%8D%E4%B8%80%E8%87%B4%E7%9A%84%E9%97%AE%E9%A2%98/

强制指定第三方依赖库内部所依赖的库的版本号具体问题在项目开发和迭代过程中,我们不得不依赖越来越多的第三方库,有些是为了不重复造轮子,有些是要用别人的功能,比如依赖一些直播平台的库。依赖的库越多,就越容易造成依赖版本冲突的问题。在最近项目上线,空闲下来的时间,准备来解决之前一直没有顾得上解决的一个依赖问题,虽然能编译通过,总感觉有一条红色警告线看着不爽。就是它…根据提示,大概意思是说所有com.an

Groovy快速入门指南 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/05/29/Groovy%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/#more

1.Groovy概述Groovy是Apache 旗下的一种基于JVM的面向对象编程语言,既可以用于面向对象编程,也可以用作纯粹的脚本语言。在语言的设计上它吸纳了Python、Ruby 和 Smalltalk 语言的优秀特性,比如动态类型转换、闭包和元编程支持。Groovy与 Java可以很好的互相调用并结合编程 ,比如在写 Groovy 的时候忘记了语法可以直接按Java的语法继续写,也可以在

| Kanghanbin's Blog

https://kanghanbin.github.io/2019/08/01/RxPermissions%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/#more

title: RxPermissions源码解析date: 2019-08-01 17:18:05tags: 源码前言AndroidM(6.0)开始,系统增加了运行时动态权限,目的在于保护用户隐私,防止一些敏感的危险权限在应用安装时被随意获取,用户可以清晰地选择是否允许app某项权限,就算没有给予某个权限,也不影响其他功能的使用,不至于令用户无法安装。以下权限都被列为危险权限,即需要运行时动态获取

序列化与反序列化之Serializable和Parcelable | Kanghanbin's Blog

https://kanghanbin.github.io/2019/08/13/%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8BSerializable%E5%92%8CParcelable/#more

面试场景Android 开发中对两个 Activity 之前传递数据,应该很熟悉吧?嗯,当然没问题。一般采用 Intent.putXXX() 就可以实现各种轻量级数据的传递。那对于自定义的 Object 呢?直接使用 Bundle.putSerializable() 即可。需要把对象实现 Serializable 接口,最后使用 Intent.putExtras(Bundle) 把数据放进 Int

神兵利器Dragger2学习篇 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/08/23/%E7%A5%9E%E5%85%B5%E5%88%A9%E5%99%A8Dragger2%E5%AD%A6%E4%B9%A0%E7%AF%87/

Dagger ,早有耳闻,但一直没有与他正真的认识过。Dagger 英文翻译为“匕首”,这可能就是把它称作神兵利器的原因。当我看一些开源项目在使用dagger2 时,我停止了前进的步伐,查阅了网上一些层差不齐的资料后,感觉还是懵逼状态,正当我感受到了从入门到放弃的状态时,看到了一篇相对好理解一写的博文,我又开始踏上了从放弃到入门之路。背景(日常念经,了解一下)Dagger ,鼎鼎大名的Square

aidl的学习记录3 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/09/15/aidl%E7%9A%84%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%953/

aidl相关文章首先放出前两篇关于aidl的文章,没看过的可以看下。前言要实现服务端每增加一本书,会主动通知客户端。不用客户端一直去调用getBooks获取最新书,才用观察者模式。当服务端有新书到来时,会通知每一个已经注册监听的客户端,并把新书对象传给客户端。具体实现1.由于AIDL无法使用普通接口所以需要新建一个aidl接口INewBookArrivedListener.adil,提供一个通知方

WanAndroid,一款每日推荐优质文章App | Kanghanbin's Blog

https://kanghanbin.github.io/2018/11/21/WanAndroid%EF%BC%8C%E4%B8%80%E6%AC%BE%E6%AF%8F%E6%97%A5%E6%8E%A8%E8%8D%90%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0App/

WanAndroidWanAndroid,一款每日推荐优质文章App,项目涉及API均来自鸿洋大神的玩Android,基于Material Design + MVP + RxJava2 + Retrofit + Litepal + Glide出于学习的目的做了这款Material Design风格的简洁的阅读应用,玩Android是一个每日推荐20~30篇Android优质文章的站点,提供Andr

CoordinatorLayout打造折叠悬浮效果 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/09/18/CoordinatorLayout%E6%89%93%E9%80%A0%E6%8A%98%E5%8F%A0%E6%82%AC%E6%B5%AE%E6%95%88%E6%9E%9C/

一、CoordinatorLayout是一个ViewGroup,遵循Material 风格,包含在 support Library中,结合AppbarLayout, CollapsingToolbarLayout等 可 产生各种炫酷的折叠悬浮效果。二、AppBarLayout是一个vertical的LinearLayout,其子View应通过下面两种方式来提供他们的Behavior。1.代码方式:

关于Adroid Binder的理解 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/08/10/%E5%85%B3%E4%BA%8EAdroid-Binder%E7%9A%84%E7%90%86%E8%A7%A3/

一. 前言这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔。生怕自己理解上还有偏差,对大家造成误解,贻笑大方。又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的设计精髓。直到今天提笔写作时还依旧战战兢兢。Binder 之复杂远远不是一篇文章就能说清楚的,本文想站在一个更高的维度来俯瞰 Binder 的设计,最终帮助大家形成一个完整的概念。对于应用层开发的同学

第一个Flutter应用之Helloworld | Kanghanbin's Blog

https://kanghanbin.github.io/2019/06/17/%E7%AC%AC%E4%B8%80%E4%B8%AAFlutter%E5%BA%94%E7%94%A8%E4%B9%8BHelloworld/

背景Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。1.0版本于2018年12月5日(北京时间)发布。 安装环境和配置1.获取 Flutter SDK 下载下面的安装包以获取最新版本 stable 的 Flutt

带你初识Kotlin(一) | Kanghanbin's Blog

https://kanghanbin.github.io/2017/07/18/%E5%B8%A6%E4%BD%A0%E5%88%9D%E8%AF%86Kotlin/

What is Kotlin?Kotlin是JVM和Android的实用编程语言,结合了OO和功能特性,专注于互操作性,安全性,清晰度和工具支持。 本文记录自己学习kotlin认为需要记录的重点,如果需要详细学习,请点击Kotlin中文文档学习。 基本类型在 Kotlin 中,所有变量的成员方法和属性都是一个对象。一些类型是内建的,它们的实现是优化过的,但对用户来说它们就像普通的类一样。 数值

StaggeredGridLayoutManager瀑布流错乱的解决 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/09/29/StaggeredGridLayoutManager%E7%80%91%E5%B8%83%E6%B5%81%E9%94%99%E4%B9%B1%E7%9A%84%E8%A7%A3%E5%86%B3-1/

使用RecyclerView搭配StaggeredGridLayoutManager实现瀑布流时,一般会在Adapter的onBindViewHolder()方法里给每一个item随机生成一个高度,使得item的排布错落有致,不死板。 @OverRide public void onBindViewHolder(final ViewHolder holder, int position)

proguard rule 惨痛教训 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/12/14/proguard-rule-%E6%83%A8%E7%97%9B%E6%95%99%E8%AE%AD/

问题今天再给项目配置混淆打release包时,遇到了个很尴尬的问题,项目打正式包下奔溃,打测试包正常运行。下面是打包配置(app下的build.gradle),关于为什么要proguard应用程序,请看这篇文章为什么每个人都应该将ProGuard用于他们的Android应用程序android { compileSdkVersion rootProject.ext.android.compi

ShadowsocksR服务端搭建教程 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/11/21/ShadowsocksR%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/#more

前提:假设你已经完成了VPS注册与购买流程,这里个人买的是Vultr主机,安装了putty来控制主机。下面命令都是在putty执行系统要求:CentOS 6+ / Debian 6+ / Ubuntu 14.04 +脚本特点:所有步骤都可以通过 Shell 脚本中文交互 操作。支持 限制 用户速度支持 限制 用户设备数支持 限制 用户总流量支持 定时 流量清零支持 显示 当前连接IP支持 显示 S

一次批量插入数据库上万条记录优化 | Kanghanbin's Blog

https://kanghanbin.github.io/2018/10/17/%E4%B8%80%E6%AC%A1%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%8A%E4%B8%87%E6%9D%A1%E8%AE%B0%E5%BD%95%E4%BC%98%E5%8C%96/

由于项目涉及到数据库的东西太多太多,基本所有功能都涉及到数据库。在一个移动客户端上只要涉及到网络数据都得保存到本地,数据量小的情况下还好,如果数据量成千上万,那稳定性,速度效率个方面问题层出不穷。问题:上万条数据从服务端下下来,可能会导致程序崩溃?解决方案:1.首先这个奔溃问题,我不知道是什么奔溃,然后让业务那边在初选收获功能模块中加一些大数据量我这边好测试,业务分别加成功了4000和9040两种

Java中的LinkedList的方法的应用 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/07/17/Java%E4%B8%AD%E7%9A%84LinkedList%E7%9A%84%E6%96%B9%E6%B3%95%E7%9A%84%E5%BA%94%E7%94%A8/#more

introduceLinkedList其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:分配内存空间不是必须是连续的;插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);在Java中,LinkedList提供了丰富的方法,可以模拟链式队列,链式堆栈等数据结构,为用户带来了极大的方便,下面看看这些方法的用法:ad

Kotlin关键字Reified在安卓开发中的用法 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/11/28/Kotlin%E5%85%B3%E9%94%AE%E5%AD%97Reified%E5%9C%A8%E5%AE%89%E5%8D%93%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84%E7%94%A8%E6%B3%95/#more

前言Reified使(抽象的东西)更具体或更真实。 Kotlin中的这个关键字使Kotlin成为用于Android开发的更好的语言。 共有3个明显的优点,如下所示。1.不再需要传参数clazz这也是大多数文章中最可能描述的一个比较明显的优点,这里也提及一下。如果希望具有一个用于启动activity的扩展函数,则必须有一个作为Class传入的参数。// Function private fun &l

AsyncTask的原理 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/09/17/AsyncTask%E7%9A%84%E5%8E%9F%E7%90%86/#more

前言AsyncTask是一个常用的已经封装好的异步任务类,可以更加方便地执行后台任务以及切换主线程去更新UI。从实现上来说,它封装了Thread(线程池)和Handler。定义一个抽象的泛型类,提供了Params, Progress, Result三个泛型参数。a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数b. Progress:异步任务执行过程中执行进度值

搞清kotlin中的inline,noinline和crossinline | Kanghanbin's Blog

https://kanghanbin.github.io/2019/11/07/%E6%90%9E%E6%B8%85kotlin%E4%B8%AD%E7%9A%84inline%EF%BC%8Cnoinline%E5%92%8Ccrossinline/#more

在 Kotlin 中使用内联函数时,有时结合这几个关键字可提高程序性能。概览inline: 声明在编译时,将函数的代码拷贝到调用的地方(内联)noinline: 声明 inline 函数的形参中,不希望内联的 lambdacrossinline: 表明 inline 函数的形参中的 lambda 不能有 returninline使用 inline 声明的函数,在编译时将会拷贝到调用的地方。inli

两个recycleview同步滚动 | Kanghanbin's Blog

https://kanghanbin.github.io/2019/04/16/%E4%B8%A4%E4%B8%AArecycleview%E5%90%8C%E6%AD%A5%E6%BB%9A%E5%8A%A8/

前言两个recycleview同步滚动网上solo的几种方法如下:作者: Jorge Antonio Díaz-Benito我相信你了解它的工作原理是相关的,所以我将解释我设计解决方案时所遵循的整个过程。请注意,此示例仅适用于两个RecyclerViews,但使用更多的RecyclerViews就像使用RecyclerViews数组一样简单。想到的第一个选项是在两个ScrollViews上监听滚动

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.