Giter Club home page Giter Club logo

effective-java-3rd-edition-chinese-english-bilingual's Introduction

Effective-Java-3rd-edition-Chinese-English-bilingual

Effective Java(第 3 版)各章节的中英文学习参考,希望对 Java 技术的提高有所帮助,欢迎通过 issue 或 pr 提出建议和修改意见。

目录(Contents)

effective-java-3rd-edition-chinese-english-bilingual's People

Contributors

alceatraz avatar altholin avatar amor128 avatar b1indsight avatar clxering avatar clxeringlab avatar daya0576 avatar gonearewe avatar gummary avatar happier2 avatar jojo0527 avatar linglu avatar lwbaptx avatar terrellchen avatar xyohn avatar yebuzhen avatar yupnano avatar zwxwz 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  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

effective-java-3rd-edition-chinese-english-bilingual's Issues

Item 57 翻译

The location of the content:(内容所在位置):

Item 57

Description and expected results(描述及预期结果):
翻译Item 57

Item 34 待定内容

The location of the content:(内容所在位置):

Item 34

Description and expected results(描述及预期结果):

  • It won’t compile without the throw statement because the end of the method is technically reachable, even though it will never be reached.
    如果没有抛出语句,它将无法编译,因为从理论上讲,方法的结尾是可到达的,尽管它确实永远不会到达。
  • constant-specific method implementations
    特定常量方法实现
  • constant-specific data
    特定常量数据
  • With a switch statement, it’s easy to do this calculation by applying multiple case labels to each of two code fragments:
    使用 switch 语句,通过多个 case 标签应用于每一类情况,可以很容易地进行计算:
  • The enum feature was specifically designed to allow for binary compatible evolution of enum types.
    枚举的特性是专门为枚举类型的二进制兼容进化而设计的。
    类比:their serialized form is designed to withstand most changes to the enum type.
    它们的序列化形式被设计成能够适应枚举类型的可变性。
  • In this relatively rare case, prefer constant-specific methods to enums that switch on their own values.
    在这种相对少见的情况下,相对于使用 switch 的枚举,特定常量方法更好。

improve Item 1

The location of the content:(内容所在位置):

Item 1

Description and expected results(描述及预期结果):

  • toolkit 改为技能树
  • paragraph 2,describe the object being returned 分句
  • BigInteger 类的构造函数 BigInteger(int, int, Random) 返回值可能为素数,最好表示成名为 BigInteger.probablePrime 的静态工厂方法。
  • paragraph 5,并且最终会错误地调用不适合的构造函数。
  • 因为静态工厂方法有确切名称,所以它们没有前一段讨论的局限。如果一个类需要具有相同签名的多个构造函数,那么用静态工厂方法替换构造函数,并仔细选择名称以突出它们的区别。
  • 中文使用全角标点符号
  • This gives you great flexibility in choosing the class of the returned object.
  • 以这种方式隐藏实现类会形成一个非常紧凑的 API

翻译计划问题

Technical discussion or constructive comments(技术讨论或建议的详细描述):
我看了一下,翻译工作还未完成,是否可以增加翻译计划的排期,就是当前正在翻译的和待翻译的内容,然后我们其他人如果有时间,也可以根据计划表认领待翻译内容,这样可以加速翻译进程。

Item62 翻译质量改进

The location of the content:(内容所在位置):

Item 62

Description and expected results(描述及预期结果):
原文:
at which point the key is no longer a key for a thread-local variable: it is a thread-local variable.
现翻译:
此时键不再是线程局部变量:而是线程局部变量。
改进:
此时键不再是线程局部变量的键值:而是成为线程局部变量本身。

翻译质量改进

The location of the content:(内容所在位置):

Item 18 ,where "the wrapper class can be used to instrument any Set implementation and will work in conjunction with any preexisting constructor:"
翻译为:包装器类可用于仪器任何集合实现,并将与任何现有构造函数一起工作

**Description and expected results(描述及预期结果):
上述翻译可以改进为: 包装类可以用来给任何Set实现类进行计算,并将与任何现有构造函数一起工作

item 17: A special case 建议

The location of the content:(内容所在位置):

Item 17. Minimize mutability

Immutable objects make great building blocks for other objects, whether mutable or immutable. It’s much easier to maintain the invariants of a complex object if you know that its component objects will not change underneath it. A special case of this principle is that immutable objects make great map keys and set elements: you don’t have to worry about their values changing once they’re in the map or set, which would destroy the map or set’s invariants.

