Run Loop邀请那些亲手制作精美产品的人。 Nikita Prokopov(
tonsky )-一艘人和一艘船,成功完成了多个其他人喜欢使用的开源项目。
首先,让我们谈谈FiraCode字体,Clojure和完全不同的项目,例如,React的ClojureScript包装器。 然后,让我们继续进行有关良好接口,常识和面向程序员的培训模型的更一般的讨论。
关于来宾 :Nikita Prokopov以创建FiraCode,为Clojure社区的发展做出了重大贡献并在OpenSource中发布了Datascript和Rum等项目而著称。 此外,他在macOS下在Objective-C上写道:AnyBar程序将在计算机的状态栏(哦,菜单栏)中告诉您事件的发生。
演讲者 :Roman Busygin(适用于iOS的Yandex.Music开发人员)和Alexey Mileev(适用于空中应用)。
尼基塔 :我是新西伯利亚的一名程序员,但现在我住在莫斯科。 他主要从事Web项目,我喜欢界面。 最近,我在Clojure中编程。
Roman :我建议围绕您的开源项目和公共项目进行今天的对话。 我想从对我来说最重要的第一件事开始-它是
FiraCode字体。 许多同事和我自己都在使用它。 我一直对如何制作自己的字体,它如何发生,是否有特殊程序,制作自己的字体需要具备哪些知识感兴趣。 请介绍一下。
Firacode
Nikita :说这是我的字体并不完全正确。 我使用了完成的等宽字体并完成了连字,但我自己没有画字母。 要自己制作信件,您需要大量的经验和毅力。 很难,有一百万个细微的细微差别。 有业余字体,您总能看到它们笨拙,但并不总是很清楚这是什么笨拙的东西。
我从Mozilla挑选了一个好的FiraMono字体,并在那里画了连字,为此有几个程序。 我使用了相当流行的Glyphs程序。 我不是字体设计专家,所以我研究了其他人正在使用的字体,我也使用了它。 它非常昂贵可能令人惊讶,但是他们给了我开发FiraCode的许可证。 字形就像矢量图形编辑器。 打开,有字母,找到单元格并绘制图片。 另外,与字体相关的各种微妙之处,例如,字母具有大小,锚点,从粗体到非粗体的过渡。 一切都很简单。
有趣的是,在OpenType字体内部,存在一种编程语言,以此作为替换连字的基础。 最初,它是作为实现字体中各种技巧的一种方法而创建的。 例如,当将常规字体中的fi,ffi等替换为连字时,连字。 另外,字母还有可变性和结尾样式:如果一个字母位于单词的开头和结尾,则会在其末尾添加一些字母。 所有这些都可以使用棘手的图案以及他制作的连字进行编程。
Roman :将FiraMono最终确定为每个人现在使用的FiraCode需要多长时间?
尼基塔 :这将很难计算。 第一个版本不是很困难。 和往常一样,这一切都很快开始了,但是花了一些时间弄清楚发生了什么,如何实现它:没有太多的例子。
罗曼 :也就是说,也有几个版本。 它们有何不同?
Nikita :是的,并且版本正在更新。 首先,我完成新的连字,如果它们之间发生冲突,有时会删除旧的连字。 在某些时候,绘制连字的机制在那里发生了变化。 里面有一个非常有趣的算法问题:字符序列很长,您需要从中分离出组成连字的那些组合,但是如果它们相交,那么就必须再进行替换。 我什至有一个Clojure程序,该程序会生成一组规则,然后将其插入字体中-相当困难。 这件事已更改,呈现连字的方法已更改。 以前,它们被一个字符替换,现在被三个字符替换。 实际上,对于用户而言,它会变得更好,更少的错误,更多的连字。
罗马 :有趣。 我从没想过字体可能有错误。 画家决定何时插入连字以及何时不插入连字的规则是用一种特殊的编程语言来描述的还是仅仅是声明性的?
Nikita :以声明方式,然后在内部将其高效地转换为替换表。
设置为连字的第一个版本
罗曼 :告诉我,您什么时候想出一组连字,您是在看任何特定的编程语言,还是人们在日常生活中需要的大致列表?
尼基塔 :我自己没有想到这个主意。 我看到有一种专门为Haskell制作的Hasklig字体。 但是我不需要Haskell,因此我认为我需要制作相同的字体,但首先,要基于我喜欢的字体,其次,对于任何一种语言。 然后我把
发生在我身上的一切都拿走
了 。 第一件事很明显:<=,> =,->,<-。 您用C编写,但是被箭头代替。 我认为这一切都开始了。
Clojure
阿列克谢 :一开始,您提到您现在正在写Clojure。 告诉我您是怎么来Clojure的,这一切是如何开始的,您是怎么来这种语言的?
Nikita :我看了Rich Hickey的一些演讲(例如,我推荐
this和
this )。 在程序员的头脑如何工作,大致来说如何设计系统这一主题上,它们非常酷并且用途广泛。 讲座为我打开了大量重要的新的重要信息,而我是Rich Hickey的粉丝。 然后他开始对自己的工作感兴趣。 原来,他使用Clojure语言。 我去阅读它,想通了一切,然后走了。
罗曼 :我也可以说是Rich Hickey的粉丝。 我看到了他的表演:既长又重要,很有趣。 也就是说,他设法使听众长时间保持注意力。
Alexei :您对Clojure到底喜欢什么?
尼基塔 :在上次会议上,里奇·希基发表了以下评论:
Clojure是一种面向年长,疲倦的程序员的语言。
他们并不是在事业初期就来找他的,但是在10-15年后他变得很有趣。 首先,您拥有绝对的自由。 您所需的一切,都可以自己做,也可以从图书馆中获取。
在语言本身中,最少的东西都是缝制的 。 您设计的其他所有内容都可以完全按照您的需要进行。 一切都是自制的,可以更改。 当您是初学者时,这很危险,但是如果您已经是专家并且知道您的需求,那么它将很有用。
用这种语言,思想尽可能清晰,紧凑地表达出来。 也就是说,您要表达的内容的复杂性与编写方式的复杂性之间的最小差距。 例如,在Java中,您可以做一些完全无关紧要的事情,但是它将持续10行,并且您会很累。 在Clojure中,如果一件事物是琐碎的,那么它很可能是琐碎地用一两行写的。
罗曼 :我知道你回答了我的问题。 当我听说Clojure并没有对您施加任何限制时,出于某种原因,我立即想起了C,他也以某种方式站在他的耳朵上。 但是后来我听到了答案,毕竟这不仅是语法糖,而且还是一种方便,紧凑的语言,使您可以用更少的代码表达自己的想法。
Nikita :是的,它非常高级,而C是低级。
阿列克谢(Alexei) :我想知道这样的语言自由是否不会干扰在具有大量人员的大型项目中的工作。 还是在OpenSource中,您需要在其中仔细监视每个更改? 据我所知,在Clojure中允许进行某些操作,直到
更改该语言的语法为止。 这不打扰您吗?
它使我想起了Scala的情况,当时该语言知道很多事情,并且在每个大型项目中,每个人都陷入了自己的困境。 结果,他们采用了一些常用的惯例,而我们没有使用。 结果,
一个项目中的Scala和另一个项目中的Scala是两个不同的Scala 。 Clojure中有这样的问题吗?
尼基塔 :我没有在特别大的项目中工作。 在他工作过的地方,有一些细微的差别。 实际上,由于某种原因,不会发生这种直接的混乱。 在我看来,这是因为,在Scala中,可以说有很多粉丝可以对如何最正确地进行操作进行理论化和推测。 正如您所说,有很多东西-您可以选择不这样做。 相反,在Clojure中,没有太多内容-您不能选择错误的内容。 这是一种非常实用的语言。 Clojure不喜欢为将来做抽象。 例如,如果您需要打印某些内容,则只需尽可能实际地进行打印,而不用担心打印机的来源,所用的接口和协议。 您可以按照自己的需要做。 因此,这种实用性可能是一个共同点。
Clojure的项目
Roman :据我所知,您在GitHub的Clojure上有几个项目。 告诉我们更多有关他们的信息。
数据脚本
Nikita :我的第一个相对成功的OpenSource项目是
Datascript 。 这是浏览器的客户端存储。 这可能对站点不是很有用,如果您正在浏览器中编写某种交互式应用程序,则需要将状态存储在某个位置。 数据脚本只是状态的存储库。 他的筹码:
- 他是一成不变的 。 也就是说,它不会破坏以前的版本,而只是非常有效地创建了一个新的存储副本。
- 他被分类了 。 它自动支持属性索引,任何entity_id等等。 它使您可以快速找到所需的一切。 所有你需要的。
- 它是平坦的 。 如果您还没有真正考虑过如何在客户端上实现存储,那么您要做的第一件事就是嵌套JSON的结构。 在Datascript中,存储空间是平坦的,您可以随时随地去任何地方找到所需的内容。
通常,这是相对方便的两种数据访问方式:您可以从父级到子级,也可以从子级到父级。
对于Clojure社区而言,它还有另一个优势:它使用与Datomic相同的API制作。 Datomic是Clojure数据库。 因为它们具有相同的界面,所以如果您了解Datomic,就可以了解Datascript。 那里也有查询,您可以使用Datalog语言编写数据查询。 我没有发现此功能对界面特别有用,但是有些人对此很有用。 这类似于SQL,您可以铺平条件并从客户端存储库中获取结果。
罗曼 :请告诉我们为什么数据脚本是唯一的。 在交互式应用程序中将状态存储在客户端上的任务非常普遍。 似乎它应该已经嵌入在语言本身或某种框架中的某个位置。 但是,您决定做出决定。 是什么提示了您?
尼基塔 :我想知道我是否可以制造Datomic小型工具。 重复现有系统很有趣。 事实证明,这实际上是一个好主意,以这种方式组织和访问状态非常方便。 JavaScript世界中可能有类似的解决方案。 有像中继这样的东西。 据我所知,它解决了同步和数据存储的问题。 她有些相似,但我认为后来出现了。
朗姆酒
Alexey :您的
Rum库还有一个。 请告诉我她的事。
Nikita :Rum只是ClojureScript的React包装器。 React很酷,很棒,每个人都喜欢它。 我想在ClojureScript中使用它b。 他是Java脚本,但我想在Clojurescript中使用它。 ClojureScript世界中有几种解决方案,但是它们都太概念化。 他们提供了他们的模型,该模型在内部使用React。 那不是纯粹的,而是它自己的使用React的概念。
朗姆酒的想法源于您不能将Datascript与这些以前的活页夹一起使用的事实,但我想使用它。 结果,我进入了一种设计,其中Rum是对React的最透明和最简单的绑定。 我们提供与React相同的所有功能,只是包装在方便使用ClojureScript的界面中。 它什么也没有隐藏,您可以使用React的本机组件。 如您所愿,他是一个不可知论者,并组织应用程序和体系结构。
罗马 :根据熟悉的排字工人的故事,总的来说,朝着React和React Native的方向看,我发现您的项目越来越受欢迎。 您说它是React的包装器。 但是React是一个巨大的项目,您无需研究大量的React来源就可以使Rum很小。 你是怎么做到的?
Nikita :React实际上并不是一个很大的项目。 React中的所有基本要素都在Preact库中,该库仅占用3 KB。 React有一个相当小的API以及针对新浏览器的大量技巧,学习技巧几乎没有意义,因为它们全都在React中。
罗曼 :G6是否是React的一部分?
尼基塔 :正式地-不,这是一个单独的组成部分。
罗曼 :您将其移植或放在一边吗?
Nikita :不,我没有移植它;您没有在ClojureScript中使用它。 在ClojureScript中,代码就是数据,而您甚至都不需要G6之类的东西,您已经拥有自己的基于矢量的语法,这在Clojure社区中是公认的。 使用数据,我们展示了宏和源的预处理在G6中完成的相同操作。
罗曼 :哇! 现在,我建议切换到下一个项目。 当我看到您Nikita编写了
AnyBar项目时,我感到非常惊讶和高兴
。AnyBar项目是一个菜单栏应用程序,可以
随时显示不同的指示器。 出乎意料的是,我的第一个MacOS项目也是一个菜单栏应用程序,它显示了来自Yandex.Mail的新信件通知。 我看了看资料,直接回到了八年前。
该项目非常简单且受欢迎。 当然,他们将其用于某些应用任务。 请告诉我该项目的外观,您自己如何使用它,或者也许您知道有人如何使用它?
Anybar
尼基塔 :这个项目是偶然出现的。 您知道,程序员喜欢在这里编写脚本。 Clojure代码不需要编译; ClojureScript代码需要编译。 每次更改源时,都会重新编译它。 这需要一些时间:例如,冷启动需要30-40秒,而增量构建则需要1秒钟到10秒。 您更改了源代码,切换到浏览器,但由于源代码尚未编译,因此您仍然不知道是否可以观看还是需要等待。 要知道这一点,我想出了一个指标。
所有工作主要在笔记本电脑上进行,没有太多空间,不能从哪里获得。 您必须切换到终端,然后等待所有内容在终端中编译,然后再切换到浏览器。 为了避免再次进入终端,我在菜单栏中使自己成为了一个指示器,该指示器显示了构建状态:它会编译,编译并编译时出错。 如果发生错误,则无需刷新页面一百次,仍然没有任何内容。
我没有以特定的方式进行此操作,但是我已尽可能广泛地进行了此操作。 要更改AnyBar中指示器的颜色,您只需要发送UDP数据包,这是最简单的交叉通信方式。 事实证明,这是一件非常灵活的事情,对于脚本来说是微不足道的。 我主要用于构建状态。
例如,最近有人发推文说,他已经表明了使馆空座位的状况。 这样您可以在空座位时立即进行预约。 它也显示在AnyBar中。
Roman :Nikita,这个东西只能在Localhost上运行吗,或者我在荷兰的虚拟机可以ping我的笔记本电脑并在菜单栏中显示某些内容吗?
Nikita :如果可以从虚拟机向笔记本电脑发送UDP数据包,则可以。
Alexei :听说过30-40秒的冷构建时间,然后热加载一两秒钟,当然,我只能羡慕Android世界。 但是在这里我有一个问题:整个过程是否被一套现成的shell脚本,甚至您甚至无法编写,只是简单地插入以便它们立即起作用的现成的插件所淹没?
妮基塔(Nikita) :它并不过分,因为我没有做太多。 我什至对其他人感兴趣而感到惊讶。 有很多东西:很多想法,甚至很多克隆。 人们想显示文本或几个指示器等。 我本来打算做这一切,但我的手没有伸开。
脾气暴躁的网站
Alexei :让我们继续下一个项目。 告诉我什么是
grumpy.website。Nikita :
grumpy.website是有关不良接口示例的博客。 我们收集计算机和非计算机接口中的任何门框,进行讨论,抱怨。
阿列克谢 :这个网站出现了多久了?
尼基塔 :大约一年前。
阿列克谢 :有多少人在那儿张贴东西?
Nikita :这是一个作者的项目,我们现在有四个作者。 我们主要发布信息,但又有五个人定期发送建议。 这是在我的
YouTube频道上直播的Clojure上编写的完全自定义引擎。 播出了13-14个问题,其详细说明在
Gist中 。 如果您对如何从头开始在Clojure上创建Web应用程序感兴趣,可以看到。
Roman :该课程是否已经完成,或者项目仍在完成中,您是否会在完成时发布注释?
Nikita:更多是视频博客。 到现在
为止处于
grumpy.website所在的状态-它是实时的。 现在网站上的内容,然后是博客。
设计和可用性
Roman :您作为提出有关接口设计愚蠢性的项目的人,最有可能精通设计和可用性。 您是如何进入这一领域的? 您是如何对此感兴趣的?
尼基塔 :这很早就发生在职业生涯的初期。 我参与了Web项目,在我看来,为了做好界面,我需要了解我们在做什么。 感觉计算机接口并不能解决所有问题。
我读了几本书,听起来很合理。 一方面,您需要注意良好的界面。 另一方面,常识。 要阅读
grumpy.website ,您不需要是界面专家,常识足以理解这是恐怖的。
罗曼 :我记得我读过唐纳德·诺曼(Donald Norman)的《熟悉的事物的设计》一书后,真的开始看到更多。 但是在此之前,我使用了这些废话,这些缺陷,而且我的眼睛没有紧贴。
AppsConf报告
Alexey :Nikita将在AppsConf上发表题为“
技能获得 ”的报告。 尼基塔,告诉我这样的报告是怎么出现的。
尼基塔 :我看了一份关于漂流模型的报道。 这是一个获取技能的模型,根据这个模型,每个人在学习新领域时都经历不同的阶段:初学者,胜任者,专家,专家,硕士。 我去阅读,弄清楚了这些级别是什么,它们之间有何不同,弄清了编程的方式以及我在编程方面看到的一切:课程,书籍,Internet上的讨论以及编程语言的设计。 也就是说,它是针对不同级别的程序员或编程人员。 原来,这是一个有趣的模型,可以解释很多事情。 , , .
, : , . — , — . . , , , .
: , , , , , . , . , .
AppsConf — 8 9 . . ( : , ), .
YouTube- , .