<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Кирилл Морозов</title><author><name>Кирилл Морозов</name></author><id>https://teletype.in/atom/fidget</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/fidget?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@fidget?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=fidget"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/fidget?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-14T14:32:10.418Z</updated><entry><id>fidget:js-proxy-use-cases</id><link rel="alternate" type="text/html" href="https://teletype.in/@fidget/js-proxy-use-cases?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=fidget"></link><title>Proxy в Javascript: Что за зверь. Use cases (сценарии использования)</title><published>2024-10-16T22:26:11.333Z</published><updated>2024-10-16T22:26:11.333Z</updated><summary type="html">В JavaScript Proxy — это объект, который перехватывает операции с другим объектом, известным как целевой объект (target). Это мощный инструмент для добавления поведения или проверки доступа к объектам.</summary><content type="html">
  &lt;p id=&quot;sHe9&quot;&gt;В JavaScript &lt;code&gt;Proxy&lt;/code&gt; — это объект, который перехватывает операции с другим объектом, известным как &lt;strong&gt;целевой объект&lt;/strong&gt; (target). Это мощный инструмент для добавления поведения или проверки доступа к объектам.&lt;/p&gt;
  &lt;p id=&quot;TeED&quot;&gt;Ниже приведены несколько примеров использования (use cases) &lt;code&gt;Proxy&lt;/code&gt;:&lt;/p&gt;
  &lt;h2 id=&quot;7Zx9&quot;&gt;Валидация данных&lt;/h2&gt;
  &lt;p id=&quot;mcOz&quot;&gt;&lt;code&gt;Proxy&lt;/code&gt; можно использовать для проверки данных перед их установкой в объект.&lt;/p&gt;
  &lt;pre id=&quot;VQs8&quot; data-lang=&quot;javascript&quot;&gt;const user = {
  name: &amp;#x27;John&amp;#x27;,
  age: 25
};

