<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Блокнотик Centaur’а</title>
  <link>https://yurikhan.dreamwidth.org/</link>
  <description>Блокнотик Centaur’а - Dreamwidth Studios</description>
  <lastBuildDate>Thu, 28 Sep 2017 13:13:18 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>yurikhan</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/15796844/1181104</url>
    <title>Блокнотик Centaur’а</title>
    <link>https://yurikhan.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://yurikhan.dreamwidth.org/70831.html</guid>
  <pubDate>Thu, 28 Sep 2017 13:13:18 GMT</pubDate>
  <title>Подсветка синтаксиса высших порядков</title>
  <link>https://yurikhan.dreamwidth.org/70831.html</link>
  <description>&lt;p&gt;В старые добрые времена, когда людям нужно было выразить что-нибудь в компьютерном файле, они изобретали новый синтаксис. Потом в чью-то умную голову пришла мысль подсвечивать элементы синтаксиса в текстовых редакторах.&lt;/p&gt;

&lt;p&gt;Потом люди придумали универсальные языки разметки — XML, JSON и YAML — с помощью которых можно выразить всё что угодно. Поэтому теперь вместо синтаксиса часто изобретают схему.&lt;/p&gt;

&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;
&lt;p&gt;Однако, что у нас с их подсветкой? Возьмём, к примеру, кусочек мета-схемы JSON Schema Draft 04 (который примечателен тем, что описывает свою собственную структуру):&lt;/p&gt;

&lt;pre style=&quot;background-color: white; color: black&quot;&gt;&lt;code&gt;{ &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$schema&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;http://json-schema.org/draft-04/schema#&quot;&lt;/span&gt;,
  &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;object&quot;&lt;/span&gt;,
  &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;properties&quot;&lt;/span&gt;: {
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$schema&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;string&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;format&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;url&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;string&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;format&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;url&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;tsring&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;enum&quot;&lt;/span&gt;: [
      &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;null&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;boolean&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;integer&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;number&quot;&lt;/span&gt;,
      &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;string&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;array&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;object&quot;&lt;/span&gt;]},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;format&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;string&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;properties&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;object&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;aditionalProperties&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;}},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;additionalProperties&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;enum&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;array&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;items&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;}},
    &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;items&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;}
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Одни сплошные «строковые литералы». В лучшем случае — ключи объектов одним цветом, остальные строки другим. На первом плане — синтаксис самого JSON; а более высокоуровневый синтаксис, построенный поверх JSON’а, остаётся нераскрашенным и непроверяемым на глаз. Найдите две опечатки в примере выше.&lt;/p&gt;

&lt;p&gt;Надо — имея на руках схему, валидировать об неё документ и подсвечивать по-разному:&lt;/p&gt;