Description and expected results(描述及预期结果):

这里的A Special case是不是应该是一个具体的例子

Chapter 5 格式和翻译问题

The location of the content:(内容所在位置):

Chapter-5-Introduction

Item 26-33

Description and expected results(描述及预期结果):

  • 共同存在的问题
    • 排版格式不统一,修改为:英文单词和数字前后留空、译文标点符号使用中文全角、引号一律使用 「」
    • 代码缩进应使用 4 个空格
    • 其他用词、语序的问题
    • 在译文中,Markdown 格式无法直接识别尖括号<>,应添加到单行代码中,例如:List<String>
    • 异常的英文描述,例如:ArrayStoreException,词尾 Exception 已经包含了「异常」的含义,不应再翻译成「ArrayStoreException 异常」
  • Item 26 中 class literals 翻译待定
  • Item 28 中 list 保持英文原型

冒昧的问下有电子书吗?

Technical discussion or constructive comments(技术讨论或建议的详细描述):
请问有在线版或则打包的电子书吗?

Item 26 待定内容

The location of the content:(内容所在位置):

Item 26

Description and expected results(描述及预期结果):

  • it pays to discover errors as soon as possible after they are made
    在出现错误之后尽快发现错误是有价值的
  • This requirement, known as migration compatibility, drove the decisions to support raw types and to implement generics using erasure
    这被称为迁移兼容性的需求,它促使原始类型得到支持并使用擦除实现泛型
  • This is a compiler-generated cast, so it’s normally guaranteed to succeed, but in this case we ignored a compiler warning and paid the price.
    这是一个由编译器生成的强制类型转换,它通常都能成功,但在本例中,我们忽略了编译器的警告,并为此付出了代价。
  • You can put any element into a collection with a raw type, easily corrupting the collection’s type invariant
    将任何元素放入具有原始类型的集合中,很容易破坏集合的类型一致性
  • Admittedly this error message leaves something to be desired, but the compiler has done its job, preventing you from corrupting the collection’s type invariant, whatever its element type may be.
    无可否认,这个错误消息让人不满意,但是编译器已经完成了它的工作,防止你无视它的元素类型而破坏集合的类型一致性。
  • you can’t assume anything about the type of the objects that you get out.
    不能臆想你得到的对象的类型。
  • class literals
  • Set is a raw type, which opts out of the generic type system.
    Set 是一个原始类型,它不属于泛型系统。

Chapter2-Item6翻译的一些问题

The location of the content:(内容所在位置):

Item 6 中

It would be possible to eliminate the initialization by lazily initializing the field (Item 83) the first time the isRomanNumeral method is invoked,  but this is not recommended. As is often the case with lazy initialization, it would complicate the implementation with no measurable performance improvement (Item 67).

Description and expected results(描述及预期结果):
我又来了=。=
感觉翻译有些硬核..不过也感觉确实有点难翻译成比较流畅的说法
做了下尝试改进了下语句的流畅性
另外..
lazily initializing 延迟初始化 感觉用 懒加载 会不会好理解些?
As is often the case 翻译成 通常情况下 感觉会比原翻译通顺一些..

翻译错误

The location of the content:(内容所在位置):

Item 59 chapter 9

Description and expected results(描述及预期结果):
「有几个图书馆值得一提」此处应翻译为「 有几个库值得一提」。此处的 library 应指代 Java 中的类库

你好,第一章呢

Technical discussion or constructive comments(技术讨论或建议的详细描述):

Chapter 3 Item 12 翻译建议

Technical discussion or constructive comments(技术讨论或建议的详细描述):

When practical, the toString method should return all of the interesting information contained in the object。
当实际使用时,toString 方法应该返回对象中包含的所有有趣信息;
A particularly annoying penalty for failing to include all of an object’s interesting information in its string representation is test failure reports that look like this:
如果没有在字符串表示中包含所有对象的有趣信息,那么一个特别恼人的惩罚就是测试失败报告,如下所示:

建议:interesting 翻译为值得(引起/需要)关注的或者重要的会更恰当一些,也更好理解。

以及Chapter 2 Item 8
该规范不仅不能保证终结器或清洁剂能及时运行;它并不能保证它们能运行。

存在错别字。

Item 34: Use enums instead of int constants(用枚举类型代替 int 常量)

