<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Insuline</title><generator>teletype.in</generator><description><![CDATA[Web 3.0 content creator
Frontend Teamlead @ Via Protocol
Member @ Developer DAO]]></description><image><url>https://img3.teletype.in/files/e7/8a/e78ac504-2ffc-466e-b890-e10af96a016a.png</url><title>Insuline</title><link>https://teletype.in/@insuline</link></image><link>https://teletype.in/@insuline?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/insuline?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/insuline?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 09 Apr 2026 05:54:38 GMT</pubDate><lastBuildDate>Thu, 09 Apr 2026 05:54:38 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@insuline/ai-commit</guid><link>https://teletype.in/@insuline/ai-commit?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/ai-commit?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Улучшение опыта работы фронтенд-разработчика с помощью AI. Пишем свою обертку над GPT-3</title><pubDate>Fri, 17 Feb 2023 20:21:47 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/68/ac/68ac9189-1ebe-4d83-ba85-12e7848aa54e.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/76/3a/763ae970-2a88-4f2f-8d03-1454ec3ad128.jpeg"></img>Привет! Вы наверняка слышали множество разговоров о том, как AI изменит мир и нашу работу в будущем. Однако, многие из этих разговоров не концентрируются на том, как именно можно использовать технологию AI для улучшения конкретных процессов. В этой статье мы поговорим о том, как использование GPT-3 может помочь вам улучшить опыт работы frontend-разработчика.]]></description><content:encoded><![CDATA[
  <figure id="dCNS" class="m_column">
    <img src="https://img4.teletype.in/files/76/3a/763ae970-2a88-4f2f-8d03-1454ec3ad128.jpeg" width="1126" />
  </figure>
  <p id="SDbc">Привет! Вы наверняка слышали множество разговоров о том, как AI изменит мир и нашу работу в будущем. Однако, многие из этих разговоров не концентрируются на том, как именно можно использовать технологию AI для улучшения конкретных процессов. В этой статье мы поговорим о том, как использование GPT-3 может помочь вам улучшить опыт работы frontend-разработчика.</p>
  <p id="2ttD">GPT-3 — это мощный искусственный интеллект, который может генерировать тексты на основе анализа огромного количества данных. Он может быть очень полезен для различных задач, связанных с frontend-разработкой, от написания кода до создания документации.</p>
  <h2 id="PiMQ">Как GPT-3 может помочь фронтенд разработчикам</h2>
  <p id="6Mzt">Давайте рассмотрим некоторые из задач, с которыми сталкиваются фронтенд-разработчики, и посмотрим, как GPT-3 может помочь в их решении:</p>
  <ul id="JCLm">
    <li id="r29R"><strong>Написание кода</strong>. Часто, чтобы написать хороший код, нужно учитывать множество факторов, например контекст, задачу, которую нужно решить, и возможные ошибки. С помощью GPT-3 вы можете генерировать умные подсказки, которые помогут вам написать более качественный код быстрее. Например, инструменты, основанные на GPT-3, могут генерировать код на основе входных данных и контекста, что может сэкономить много времени и усилий. Один из примеров такого инструмента — <a href="https://github.com/features/copilot" target="_blank">Github Copilot</a>, который следит за контекстом написания и предлагает умные подсказки.</li>
    <li id="g6GN"><strong>Тестирование</strong>. Создание тестов — важная часть работы frontend-разработчика, которая помогает убедиться, что код работает правильно и не содержит ошибок. GPT-3 может помочь сгенерировать базовые тесты автоматически на основе ваших данных, что позволит сэкономить время и силы. Также GPT-3 может использоваться для создания автоматических тестов, которые проверяют работу приложения в широком диапазоне сценариев. Я тестировал написание тестов с помощью <a href="https://chat.openai.com/chat" target="_blank">ChatGPT</a> и результат был отличным. Но в текущем рабочем проекте мы не пишем тесты, поэтому оставлю эту идею на следующую публикацию.</li>
    <li id="nEPf"><strong>Документация</strong>. Создание документации — это важная, но не всегда приятная работа. GPT-3 может помочь автоматизировать процесс создания документации. Последние полгода я использую VSCode расширение <a href="https://writer.mintlify.com/" target="_blank">Mintlify</a> для автоматической генерации JSDoc документации. В Javascript это позволяет добиться небольшой типизации и упростить работу для других разработчиков. Более комплексные участки кода я по прежнему документирую вручную.</li>
  </ul>
  <h2 id="yr93">Developer Experience</h2>
  <p id="dueU">Что скрывается за термином «Developer Experience»? Это может быть все, что угодно, начиная от языка программирования и фреймворков и заканчивая конвенциями о форматах API, линтерах, именах переменных, коммитах и т. д. В этой статье мы рассмотрим то, что я подразумеваю под этим термином.</p>
  <p id="9o3Q">Developer Experience означает, что разработчику не нужно думать о каких-то правилах, таких как кодстайлы, правила для линтеров и конвенции по написанию кода. </p>
  <p id="JVhf">Недавно я просил ChatGPT исправить некоторые eslint-ошибки в проекте, и он прекрасно справился с этой задачей. Однако стоит ли создавать отдельный инструмент для этого, если уже есть автоматическое исправление в eslint? Я считаю, что нет. Лучше научиться настраивать eslint.</p>
  <p id="h2lk">Однако, что действительно может вызывать проблемы — это коммиты. Для их именования существуют готовые конвенции, например, <a href="https://www.conventionalcommits.org/en/v1.0.0/" target="_blank">Conventional Commits</a>. Для проверки этих коммитов можно использовать <a href="https://commitlint.js.org/#/concepts-commit-conventions" target="_blank">Commitlint</a>.</p>
  <figure id="r068" class="m_original">
    <img src="https://img1.teletype.in/files/c8/2a/c82a895e-b7a7-44c8-8c67-8457f8aa1b99.png" width="441" />
  </figure>
  <figure id="ynwP" class="m_column" data-caption-align="center">
    <img src="https://img4.teletype.in/files/74/ac/74ac4bdf-7caf-4f8a-ace4-9a3d418f0c6b.jpeg" width="327" />
    <figcaption>Представьте, что вам нужно разобраться в том, что делают эти изменения кода. Где удобнее?</figcaption>
  </figure>
  <p id="ivKI">Я также являюсь большим поклонником использования <a href="https://gitmoji.dev/" target="_blank">Gitmoji</a> в проектах. Эта методология позволяет гораздо проще интерпретировать тип изменений, вносимых в код, одним смайликом. Gitmoji — это отличный способ отслеживать изменения, которые вносятся, и это может сэкономить много времени при просмотре кода. В общем, использование Gitmoji — это невероятно полезный инструмент, который я очень рекомендую всем, кто работает с кодом в команде.</p>
  <p id="vbka">Атомарные коммиты — это когда каждый коммит задевает минимальную область изменений (обычно до 20-30 строк кода и одного файла)</p>
  <p id="8z6u">Атомарные коммиты могут быть полезны для разработчика. Они помогают сделать ясное и легко читаемое представление изменений. Лучше делать мелкие коммиты, чтобы было проще отслеживать историю, откатывать изменения и исправлять ошибки. </p>
  <p id="fxN0">Но вводить 100 символов описания для каждых 10 строчек — лень 🫡</p>
  <p id="e0L2">И раз пока не придумали инструмент, который генерирует названия коммитов, с учетом всех моих предпочтений, за нас — давайте я сам сделаю такой инструмент и расскажу, как интегрирую его в свой процесс разработки.</p>
  <h2 id="syvT">Прогаем</h2>
  <p id="flD8">Для начала нам понадобится аккаунт OpenAI. Если у вас еще нет аккаунта OpenAI – можете воспользоваться вот этим <a href="https://vc.ru/life/584440-kak-zaregistrirovatsya-v-openai-chatgpt-iz-rossii-v-2023-godu" target="_blank">гайдом</a>. Далее нам нужно получить OpenAI API KEY по этому <a href="https://platform.openai.com/account/api-keys" target="_blank">адресу</a>. </p>
  <p id="N8Fw">Так же, необходимо установить NodeJS, следуя оффициальному <a href="https://nodejs.org/en/" target="_blank">гайду</a>.</p>
  <h3 id="86Yz">Логика формирования запроса к нейронке</h3>
  <p id="dFTf">Сгенерируем prompt. Путем 10-15 экспериментов с ChatGPT, у меня получился примерно такой prompt, который генерирует осмысленные и подходящие по типу сообщения:</p>
  <p id="9ioJ"><code>Generate a short commit title based on diff changes above, using gitmoji and conventional commits. Structure: &lt;emoji&gt; &lt;type&gt;: &lt;subject&gt;&#x27;</code></p>
  <p id="xwzK">Я указываю, что заголовок не должен быть длинным, так как иначе коммит не будет помещаться в одну строку. А дальше передаю структуру, к которой привык (так как многие сначала указывают тип, а уже потом эмодзи, но я привык ставить эмодзи в самом начале)</p>
  <p id="ro5O">Так же, я хочу сделать скрипт универсальным и запускать его в любой директории (через глобальную установку, значит необходимо добавить глобальную обработку<code>OPENAI_API_KEY</code>, чтобы его не пришлось указывать в самом файле. Поэтому добавим обработку из параметров запуска скрипта, а так же из глобального <code>env</code> файла.</p>
  <pre id="fKbT">const getArgs = () =&gt; {
  return process.argv.slice(2)
    .reduce((args, arg) =&gt; {
      if (arg.startsWith(&#x27;--&#x27;)) {
        const [flag, value = true] = arg.split(&#x27;=&#x27;);
        args[flag.slice(2)] = value;
      } else if (arg[0] === &#x27;-&#x27;) {
        arg.slice(1).split(&#x27;&#x27;).forEach(flag =&gt; {
          args[flag] = true;
        });
      }

      return args;
    }, {});
};

const args = getArgs();

const apiKey = args.apiKey || process.env.OPENAI_API_KEY || (() =&gt; {
    error(&#x27;Please set the OPENAI_API_KEY environment variable.&#x27;);
    process.exit(1);
})();</pre>
  <h3 id="HoZA">Проверяем, что запросы уходят</h3>
  <p id="9w3I">Пишем базовую проверку и запускаем скрипт 👀</p>
  <pre id="wWLY">const api = new ChatGPTAPI({
  apiKey,
})

async function main() {
  const { text } = await api.sendMessage(&#x27;Test connection&#x27;);

  console.log(text)
}</pre>
  <figure id="xUYC" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/c8/f2/c8f2655c-f4cd-40b2-aa3a-5e897c07b0ba.png" width="477" />
    <figcaption>Работаем!</figcaption>
  </figure>
  <h3 id="vTlj">Достаем изменения с помощью git-а.</h3>
  <p id="SgvS">Теперь, нам нужно собрать список изменений в файле. Для этого используем встроенный в Node модуль <code>child_proccess</code></p>
  <p id="qVVK">Запишем в переменную наш <code>diff</code> и отправим в GPT-3 уже полноценный запрос, который состоит из изменений и промпта.</p>
  <pre id="nXrk">import { execSync } from &#x27;child_process&#x27;;
import { ChatGPTAPI } from &#x27;chatgpt&#x27;

// Здесь пропущена инициализация клиента, она есть выше.

async function main() {
  const diff = execSync(&#x27;git diff --staged&#x27;).toString()

  const prompt = &#x27;Generate a short commit title based on diff changes above, using gitmoji and conventional commits. Structure: &lt;emoji&gt; &lt;type&gt;: &lt;subject&gt;&#x27;

  const { text } = await api.sendMessage(&#x60;${diff}\n # ${prompt}&#x60;)

  console.log(&#x60;Proposed Commit:\n------------------------------\n${text}\n------------------------------&#x60;)
}

main();</pre>
  <p id="99IH">И попробуем добавить в гит эти изменения и запустить скрипт.</p>
  <figure id="BkeR" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/e6/d7/e6d7c5b6-2660-4ef1-a282-ec992821efcb.png" width="306" />
    <figcaption>Сообщение не очень информативное, но мы видим, что скрипт работает</figcaption>
  </figure>
  <h3 id="d67R">Добавляем вариативность</h3>
  <p id="wLFE">В примере выше мы видим, что сообщение не до конца передаёт суть изменения. В таком случае я бы не хотел, чтобы этот коммит попадал в репозиторий. Поэтому добавим возможность пользователю уточнить, подходит ли коммит. И только в случае, если пользователю нравится коммит, мы будем его создавать.</p>
  <pre id="IRxc">// Мы получили коммит сообщение в переменную text выше.

inquirer
    .prompt([
      {
        type: &#x27;confirm&#x27;,
        name: &#x27;continue&#x27;,
        message: &#x27;Do you want to continue?&#x27;,
        default: true,
      },
    ])
    .then((answers) =&gt; {
      if (!answers.continue) {
        console.log(&#x27;Commit aborted by user.&#x27;);
        process.exit(1);
      }
      // info(&#x27;Committing Message...&#x27;);
      console.log(&#x27;Committing Message...&#x27;)
      execSync(&#x60;git commit -F -&#x60;, { input: text }); // Делаем коммит с текущим сообщением. 
    });</pre>
  <p id="FjVd">Застейджим изменения и попробуем вызвать наш скрипт.</p>
  <figure id="1mp1" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/50/33/50339a44-aa90-49a9-a274-48d31a5028ff.gif" width="640" />
    <figcaption>Нам все еще нужно поработать над содержимым, но логика решения юзера работает, а сообщение успешно коммитится в случае положительного ответа.</figcaption>
  </figure>
  <h3 id="AEFz">Модифицируем промпт</h3>
  <p id="plJB">Если вы уже пробовали работать с ChatGPT, то понимаете, что самая сложная часть для работы с ИИ – уметь правильно обьяснить задачу. В моем примере обьяснение выглядит понятным для человека, но ИИ в большинстве случаев выдает просто название измененного файла. Воспользуемся примером из репозитория с промптами и попробуем более детально описать то, что мы хотим получить.</p>
  <p id="hlHt">Вот новый prompt: </p>
  <p id="Sljp"><code>I want you to act as a senior Frontend developer. I will provide you with my code changes as a git diff and ask you to generate a commit message. In our project, we use conventional commits and gitmoji to design the messages. The commit structure should be in the form of &lt;emoji&gt; &lt;type in lowercase&gt;: &lt;subject&gt;\nHere is a list of changes:\n</code></p>
  <p id="jQkW">Добавим его в проект и попробуем сгенерировать сообщение.</p>
  <figure id="iwio" class="m_column" data-caption-align="center">
    <img src="https://img1.teletype.in/files/07/a6/07a64a70-14ea-44ed-8629-e053cd3b4e74.gif" width="800" />
    <figcaption>Со второго раза получилось вполне осмысленное сообщение 😎</figcaption>
  </figure>
  <h3 id="MGyZ">Добавим еще немного функциональности</h3>
  <p id="VoUP">После того, как основной функционал скрипта готов – я хочу добавить еще две опции для запуска, а именно <code>list</code> и <code>force</code>. Первая команда будет генерировать список из нескольких коммитов, чтобы при неудачной генерации не приходилось вызывать скрипт заново.</p>
  <p id="U6AN">Реализуем логику работы с <code>list</code>. Вот новая функция, которая будет вызываться при добавлении параметра <code>--list</code> в вызов.</p>
  <pre id="QuBs">const generateListCommits = async (diff) =&gt; {
	// Добавили новый промпт с 5 вариантами.
  const prompt = &#x27;I want you to act as a commit message generator. I will provide you with my code changes as a git diff and I would like you to generate an appropriate commit message. Generate 5 variants and send them in one line, separated by commas. Try to understand the meaning of the changes, not just the name of the file. In our project, we use conventional commits and gitmoji to design the messages. The commit structure should be of &#x60;&lt;emoji&gt; &lt;type in lowercase&gt;: &lt;subject&gt;&#x60;\nHere is a list of changes:\n&#x27;

  const { text } = await api.sendMessage(prompt + diff)

  const msgs = text.split(&#x27;,&#x27;).map((msg) =&gt; msg.trim())

  // add regenerate option
  msgs.push(REGENERATE_MSG)

  inquirer.prompt([
    {
      type: &#x27;list&#x27;,
      name: &#x27;commit&#x27;,
      message: &#x27;Select a commit message&#x27;,
      choices: msgs,
    },
  ]).then((answers) =&gt; {
    if (answers.commit === REGENERATE_MSG) {
			// На всякий случай добавим рекурсию, если все 5 вариантов оказались неподходящие
      generateListCommits(diff) 
      return
    }
    console.log(&#x27;Committing Message... 🚀 &#x27;)
    execSync(&#x60;git commit -F -&#x60;, { input: answers.commit });
    console.log(&#x27;Commit Successful! 🎉&#x27;)
  });
}</pre>
  <p id="I1et">С <code>force</code> все ещё проще, мы просто убираем возможность отклонить коммит. Вот итоговый код</p>
  <pre id="VOqM">const generateSingleCommit = async () =&gt; {
  const prompt = &#x27;I want you to act as a commit message generator. I will provide you with my code changes as a git diff and I would like you to generate an appropriate commit message. Try to understand the meaning of the changes, not just the name of the file. In our project, we use conventional commits and gitmoji to design the messages. The commit structure should be of &#x60;&lt;emoji&gt; &lt;type in lowercase&gt;: &lt;subject&gt;&#x60;\nHere is a list of changes:\n&#x27;

  const { text } = await api.sendMessage(prompt + diff)

  console.log(&#x60;Proposed Commit:\n------------------------------\n${text}\n------------------------------&#x60;)

  if (args.force) {
    makeCommit(text)
    return
  }

  inquirer
    .prompt([
      {
        type: &#x27;confirm&#x27;,
        name: &#x27;continue&#x27;,
        message: &#x27;Do you want to continue?&#x27;,
        default: true,
      },
    ])
    .then((answers) =&gt; {
      if (!answers.continue) {
        console.log(&#x27;Commit aborted by user 🙅‍♂️&#x27;);
        process.exit(1);
      }

      makeCommit(text)
    });
}</pre>
  <h3 id="QpWz">Рефакторим</h3>
  <p id="cIfV">Какой код без рефакторинга? Плохой!</p>
  <p id="I7YS">Спустя пару дней тестирования пакета я понял, что генерация gitmoji работает не так, как я ожидал. В большинстве случаев emoji выбирается рандомно из списка допустимых в gitmoji. Упростим prompt, а подставление правильного gitmoji оставим в виде обычной javascript функции.</p>
  <p id="tZOX">Для этого воспользуемся ChatGPT и попросим написать функцию за нас.</p>
  <figure id="dExw" class="m_column">
    <img src="https://img3.teletype.in/files/a6/a3/a6a3f2eb-e3b0-4502-8175-a8b18dd3de23.png" width="893" />
  </figure>
  <h3 id="o12Q">Используем</h3>
  <p id="S9Pp">Окей, мы написали базовую логику для библиотеки. Давайте сделаем релиз пакета и попробуем использовать уже не из исходников, а с помощью готовой библиотеки.</p>
  <p id="anZf">Я опубликовал пакет по адресу <a href="https://www.npmjs.com/package/ai-commit" target="_blank">https://www.npmjs.com/package/ai-commit</a> и теперь, для того чтобы его использовать на любом компьютере, мне нужно сделать 3 вещи.</p>
  <ol id="X8Dp">
    <li id="mbxd">Установить глобально <code>env</code> переменную с моим OPENAI_API_KEY. Я добавлял ключ на маке по <a href="https://support.apple.com/ru-ru/guide/terminal/apd382cc5fa-4f58-4449-b20a-41c53c006f8f/mac" target="_blank">этой</a> инструкции , для своих ОС можете попросить совет у ChatGPT (ну или загуглить, как бумеры)</li>
    <li id="CAXC">Установить глобально пакет: <code>npm install -g ai-commit</code></li>
    <li id="cisj">Воспользоваться библиотекой в любом месте, где вы совершаете изменения с помощью команды <code>ai-commit</code></li>
    <li id="2mJX">Вы великолепны ✨</li>
  </ol>
  <figure id="dzZC" class="m_column">
    <img src="https://img2.teletype.in/files/51/31/513151fd-12ec-4bf5-b4e4-34f25faa77e5.gif" width="718" />
  </figure>
  <h3 id="yOFK">Упрощаем, Level GOD!</h3>
  <ol id="Hl8u">
    <li id="KIWX">Добавляем в VSCode расширение Command Runner (<a href="https://marketplace.visualstudio.com/items?itemName=edonet.vscode-command-runner" target="_blank">https://marketplace.visualstudio.com/items?itemName=edonet.vscode-command-runner</a>)</li>
    <li id="pYkg">Нажимаем Cmd + Shift + P и ищем пункт Open Keyboard Shortcuts (JSON)</li>
    <li id="rczg">В конце списка шорткатов добавляем еще один, с таким содержимым:</li>
  </ol>
  <pre id="jkkz">{
    &quot;key&quot;: &quot;cmd+enter&quot;,
    &quot;label&quot;: &quot;Generate commit and push&quot;,
    &quot;command&quot;: &quot;command-runner.run&quot;,
    &quot;args&quot;: {&quot;command&quot;: &quot;git add . &amp;&amp; ai-commit&quot;},
    &quot;when&quot;: &quot;editorTextFocus&quot;
  }</pre>
  <p id="7qGx">Теперь мы на любое небольшое изменение просто нажимаем <code>Cmd + Enter</code> и получаем готовый коммит. Добавлять файлы вручную для этого не обязательно.</p>
  <figure id="YKJP" class="m_column">
    <img src="https://img2.teletype.in/files/95/8e/958eca16-e505-4797-9a00-4a6876cc056a.gif" width="960" />
  </figure>
  <h2 id="58PR">Заключение</h2>
  <p id="D6oM">И так, мы подошли к концу статьи. Я надеюсь, что вам удалось получить некоторые полезные советы и идеи, которые помогут вам стать более продуктивным и эффективным в своей работе. </p>
  <p id="sbbY">Современные технологии, включая искусственный интеллект, могут помочь вам ускорить процесс разработки, сделать его более эффективным и удобным.</p>
  <p id="xSIi">Не брезгуйте новыми технологиями. Они позволяют убрать рутину из вашей работы и сфокусироваться на том, что действительно интересно и вызывает сложности. Оставим написание бойлерплейта машинам.</p>
  <p id="WfN8">Я надеюсь, что моя библиотека и советы помогут вам достигнуть новых высот в вашей работе. Желаю вам удачи и успехов в вашей профессиональной деятельности! Подписывайтесь на мой <a href="https://t.me/insuline_lifestyle" target="_blank">телеграм канал</a>, ставьте лайки и до скорой встречи 💜</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/meeting-productivity</guid><link>https://teletype.in/@insuline/meeting-productivity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/meeting-productivity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Почему длинные рабочие встречи – зло, что такое тривиальность и причем тут СЕО Бинанса?</title><pubDate>Tue, 07 Feb 2023 13:09:02 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/57/dd/57dd5086-1ef3-490e-abed-fc8ad76e076b.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a9/63/a963ebe3-4f41-482c-82ee-91e26861c60d.jpeg"></img>GM! Не знаю, собирается ли СЕО Бинанса запустить свой инфокурс, но он написал рассуждение о тайм-менеджменте и как у него получается быть эффективным.]]></description><content:encoded><![CDATA[
  <figure id="qpK8" class="m_column">
    <img src="https://img3.teletype.in/files/a9/63/a963ebe3-4f41-482c-82ee-91e26861c60d.jpeg" width="1280" />
  </figure>
  <p id="XvsY">GM! Не знаю, собирается ли СЕО Бинанса запустить свой инфокурс, но он написал <a href="https://www.binance.com/en/blog/from-cz/cz-on-time-management-937115089915394194" target="_blank">рассуждение о тайм-менеджменте</a> и как у него получается быть эффективным.</p>
  <p id="NWVQ">В целом, что-то «революционное» в его посте найти сложно. Базовые правила, вроде: не тратить время на рутинные дела, покупать одинаковые вещи и уметь говорить нет. Но есть в данном тексте одна идея, которую я хочу дополнить своими мыслями, так как совсем недавно размышлял на этот счет.</p>
  <blockquote id="WIP4">Я сокращаю большинство своих встреч до 15 минут (с) Чанпэн Чжао</blockquote>
  <p id="pOuK">Действительно, нужны ли долгие встречи в работе? Ведь часто хочется что-то обсудить, послушать мнение всех и не забыть про «подводные камни», которые могут встретиться на пути. И тут стоит рассказать о первом и наиболее популярном законе Паркинсона:</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="P8Ub">Работа занимает все отведенное на нее время </p>
  </section>
  <p id="AKaL">Но получается, что можно обсуждать большие дела за 5 минут и выполнять все на 100 процентов? Нет, немного не так. Паркинсон был умным чуваком и следом за своим самым популярным законом сразу написал второй: </p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="bhe6">Время, затраченное на обсуждение проблемы, обратно пропорционально значимости этой проблемы. Большие и сложные вопросы обсуждаются недостаточно, тогда как мелкие и неважные обсуждаются дольше всего.</p>
  </section>
  <p id="fSNG">Можно подробно почитать про «эффект велосипедного сарая», на котором как раз построен закон, но суть достаточно проста.</p>
  <p id="L0Dv">Чем тривиальнее и проще тема для обсуждения — тем больше человек хочет высказаться о ней. Таким образом, если на одной встрече поставлено несколько тем — большинство времени у всех займет обсуждение менее важной задачи.</p>
  <h2 id="osou">Воображаемый пример из криптостартапа</h2>
  <p id="iLTM">Собирается встреча, на которой нужно обсудить производительность API сервиса. На встречу приглашается вся команда (фронтендеры, бэкендеры, дизайнеры, СЕО) и часовая встреча, в теме которой стоит производительность, завершается тем, что дизайнеры рисуют лоадеры, СЕО придумывает юзер-флоу, в котором данные идут долго, а фронтендеры сразу берут все эти задачи в работу.</p>
  <p id="iM4b">Решилась ли проблема? Я считаю, что да. Ведь сама по себе проблема заключалась в неудобстве пользователя продукта, но какими ресурсами она решилась? Давайте возьмем за пример компанию, в которой по 2 человека в каждом направлении и СЕО, да сравним. На встрече находятся 7 человек, каждый из которых потратил по часу своего рабочего времени. Дальше СЕО продумывает новый флоу и отдает ТЗ дизайнерам. Возьмем еще 2 часа времени на это. Ну и дальше уже стандартный рабочий процесс с выполнением дизайна, передаче на фронтенд и имплементации. Пусть будет еще 6 часов суммарной работы между дизайнером и фронтендером.</p>
  <p id="xqJT">Но что, если воспользоваться законом Паркинсона и сократить время встречи до 10 минут? Тогда кажется разумным, что приглашать 7 человек не имеет никакого смысла, ведь у каждого будет всего по одной минуте на то, чтобы высказаться и к результату придти сложно (это мы еще не берем в расчет, что половина людей опоздает и времени останется еще меньше). Как решать эту проблему? 🤔</p>
  <p id="EEGw">А тут на помощь приходит второй вариант: 10 минутная встреча, на которой находятся 2 бэкендера. Они обсуждают CDN и кэширование данных, им не приходится объяснять свои профессиональные термины, и они гораздо проще договариваются. Один из них берет задачу, тратит на нее 6 часов. И проблема решена. Для наглядности прикреплю таблицу</p>
  <figure id="JozL" class="m_custom">
    <img src="https://img3.teletype.in/files/ef/cf/efcff09e-09f1-4332-9be2-706d8f4c7fa1.png" width="487" />
  </figure>
  <p id="khVl">В итоге мы получаем почти <strong>9 часов сэкономленного времени</strong> для решения одной и той же проблемы, но с разными коэффициентами эффективности</p>
  <figure id="upiQ" class="m_custom">
    <img src="https://img4.teletype.in/files/7b/41/7b41b718-3c5d-4c30-bb60-3565d15f2345.png" width="387" />
  </figure>
  <h2 id="4uz9">Добавляем тривиальности</h2>
  <p id="Gt7z">Но ведь в «эффекте велосипедного сарая» говорилось о тривиальности проблем. Так давайте расширим пример для большей наглядности.</p>
  <p id="HTnD">Попробуем оставить тот же временной диапазон и добавим во встречу вторую тему: первоначальная загрузка сайта.</p>
  <p id="aagQ">И вот, у нас на встрече 7 человек, из которых только 2 человека разбираются в бэкенде. Вероятнее всего, 80% времени будет обсуждаться тема первоначальной загрузки сайта, потому что тут свои предложения могут вбросить и дизайнеры, и СЕО, да и фронтендеры, потому что им в итоге выполнять задачу. По итогу: всем будет труднее договориться, задача опять может быть разбита на длинную последовательную работу, а до производительности API никто и не дойдет. </p>
  <p id="ascz">Для наглядности опять попробуем построить таблицу, но предсказать результат здесь будет уже сложнее. Возьмем общий X для обеих ситуаций.</p>
  <figure id="l6WB" class="m_original">
    <img src="https://img3.teletype.in/files/e2/24/e224aff9-61d4-4559-ac60-5cc81eef8b66.png" width="565" />
  </figure>
  <p id="AEfq">Поэтому длинные рабочие встречи становятся злом, так как на них тратится много времени, а в итоге результат может быть менее эффективным, чем при более короткой и целенаправленной встрече</p>
  <h2 id="EGU4">А как в итоге правильно то?</h2>
  <p id="mwMl">Ну, для начала перестаньте звать на встречи всех подряд, без надобности. А вот пошаговый чеклист для эффективных встреч:</p>
  <ul id="hiXZ">
    <li id="CT0V">Поймите минимальное количество людей, необходимых для решения проблемы. Позовите только их. Если будет не достаточно — сделайте summary встречи и отправьте другому человеку, которого хотели пригласить.</li>
    <li id="UjGt">Чем короче встречи — тем эффективнее. Но не забывайте про адекватность. Миграцию продукта на другой стек даже 2 фронтендера не успеют обсудить за 10 минут.</li>
    <li id="dNSs"><strong>Готовьтесь</strong> к встречам. Не делайте так, что на встречах все остальные люди сидят и смотрят, как вы исследуете проблему в прямом эфире. Каждый человек должен подготовиться к встрече и выписать свои тезисы заранее.</li>
    <li id="gnyO">Если получается так, что нужно обсудить несколько проблем — нужно добавить тайм-блоки на обсуждение каждой проблемы. Если не сделать это заранее — большинство обсуждения пройдет за легкой темой.</li>
    <li id="eMsB">Попробуйте решать проблемы асинхронно. Здесь могут подойти любые мессенджеры, но наилучшим вариантом будет почта. Через почту люди стараются формулировать мысль наиболее полно и не отправляют по 20 сообщений с редактированиями, must have</li>
    <li id="e5oD">Сделайте себе плагин, который будет писать стоимость встречи, как на скриншоте ниже 😎</li>
  </ul>
  <figure id="90nV" class="m_custom">
    <img src="https://img1.teletype.in/files/4a/30/4a304236-aedd-4271-a6c9-f39b80f56bed.jpeg" width="345.99999999999994" />
  </figure>
  <p id="VXb8">Ну и подписывайтесь на мой <a href="http://t.me/insuline_lifestyle" target="_blank">телеграм</a>, я буду делиться советами о продуктивности и качественной командой работе и дальше. Успехов!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/arbitrage</guid><link>https://teletype.in/@insuline/arbitrage?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/arbitrage?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Поговорим про арбитраж 🤑</title><pubDate>Tue, 06 Dec 2022 12:04:19 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/aa/41/aa4199dd-6240-4d14-8768-ff4bcbcd73ec.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/77/3d/773d0db8-514e-412c-9949-65922f94c4c0.png"></img>Привет! Уже почти 3 месяца я постоянно изучаю тему, которая не даёт покоя каждому &quot;темщику&quot; в сети, а именно – арбитраж.]]></description><content:encoded><![CDATA[
  <figure id="ZcT7" class="m_column">
    <img src="https://img4.teletype.in/files/77/3d/773d0db8-514e-412c-9949-65922f94c4c0.png" width="2560" />
  </figure>
  <p id="gZGz">Привет! Уже почти 3 месяца я постоянно изучаю тему, которая не даёт покоя каждому &quot;темщику&quot; в сети, а именно – арбитраж.</p>
  <p id="5Ky4"></p>
  <p id="YXWG">За 3 месяца экспериментов я успел:</p>
  <ul id="vHiv">
    <li id="7xYd">написать бота для автоматического арбитража</li>
    <li id="1LoP">сделать <a href="https://t.me/insulineARBI" target="_blank">парсер</a> любой возможности поарбитражить между DEX и CEX</li>
    <li id="izC5">потерять много денег после введения сжигания токенов на Terra Classic</li>
    <li id="tSWL">полезть в сендвич атаки и арбитраж в одном чейне и потерять деньги и там</li>
    <li id="9Zoj">сделать свой клон Via Protocol и написать интеграции для 4 мостов</li>
  </ul>
  <p id="zpj9"></p>
  <p id="5A89">Но самое интересное – найти арбитражников в <strong>коммьюнити. </strong>Именно от таких знакомств получается набраться опыта в самые сжатые сроки, за счет совместных наработок получается гораздо быстрее получать результат, а так же – делиться друг с другом разными идеями.</p>
  <p id="38Hi"></p>
  <p id="JEkW">Так вот, в субботу я серфил по инету и нашел еще одного арбитражника, который сказал, что без проблем может записать со мной интервью и поделиться базой по арбитражу, которая будет полезна каждому, кто начинает свой путь в этом направлении.</p>
  <p id="ems2"></p>
  <h3 id="SO2W">Знакомьтесь, Опен</h3>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="QI5F" class="m_column">
      <img src="https://img2.teletype.in/files/d7/2f/d72fd8fd-7ccc-4867-a02b-003e8822c45b.jpeg" width="1600" />
    </figure>
  </section>
  <p id="ghg5">Опен – уникален. Он обыгрывал чемпионов мира <a href="https://openai.com/blog/openai-five/" target="_blank">OG в доту</a>, после этого долго занимался <a href="https://openai.com/dall-e-2/" target="_blank">рисованием картин</a>, а в свободное время <a href="https://www.tesla.com/" target="_blank">&quot;таксует для души&quot;.</a></p>
  <p id="GsBi"></p>
  <h3 id="6mtc">Погнали 🚀</h3>
  <p id="CqaC"><strong>Insuline: </strong>Привет. Я изучаю треугольный арбитраж на крипте.  Ты слышал что-нибудь об этом?</p>
  <p id="azrS"><strong>Open:</strong> Здаров. Да, я знаком с концептом треугольного арбитража в контексте криптовалютного трейдинга. Треугольный арбитраж - это торговая стратегия, которая использует ценовую разницу между тремя различными валютами на рынке, конвертируя одну валюту в другую, а затем обратно в исходную валюту, в попытке получить прибыль от разницы цен. Эта стратегия основана на предположении, что на эффективном рынке цены различных валют должны тесно коррелировать, поэтому, если между тремя валютами существует значительная разница в цене, можно получить прибыль, используя эту разницу. </p>
  <p id="VxlV">Но кажется, что такой арбитраж может быть трудно осуществим на практике из-за сложности расчетов, необходимости быстрого исполнения и потенциальных рисков.</p>
  <p id="uwJ9"><strong>Insuline:</strong> А что сложного в сложности расчетов? Ты пробовал написать формулы? </p>
  <p id="jNQL"><strong>Open:</strong> Да. Я писал имплементацию на JavaScript. </p>
  <p id="OJNS">Чтобы реализовать алгоритм треугольного арбитража на JavaScript, необходимо иметь доступ к рыночным данным в реальном времени по различным валютам, которыми вы заинтересованы торговать, а также возможность быстрого и эффективного исполнения сделок. Ты можешь использовать библиотеку <a href="https://github.com/ccxt/ccxt" target="_blank">ccxt</a> для доступа к рыночным данным, <a href="https://github.com/ethers-io/ethers.js/" target="_blank">ethers</a> – для совершения сделок, а для выполнения необходимых расчетов - математическую библиотеку, например <a href="https://mathjs.org/" target="_blank">math.js</a>. Вам также потребуется хорошее понимание основ треугольного арбитража и потенциальных рисков и проблем, связанных с реализацией этого типа торговой стратегии.</p>
  <p id="RsHa"><strong>Insuline: Забыл рассказать – я работаю в Via.exchange, поэтому доступы к множеству курсов на разных блокчейнах у меня есть. Но как дальше их считать?</strong></p>
  <p id="h2eY"><strong>Open:</strong> Кайф. Чтобы рассчитать потенциальную прибыль от треугольного арбитража, необходимо знать текущие курсы обмена трех валют, участвующих в сделке, а также комиссионные и другие расходы, связанные с проведением сделок. Основная формула для расчета потенциальной прибыли от треугольного арбитража выглядит следующим образом:</p>
  <pre id="xDIV">Потенциальная прибыль = (Курс обмена 1 * Курс обмена 2 * Курс обмена 3) - (Курс обмена 1 * Комиссия 1) - (Курс обмена 2 * Комиссия 2) - (Курс обмена 3 * Комиссия 3)</pre>
  <p id="3bEn">Здесь &quot;Курс обмена 1&quot; - это курс обмена между первой и второй валютами, &quot;Курс обмена 2&quot; - это курс обмена между второй и третьей валютами, а &quot;Курс обмена 3&quot; - это курс обмена между третьей и первой валютами. &quot;Комиссия 1&quot; - это комиссия, связанная с первой сделкой, &quot;Комиссия 2&quot; - это комиссия, связанная со второй сделкой, а &quot;Комиссия 3&quot; - это комиссия, связанная с третьей сделкой.</p>
  <p id="KZj5"><strong>Insuline:</strong> Хм. Ну звучит не сложно, а какие тут подводные камни?</p>
  <p id="ACwO"><strong>Open:</strong> При торговле с использованием стратегии треугольного арбитража необходимо знать о нескольких потенциальных подводных камнях. </p>
  <p id="zSmj">Одной из основных проблем является необходимость быстрого исполнения сделок, поскольку потенциальная прибыль от треугольного арбитража может быстро исчезнуть при изменении валютных курсов. </p>
  <p id="9dZS">Кроме того, расчеты, связанные с определением потенциальной прибыли от треугольного арбитража, могут быть сложными, и ошибки в этих расчетах могут привести к значительным потерям. </p>
  <p id="YyGJ">Еще одним потенциальным препятствием является риск рыночной неэффективности, когда цены на различные валюты могут быть слабо коррелированы, что затрудняет получение прибыли от возможностей треугольного арбитража. </p>
  <p id="K8Lh">Наконец, существует риск волатильности криптовалютного рынка, который может привести к значительным потерям даже для опытных трейдеров.</p>
  <p id="pt3m"><strong>Insuline: </strong>Блин, жестко это. А как еще можно арбитражить?</p>
  <p id="BIem"><strong>Open:</strong> Существует несколько других способов арбитража криптовалют, помимо треугольного арбитража. </p>
  <p id="zTGH">Один из распространенных подходов заключается в использовании разницы в ценах между различными биржами путем покупки криптовалюты на одной бирже, где она относительно дешевая, и последующей продажи на другой бирже, где она относительно дорогая. Этот вид арбитража, известный как &quot;межбиржевой арбитраж&quot;, может быть прибыльным, если разница в ценах достаточно велика, чтобы покрыть комиссионные и другие расходы, связанные с проведением сделок. </p>
  <p id="QmCv">Другой подход заключается в том, чтобы воспользоваться временным дисбалансом спроса и предложения на конкретную криптовалюту, покупая ее, когда она относительно недооценена, и продавая, когда она относительно переоценена. Этот вид арбитража, известный как &quot;фундаментальный арбитраж&quot;, может быть прибыльным, если трейдер хорошо понимает факторы, определяющие спрос на криптовалюту.</p>
  <p id="wF6O"><strong>Insuline: </strong>Я слышал про межбиржевой арбитраж, но не хочется связываться с биржами, потому что высокий риск блокировок и так далее. Пример с GALA хорошо это продемонстрировал, хотя в чатиках я видел success кейсы. Наверное тут еще можно добавить p2p арбитраж, да?</p>
  <p id="uBua"><strong>Open: </strong>Это может быть рискованная стратегия, поскольку биржи могут блокировать или отменять арбитражные сделки, если заподозрят, что трейдер занимается арбитражной деятельностью. P2P-арбитраж, с другой стороны, предполагает использование разницы в ценах между различными платформами peer-to-peer (P2P), где пользователи могут покупать и продавать криптовалюты напрямую друг с другом, без участия центральной биржи. Это может быть менее рискованным способом арбитража, поскольку P2P-платформы обычно имеют меньше ограничений на арбитражную деятельность. Однако P2P-арбитраж может быть и сложным, поскольку он требует от трейдера найти желающих покупателей и продавцов на нескольких P2P-платформах и скоординировать торговлю таким образом, чтобы все стороны остались довольны.</p>
  <p id="Kvce"><strong>Insuline:</strong> Так, ну и последняя сфера арбитража, про которую я знаю – это арбитраж фандинга. Что насчет него? </p>
  <p id="SFWs"><strong>Open: </strong>Арбитраж ставок финансирования - это торговая стратегия, которая предполагает использование различий в ставках финансирования криптовалютных фьючерсных контрактов на разных биржах. На рынке криптовалютных фьючерсов трейдеры могут заключать контракты на покупку или продажу определенной криптовалюты на будущую дату по цене, которая определяется на момент заключения контракта. Ставка финансирования - это плата, которую одна сторона контракта выплачивает другой стороне, чтобы компенсировать разницу между ценой контракта и текущей рыночной ценой. Если ставки финансирования на двух разных биржах отличаются, можно извлечь прибыль из этой разницы, покупая и продавая фьючерсные контракты на этих двух биржах. </p>
  <p id="1bwf">Это может быть сложная и рискованная стратегия, поскольку она включает в себя как торговлю фьючерсами, так и арбитраж, и требует хорошего понимания факторов, влияющих на ставки финансирования фьючерсных контрактов.</p>
  <p id="YabD"><strong>Insuline:</strong> Ладно, про фандинг нам расскажет Гасерд. Но в общем, опять трейдинг 🥲</p>
  <p id="dAqN">А че думаешь, где еще в децентрализованных финансах можно получить дополнительный доход для разработчиков? Например, я могу написать арбитражного бота. Но что еще можно поресерчить, чтобы создать софт на медвежке и получать прибыль?</p>
  <p id="uVFv"><strong>Open:</strong> Существует множество потенциальных возможностей для разработчиков получать дополнительный доход в сфере децентрализованных финансов (DeFi). </p>
  <p id="ycOs">Например, разработчики могут создавать и внедрять смарт-контракты на платформах блокчейн, таких как Ethereum, для создания новых финансовых продуктов и услуг. Среди них могут быть децентрализованные биржи, платформы кредитования и заимствования, стабильные монеты, рынки предсказаний и другие. Разработчики также могут создавать и продавать пользовательские инструменты и услуги, которые помогут другим пользователям DeFi, например, арбитражные боты, инструменты управления портфелем и аналитические платформы. </p>
  <p id="D7qd">Кроме того, разработчики могут получать доход через стейкинг, участвуя в управлении децентрализованными сетями и предоставляя вычислительные мощности, необходимые для поддержания сети. Существует множество других способов получения дохода разработчиками в пространстве DeFi, и эти возможности постоянно расширяются по мере роста и развития экосистемы DeFi.</p>
  <p id="K8Qz"><strong>Insuline:</strong> Является ли Ethereum будущим или ты знаешь другие интересные блокчейны?</p>
  <p id="RVLo"><strong>Open:</strong> Трудно предсказать будущее любого конкретного блокчейна, включая Ethereum. </p>
  <p id="Z10V">В настоящее время Ethereum является одной из наиболее широко используемых блокчейн-платформ и сыграл ключевую роль в развитии экосистемы децентрализованных финансов (DeFi). Однако сфера блокчейна очень динамична и конкурентна, и в будущем могут появиться другие платформы, предлагающие иные функции и возможности. Примерами других блокчейн-платформ, набирающих обороты в сфере DeFi, являются <strong>Solana, Binance Smart Chain и Polygon</strong>. Эти платформы имеют различные характеристики и возможности, которые могут сделать их более подходящими для определенных случаев использования или приложений. Стоит также отметить, что, хотя технология блокчейн имеет множество потенциальных преимуществ и применений, она все еще является новой и развивающейся технологией, и существует множество проблем и ограничений, которые необходимо решить для того, чтобы она полностью раскрыла свой потенциал.</p>
  <p id="MrQm"><strong>Insuline:</strong> А что будет с Layer 2? В чем преимущество таких сетей перед форками Ethereum, такими как binance smart chain?</p>
  <p id="CFfr"><strong>Open:</strong> Сети второго уровня - это блокчейн-сети, которые строятся поверх существующих блокчейн-платформ, таких как Ethereum, и предназначены для улучшения масштабируемости и производительности базовой платформы. Сети второго уровня используют различные методы, такие как внецепочечные транзакции и каналы состояния, чтобы обеспечить более высокую пропускную способность транзакций и более низкие комиссии за транзакции по сравнению с базовой платформой. Преимущество сетей второго уровня перед форками Ethereum, такими как Binance Smart Chain, заключается в том, что они более тесно интегрированы с базовой платформой и поэтому могут использовать преимущества существующей инфраструктуры, безопасности и экосистемы разработчиков. Кроме того, сети второго уровня часто могут быть более гибкими и настраиваемыми, чем форки Ethereum, поскольку их можно адаптировать под конкретные случаи использования и приложения. Однако компромисс заключается в том, что сети второго уровня не могут предложить такой же уровень независимости и контроля, как форки Ethereum, поскольку они по-прежнему в конечном итоге зависят от базовой платформы.</p>
  <p id="lbSh"><strong>Insuline:</strong> Хорошо, спасибо! Мы пошли билдить, если что – еще спишемся с тобой 😎</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/why-you-need-to-be-dev</guid><link>https://teletype.in/@insuline/why-you-need-to-be-dev?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/why-you-need-to-be-dev?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Почему знать основы программирования нужно всем? 👨🏼‍💻</title><pubDate>Tue, 26 Jul 2022 16:15:24 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c8/2a/c82a89d7-97db-4033-8d29-26bec4e1e9cc.png"></media:content><description><![CDATA[Полгода назад я познакомился с книгой Навала Равиканта (он, кстати, инвестор Via 👀)  «Как стать богатым».   ]]></description><content:encoded><![CDATA[
  <p id="YibK">Полгода назад я познакомился с книгой Навала Равиканта <em>(он, кстати, инвестор Via</em> <em>👀)</em>  «Как стать богатым».   </p>
  <p id="sjyY">Навал сделал <a href="https://twitter.com/naval/status/1002103360646823936" target="_blank">твиттер тред</a> с коллегой, потом эта идея перетекла в <a href="https://nav.al/rich" target="_blank">4 часовой подкаст</a>, а в итоге активно распространяется в версии книги. На <a href="https://zamesin.ru/books/how-to-live/how-to-get-rich" target="_blank">русском тоже</a> :)</p>
  <p id="dOKI">Крайне рекомендую прочитать, так как Навал на своем примере объясняет, что должно быть в вашем фокусе. Какие навыки развивать, как формируется богатство, чем оно отличается от денег, и как строить современный бизнес. </p>
  <p id="jRMq">Так вот, в книге была мысль о том, что один из 5 важных навыков для современного человека — <strong>программирование</strong>. </p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8M01">Я бы сказал, что есть пять самых важных навыков — это, конечно, чтение, письмо, арифметика и, как ты говоришь, навык убеждения, то есть умение говорить. Плюс, я бы добавил сюда программирование, потому что это прикладная форма арифметики, которая дает вам много бесплатных рычагов в любой сфере, в которой вы работаете. </p>
  </section>
  <p id="Dysw">Хочу рассказать, как навык программирования помогает мне в моей бытовой жизни :)</p>
  <h2 id="lFX4">1. Алгоритмы </h2>
  <p id="m29S">Первое, что отлично помогает в быту — это умение строить в голове <strong>алгоритмы</strong> (я не о душном переборе деревьев)</p>
  <p id="Rr3m">К примеру, когда у меня есть какая-то бытовая задача — я представляю в голове все условия (<code>if else</code>), которые могут вызывать трудности. Дальше уже можно построить пошаговый план решения задачи, по необходимости записать его, и приступить к решению. </p>
  <p id="7OmM">Процесс очень похож с разработкой какого-то модуля в приложении. Есть требование, есть начальные данные — нужно выполнить задачу с минимальными вложениями времени. Осталось только разобраться с тем, как впихнуть юнит-тесты в реальную жизнь 🤓</p>
  <h2 id="61J1">2. Гугл</h2>
  <p id="TqeQ">Второй навык, который развивается во время обучения разработке и очень помогает в реальной жизни — <strong>умение</strong> <strong>гуглить</strong>.</p>
  <p id="7iL9">Да, это действительно не так легко, как кажется на первый взгляд. Проведите эксперимент и предложите своим знакомым постараться найти решение на какую-то бытовую тему вместе. </p>
  <p id="mDsc">Тема может быть любой, к примеру можно попробовать найти и собрать полный список документов на визу. Или найти возможность оплатить заказ на Amazon с помощью русских карт. </p>
  <p id="Ic1D" data-align="center">В какой-то момент для меня это стало <em>инсайтом </em>💡 </p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="hk4Y">Действительно, мем с «тыжпрограммист» родился не от того, что программист по умолчанию умеет взаимодействовать со всей электроникой, устанавливать Windows и чинить разбитые экраны. Разработчик просто может решить данную проблему в несколько раз быстрее, так как уже имеет насмотренность работы с документациями / инструкциями и может сделать качественный запрос в гугл, который решает проблему. </p>
  </section>
  <h2 id="UFCo">3. DeFi. Мы же всё-таки Web 3.0 бояре</h2>
  <p id="fpmK">Сложно рассказывать в канале о крипте и не упомянуть в этой статье DeFi.</p>
  <p id="hCYk">Большая часть моей аудитории связана с криптой и должны понимать ценность базового изучения разработки. </p>
  <p id="7Xr4">Если вы <strong>NFT флиппер</strong> — вы легко можете научиться писать базовые скрипты на регистрации аккаунтов. Сможете разобраться, как минтить через смарт-контракты и находить бэкдоры, как <a href="https://t.me/terncrypto" target="_blank">Терн</a> или <a href="https://t.me/nifoleko_mclaren" target="_blank">Нифолеко</a>. </p>
  <p id="sajN">Если вы просто <strong>инвестируете в крипту</strong> — для вас точно будет интересно разобраться в том, как написать смарт-контракт, который реинвестирует прибыль в стейкинг. Или же написать ончейн торгового бота, который будет работать с контрактами 1inch 👀 </p>
  <p id="gHje">Еще я бы предложил разобраться с стратегиями автоматизации трейдинга и инвестиций. Можно парсить данные со сделок на бинансе и рисовать красивые графики вместо ручного заполнения экселя, можно научиться делать backtest-ы для торговых стратегий.</p>
  <p id="AC3U">Ах да, в крипте же очень много <strong>скама</strong>. И даже бейджик <code>Audited by Certik</code> не должен усыплять вашу бдительность. Научитесь анализировать смарт-контракты, лезьте в код и изучайте проекты. </p>
  <p id="sQ8l">А как же будет приятно получить респект от основателей проектов за вклады в их opensource код, я даже передать не могу. Меня всегда воодушевляет идея того, что можно без каких-либо трудностей привнести свой вклад в крупнейшие проекты в сфере и получить за это вознаграждениеx5xt. А бейджик контрибьютора поможет вам в поиске работы, в этом можете не сомневаться :)</p>
  <p id="XUmS">Ну, а если вы просто <strong>хотите зарабатывать деньги</strong> — пойдите в Web 3.0 фронтенд, благо <a href="https://t.me/insuline_lifestyle/373" target="_blank">я уже рассказывал о том, как сделать это с пошаговыми инструкциями</a> :)</p>
  <h2 id="kJdC">4. Автоматизация</h2>
  <p id="QEmU">Ну и<em> last, but not least</em>, это автоматизация. </p>
  <p id="P5wS">Вы можете экономить очень много своего времени и мыслей с помощью автоматизации. Это может быть что угодно: оплаты счетов, рутинные задачи, формирование баз данных с какой-то нужной информацией<br /><br />Расскажу, что делал я:<br />— Веб-сайт для записи показателей по <a href="https://github.com/insulineru/diabet-control" target="_blank">диабету</a> через Firebase<br />— Платформа, чтобы играть с другом в <a href="https://github.com/insulineru/chess" target="_blank">шахматы</a><br />— Туду-лист в Notion с интеграцией через <a href="https://www.instagram.com/stories/highlights/18036709642305259/" target="_blank">Telegram бота</a><br />— Делал 5 итераций своего сервиса для <a href="https://t.me/insuline_lifestyle/47" target="_blank">учёта финансов.</a> Финальное решение было через No-Code с помощью Integromat, но была и база в Firebase, 3 версии разных фронтендов.<br />— Бот для тимлидов Связного, который строил доску из Forwarded сообщений (способ борьбы с дырявым стеком)<br />— На этой неделе сделал Телеграм бота, который рассчитывает оптимальные размеры позиций в трейдинге с учетом риска и общего депозита по [формуле Келли]</p>
  <p id="4ckm">Любые автоматизации позволяют вам перестать полагаться на свою память, освободить свое драгоценное время для дел, которые не подвергаются автоматизации. По крайней мере, я пока не придумал как написать скрипт, который проводит время с девушкой или выполняет упражнения за меня 👀</p>
  <p id="sJLn"></p>
  <h2 id="wrje">Happy coding ✨</h2>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/crypto-bads</guid><link>https://teletype.in/@insuline/crypto-bads?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/crypto-bads?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Крипто БАДы</title><pubDate>Mon, 11 Jul 2022 12:49:46 GMT</pubDate><description><![CDATA[<img src="https://telegra.ph/file/b6f85b2d726451a027067.png"></img>Выбрасываем свои нерабочие мультивитаминные комплексы и запасаемся этим набором.]]></description><content:encoded><![CDATA[
  <p id="nxe4">Выбрасываем свои нерабочие мультивитаминные комплексы и запасаемся этим набором.</p>
  <figure id="zjBx" class="m_column">
    <img src="https://telegra.ph/file/b6f85b2d726451a027067.png" width="1280" />
  </figure>
  <p id="cWCM">1. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Витамин D-3. </strong></a>Синтезируется только на солнце, поэтому 90% людей имеет его хронический недостаток. Поддерживает опорно-двигательный аппарат (за счет регуляции уровня калия и фосфора), укрепляет кости, улучшает состояние кожи. Влияет на все системы организма, включая гены, иммунную, сердечно-сосудистую и гормональную и даже сперматогенез. Коррелирует с тестостероном, настроением и инсулинорезистентностью.</p>
  <p id="Ku1m"><strong>Способ приема:</strong> весной и зимой - 5.000-10.000 в сутки, летом и осенью - 5.000. Если нет солнца в регионе - можно все время 8.000. В любое время суток, неплохая идея принимать на ночь (т.к. во сне происходят гормональные изменения).</p>
  <p id="5oWQ">2. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Витамин К-2.</strong></a>Синергетик для витамина D-3, поэтому принимаем их ВМЕСТЕ в ОДИН ПРИЕМ. Помогает правильно усваивать кальций, участвует в регуляции свертываемости крови, поддерживает иммунитет, нервную систему и мозговую активность.</p>
  <p id="3Hj0"><strong>Способ приема: </strong>вместе с витамином Д-3, очень желательно с приемом пищи, содержащей полезные жиры (например, бутерброд с кокосовым маслом). Дозировка: 200 мкг/сутки.</p>
  <p id="akhh">3. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Цинка хелат.</strong> </a>Хелатная форма цинка - лучшая форма с точки зрения усвоения организмом, сам цинк стимулирует повышение уровня тестостерона, укрепляет волосы (в том числе «пушок» на бороде становится темнее), ногти; является мощным антиоксидантом, предельно важен нашему организму для качественного синтеза белка.</p>
  <p id="X74x"><strong>Способ приема: </strong>25-30 мг в сутки. НЕДЕЛЯ ЧЕРЕЗ НЕДЕЛЮ, если не ведете активную половую жизнь. Минералы быстро накапливаются организмом, поэтому неделя через неделю - оптимально.</p>
  <p id="Bdor">4. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Kelp.</strong> </a>Недостаток йода имеет примерно 35% населения земного шара и большинство жителей городов отдаленных от моря. Его недостаток приводит к проблемам с щитовидной железой (очень распространено у нас), с метаболизмом и ухудшению выработки гормонов организмом. Лучше всего не жлобить денег и сдать анализ на уровень йода (он недорогой), поскольку в избыточных количествах может быть токсичным для организма и сделает только хуже. Это важный момент!</p>
  <p id="HAwZ"><strong>Способ приема: </strong>150 мкг в сутки, это безопасная дозировка. Для начала можно неделя через неделю (опять же, минералы не так быстро растрачиваются организмом). Смотреть по анализам.</p>
  <p id="VDmn">5. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Кокосовое масло.</strong> </a>Очень часто мы испытываем недостаток жиров и переизбыток углеводов - это одна из самых частых причин ожирения. Кокосовое масло способствует ускорению метаболизма (быстрее горит жир, улучшает чувствительность к инсулину и работу щитовидной железы), помогает понижать холестерин. Маст хэв.</p>
  <p id="6nco"><strong>Способ приема: </strong>10 грамм в сутки. Делаете бутерброды с хлебцами или салат с морковкой и едите. Оно к тому же очень вкусное. Можете запивать гранатовым соком, метаболизм будет благодарить вас.<br />p.s. но есть еще крутой способ приема масла, о котором будут знать только камрады 2 и 3 ступеней.</p>
  <p id="csOE">6. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>NAC.</strong> </a>Улучшает вывод тяжелых металлов из организма, является строительным материалом для белков, антиоксидантом, улучшает выносливость организма, повышает уровень глутатиона (антиоксиданта, который отвечает за нашу молодость, красоту и активность) и понижает гомоцистеин (а значит, понижает риск сердечно-сосудистых заболеваний).</p>
  <p id="9hwp"><strong>Способ приема:</strong> 2 таблетки по 600 мг в сутки. Можно поднимать до 3, если собственный вес большой (85+ кг). Если жалко денег на NAC, для здоровья сердца купите хотя бы фолиевую кислоту, вам одной банки хватит на полгода/плюс, а стоит она дешевле Биг Тейсти!</p>
  <p id="T0sR">7. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Витамин С.</strong></a> Это здоровье связок, суставов, иммунитет. Недостаток приводит к быстрой утомляемости и старению кожи. Ускоряет заживление организма, улучшает работы печени и надпочечников (еще одна проблема 21 века - истощение надпочечников).</p>
  <p id="U2cR"><strong>Способ приема:</strong> 1000 мг 1-2 раза в день. Когда заболели можно закидывать больше (сюда же и овердозировки витамина Д и цинка, на западе это сейчас популярная практика при симптоматике ОРВИ, короны и прочего дерьма; да и до нас эта практика дошла).</p>
  <p id="zgRf">8. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Силимарин.</strong></a> Печень главный наш фильтр, но мало кто о ней заботится, в основном терроризирует бомбардировкой из алкогольных коктейлей. Чистка печени поможет почистить и состояние кожи, улучшить работу пищеварения, в том числе убрав такие эффекты как вздутие, повышенное газообразование и так далее.</p>
  <p id="WMW4"><strong>Способ приема:</strong> 1-3 капсулы в день. Можно курсом пропить 3 (если знаете, что печень барахлит), а потом для профилактики по 1.</p>
  <p id="Lur8">9. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Ниацинамид.</strong></a>Это более щадящая форма Ниацина (витамина В-3), который здорово так разжижает кровь и превращает человека в рака на ближайший час-два. Ниациминамид лишен этих побочных эффектов. За счет разжижения крови проявляется много положительных свойств, включая улучшенный памп, более эффективное усвоение добавок, расслабляющий эффект и другие. Его не стоит принимать, когда ты худеешь.</p>
  <p id="kFXD"><strong>Способ приема:</strong> 1000-2000 мг в сутки. Таблетку перед тренировкой, таблетку перед сном. Выпить воды (чтоб разогнать кровь). Очень круто совмещать с физ активностью и приемом горячей ванны/баней. Тогда эффект будет еще круче.</p>
  <p id="UUn2">10. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>DMAE.</strong></a> Позаботились о печени, сердце, крови, гормоналке, время и мозге подумать! DMAE, по сути, натуральный ноотроп, не вызывающий феномена отмены/отката. Его можно безопасно принимать ВСЕГДА. Повышает концентрацию, улучшает память, улучшает умственные способности и положительно воздействует на иные системы организма.</p>
  <p id="k44y"><strong>Способ приема:</strong> 250 мг перед началом рабочего дня. Если не почувствовали - 250 мг в два приема, т.е. 500 в день. В корзине будет с содержанием 130 мг вещества, поэтому можно пить до 3 капсул!</p>
  <p id="dojq">11. <a href="https://checkout12.iherb.com/cart/shared?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>Селен. </strong></a>Каждый cедьмой житель земли испытывает дефицит селена<strong>, </strong>чаще всего встречается при болезнях ЖКТ, являясь или их причиной или следствием. Или и тем, и тем вместе. В общем-то, для тех у кого проблемы с пищеваром - мастхэв. Создает защиту от злокачественных опухолей (по данным ученых, снижает вероятность рака в 7 РАЗ).</p>
  <p id="GTO2"><strong>Способ приема:</strong> 1 таблетка в сутки вместе с витамином С. Неделя через неделю, банки хватит на год!</p>
  <h3 id="В-завершение">В завершение</h3>
  <p id="8Gi5">Этого набора для НОВИЧКА более чем достаточно. Как видите, здесь мы минимально затронули все системы организма, более подробно мы будем рассматривать их далее. Если есть возможность, то самым грамотным решением будет сдать анализы на минералы и витамины перед их употреблением.</p>
  <p id="J5CC">На днях выйдет базовый набор для мозга и крутой стэк для сна, который вырубит даже после 10 банок энергетика.</p>
  <p id="WI11">Не обязательно покупать всё и сразу, если вы, например, чувствуете что у вас такой пищевар, что вы сожрете сырую свинину и ваша микрофлора кишечника разъебет даже трихинеллу — возможно, селен вам не нужен. Ориентируйтесь на бюджет и потребности.</p>
  <p id="mKkU">Может, у вас главная проблема - это сон. Тогда дождитесь стэка для сна! Мы не зря даем полное описание действия каждого элемента. Ключевая цель - здесь формирования своего понимания для чего и как принимать, чтобы можно редактировать наборы под себя, а не бездумно жрать горсть таблеток.</p>
  <figure id="JSOP" class="m_column">
    <img src="https://telegra.ph/file/5fa9f5c27dbc62c6c45b4.png" width="1280" />
  </figure>
  <p id="M0fS">Вот ссылка на полную корзину добавок на iHerb, открываете ее и заказываете!</p>
  <p id="doiE"><a href="https://ru.iherb.com/tr/cb?pcodes=CGN-01352qty1_NOW-00372qty1_NFS-01294qty1_NWY-41091qty1_NOW-02680qty1_NOW-00086qty1_CGN-00931qty1_NOW-04753qty1_NAP-01930qty1_SNS-00968qty1&rcode=CPL8441" target="_blank"><strong>КОРЗИНА ДОБАВОК (кликабельно)</strong></a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/choose_redaktor</guid><link>https://teletype.in/@insuline/choose_redaktor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/choose_redaktor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Мой опыт перехода с VSCode на WebStorm</title><pubDate>Tue, 31 Aug 2021 08:20:52 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d9/ae/d9ae9571-939e-44ca-8dd9-06d496c1f382.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/ba/f0/baf042f9-3b1b-4afe-b35e-150d3a7fc0c1.png"></img>За свои 3 года в веб-разработке я перепробовал разные программы для написания кода. Начинал в NotePad++, потом долго писал код в Sublime Text и уже в начале 2019 года перешёл на VS Code. ]]></description><content:encoded><![CDATA[
  <p id="zXaL">За свои 3 года в веб-разработке я перепробовал разные программы для написания кода. Начинал в <em>NotePad++</em>, потом долго писал код в <em>Sublime Text</em> и уже в начале 2019 года перешёл на <em>VS Code</em>. </p>
  <figure id="Td2A" class="m_column">
    <img src="https://img4.teletype.in/files/ba/f0/baf042f9-3b1b-4afe-b35e-150d3a7fc0c1.png" width="1777" />
    <figcaption>Текущий сетап моего VSCode. 34 плагина за 3 года - вроде не так много :)</figcaption>
  </figure>
  <p id="hEKO">Но со временем требуемый функционал изменяется. Если раньше мне было достаточно <code><em>Emmet</em></code> (встроен в редактор) и <code>CSS IntelliSense</code>, то сейчас в задачах  основная работа происходит с <code>.js</code> (<code>.ts</code>) и <code>.vue</code> файлами, в которых нужны функционалы авто-импортов, умных автокомплитов с аннотациями типов и возможностями рефакторинга кода. И тут я задумался о смене рабочего инструмента 👀</p>
  <p id="fDs8">Дополнительным толчком для перехода стало то, что смена рабочей обстановки позволяет немного перезагрузиться. </p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UBEK">Простой пример: если вы всегда пользуетесь тёмной темой на телефоне, компьютере, IDE – то попробуйте на несколько дней переключиться на светлую тему. Когда я проделывал такой эксперимент с телефоном – было ощущение, что купил новый телефон </p>
  </section>
  <h2 id="lSRo">Процесс перехода</h2>
  <p id="yUbr">После установки <em>WebStorm</em> сразу установил в настройках Keymap из <em>VSCode</em>, так как к хоткеям я уже полностью привык и переучивать хоткеи заняло бы продолжительное время. </p>
  <figure id="jo7v" class="m_column">
    <img src="https://img1.teletype.in/files/c5/41/c54159e2-fbde-4c6a-8190-5de168867fec.png" width="1094" />
    <figcaption>Раздел настроек, в котором можно указать Keymap в WebStorm</figcaption>
  </figure>
  <p id="hEmb">Следующим этапом была очистка корневого View редактора, в котором я хотел бы сфокусироваться на коде. Убрал лишние бары, статусы. </p>
  <p id="tYoU">Помимо этого, в настройках <em>шторма</em> указал предпочитаемые правила для линтеров, такие как: точки с запятыми, кавычки, висящие запятые. Это позволяет рефакторить даже те проекты, в которых не прописаны конфиги для линтеров.</p>
  <figure id="0ERO" class="m_column">
    <img src="https://img3.teletype.in/files/a2/4d/a24d6fc8-5dc2-4e0b-8efb-f15b35342f7c.png" width="1831" />
    <figcaption>Рабочая область выглядит вот так</figcaption>
  </figure>
  <p id="I9k2">В принципе, часа на настройку мне хватило чтобы комфортно приступить к работе и 14 дней я вообще не открывал <em>VSCode</em> (ну почти) и выполнял все задачи в <em>WebStorm.</em></p>
  <h2 id="kfmQ">Преимущества <em>WebStorm</em></h2>
  <h3 id="yfyj">1. Автодополнение в процессе набора кода</h3>
  <figure id="gGhl" class="m_column">
    <img src="https://img4.teletype.in/files/7a/5b/7a5bf573-89f0-4d0c-b1fe-e5b2e4164e5f.gif" width="740" />
    <figcaption>Авто-импорт нормального человека</figcaption>
  </figure>
  <p id="VafD">Да, конечно, я сразу начну с авто-импортов. Безумно удобная штука, особенно когда импорты приходится использовать постоянно. Но важно здесь даже то, что импортам по дефолту прописываются алиасы. Плюс в <em>VSCode</em> я вечно сталкиваюсь с тем, что импорт компонента иногда не подставляет запятую, от чего &quot;автоматизм&quot; этого процесса очень страдает.</p>
  <figure id="OTyU" class="m_column">
    <img src="https://img3.teletype.in/files/ed/c4/edc4b830-566d-4fcc-9e8d-424249e3a309.gif" width="638" />
    <figcaption>Авто-импорт, который мы заслужили </figcaption>
  </figure>
  <h3 id="BtdN">2. Умный рефакторинг</h3>
  <p id="1ANE">Для второго шага не стану прикладывать видео-подтверждения, но поверьте, что автоматический рефакторинг импортов при изменении названия файла в <em>VSCode</em> либо работает криво, либо не работает совсем 🤷‍♂️</p>
  <p id="YvBO">А вот, что действительно порадовало в <em>WebStorm</em>, так это возможность автоматического рефакторинга кода в проекте с отключенными линтерами через Reformat Code. И этот процесс доставляет эстетическое удовольствие. Даже грамотно настроенный <em>ESLint</em> в проекте не будет автоматически расставлять импорты в алфавитном порядке, оптимизировать пути до файлов через относительные пути (через alias) (поправьте в комментариях, если знаете решение)</p>
  <h3 id="PPlC">3. Отсутствие необходимости делать настройки под проект</h3>
  <p id="4BsP">Огромный плюс WebStorm – его автоматический анализ проекта. IDE понимает в какой директории я работаю и позволяет автоматически применять правила из <code>eslint, webpack, stylelint, jsconfig</code> файлов. </p>
  <p id="CaV4">Для примера, работая над проектом с структурой, в которой <code>eslint, stylelint</code> конфиги расположены не в корне – VSCode не сможет их правильно обработать, следовательно работать линтеры не будут 😕 (пока не настроишь пути до конфигов вручную в настройках workspace)</p>
  <figure id="kbkK" class="m_column">
    <img src="https://img1.teletype.in/files/ce/dd/ceddbe44-9cb0-4540-86fe-ed5a100f0df3.png" width="1552" />
    <figcaption>Пример ломающей структуры в VSCode. Обратите внимание, что конфигурации расположены в директории webpack/</figcaption>
  </figure>
  <h3 id="viOM">4. Работа с Git</h3>
  <p id="xAde">Обычно работу с <em>Git</em>-ом преподносят как удобство  продуктов <em>JetBrains</em> над остальными, но я с этим не соглашусь. Расширение <a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens" target="_blank">GitLense </a> прекрасно дополняет <em>VSCode</em> и позволяет удобно работать с Git-ом. Видеть автора изменений в коде без нажатия дополнительных хоткеев, выборочно коммитить файлы, интерактивное разрешение merge conflicts – весь этот функционал прекрасно работает. </p>
  <figure id="iDSa" class="m_column">
    <img src="https://raw.githubusercontent.com/eamodio/vscode-gitlens/main/images/docs/revision-navigation.gif" width="747" />
    <figcaption>GitLense – расширение для VSCode</figcaption>
  </figure>
  <p id="Pow1">Хотя не буду спорить, что когда я первый раз увидел, как решаются merge conflicts в продуктах <em>JetBrains</em> – немного расстроился, что такого нет в моём редакторе, но уже привык работать со своим интерфейсом.</p>
  <figure id="f7273803" class="m_column">
    <img src="https://resources.jetbrains.com/help/img/idea/2021.2/ws_conflict_resolution_tool_legend.png" width="1412" />
    <figcaption>А вот интерфейс для мерджа в WebStorm (<a href="https://www.jetbrains.com/help/webstorm/resolving-conflicts.html#distributed-version-control-systems" target="_blank">источник</a>)</figcaption>
  </figure>
  <h2 id="09iQ">Результат эксперимента по переходу</h2>
  <p id="RDY0">Я ставил для себя эксперимент сроком на 14 дней, в рамках которого я не пользовался <em>Visual Studio</em>, но после этого времени подошёл процесс выбора инструмента и я... вернулся обратно.</p>
  <h3 id="XwcT">Но почему?</h3>
  <p id="whHV"><em>VSCode</em> быстрее и потребляет меньшее количество ресурсов. В моём случае (я работаю на 8ГБ оперативной памяти) это оказалось очень заметно. Первый процесс запуска проекта, вечные индексации и оперативная память на моём компьютере была полностью забита. Всё же, большинством функций в шторме я так и не воспользовался, а некоторые, требуемые для меня вещи, я так и не смог найти. <em>VSCode</em> расширяем и всегда можно найти необходимое расширение для решения проблемы, а в крайнем случае – написать самому 🙃</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="DRsa">💡<em>IDE</em> – комбайн из тысячи функций, в лучших случаях из которой вы будете пользоваться 20-30%. В редакторе кода, в свою очередь, вы полностью сами настраиваете свой workflow и не забираете лишний ресурс вашего компьютера </p>
  </section>
  <p id="uSDG">Для себя я выделил определённый стэк задач, в которых мне будет удобен <em>WebStorm</em> и ради которых я буду его запускать, но основной рабочий процесс я все-таки продолжу выполнять в <em>VSCode</em>. 3 года, потраченные на настройку и кастомизацию редактора под себя, позволяют решать большинство задач не задумываясь над сложностями, поскольку подобраны оптимальные хоткеи и расширения. </p>
  <p id="VF32"><strong>Вывод</strong> же из этого эксперимента такой: <em><strong>Выбирайте свой инструмент исходя из ваших необходимостей и ресурсов</strong></em>. Не надо гнаться за самыми современными решениями, так как не всегда профит от них будет вам полезен. Не слушайте людей, которые &quot;принуждают&quot; вас перейти на <em>WebStorm</em>, потому что он круче. Есть люди, которые до сих пор пользуются <em>Sublime Text</em> и от этого их продуктивность не страдает. Другой тип людей будет пользоваться <em>vim</em>-ом и говорить, что ничего удобнее до сих пор не придумали, но из-за нескольких примеров удобства данного инструмента вы можете приобрести кучу неудобств.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="j7Nd">Подписывайтесь на мой <a href="https://t.me/life_verstka" target="_blank">Telegram</a>, <a href="https://www.instagram.com/insuline.ru/" target="_blank">Instagram</a> и делитесь обратной связью.  Спасибо 😉</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/github-profile-to-portfolio</guid><link>https://teletype.in/@insuline/github-profile-to-portfolio?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/github-profile-to-portfolio?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Превращаем Github в портфолио</title><pubDate>Fri, 19 Feb 2021 12:39:01 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/67/c2/67c23613-07fe-4c5c-822b-31463fd87db0.png"></img>Наверное, все замечали, что в каждой социальной сети у тебя есть некоторое количество информации, которое позволяет тебе разместить информацию о себе. ]]></description><content:encoded><![CDATA[
  <p>Наверное, все замечали, что в каждой социальной сети у тебя есть некоторое количество информации, которое позволяет тебе разместить информацию о себе. </p>
  <p>Для примера, это Twitter, Instagram, Clubhouse, Telegram и т.д.</p>
  <p>Но ведь Github среди прочего тоже является социальной сетью, только вместо обмена фотографиями в Instagram – здесь мы обмениваемся кодом.</p>
  <p></p>
  <p>Так вот, почему бы не превратить наш Github в мини-портфолио? Страница нашего профиля будет включать в себя некоторые, по нашему мнению, важные пункты о нас, как о разработчике, и превью к профилю. </p>
  <p>Тем более, что Github в середине 2020 года зарелизили такой функционал. </p>
  <p></p>
  <h2>Сначала об ограничениях</h2>
  <p>Немного про Markdown. В нём отсутствует как таковая динамичность данных.  Обычно файлы включают в себя заголовки, какой-то текстовый контент, изображения (можно добавить анимацию с помощью GIF).</p>
  <p>Но что, если мы хотим реализовать динамичность в наших данных? Получать какие-то данные из API, обновлять информацию автоматически?</p>
  <p></p>
  <p>На помощь приходят <a href="https://github.com/features/actions" target="_blank">Github Actions.</a> Это пайплайны, которые позволяют разработчику автоматизировать процессы и задачи. В первой ревизии нашего портфолио мы обойдёмся статическим контентом, но после появления веб-интерфейса моего Telegram канала <a href="https://t.me/life_verstka" target="_blank">Вёрстка жизни,</a> я сделаю Github Action для автоматического добавления последних статей в моё README и опишу этот процесс отдельной статьёй 💁‍♂️</p>
  <p></p>
  <h2>Приступим к созданию репозитория</h2>
  <p>Первое, что нужно сделать – создать репозиторий, название которого совпадает с Вашим логином на Github. <a href="https://github.com/new" target="_blank">https://github.com/new</a></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/67/c2/67c23613-07fe-4c5c-822b-31463fd87db0.png" width="1562" />
    <figcaption>Github говорит нам, что мы нашли секрет платформы 🙈</figcaption>
  </figure>
  <p>Я указал, что данный репозиторий приватный, так как не хочу чтобы он появился на странице моего профиля до того, как я его доделаю. Можете оставить публичным и будете видеть результат сразу после коммитов.</p>
  <h2>Добавляем баннер</h2>
  <blockquote><em>Дисклеймер: дальнейшую идею оформления профиля я взял у <a href="https://github.com/braydoncoyer" target="_blank">Braydon Coyer</a>. Так же, другие примеры вы можете посмотреть на проекте <a href="https://awesomegithubprofile.tech/" target="_blank">Awesome Github Profiles</a>. Я понимаю, что копировать – плохо, поэтому если Braydon Coyer напишет мне по любому из контактов в профиле – я заменю стартовый баннер на</em> другой :)</blockquote>
  <p>Задача на этом этапе – сделать интересное приветствие посетителя. Вы можете указать здесь свою фотографию, просто представиться, но я решил использовать баннер. Процесс создания баннера – руководство к другой сфере, поэтому расскажу как добавить его в Ваш README.md файл. </p>
  <p>В корне репозитория добавляем директорию <code>assets,</code> в которой будут храниться все дополнительно требуемые ресурсы. В самом README.md указываем путь до изображения <code>![GitHub Header Banner](./assets/github-header.png)</code></p>
  <p><a href="https://github.com/insulineru/insulineru/commit/8644cadd77baa31763be7ac98cc3a78fd4eddb34" target="_blank">Коммитим.</a> </p>
  <h2>Добавляем бейджи других соц. сетей</h2>
  <p> Следующее, что я хочу сделать – указать контактные данные для связи со мной помимо стандартной почты в Github профиле.</p>
  <p>Для генерации бейджей воспользуемся <a href="https://shields.io/" target="_blank">Shields.io</a></p>
  <p>Я сделаю бейджи Instagram, Telegram, а так же счетчик посещений профиля.</p>
  <p>Бейдж для добавления Instagram с моей цветовой конфигурацией и описанием выглядит вот так:</p>
  <p><code>[![Instagram Badge](https://img.shields.io/badge/instagram-%23C44569.svg?&amp;style=for-the-badge&amp;logo=instagram&amp;logoColor=white)](https://www.instagram.com/elinoril1337/)</code></p>
  <p>Делаем остальные, <a href="https://github.com/insulineru/insulineru/commit/174fe9d564f92d1e240a2b423c21eb6fdf73835e" target="_blank">коммитим</a>!</p>
  <h2>Делаем блок с последними публикациями</h2>
  <p>Это тот самый блок, который в дальнейшем будет автоматизирован с помощью Github Actions. Но я хочу привлечь внимание к своим переведённым и написанным статьям уже прямо сейчас, поэтому пока сделаем этот блок статическим.</p>
  <p>Делаем блок в виде обычного списка с ссылками. </p>
  <p><code>## Последние посты 👀</code></p>
  <p><code>– [Превращаем Github профиль в портфолио](<a href="https://teletype.in/@life_verstka/github-profile-to-portfolio" target="_blank">https://teletype.in/@life_verstka/github-profile-to-portfolio</a>)</code></p>
  <p><code>– [6 полезных паттернов во Vue](<a href="https://teletype.in/@life_verstka/github-profile-to-portfolio" target="_blank">https://teletype.in/@life_verstka/6_vue_2_patterns</a>)</code></p>
  <p><code>– [Хотите сделать анимацию на сайте? Расскажу, как сделать это правильно](<a href="https://teletype.in/@life_verstka/good_css_animations" target="_blank">https://teletype.in/@life_verstka/good_css_animations</a>)</code></p>
  <p><a href="https://github.com/insulineru/insulineru/commit/d4284f228f09b217ef86293a3ac513750da0501f" target="_blank">Коммитим</a>!</p>
  <h2>Секция с навыками</h2>
  <p>Если вы собираетесь написать каждый, освоенный вами инструмент, с помощью списка, то это будет простыня текста, которую человек чаще всего просто проскроллит. </p>
  <p>Хорошим решением будут бейджи, которые мы использовали при оформлении соц. сетей. Но не надо делать все бейджи в единую кучу. </p>
  <p>Сделаем две секции – первая, в которой вы указываете активно используемые технологии. А уже во второй можно написать все инструменты, с которыми вы работали за свою карьеру. Но вторую часть мы не будем показывать всегда, а выделим в отдельный спойлер, который Markdown позволяет делать, за счёт своей привязанности к HTML.</p>
  <p>Полный код данной секции можно посмотреть в коммите, а здесь покажу с помощью чего мы реализуем выпадающую секцию</p>
  <p><code>&lt;details&gt;</code></p>
  <p><code>&lt;summary&gt;Все навыки &lt;/summary&gt;</code></p>
  <p><code>&lt;!-- Здесь скрытый по умолчанию контент --&gt;</code></p>
  <p><code>&lt;/details&gt;</code></p>
  <p><a href="https://github.com/insulineru/insulineru/commit/221d3b0577f803606b36d6b0ddf8445aa41da8f5" target="_blank">Коммитим</a> изменения!  </p>
  <h2>Заключение</h2>
  <p>Теперь, после того как описаны все основные секции, можно сделать репозиторий публичным. Мини-портфолио готово и в дальнейшем его можно улучшать и дополнять. Вы можете прикрутить статистику вашего профиля через <a href="https://github.com/anuraghazra/github-readme-stats" target="_blank">Github Readme Stats.</a> Можете выделить ваши самые достойные работы в отдельный блок либо сгенерировать какой-то контент и сделать его динамическим через Github Actions.</p>
  <figure class="m_column" data-caption-align="center">
    <img src="https://teletype.in/files/80/ac/80acc951-f0b5-4928-86a3-8ded3da81ab7.png" width="3584" />
    <figcaption>Такой вид профиля получился у меня :)</figcaption>
  </figure>
  <p data-align="center">Спасибо за прочтение! </p>
  <p data-align="center">Ещё больше контента по разработке, дизайну в моём Telegram канале по разработке – <a href="https://t.me/life_verstka" target="_blank">Вёрстка Жизни (life_verstka).</a> Удачи!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/6_vue_2_patterns</guid><link>https://teletype.in/@insuline/6_vue_2_patterns?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/6_vue_2_patterns?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>6 полезных паттернов во Vue</title><pubDate>Tue, 09 Feb 2021 20:36:48 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/07/c5/07c53abe-edf1-45ba-b28c-ea67518ed782.png"></img>Будем честны, чтение документации — не то, что любят разработчики в своей профессии. А зря, ведь при работе с современным фронтендом, а в особенности современными фреймворками, такими как Vue, React и т. д, которые постоянно развиваются, многие вещи могут меняться с каждым новым релизом. И вы, возможно, пропустили некоторые из новых и блестящих возможностей, которые были предоставлены после того, как вы впервые познакомились с фреймворком и прочитали документацию. Давайте посмотрим на очень интересные, но не популярные фичи.

Напомню, все предоставленные паттерны ниже являются частью официальной документации к Vue.]]></description><content:encoded><![CDATA[
  <p>Будем честны, чтение документации — не то, что любят разработчики в своей профессии. А зря, ведь при работе с современным фронтендом, а в особенности современными фреймворками, такими как Vue, React и т. д, которые постоянно развиваются, многие вещи могут меняться с каждым новым релизом. И вы, возможно, пропустили некоторые из новых и блестящих возможностей, которые были предоставлены после того, как вы впервые познакомились с фреймворком и прочитали документацию. Давайте посмотрим на очень интересные, но не популярные фичи.<br /><br />Напомню, все предоставленные паттерны ниже являются частью официальной документации к Vue.</p>
  <p></p>
  <h2>1. <a href="https://ru.vuejs.org/v2/guide/components-dynamic-async.html#%25D0%25A3%25D0%25BF%25D1%2580%25D0%25B0%25D0%25B2%25D0%25BB%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5-%25D1%2581%25D0%25BE%25D1%2581%25D1%2582%25D0%25BE%25D1%258F%25D0%25BD%25D0%25B8%25D0%25B5%25D0%25BC-%25D0%25B7%25D0%25B0%25D0%25B3%25D1%2580%25D1%2583%25D0%25B7%25D0%25BA%25D0%25B8" target="_blank">Управление состоянием загрузки</a></h2>
  <p></p>
  <p>В больших приложениях часто может понадобиться разделить приложение на более мелкие компоненты и загружать их с сервера только тогда, когда это необходимо. Чтобы упростить это, Vue позволяет определить ваш компонент как <em>фабрику</em><u>,</u> которая асинхронно загружает компонент. Vue будет триггерить фабрику только в тех случаях, когда компонент нуждается в отрисовке, а так же будет кэшировать результат для будущих ререндеров. </p>
  <p>Новым в версии 2.3 является то, что фабрика асинхронных компонентов может возвращать объект следующего формата: </p>
  <p><code>const AsyncComponent = () =&gt; ({<br />  // Загружаемый компонент (должен быть Promise)<br />  component: import(&#x27;./MyComponent.vue&#x27;),<br />  // Компонент, используемый во время загрузки необходимого<br />  loading: LoadingComponent,<br />  // Данный компонент отображается в том случае, если загрузка завершилась ошибкой<br />  error: ErrorComponent,<br />  // Задержка перед отображением loading компонента. По умолчанию 200мс.<br />  delay: 200,<br />  // Компонент error будет отображен, если таймаут существует и превышен. По умолчанию отсутствует.<br />  timeout: 3000<br />})</code></p>
  <p>При таком подходе у вас есть дополнительные опции состояния загрузки и ошибок, задержки при загрузке компонентов и тайм-аута.</p>
  <p></p>
  <h2>2. <a href="https://ru.vuejs.org/v2/guide/components-edge-cases.html#%25E2%2580%259C%25D0%2594%25D0%25B5%25D1%2588%25D1%2591%25D0%25B2%25D1%258B%25D0%25B5%25E2%2580%259D-%25D1%2581%25D1%2582%25D0%25B0%25D1%2582%25D0%25B8%25D1%2587%25D0%25B5%25D1%2581%25D0%25BA%25D0%25B8%25D0%25B5-%25D0%25BA%25D0%25BE%25D0%25BC%25D0%25BF%25D0%25BE%25D0%25BD%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B-%25D1%2581-%25D0%25BF%25D0%25BE%25D0%25BC%25D0%25BE%25D1%2589%25D1%258C%25D1%258E-v-once" target="_blank">«Дешёвые» статические компоненты с помощью v-once</a></h2>
  <p></p>
  <p>Рендеринг простых HTML-элементов очень быстр во Vue, но иногда у вас может быть компонент, который содержит большое количество статического контента. В этих случаях вы можете убедиться, что он вычисляется только один раз, а затем кэшируется, добавив директиву v-once к корневому элементу.</p>
  <p>Пример кода:</p>
  <p><code>Vue.component(&#x27;terms-of-service&#x27;, {<br />  template: <br />    &lt;div v-once&gt;<br />      &lt;h1&gt;Правила использования&lt;/h1&gt;<br />      ... огромное полотно статического контента ...<br />    &lt;/div&gt;<br />})</code></p>
  <p></p>
  <h2>3. <a href="https://ru.vuejs.org/v2/guide/components-edge-cases.html#%25D0%25A0%25D0%25B5%25D0%25BA%25D1%2583%25D1%2580%25D1%2581%25D0%25B8%25D0%25B2%25D0%25BD%25D1%258B%25D0%25B5-%25D0%25BA%25D0%25BE%25D0%25BC%25D0%25BF%25D0%25BE%25D0%25BD%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B" target="_blank">Рекурсия в компонентах</a></h2>
  <p></p>
  <p>Компоненты могут рекурсивно вызывать себя в своём собственном шаблоне. Единственное НО, они могут сделать это только, если имеют параметр name.</p>
  <p>Если не быть осторожным, рекурсивные компоненты также могут привести к бесконечным циклам:</p>
  <p><code>name: &#x27;stack-overflow&#x27;,<br />template: &#x27;&lt;div&gt;&lt;stack-overflow&gt;&lt;/stack-overflow&gt;&lt;/div&gt;&#x27;</code></p>
  <p>Компонент из примера выше, приведет к ошибке «Max stack size exceeded», поэтому убедитесь, что рекурсивный вызов является условным (т. е. использует v-if, который в конечном счёте окажется в значении <code>false</code>)</p>
  <p></p>
  <h2>4. <a href="https://ru.vuejs.org/v2/guide/custom-directive.html#%25D0%2594%25D0%25B8%25D0%25BD%25D0%25B0%25D0%25BC%25D0%25B8%25D1%2587%25D0%25B5%25D1%2581%25D0%25BA%25D0%25B8%25D0%25B5-%25D0%25B0%25D1%2580%25D0%25B3%25D1%2583%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D1%258B-%25D0%25B4%25D0%25B8%25D1%2580%25D0%25B5%25D0%25BA%25D1%2582%25D0%25B8%25D0%25B2%25D1%258B" target="_blank">Динамические аргументы директивы.</a></h2>
  <p><br />Аргументы директивы могут быть динамическими. Например, в <code>v-mydirective:[аргумент]=&quot;значение&quot;</code>, аргумент может быть обновлен на основе свойств данных в нашем экземпляре компонента! Это делает наши пользовательские директивы гибкими для использования во всем нашем приложении.<br />Вот директива, где динамический аргумент может быть обновлен для каждого экземпляра компонента:</p>
  <p><code>&lt;div id=&quot;dynamicexample&quot;&gt;<br />  &lt;h3&gt;Scroll down inside this section ↓&lt;/h3&gt;<br />  &lt;p v-pin:[direction]=&quot;200&quot;&gt;I am pinned onto the page at 200px to the left.&lt;/p&gt;<br />&lt;/div&gt;<br />Vue.directive(&#x27;pin&#x27;, {<br />  bind: function (el, binding, vnode) {<br />    el.style.position = &#x27;fixed&#x27;<br />    var s = (binding.arg == &#x27;left&#x27; ? &#x27;left&#x27; : &#x27;top&#x27;)<br />    el.style[s] = binding.value + &#x27;px&#x27;<br />  }<br />})</code></p>
  <p><code>new Vue({<br />  el: &#x27;#dynamicexample&#x27;,<br />  data: function () {<br />    return {<br />      direction: &#x27;left&#x27;<br />    }<br />  }<br />})</code></p>
  <p></p>
  <h2>5. <a href="https://ru.vuejs.org/v2/guide/render-function.html#%25D0%25A1%25D0%25BE%25D0%25B1%25D1%258B%25D1%2582%25D0%25B8%25D1%258F-%25D0%25B8-%25D0%25BC%25D0%25BE%25D0%25B4%25D0%25B8%25D1%2584%25D0%25B8%25D0%25BA%25D0%25B0%25D1%2582%25D0%25BE%25D1%2580%25D1%258B-%25D0%25BA%25D0%25BB%25D0%25B0%25D0%25B2%25D0%25B8%25D1%2588" target="_blank">События и модификаторы клавиш</a></h2>
  <p></p>
  <p>Для <code>.passive, .capture, .once</code> Vue предлагает префиксы, которые могут быть использованы с <code>on</code>:</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/07/c5/07c53abe-edf1-45ba-b28c-ea67518ed782.png" width="298" />
  </figure>
  <p>Пример: </p>
  <p><code>on: {<br />  &#x27;!click&#x27;: this.doThisInCapturingMode,<br />  &#x27;keyup&#x27;: this.doThisOnce,<br />  &#x27;!mouseover&#x27;: this.doThisOnceInCapturingMode<br />}</code></p>
  <p>Для всех остальных событий и модификаторов клавиш не требуются префиксы, так как в обработчике можно использовать методы событий:</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/54/8e/548e2f9c-947a-4270-b85b-b061f9f4297e.png" width="728" />
  </figure>
  <h2>6. <a href="https://ru.vuejs.org/v2/guide/components-edge-cases.html#%25D0%2592%25D0%25BD%25D0%25B5%25D0%25B4%25D1%2580%25D0%25B5%25D0%25BD%25D0%25B8%25D0%25B5-%25D0%25B7%25D0%25B0%25D0%25B2%25D0%25B8%25D1%2581%25D0%25B8%25D0%25BC%25D0%25BE%25D1%2581%25D1%2582%25D0%25B5%25D0%25B9" target="_blank">Внедрение зависимостей (Provide/Inject)</a></h2>
  <p></p>
  <p>Есть несколько способов заставить два компонента общаться в Vue с преимуществами и недостатками в каждом из них. Новый способ, введенный в версию 2.2 — это использование внедрения зависимостей с помощью Provide/Inject.<br /><br />Эта пара опций используется вместе, чтобы позволить компоненту-предку передавать данные для всех его потомков, независимо от того, насколько глубока иерархия компонентов, до тех пор, пока они находятся в одной и той же родительской цепи. Если вы знакомы с React, но это очень похоже на фичу React Context.</p>
  <p>Пример:</p>
  <p><code>// родитель передает &#x27;foo&#x27;<br />const Provider = {<br />  provide: {<br />    foo: &#x27;bar&#x27;<br />  },<br />  // ...<br />}</code></p>
  <p><code>// дочерний компонент получает &#x27;foo&#x27;<br />const Child = {<br />  inject: [&#x27;foo&#x27;],<br />  created () {<br />    console.log(this.foo) // =&gt; &quot;bar&quot;<br />  }<br />  // ...<br />}</code></p>
  <h2>Заключение</h2>
  <p></p>
  <p>Всегда быть в курсе событий – это тяжело и требует времени. Лучший способ делать это – следить за оффициальным аккаунтом Vue в твиттере, читать оффициальные релизы версий и отслеживать публикации по Vue на профильных ресурсах, таких как мой канал <a href="http://t.me/life_verstka" target="_blank">@life_verstka.</a> </p>
  <p>Кроме того, сейчас вышел Vue 3 с массой новых функций, с которыми вы, возможно, захотите ознакомиться перед миграцией ваших проектов.</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/d6/1c/d61c9366-ebe6-4e38-9a1d-c753a20642df.jpeg" width="1413" />
  </figure>
  <p><a href="https://medium.com/js-dojo/7-vue-patterns-that-you-should-be-using-more-often-b13cde4d2ae6" target="_blank">Источник</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@insuline/good_css_animations</guid><link>https://teletype.in/@insuline/good_css_animations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline</link><comments>https://teletype.in/@insuline/good_css_animations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=insuline#comments</comments><dc:creator>insuline</dc:creator><title>Хотите сделать анимацию на сайте? Расскажу как сделать это правильно</title><pubDate>Fri, 05 Feb 2021 13:19:19 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/12/0a/120a2925-d47f-4b4d-afd5-10e88a3b2d4c.gif"></img>На протяжении нескольких лет я занимаюсь разработкой веб-интерфейсов.  И всё чаще в дизайн начинают приходить веб-анимации. ]]></description><content:encoded><![CDATA[
  <p>На протяжении нескольких лет я занимаюсь разработкой веб-интерфейсов.  И всё чаще в дизайн начинают приходить веб-анимации. </p>
  <p>Цель статьи: рассказать разработчикам, собирающимся работать с анимациями, о том, что не обязательно использовать какие-то специальные JS библиотеки, которые волшебным образом решают проблемы с анимацией. По большей части, можно полностью обходиться современными возможностями браузеров, такими как GPU Rendering и CSS3 Spec.</p>
  <p></p>
  <p>В разработке анимаций нет «идеального решения», кроме того приходится тратить часть времени на их тестирование и оптимизацию. Но за продолжительное время работы с ними был придуман ряд принципов дизайна и разработки, которые, ИМХО, приводят к хорошим анимациям. Эти методы позволят вам получить на странице гладкое поведение, обеспечить работу во всех современных браузерах (конечно, мобильных и десктопных), и — самое главное — простых в поддержке.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/12/0a/120a2925-d47f-4b4d-afd5-10e88a3b2d4c.gif" width="735" />
  </figure>
  <p>Технологии и способ внедрения может немного различаться для всех, но общие принципы должны быть полезны практически в любой ситуации.</p>
  <p></p>
  <h2>Что же такое анимация?</h2>
  <figure class="m_column">
    <img src="https://teletype.in/files/44/72/447225db-36b6-4155-8450-fe6b8294751f.png" width="900" />
  </figure>
  <p>Анимации существовали еще до появления интернета, а сделать её красивой — занимало времени примерно столько же, сколько сейчас нужно для освоения фронтенда. Но тем не менее, существуют некоторые ограничения и трудности для их использования в интернете.<br /><br />Для плавной 60 fps картинки каждый кадр должен быть отрендерен менее, чем за 16 мс. Это не большое количество времени, поэтому нужно искать эффективные способы рендеринга каждого кадра для «гладкой» картинки.</p>
  <p></p>
  <figure class="m_column" data-caption-align="center">
    <img src="https://teletype.in/files/11/23/1123178b-97e3-4573-b388-93361c9c0bdc.gif" width="600" />
    <figcaption><a href="http://the12principles.tumblr.com/" target="_blank">12 принципов классической анимации</a></figcaption>
  </figure>
  <p>Есть множество способов достичь анимации в вебе. Один из способов – <strong>кинополоска</strong> (filmstrip), подход придуманный задолго до первых страниц, при котором немного другой кадр, нарисованный вручную, сменяется. </p>
  <p>Таким подходом <a href="https://www.apple.com/iphone-12/" target="_blank">пользуется Apple</a> на своих промо-страницах. </p>
  <p>Твиттер так же недавно использовал этот подход для своей новой анимации лайка, перелистывая спрайт кадров.</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/be/f9/bef995b4-5e35-40ce-8a25-1b6621f22999.png" width="800" />
  </figure>
  <p>Да, такой эффект можно повторить CSS-анимациями множеством крошечных элементов, либо SVG анимациями, но это было бы неоправданно сложным и, вполне вероятно, не так гладко бы выглядело.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/7f/40/7f4016b9-3a2d-4219-a63f-3f3d835ebaf2.gif" width="480" />
  </figure>
  <p>В большинстве случаев, вы захотите использовать CSS переходы для автоматической анимации элемента при его изменении. Эта техника называется «<strong>tweening</strong>» — переход между двумя элементами (beTWEEN). Преимущество данного подхода в том, что он легко отменяется или возвращается без необходимости строить логику. Это идеально подходит для анимаций в стиле «сделал и забыл». Например, для появления секций или простых взаимодействий, как <code>hover</code> и т. д.</p>
  <blockquote>Дополнительное чтение: <a href="https://blog.alexmaccaw.com/css-transitions" target="_blank">Все, что вы должны знать о CSS анимациях.</a></blockquote>
  <p></p>
  <p>В других случаях keyframe-based анимации могут стать идеальным решением для непрерывной работы деталей фона. Например, вращающийся loader.</p>
  <p></p>
  <p>Итак, вот несколько советов, которые должны улучшить производительность ваших анимаций:</p>
  <h2>1. Не меняйте никаких свойств, кроме opacity и transform</h2>
  <p><em>Даже если ты думаешь, что это нормально – не надо :)</em></p>
  <p>Один этот принцип может стоить вам 80% производительности вашего проекта, в т.ч. на мобильных устройствах. Вы, наверное, уже слышали этот принцип раньше – это часто упоминается во всех мануалах, но далеко не каждый веб-разработчик её соблюдает. </p>
  <p>Это правило довольно просто выполняется и как только вы привыкнете к этому, то даже перестанете задумываться. Например, если вы хотите уменьшить размер элемента – не надо трогать его <code>width</code> и <code>height</code>, когда можно использовать <code>transform: scale().</code> А если вдруг вы хотите передвинуть элемент – вполне можно обойтись без изменения марджинов тем же трансформом. </p>
  <h3>Почему это работает?</h3>
  <p>Для человека изменение ширины, отступа или других свойств может показаться несущественным и даже предпочтительным, так как эти свойства проще. Но с точки зрения того, что браузер должен сделать &quot;под капотом&quot; для правильного изменения этих свойств – это огромная работа. </p>
  <p>Команды браузеров проделали огромную работу по оптимизации работы <code>transform</code> и данное решение вполне простое и эффективное, ведь в множестве случаев позволяет использовать преимущества видеокарты без ре-рендера элементов. Да, вы можете использовать <code>border-radius</code>, загрузить кучу изображений и поставить каждой размытие с <code>box-shadow,</code> но делайте это лишь один раз, при первоначальном рендере страницы. После этого при каждом изменении упомянутых выше свойств браузер насчет перерасчёт всей страницы, что может повлиять на появление лагов. </p>
  <blockquote>Дополнительное чтение: <a href="https://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/" target="_blank">Передвигайте элементы через translate (Paul Irish)</a></blockquote>
  <p></p>
  <h2>2. Скрывайте содержимое правильно</h2>
  <p>Используйте <code>pointer-events: none</code>, когда убираете прозрачность у элементов. </p>
  <p>Давным-давно, когда анимации делали через jQuery <code>animate(),</code> большая часть проблем была связана с кликабельностью элементов во время анимаций, так как все анимации были завязаны на изменении opacity и дальнейшем <code>display: none</code> у элементов. В итоге из-за рассинхронизации, на страницах был момент, когда есть большой пустой (прозрачный) кликабельный блок при анимации скрытия/появления элемента. А после каждой анимации приходилось делать колбек. </p>
  <p>CSS-свойство <code>pointer-events</code> в основном используется для того, чтобы элемент переставал реагировать на клики или любые другие взаимодействия. Его легко можно включить/выключить с помощью CSS, не прерывая анимацию и не влияя на рендеринг элемента. Это прекрасно работает с абсолютно позиционированными элементами, потому что вы можете быть уверены, что они не оказывает абсолютно никакого влияния на странице. </p>
  <p></p>
  <h2>3. Не анимируйте все единовременно</h2>
  <p><em>Лучше постройте композицию.</em></p>
  <p>Одна анимация может быть гладкой сама по себе, но множество таких анимаций запущенных единовременно могут привести к проблемам с композицией. Поэтому важно их правильно спланировать. </p>
  <p>Лучше всего распределить время так, чтобы одновременно не выполнялось более 3 анимаций на сайте. Если на вашей странице не одна анимация – стоит задуматься над их композицией. Хоть, каждая анимация – это отдельный элемент, вместе они образуют систему. И у любого элемента система должно быть своё направление и своё время исполнения, чтобы не ломать остальное.</p>
  <p>В Material Design гайдах от Гугла концепция правильно выстроенных анимаций называется хореографией, хоть это и танцевальный термин. </p>
  <p>Это не единственный способ правильной работы над анимациями, а та часть, над которой нужно думать при разработке и тестировать. </p>
  <figure class="m_column">
    <img src="https://teletype.in/files/03/9b/039b271d-df5e-4d09-adff-4dfba92be98e.png" width="1648" />
  </figure>
  <blockquote>Дополнительное чтение: <a href="https://material.io/design/motion/choreography.html#sequencing" target="_blank">Material Design – Motion</a>.</blockquote>
  <p></p>
  <h2>4. Незначительные задержки перехода улучшают общую композицию анимаций</h2>
  <p>Композиция анимаций действительно важна и потребует много экспериментов, чтобы почувствовать себя правильно. Однако код для этого не должен быть очень сложным. Обычно, можно изменением одного класса (часто это может быть класс на <code>body</code>), вызвать кучу переходов, каждый из которых будет иметь свои собственные переменные задержки перехода, чтобы завершиться в нужное время. С точки зрения кода, вы просто должны побеспокоиться об одном изменении состояния, а не поддерживать десятки таймингов внутри вашего JS.</p>
  <figure class="m_column" data-caption-align="center">
    <img src="https://teletype.in/files/aa/28/aa283bb5-bcb3-4370-8d5a-ef3c47488e50.gif" width="820" />
    <figcaption>Пример анимации с композицией</figcaption>
  </figure>
  <p>Важно распределить анимации в серии так, чтобы это было похоже на непрерывный поток, а не на цепочку отдельных вещей. </p>
  <h3>Пример кода</h3>
  <p>Есть пара простых приёмов для анимации серии элементов – особенно если это список. Если в нём статическое количество элементов, то можно обойтись всего лишь SASS миксином.</p>
  <p><code>@for $i from 1 through 7 {<br />    &amp;:nth-child(#{$i}) {<br />        .loaded &amp; {<br />            .text {<br />                transition-delay: 500 + (42ms * $i);<br />            }<br />        }<br />    }<br />}</code></p>
  <p>Для длинных списков или динамического контента, тайминги можно устанавливать с помощью JS и таких же циклов по каждому элементу. </p>
  <p><code>const baseDelay = 350<br />const randomDelay = 64<br />document.querySelectorAll(&#x27;.reports li&#x27;).forEach((item, index) =&gt; {<br />  setTimeout(() =&gt; {<br />    item.classList.add(&#x27;showing&#x27;)<br />  }, baseDelay + randomDelay * index)<br />})</code></p>
  <p>Обычно в данных циклах есть две переменные: базовая задержка и затем временная задержка между каждым элементом. Это хитрый баланс, который нужно найти, но когда вы достигнете необходимых значений, то быстро почувствуете себя Motion-гением.</p>
  <p></p>
  <h2>6. Используйте глобальные модификаторы для замедленного режима</h2>
  <p><em>Но не забывайте после этого обратно ускорить :)</em></p>
  <p>В разработке анимаций правильно подобранное время – это всё. Лишь 20% времени вы будете что-то создавать и реализовывать, а оставшиеся 80% будут заключаться в поиске правильных параметров и анимаций, чтобы все анимации были синхронизированы и плавными.</p>
  <p>Особенно, когда вы работаете над хореографией нескольких элементов и пытаетесь получить производительность и параллельность на странице, видеть всё это в замедленном режиме гораздо проще.</p>
  <p>Вне зависимости от синтаксиса написания ваших анимаций (CSS, SASS, JS) это не так тяжело реализовать с помощью небольшой помощи математики и использования переменных. </p>
  <p>Например, если анимация имеет подвисания даже на скорости в 10x раз меньше, то возможно вы делаете что-то не так. Если же при замедлении в 50x раз анимация идёт плавно, то остаешься лишь определить максимальную скорость, при которой она будет работать. Может быть трудно заметить проблемы в производительности на полной скорости, но если вы замедлите все анимации, то проблемы становятся очевидными. </p>
  <p></p>
  <h2>6. Сетевые запросы могут вызывать лаги</h2>
  <p><em>Поэтому не забывайте о предзагрузке данных или откладывайте большие HTTP запросы</em></p>
  <p>Изображения являются большим виновником данного пункта, будь то несколько больших картинок (фоновые изображения) или множество маленьких (иконки, аватарки и т.д.), или же просто большое количество контента. </p>
  <p>Когда страница загружается первый раз – происходит инициализация и загрузка множества вещей. Наличие аналитики, рекламы и других сторонних скриптов делает это ещё хуже. Иногда задержка всех анимаций всего на несколько сотых мс после загрузки творит чудеса с производительностью. </p>
  <p>Не усложняйте оптимизацию данного пункта, пока это не станет необходимым, но сложная страница может потребовать очень точных задержек и таймингов контента для бесперебойной работы. </p>
  <p>В общем и целом, вам нужно сначала загрузить как можно меньше данных, а затем продолжить загрузку остальной части страницы после завершения первых анимаций (к примеру, первый экран лендинга).</p>
  <p>На страницах с большим количеством контента работа по загрузке этих данных может быть очень требовательной. Анимация, которая хорошо работает с статическим контентом, может начать разваливаться если в неё загружать динамические данные. Если вам кажется, что анимация должна работать, а стабильно работает она не всегда – я бы посоветовал проверить во время выполнения вкладку Network в браузере, чтобы убедиться, что вы не занимаетесь загрузкой данных и другой сложной работой в браузере в это время.</p>
  <p></p>
  <h2>7. Не привязывайте анимацию напрямую к скроллу</h2>
  <p><em>Вроде идея звучит круто, но это не совсем так</em></p>
  <p>За последние несколько лет анимация на основе прокрутки иногда приобретает большую популярность, особенно с использованием параллакса или некоторых других специальных эффектов. Являются ли эти анимации хорошим дизайном, остается предметом споров, но есть лучшие и худшие способы их технической реализации.</p>
  <p>Достаточно эффективный способ сделать что-то из этой категории – рассматривать достижение определенного расстояния прокрутки как событие - и просто запускать анимацию один раз. Если вы действительно не знаете, что делаете, я бы посоветовал избегать этой категории, поскольку в ней очень легко ошибиться и ее очень трудно поддерживать.</p>
  <p>Худшим вариантом является создание собственного функционала скролла. Так называемый <code>scrolljacking.</code> <strong>Пожалуйста, не делайте этого на своих сайтах.</strong></p>
  <p>Это одно из тех правил, которые особенно полезны на мобильных устройствах. Так же, кастомный скролл – это анти user experience паттерн. </p>
  <p>Если же в вашем проекте это обязательно – сначала создайте быстрый прототип, чтобы убедиться в нормальной производительности вашего решения, перед тем как тратить время на разработку анимаций.</p>
  <blockquote>Дополнительное чтение: <a href="https://medium.com/@paonecreative_87456/scrolljacking-the-usability-nightmare-2a5bbb4273d0" target="_blank">Scrolljacking – кошмар для вашего UX</a></blockquote>
  <p></p>
  <h2>8. Проверяйте на мобильных как можно раньше и чаще</h2>
  <p>Большинство веб-сайтов создаются на компьютере и, вероятно, чаще всего тестируются на том же компьютере, на котором они разработаны. Таким образом, мобильные возможности и производительность анимаций часто остаются в тени. Некоторые технологии (например, canvas) или методы анимаций могут не работать на мобильных устройствах.</p>
  <p>Однако, при правильной разработке и оптимизации (см. 1 пункт) работа на мобильных устройствах может быть даже более плавной, чем на компьютере. Когда-то мобильная оптимизация была очень сложной задачей, но теперь новые iPhone работают быстрее, чем большинство ноутбуков! Если вы следовали всем предыдущим советам, то вполне возможно, что у вас сразу же появится отличная мобильная производительность. </p>
  <p>Мобильный UX будет большой и важной частью практически любого сайта. Это может показаться странным, но я бы посоветовал вам просматривать ваш сайт какое-то время только с смартфона. Принуждение к использованию только мобильной версии не должно восприниматься как наказание. </p>
  <p>Продолжайте улучшать дизайн и повышать производительность мобильной версии, пока она не станет такой же безупречной и удобной, как десктопная версия вашего сайта. </p>
  <p></p>
  <h2>9. Тестируйте на разных устройствах</h2>
  <p><em>Размер экрана, плотность и устройство могут иметь большое значение</em></p>
  <p>Помимо мобильных устройств и компьютеров существует множество факторов, которые могут существенно повлиять на производительность. Например, является ли экран ретиной, общее количество пикселей в окне, какая ОС установлена и т.д.</p>
  <p>Несмотря на то, что Chrome, Safari и Edge являются браузерами на основе Webkit с аналогичным синтаксом, у каждого из них есть свои особенности. </p>
  <p>Каждое обновление Chrome может что-то исправить и внести новые ошибки, поэтому нужно постоянно следить за изменениями.</p>
  <p>Я регулярно переключаюсь между своим настольным ПК на Windows 10, рабочим Macbook Pro и iPad с iPhone. Каждый цикл переключения по своим сайтам может выявить проблемы и улучшения, которые необходимо внести – часто это производительность оптимизации, но также это могут быть общий дизайн сайта, шрифты, плотность информации и т.д.</p>
  <p>Медиа-запросы могут быть действительно мощными инструментами для работы с этими разными сегментами. Изменение стилей в зависимости от ширины экрана – типичное использование медиа-запросов, но их также можно использовать для таргетинга по плотности пикселей или другим свойствам. </p>
  <blockquote><a href="https://blog.gyrosco.pe/smooth-css-animations-7d8ffc2c1d29#.t6img0c0u" target="_blank">Источник</a></blockquote>
  <p></p>
  <hr />
  <p></p>
  <hr />
  <figure class="m_original">
    <img src="https://teletype.in/files/b6/c5/b6c54268-48a6-4462-842f-09bf29d106c4.gif" width="1152" />
  </figure>
  <p data-align="center">Надеюсь, что эти техники будут полезны вам в разработке ваших следующих проектов, а так же в поддержке текущих. Ещё больше контента по разработке, дизайну в моём авторском Telegram канале по разработке – <a href="https://t.me/life_verstka" target="_blank">Вёрстка Жизни (life_verstka).</a> Удачи!</p>

]]></content:encoded></item></channel></rss>