const proxyUser = new Proxy(user, {
  set(target, property, value) {
    if (property === &amp;#x27;age&amp;#x27; &amp;amp;&amp;amp; typeof value !== &amp;#x27;number&amp;#x27;) {
      throw new Error(&amp;#x27;Age must be a number&amp;#x27;);
    }
    target[property] = value;
    return true;
  }
});

proxyUser.age = 30;  // Всё нормально
proxyUser.age = &amp;#x27;thirty&amp;#x27;;  // Ошибка: Age must be a number&lt;/pre&gt;
  &lt;p id=&quot;xqYH&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Cc8q&quot;&gt;Логирование операций&lt;/h2&gt;
  &lt;p id=&quot;R1RR&quot;&gt;&lt;code&gt;Proxy&lt;/code&gt; можно использовать для ведения журнала всех действий, происходящих с объектом.&lt;/p&gt;
  &lt;pre id=&quot;8GHF&quot; data-lang=&quot;javascript&quot;&gt;const product = {
  name: &amp;#x27;Laptop&amp;#x27;,
  price: 1000
};

const proxyProduct = new Proxy(product, {
  get(target, property) {
    console.log(&amp;#x60;Accessed property: ${property}&amp;#x60;);
    return target[property];
  },
  set(target, property, value) {
    console.log(&amp;#x60;Set property ${property} to ${value}&amp;#x60;);
    target[property] = value;
    return true;
  }
});

console.log(proxyProduct.name);  // Логирует доступ к свойству &amp;quot;name&amp;quot;
proxyProduct.price = 1200;  // Логирует изменение свойства &amp;quot;price&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;qAiV&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;8e8H&quot;&gt;Ограничение доступа&lt;/h2&gt;
  &lt;p id=&quot;8U2b&quot;&gt;Можно использовать &lt;code&gt;Proxy&lt;/code&gt; для ограничения доступа к определённым свойствам объекта.&lt;/p&gt;
  &lt;pre id=&quot;O9j5&quot; data-lang=&quot;javascript&quot;&gt;const secretData = {
  username: &amp;#x27;admin&amp;#x27;,
  password: &amp;#x27;1234&amp;#x27;
};

const proxySecretData = new Proxy(secretData, {
  get(target, property) {
    if (property === &amp;#x27;password&amp;#x27;) {
      throw new Error(&amp;#x27;Access to password is denied&amp;#x27;);
    }
    return target[property];
  }
});

console.log(proxySecretData.username);  // &amp;#x27;admin&amp;#x27;
console.log(proxySecretData.password);  // Ошибка: Access to password is denied&lt;/pre&gt;
  &lt;p id=&quot;Nrhr&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;gqHK&quot;&gt;Автоматическое создание свойств&lt;/h2&gt;
  &lt;p id=&quot;CyWB&quot;&gt;&lt;code&gt;Proxy&lt;/code&gt; может быть использован для автоматического создания свойств объекта при обращении к ним.&lt;/p&gt;
  &lt;pre id=&quot;8YVf&quot; data-lang=&quot;javascript&quot;&gt;const data = {};

const proxyData = new Proxy(data, {
  get(target, property) {
    if (!(property in target)) {
      target[property] = 0;  // Если свойства нет, создать его с начальным значением 0
    }
    return target[property];
  }
});

console.log(proxyData.counter);  // Выведет 0, даже если свойства &amp;quot;counter&amp;quot; не было
proxyData.counter += 1;
console.log(proxyData.counter);  // Выведет 1&lt;/pre&gt;
  &lt;p id=&quot;tU9G&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;nNoo&quot;&gt;Наблюдение за изменениями&lt;/h2&gt;
  &lt;p id=&quot;886a&quot;&gt;&lt;code&gt;Proxy&lt;/code&gt; можно использовать для отслеживания изменений в объекте.&lt;/p&gt;
  &lt;pre id=&quot;vInO&quot; data-lang=&quot;javascript&quot;&gt;const user = {
  name: &amp;#x27;Alice&amp;#x27;,
  age: 30
};

const handler = {
  set(target, property, value) {
    console.log(&amp;#x60;Property ${property} was changed from ${target[property]} to ${value}&amp;#x60;);
    target[property] = value;
    return true;
  }
};

const proxyUser = new Proxy(user, handler);

proxyUser.name = &amp;#x27;Bob&amp;#x27;;  // Логирует изменение имени с &amp;#x27;Alice&amp;#x27; на &amp;#x27;Bob&amp;#x27;
proxyUser.age = 35;      // Логирует изменение возраста с 30 на 35&lt;/pre&gt;
  &lt;p id=&quot;l9gj&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ahMw&quot;&gt;Псевдомассив с отрицательными индексами&lt;/h2&gt;
  &lt;p id=&quot;c5So&quot;&gt;Proxy может расширить функциональность массивов, добавив поддержку отрицательных индексов.&lt;/p&gt;
  &lt;pre id=&quot;6N6x&quot; data-lang=&quot;javascript&quot;&gt;const array = [1, 2, 3, 4, 5];

const proxyArray = new Proxy(array, {
  get(target, property) {
    const index = Number(property);
    if (index &amp;lt; 0) {
      return target[target.length + index];
    }
    return target[property];
  }
});

console.log(proxyArray[-1]);  // 5 (последний элемент массива)
console.log(proxyArray[-2]);  // 4&lt;/pre&gt;
  &lt;p id=&quot;S3ES&quot;&gt;Эти примеры показывают, как &lt;code&gt;Proxy&lt;/code&gt; может быть использован для валидации, логирования, ограничения доступа, создания новых свойств и расширения функционала объектов и массивов в JavaScript.&lt;/p&gt;
  &lt;p id=&quot;1OPk&quot;&gt;А как вы используете &lt;code&gt;Proxy&lt;/code&gt;?&lt;/p&gt;

</content></entry><entry><id>fidget:kak-proverit-peredannye-dannye-v-ng-content</id><link rel="alternate" type="text/html" href="https://teletype.in/@fidget/kak-proverit-peredannye-dannye-v-ng-content?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=fidget"></link><title>ANGULAR: КАК ПРОВЕРИТЬ ПЕРЕДАННЫЕ ДАННЫЕ В NG-CONTENT</title><published>2024-06-07T09:17:33.761Z</published><updated>2024-07-14T12:19:35.920Z</updated><category term="angular" label="Angular"></category><summary type="html">Иногда возникает задача с проверкой пришли ли данные в ng-content компонента или нет.</summary><content type="html">
  &lt;p id=&quot;1P8C&quot;&gt;Иногда возникает задача с проверкой пришли ли данные в ng-content компонента или нет.&lt;/p&gt;
  &lt;p id=&quot;iYVw&quot;&gt;Например у нас есть такой шаблон компонента:&lt;/p&gt;
  &lt;pre id=&quot;imNX&quot; data-lang=&quot;html&quot;&gt;&amp;lt;div class=&amp;quot;block&amp;quot;&amp;gt;
    &amp;lt;div *ngIf=&amp;quot;title&amp;quot; class=&amp;quot;block__title&amp;quot; innterHtml=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;block__body&amp;quot;&amp;gt;
        &amp;lt;ng-content&amp;gt;&amp;lt;/ng-content&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;pJKS&quot;&gt;Проблема в то сто если мы ничего не передали в ng-content то обёртка &lt;code&gt;.block__body&lt;/code&gt; все равно отобразится, чего не хотелось бы.&lt;/p&gt;
  &lt;p id=&quot;nWUi&quot;&gt;Решение есть. Не очень красивое, но все же...&lt;/p&gt;
  &lt;p id=&quot;c8TQ&quot;&gt;При вызове компонента оборачиванем данные в ng-template&lt;/p&gt;
  &lt;pre id=&quot;5wJD&quot; data-lang=&quot;html&quot;&gt;&amp;lt;ng-template #сontent&amp;gt;
    &amp;lt;p&amp;gt;Body content...&amp;lt;/p&amp;gt;
&amp;lt;/ng-template&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;w8AE&quot;&gt;В компоненте инициализируем переменную:&lt;/p&gt;
  &lt;pre id=&quot;pgRI&quot; data-lang=&quot;typescript&quot;&gt;@ContentChild(&amp;#x27;content&amp;#x27;, { static: false }) content: TemplateRef&amp;lt;unknown&amp;gt;;&lt;/pre&gt;
  &lt;p id=&quot;2qvC&quot;&gt;У после этого в шаблоне уже можем проверить - пришли данные или нет.&lt;/p&gt;
  &lt;pre id=&quot;I3Wn&quot; data-lang=&quot;html&quot;&gt;&amp;lt;div class=&amp;quot;block&amp;quot;&amp;gt;
    &amp;lt;div *ngIf=&amp;quot;title&amp;quot; class=&amp;quot;block__title&amp;quot; innterHtml=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div *ngIf=&amp;quot;content&amp;quot; class=&amp;quot;block__body&amp;quot;&amp;gt;
        &amp;lt;ng-container *ngTemplateOutlet=&amp;quot;mainContent&amp;quot;&amp;gt;&amp;lt;/ng-container&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;

</content></entry><entry><id>fidget:angular-module-federation-vs-library</id><link rel="alternate" type="text/html" href="https://teletype.in/@fidget/angular-module-federation-vs-library?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=fidget"></link><title>Angular: Чем module federation отличается от library? </title><published>2023-02-28T20:09:19.327Z</published><updated>2023-03-01T08:38:10.181Z</updated><category term="angular" label="Angular"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f8/51/f8513924-379b-4a83-8428-ae835b4c354c.png&quot;&gt;Module Federation и библиотеки в Angular - это два разных концепта.</summary><content type="html">
  &lt;figure id=&quot;QoR0&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f8/51/f8513924-379b-4a83-8428-ae835b4c354c.png&quot; width=&quot;1024&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rUxs&quot;&gt;Module Federation и библиотеки в Angular - это два разных концепта.&lt;/p&gt;
  &lt;p id=&quot;ajGy&quot;&gt;Библиотеки в Angular - это переиспользуемые наборы кода, которые вы можете создавать и использовать в разных проектах. Они представляют собой некоторую функциональность, которую можно импортировать и использовать в других частях вашего приложения. Это может быть что угодно, от набора компонентов и сервисов до функций и классов утилит.&lt;/p&gt;
  &lt;p id=&quot;Aq7f&quot;&gt;Module Federation - это механизм, который позволяет нескольким приложениям, работающим на разных доменах, обмениваться кодом на основе модулей. Он позволяет разделить ваше приложение на небольшие, независимые части, которые можно развернуть на разных серверах и обмениваться между собой. Это особенно полезно, когда у вас есть несколько микросервисов, работающих на разных доменах, и вы хотите, чтобы они обменивались функциональностью, не копируя код между ними.&lt;/p&gt;
  &lt;p id=&quot;HFfq&quot;&gt;Таким образом, библиотеки в Angular предназначены для переиспользования кода в рамках одного приложения, тогда как Module Federation предназначен для обмена кодом между несколькими приложениями на разных доменах.&lt;/p&gt;
  &lt;p id=&quot;Ueac&quot;&gt;Module Federation позволяет обмениваться кодом между приложениями на основе модулей, что может помочь упростить разработку и ускорить время выхода на рынок. Он также позволяет создавать более гибкие и масштабируемые приложения, поскольку вы можете использовать только те модули, которые вам нужны, и не переносить весь код между приложениями.&lt;/p&gt;
  &lt;p id=&quot;XlsR&quot;&gt;В Angular вы можете использовать Module Federation, чтобы подключить удаленный код, который предоставляется другими приложениями, в ваше приложение. Это может быть полезно, если вы хотите добавить функциональность из другого приложения, например, использовать компоненты из другого приложения в своем приложении.&lt;/p&gt;
  &lt;p id=&quot;gaVJ&quot;&gt;Таким образом, хотя библиотеки и Module Federation могут использоваться вместе, они решают разные задачи и имеют различные применения в разработке приложений.&lt;/p&gt;
  &lt;p id=&quot;AzGT&quot;&gt;В Angular библиотеки позволяют создавать и переиспользовать код между разными приложениями, что может значительно сократить время разработки, повысить производительность и уменьшить количество ошибок. В библиотеках вы можете хранить компоненты, сервисы, директивы и другие элементы, которые можно использовать в различных приложениях.&lt;/p&gt;
  &lt;p id=&quot;6vNi&quot;&gt;Module Federation, с другой стороны, предоставляет возможность обмениваться кодом между отдельными приложениями, работающими на разных доменах. Это позволяет создавать распределенные системы, которые могут легко масштабироваться и поддерживаться.&lt;/p&gt;
  &lt;p id=&quot;zI7q&quot;&gt;Кроме того, с помощью Module Federation вы можете создавать гибридные приложения, объединяя код, написанный на разных языках программирования и/или фреймворках, в одно приложение. Например, вы можете использовать React-компоненты в Angular-приложении или наоборот.&lt;/p&gt;
  &lt;p id=&quot;UktN&quot;&gt;Таким образом, использование библиотек и Module Federation в Angular может помочь сделать ваше приложение более гибким, масштабируемым и удобным для разработки.&lt;/p&gt;

</content></entry><entry><id>fidget:kak-smenit-polzovatelya-git-na-mac</id><link rel="alternate" type="text/html" href="https://teletype.in/@fidget/kak-smenit-polzovatelya-git-na-mac?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=fidget"></link><title>Как сменить пользователя git на mac os</title><published>2020-12-24T10:30:26.677Z</published><updated>2020-12-24T10:36:48.507Z</updated><category term="git" label="git"></category><summary type="html">В общем сижу себе такой «крутой» удаленный работник в Крыму на шезлонге, пью квас, заедаю кукурузой. И тут хуяк, github мне пишет, мы вас просекли, вы работаете на территори, которая находится под санкциями США - типа пишите объяснительную чё за нахуй?</summary><content type="html">
  &lt;p&gt;В общем сижу себе такой «крутой» удаленный работник в Крыму на шезлонге, пью квас, заедаю кукурузой. И тут хуяк, github мне пишет, мы вас просекли, вы работаете на территори, которая находится под санкциями США - типа пишите объяснительную чё за нахуй?&lt;/p&gt;
  &lt;p&gt;Глянул там надо на кучу вопросов ответить + приложить скан документа с пропиской. Охуенно…&lt;/p&gt;
  &lt;p&gt;Ну я же умный, зарегил новый аккаунт делаю git pull… а мне пишет что вы работаете из старого аккаунта.&lt;/p&gt;
  &lt;p&gt;Решается это довольно просто. На маке заходим в связку ключей (программа такая страндартная). Находим github.com и удаляем учетную запись. Все теперь при следующей работе с github из консоли попросит ввести новый логин и пароль. Ура!&lt;/p&gt;

</content></entry></feed>