The location of the content:(内容所在位置):
Item 34-计算每周工资
案例代码
例如,考虑一个表示一周当中计算工资发放的枚举。枚举有一个方法,该方法根据工人的基本工资(每小时)和当天的工作分钟数计算工人当天的工资。在五个工作日内,任何超过正常轮班时间的工作都会产生加班费;在两个周末,所有的工作都会产生加班费。
`// The strategy enum pattern
enum PayrollDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);

private final PayType payType;
PayrollDay(PayType payType) { this.payType = payType; }
PayrollDay() { this(PayType.WEEKDAY); } // Default

int pay(int minutesWorked, int payRate) {
    return payType.pay(minutesWorked, payRate);
}

// The strategy enum type
private enum PayType {
    WEEKDAY {
        int overtimePay(int minsWorked, int payRate) {
            return minsWorked <= MINS_PER_SHIFT ? 0 :(minsWorked - MINS_PER_SHIFT) * payRate / 2;
        }
    },
    WEEKEND {
        int overtimePay(int minsWorked, int payRate) {
            return minsWorked * payRate / 2;
        }
    };

    abstract int overtimePay(int mins, int payRate);

    private static final int MINS_PER_SHIFT = 8 * 60;

    int pay(int minsWorked, int payRate) {
        int basePay = minsWorked * payRate;
        return basePay + overtimePay(minsWorked, payRate);
    }
}

}`

Description and expected results(描述及预期结果):

  • 如果是周末,测试结果如下
    `int pay = PayrollDay.SATURDAY.pay(500, 1);
    System.out.println("pay = " + pay); // 750

  • 按修改之后的代码结果思路
    int pay(int minsWorked, int payRate) { int basePay = minsWorked <= MINS_PER_SHIFT ? minsWorked * payRate : MINS_PER_SHIFT * payRate; return basePay + overtimePay(minsWorked, payRate); }
    `int pay = PayrollDay.SATURDAY.pay(500, 1);
    System.out.println("pay = " + pay); // 730

Item 14 翻译

The location of the content:(内容所在位置):

Item 14

Description and expected results(描述及预期结果):
不知道为啥 Item 14 没有译文..做了下尝试..供参考..

Item 1 中存在格式和部分翻译不完善的问题

The location of the content:(内容所在位置):

Item 1

Description and expected results(描述及预期结果):

  • 排版格式不统一,修改为:英文单词和数字前后留空、译文标点符号使用中文全角、引号一律使用 「」
  • One advantage of static factory methods is that, unlike constructors, they have names.
    译文修改为:静态工厂方法与构造函数相比的第一个优点,静态工厂方法有确切名称。
  • A second advantage of static factory methods is that, unlike constructors,they are not required to create a new object each time they’re invoked.
    译文修改为:静态工厂方法与构造函数相比的第二个优点,静态工厂方法不需要在每次调用时创建新对象。
  • A third advantage of static factory methods is that, unlike constructors,they can return an object of any subtype of their return type.
    译文修改为:静态工厂方法与构造函数相比的第三个优点,可以通过静态工厂方法获取返回类型的任何子类的对象。
  • from—A type-conversion method that takes a single parameter and returns a corresponding instance of this type, for example:
    该处翻译错误,译文修改为:from,一种型转换方法,该方法接受单个参数并返回该类型的相应实例,例如:
  • 调整一些用词和语序上的细节

纯中文版

能不能发布一个纯中文的,双语跳着看不舒服。。

improve Item 2

The location of the content:(内容所在位置):

Item 2

Description and expected results(描述及预期结果):

  • 它是建造者模式的一种形式[Gamma95]。
  • The builder’s setter methods return the builder itself so that invocations can be chained, resulting in a fluent API.

Chapter 2 Item 1 翻译错误修改与翻译改进

The location of the content:(内容所在位置):

Item 1

Description and expected results(描述及预期结果):
原文1:
服务提供者框架中有三个基本组件:代表实现的服务接口;
改进1:
服务提供者框架中有三个基本组件:服务接口,代表要实现的服务;

原文2:
在 JDBC 中,连接扮演服务接口 DriverManager 的角色。DriverManager.registerDriver 是提供商注册的 API,DriverManager.getConnection 是服务访问 API,驱动程序是服务提供者接口。
改进2:
在 JDBC 中,Connection 扮演服务接口的角色。DriverManager.registerDriver 是提供者注册的 API,DriverManager.getConnection 是服务访问 API,Driver 是服务提供者接口。

Chapter 9 Introduction 待定内容

The location of the content:(内容所在位置):

Chapter 9 Introduction

Description and expected results(描述及预期结果):
翻译第九章内容

Item 2 中格式、语义语序、用词欠准确的问题

