https://github.com/allegro/turnilo

一个开源的可视化数据探索工具,前身是转向闭源的 Imply。Turnilo 的查询速度比 Kibana 快多了,界面直观又支持拖放,用起来非常顺畅。

当然 Turnilo 和 Imply 相比还是有很多缺点的。文档不够完善、不支持类似 Grafana 的 dashboard 功能、没有完善的认证机制、用户体验稍差等等。不过对于已脱敏的数据还是很推荐试一试的。找到想要的图表后还能通过 Druid 插件整到 Grafana 上。

https://github.com/misskey-dev/misskey

Misskey 的历史最早可以追溯到 2014 年,主要由 @syuilo 一人开发。自 2018 年 Misskey 加入 Fediverse 进军去中心化社交平台后,Misskey 的知名度快速提升。1

虽然没有 Fediverse 老大哥 Mastodon 流行,但 Misskey 强在功能丰富。Misskey Flavored Markdown2 提供了丰富的视觉表现,多种 emoji reaction 增强了互动的趣味性,还有新推出的相册功能。无聊时可以玩玩 AiScript 写的趣味小页面,或者找人来一局 Reversi。

Misskey 的 i18n 做得不错,用户界面基本都支持各国语言。但由于主要开发者都使用日语,Misskey 项目的开发过程中依然有大量日语出没,对于国际上的贡献者来说不是很友好,勉强算是缺点之一吧。

Java

https://google.github.io/styleguide/javaguide.html#s4.5.1-line-wrapping-where-to-break

  1. When a line is broken at a non-assignment operator the break comes before the symbol. (Note that this is not the same practice used in Google style for other languages, such as C++ and JavaScript.)
  • This also applies to the following "operator-like" symbols:

    • the dot separator (.)
    • the two colons of a method reference (::)
    • an ampersand in a type bound (<T extends Foo & Bar>)
    • a pipe in a catch block (catch (FooException | BarException e)).
  1. When a line is broken at an assignment operator the break typically comes after the symbol, but either way is acceptable.
  • This also applies to the "assignment-operator-like" colon in an enhanced for ("foreach") statement.
  1. A method or constructor name stays attached to the open parenthesis (() that follows it.
  2. A comma (,) stays attached to the token that precedes it.
  3. A line is never broken adjacent to the arrow in a lambda, except that a break may come immediately after the arrow if the body of the lambda consists of a single unbraced expression. Examples:
MyLambda<String, Long, Object> lambda =
    (String label, Long value, Object obj) -> {
        ...
    };

Predicate<String> predicate = str ->
    longExpressionInvolving(str);

Kotlin

https://developer.android.com/kotlin/style-guide#where_to_break

The prime directive of line-wrapping is: prefer to break at a higher syntactic level. Also:

  • When a line is broken at an operator or infix function name, the break comes after the operator or infix function name.
  • When a line is broken at the following "operator-like" symbols, the break comes before the symbol:

    • The dot separator (., ?.).
    • The two colons of a member reference (::).
  • A method or constructor name stays attached to the open parenthesis (() that follows it.
  • A comma (,) stays attached to the token that precedes it.
  • A lambda arrow (->) stays attached to the argument list that precedes it.

C++

https://google.github.io/styleguide/cppguide.html#Boolean_Expressions

When you have a boolean expression that is longer than the standard line length, be consistent in how you break up the lines.
if (this_one_thing > this_other_thing &&
    a_third_thing == a_fourth_thing &&
    yet_another && last_one) {
  ...
}
Note that when the code wraps in this example, both of the && logical AND operators are at the end of the line. This is more common in Google code, though wrapping all operators at the beginning of the line is also allowed. Feel free to insert extra parentheses judiciously because they can be very helpful in increasing readability when used appropriately, but be careful about overuse. Also note that you should always use the punctuation operators, such as && and ~, rather than the word operators, such as and and compl.