&lt;ul style=&quot;background-color: white&quot;&gt;
&lt;li style=&quot;color: #5c3566&quot;&gt;ключи, явно допустимые в текущем контексте;&lt;/li&gt;
&lt;li style=&quot;color: #204a87&quot;&gt;ключи, допустимые по шаблону или по принципу «всё, что не запрещено»;&lt;/li&gt;
&lt;li style=&quot;color: #a40000&quot;&gt;ключи, недопустимые в текущем контексте, и примитивные значения, не соответствующие схеме;&lt;/li&gt;
&lt;li style=&quot;color: #8f5902&quot;&gt;значения, явно соответствующие заданным ограничениям;&lt;/li&gt;
&lt;li style=&quot;color: #4e9a06&quot;&gt;все остальные строки.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre style=&quot;background-color: white; color: black&quot;&gt;&lt;code&gt;{ &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;$schema&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;http://json-schema.org/draft-04/schema#&quot;&lt;/span&gt;,
  &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #8f5902&quot;&gt;&quot;object&quot;&lt;/span&gt;,
  &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;properties&quot;&lt;/span&gt;: {
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;$schema&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #8f5902&quot;&gt;&quot;string&quot;&lt;/span&gt;, &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;format&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;url&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #8f5902&quot;&gt;&quot;string&quot;&lt;/span&gt;, &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;format&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;url&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;type&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #a40000&quot;&gt;&quot;tsring&quot;&lt;/span&gt;, &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;enum&quot;&lt;/span&gt;: [
      &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;null&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;boolean&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;integer&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;number&quot;&lt;/span&gt;,
      &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;string&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;array&quot;&lt;/span&gt;, &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;object&quot;&lt;/span&gt;]},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;format&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #8f5902&quot;&gt;&quot;string&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;properties&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #8f5902&quot;&gt;&quot;object&quot;&lt;/span&gt;, &lt;span style=&quot;color: #204a87&quot;&gt;&quot;aditionalProperties&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;}},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;additionalProperties&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;enum&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;type&quot;&lt;/span&gt;: &lt;span style=&quot;color: #8f5902&quot;&gt;&quot;array&quot;&lt;/span&gt;, &lt;span style=&quot;color: #5c3566&quot;&gt;&quot;items&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;}},
    &lt;span style=&quot;color: #204a87&quot;&gt;&quot;items&quot;&lt;/span&gt;: {&lt;span style=&quot;color: #5c3566&quot;&gt;&quot;$ref&quot;&lt;/span&gt;: &lt;span style=&quot;color: #4e9a06&quot;&gt;&quot;#&quot;&lt;/span&gt;}
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=yurikhan&amp;ditemid=70831&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://yurikhan.dreamwidth.org/70831.html</comments>
  <category>syntax</category>
  <category>json</category>
  <category>xml</category>
  <category>yaml</category>
  <category>usability</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://yurikhan.dreamwidth.org/66551.html</guid>
  <pubDate>Mon, 22 Aug 2016 11:01:24 GMT</pubDate>
  <title>CLI как язык</title>
  <link>https://yurikhan.dreamwidth.org/66551.html</link>
  <description>&lt;p&gt;Синтаксис аргументов командной строки следует рассматривать и проектировать аналогично синтаксису человеческого языка. В частности, в нём бывают различные части речи и члены предложения.&lt;/p&gt;

&lt;p&gt;Название бинарника может быть глаголом в повелительном наклонении (&lt;code&gt;reboot&lt;/code&gt;) или существительным в роли обращения (&lt;code&gt;firefox&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;). В последнем случае отсутствие аргументов соответствует запуску приложения с пользовательским интерфейсом; если аргументы есть, то первый — это опять глагол в повелительном наклонении (&lt;code&gt;git fetch&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Ключ без аргумента соответствует наречию, обычно в роли обстоятельства образа действия (&lt;code&gt;--quietly&lt;/code&gt;, &lt;code&gt;--verbosely&lt;/code&gt;; по истерическим перчинам устоялось написание без суффикса -ly).&lt;/p&gt;

&lt;p&gt;Ключ с аргументом — это косвенное дополнение, где имя ключа играет роль предлога (&lt;code&gt;install &lt;b&gt;-t /usr/bin&lt;/b&gt; foo&lt;/code&gt; — &lt;i&gt;установить &lt;b&gt;в /usr/bin&lt;/b&gt; foo&lt;/i&gt;); или уточняющее родовое слово в составе прямого дополнения (&lt;code&gt;install &lt;b&gt;-d /var/lib/foo&lt;/b&gt;&lt;/code&gt; — &lt;i&gt;установить &lt;b&gt;каталог /var/lib/foo&lt;/b&gt;&lt;/i&gt;).&lt;/p&gt;

&lt;p&gt;Позиционный аргумент — это прямое дополнение (&lt;code&gt;git clone git://github.com/git/git.git&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Это, конечно, не все паттерны — что-то я наверняка упустил.&lt;/p&gt;

&lt;p&gt;Базовый язык для команднострочного интерфейса — разумеется, английский. (Если бы командную строку изобрёл японец, глагол ставился бы последним, а &lt;code&gt;sudo&lt;/code&gt; записывалось бы как 下さい [kudasai] после глагола.)&lt;/p&gt;

&lt;p&gt;Собственно, я это всё к чему? У системы виртуализации/контейнеризации LXC есть команды &lt;code&gt;lxc-start&lt;/code&gt;, &lt;code&gt;lxc-stop&lt;/code&gt; и несколько других. И все они принимают название контейнера, над которым работать, именованным аргументом (&lt;code&gt;lxc-start -n foo&lt;/code&gt;). Жутко бесит. Очевидно же, что это должно быть прямое дополнение.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=yurikhan&amp;ditemid=66551&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://yurikhan.dreamwidth.org/66551.html</comments>
  <category>usability</category>
  <category>cli</category>
  <category>lxc</category>
  <category>syntax</category>
  <category>soft</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
</channel>
</rss>