The location of the content:(内容所在位置):

Item 2

Description and expected results(描述及预期结果):

  • 排版格式不统一,修改为:英文单词和数字前后留空、译文标点符号使用中文全角、引号一律使用 「」
  • Item 2: Consider a builder when faced with many constructor parameters
    标题译文修改为:当构造函数有多个参数时,应考虑改用构建器
  • fields 统一译为「字段」,constructors 统一译为「构造函数」
  • The Builder pattern 统一译为「建造者模式」,builders 统一译为「构建器」
  • 重构第一段,分别修改 serving size 和 servings per container 的译文为「净含量」和「毛重」
  • 根据语义,调整第二段语序
  • Abstract classes have abstract builders; concrete classes have concrete builders.
    该处翻译错误,译文修改为:抽象类有抽象类构建器;具体类有具体类构建器。
  • 调整一些用词和语序上的细节

Item3翻译改进

The location of the content:(内容所在位置):

chapter 2 Item 3

Description and expected results(描述及预期结果):
To make a singleton class that uses either of these approaches serializable (Chapter 12)

要使单例类使用这两种方法中的任何一种序列化(Chapter 12),仅仅在其声明中添加实现 serializable 是不够的

Chapter2 Item7 翻译改进

The location of the content:(内容所在位置):

Item 7: Eliminate obsolete object references(排除过时的对象引用)

Description and expected results(描述及预期结果):

any object references contained in the element should be nulled out.
元素中包含的任何对象引用都应该被取消

个人认为翻译成”任何对象引用都应该被置为 null“ 会更有助于阅读。

14条最后一句 这一句话不太理解

Technical discussion or constructive comments(技术讨论或建议的详细描述):

总之,无论何时实现具有排序性质的值类,都应该让类实现 Comparable 接口,这样就可以轻松地对实例进行排序、搜索,并与依赖于此接口的集合实现进行互操作。在 compareTo 方法的实现中比较字段值时,避免使用 < 和 > 操作符,应使用包装类中的静态比较方法或 Comparator 接口中的 comparator 构造方法。

14条最后一句
这一句话不太理解

在 compareTo 方法的实现中比较字段值时,避免使用 < 和 > 操作符,应使用包装类中的静态比较方法或 Comparator 接口中的 comparator 构造方法。

能有正确和错误的例子吗?

Typo: Chapter-2 Item-2

The location of the content:(内容所在位置):

Item 2

与构造函数相比,构造函数的一个小优点是构造函数可以有多个变量参数,因为每个参数都是在自己的方法中指定的。或者,构建器可以将传递给一个方法的多个调用的参数聚合到单个字段中,如前面的 addTopping 方法中所示。

Description and expected results(描述及预期结果):
与构造函数相比,构建器的一个小优点是构建器可以有多个变量参数,因为每个参数都是在自己的方法中指定的。或者,构建器可以将传递给一个方法的多个调用的参数聚合到单个字段中,如前面的 addTopping 方法中所示。

强烈谴责纸制书中文版的翻译,好好的经典书籍翻译成了s

最开始以为自己看不懂是因为水平洼,后来过来看原文 原来是翻译的太差了.
一个条目,关键的点就那几句话. 翻的差了一两个词, 这句话意思就差了, 也许这个条目就整个看不懂了.
一个书出版了, 别的人就不能再拿这个书重新出版了,永远的订在了耻辱架上.
误人子弟啊.
有同感的请跟帖回复.

Technical discussion or constructive comments(技术讨论或建议的详细描述):
第41条
“Might I want to write one or more methods that accept only objects that have this marking?”
原书: 我要编写一个还是多个只接受有这种标记的方法呢?
「我是否可以编写一个或多个方法,只接受具有这种标记的对象?」
If you can convince yourself that you’ll never want to write a method that accepts only objects with the marking,
原书:如果你确信自己永远不需要编写一个只接受带有标记的对象.
编写一个.....的方法.

第45条
When it is applicable, a better workaround is to invert the mapping when you need access to the earlier-stage value.
Luckily, it’s easy to compute the exponent of a Mersenne number by inverting the mapping that took place in the first intermediate operation.
映射求逆 翻成了将映射颠倒过来.

第47条标题都翻译错了, 那还怎么读?
Item 47: Prefer Collection to Stream as a return type
Stream 要优先用Collection作为返回类型.

Note that no cast is necessary in the adapter method because Java’s type inference works properly in this context:
类型推断翻译成了类型引用
do not store a large sequence in memory just to return it as a collection.
原文: 千万别在内存中保存巨大的序列, 将它作为集合返回即可.

Chapter 2 Item-8 Item 9 翻译改进

The location of the content:(内容所在位置):

Item 8

It can take arbitrarily long between the time that an object becomes unreachable and the time its finalizer or cleaner runs.
从对象变得不可访问到结束器或清理器运行的时间到结束器或清理器运行的时间,可能需要任意长的时间。

原翻译可能写重复了.. 然后关于 arbitrarily long 的翻译,个人觉得 任意长的时间 用 不确定 会不会更符合语法习惯?

Item 9

originals, but they provide far better diagnostics. 

这里的originals 我的理解是指 try-finally 和 try-with-resources 达到的效果是差不多的,然后后者提供了更好的诊断? 将originals翻译成一开始觉得..怪怪的 =。=
Description and expected results(描述及预期结果):

Improve Item 6

The location of the content:(内容所在位置):

Item 6

Description and expected results(描述及预期结果):

  • Reuse can be both faster and more stylish.
  • millions of String instances can be created needlessly.
  • Boolean.valueOf(String) 、String.matches 使用单行代码标记
  • which was deprecated in Java 9. 不加粗
  • it’s not always obvious when you’re creating such an object.
  • The problem is that it internally creates a Pattern instance for the regular expression and uses it only once, after which it becomes eligible for garbage collection. Creating a Pattern instance is expensive because it requires compiling the regular expression into a finite state machine.
  • Pattern instance 使用原文
  • This item should not be misconstrued to imply that object creation is expensive and should be avoided.
  • 评估将「重用」改为「复用」的效果

Item 3 中格式、语义语序、用词欠准确的问题

The location of the content:(内容所在位置):

Item 3

Description and expected results(描述及预期结果):

  • 排版格式不统一,修改为:英文单词和数字前后留空、译文标点符号使用中文全角、引号一律使用「」
  • 在译文中,Markdown 格式无法直接识别尖括号<>,应添加到单行代码中,例如:Supplier<Elvis>
  • 代码缩进应使用 4 个空格
  • singleton
    翻译错误,译为单例对象会造成歧义,修改为:单例
  • the member is a final field
    翻译错误,译文修改为:成员是一个 final 字段
  • initialize the public static final field Elvis.INSTANCE.
    译文修改为:初始化 public static final 修饰的 Elvis 类型字段 INSTANCE。
  • invoke the private constructor reflectively (Item 65) with the aid of the AccessibleObject.setAccessible method.
    译文修改为:借助 AccessibleObject.setAccessible 方法利用反射调用私有构造函数
  • generic singleton factory
    译文修改为:泛型的单例工厂

Chapter 4 Item 17 翻译改进

The location of the content:(内容所在位置):

Item 17

Description and expected results(描述及预期结果):
原文: This can be done by making the class final
译文: 这可以通过期末考试来完成
应该是 这可以通过指定类为final来完成 之类的意思

原文: make every field final unless there is a compelling reason to make it nonfinal.
译文: 除非有令人信服的理由使每个字段成为 final
应该是 除非有令人信服的理由使字段非final, 否则每个字段都应设为final 之类的意思

原文: your natural inclination should be to declare every field private final unless there’s a good reason to do otherwise.
译文: 你的自然倾向应该是 声明每个字段为私有 final,除非有很好的理由这样做
个人认为应该是 除非有很好的理由不这样做

第 6 章目录、Item 36、Item 38 页面底部跳转链接有误

The location of the content:(内容所在位置):

Chapter 6 Introduction
Item 36
Item 38

Description and expected results(描述及预期结果):
目录链接改为:
- [Item 37: Use EnumMap instead of ordinal indexing(使用 EnumMap 替换序数索引)](https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/master/Chapter-6/Chapter-6-Item-37-Use-EnumMap-instead-of-ordinal-indexing.md)
Item 36 底部链接改为:
- **Next Item(下一条目):[Item 37: Use EnumMap instead of ordinal indexing(使用 EnumMap 替换序数索引)](https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/master/Chapter-6/Chapter-6-Item-37-Use-EnumMap-instead-of-ordinal-indexing.md)**
Item 38 底部链接改为:
- **Previous Item(上一条目):[Item 37: Use EnumMap instead of ordinal indexing(使用 EnumMap 替换序数索引)](https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/master/Chapter-6/Chapter-6-Item-37-Use-EnumMap-instead-of-ordinal-indexing.md)**

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.