<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serov.eu</title>
	<atom:link href="https://serov.eu/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://serov.eu</link>
	<description>Блог программиста</description>
	<lastBuildDate>Thu, 30 Apr 2026 12:31:53 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1.15</generator>
	<item>
		<title>Codex и Claude Code</title>
		<link>https://serov.eu/?p=1073</link>
		<comments>https://serov.eu/?p=1073#comments</comments>
		<pubDate>Thu, 30 Apr 2026 12:31:53 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1073</guid>
		<description><![CDATA[Сейчас я использую две ИИ, это codex и Claude Code Codex 5.5, а вот Claude из за того что это подписка github все еще Sonnet 4.6 И клод прям существенно отупел за последнюю недели, он пару раз уже писал код, которые вообще не нужен, то есть он делает какие то вычисления, потом эти вычисления никуда &#8230; <a href="https://serov.eu/?p=1073" class="more-link">Читать далее <span class="screen-reader-text">Codex и Claude Code</span></a>]]></description>
				<content:encoded><![CDATA[<p>Сейчас я использую две ИИ, это codex и Claude Code<br />
Codex 5.5, а вот Claude из за того что это подписка github все еще Sonnet 4.6<br />
И клод прям существенно отупел за последнюю недели, он пару раз уже писал код, которые вообще не нужен, то есть он делает какие то вычисления, потом эти вычисления никуда не применяет. Один раз написал авто тест который на самом деле ничего не тестирует<br />
Теперь всегда передаю на ревью codex код, написаный Claude</p>
<p><a href="https://serov.eu/wp-content/uploads/2026/04/photo_2026-04-30-15.23.54.jpeg"><img src="https://serov.eu/wp-content/uploads/2026/04/photo_2026-04-30-15.23.54-1024x768.jpeg" alt="photo_2026-04-30 15.23.54" width="660" height="495" class="alignnone size-large wp-image-1074" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1073</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка и настройка Jitsi Meet на Ubuntu 22.04</title>
		<link>https://serov.eu/?p=1068</link>
		<comments>https://serov.eu/?p=1068#comments</comments>
		<pubDate>Fri, 29 Aug 2025 06:53:20 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1068</guid>
		<description><![CDATA[https://trueconf.ru/blog/baza-znaniy/ustanovka-servera-dlya-videokonferenczij-jitsi-meet Jitsi Meet — это бесплатное программное обеспечение с открытым исходным кодом, которое позволяет создавать и развертывать решения для видеоконференцсвязи. Jitsi Meet работает на базе открытой технологии WebRTC. Это позволяет использовать для проведения конференций браузер, а также клиентские приложения для Linux, macOS, Windows, iOS и Android.]]></description>
				<content:encoded><![CDATA[<p>https://trueconf.ru/blog/baza-znaniy/ustanovka-servera-dlya-videokonferenczij-jitsi-meet</p>
<p>Jitsi Meet — это бесплатное программное обеспечение с открытым исходным кодом, которое позволяет создавать и развертывать решения для видеоконференцсвязи. Jitsi Meet работает на базе открытой технологии WebRTC. Это позволяет использовать для проведения конференций браузер, а также клиентские приложения для Linux, macOS, Windows, iOS и Android.</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1068</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>заставить macOS сделать полный бэкап в Time Machine с нуля</title>
		<link>https://serov.eu/?p=1064</link>
		<comments>https://serov.eu/?p=1064#comments</comments>
		<pubDate>Fri, 08 Aug 2025 13:10:19 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1064</guid>
		<description><![CDATA[disk="/Volumes/TimeMachine" &#038;&#038; \ sudo rm -rf "$disk/Backups.backupdb" &#038;&#038; \ for snap in $(tmutil listlocalsnapshots / &#124; awk -F. '{print $4}'); do sudo tmutil deletelocalsnapshots $snap; done &#038;&#038; \ tmutil startbackup --block --auto --rotation]]></description>
				<content:encoded><![CDATA[<pre>
disk="/Volumes/TimeMachine" &#038;&#038; \
sudo rm -rf "$disk/Backups.backupdb" &#038;&#038; \
for snap in $(tmutil listlocalsnapshots / | awk -F. '{print $4}'); do sudo tmutil deletelocalsnapshots $snap; done &#038;&#038; \
tmutil startbackup --block --auto --rotation
</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1064</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>дженерики в go с версии Go 1.18</title>
		<link>https://serov.eu/?p=1060</link>
		<comments>https://serov.eu/?p=1060#comments</comments>
		<pubDate>Sat, 12 Apr 2025 15:57:29 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1060</guid>
		<description><![CDATA[С введением дженериков (с версии Go 1.18) можно писать функции и типы, которые работают с различными типами данных, обеспечивая при этом строгую типизацию и переиспользование кода. &#160; &#160; &#160; Пример кода package main import "fmt" // Обобщённая функция Swap меняет местами два значения любого типа. // T — параметр типа, а ограничение any означает, что &#8230; <a href="https://serov.eu/?p=1060" class="more-link">Читать далее <span class="screen-reader-text">дженерики в go с версии Go 1.18</span></a>]]></description>
				<content:encoded><![CDATA[<p>С введением дженериков (с версии Go 1.18) можно писать функции и типы, которые работают с различными типами данных, обеспечивая при этом строгую типизацию и переиспользование кода.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Пример кода</p>
<pre>package main

import "fmt"

// Обобщённая функция Swap меняет местами два значения любого типа.
// T — параметр типа, а ограничение any означает, что функция принимает аргументы любого типа.
func Swap[T any](a, b T) (T, T) {
	return b, a
}

// Обобщённый тип Box хранит значение произвольного типа T.
type Box[T any] struct {
	value T
}

// Метод Get возвращает значение, хранящееся в Box.
func (b Box[T]) Get() T {
	return b.value
}

// Метод Set присваивает новое значение полю value.
func (b *Box[T]) Set(value T) {
	b.value = value
}

func main() {
	// Пример использования функции Swap с числами
	a, b := 10, 20
	a, b = Swap(a, b)
	fmt.Println("После обмена:", a, b)

	// Пример использования типа Box для хранения значения int
	intBox := Box[int]{value: 100}
	fmt.Println("Значение в intBox:", intBox.Get())

	// Пример использования типа Box для хранения значения string
	strBox := Box[string]{value: "hello"}
	fmt.Println("Значение в strBox:", strBox.Get())
}


</pre>
<p>&nbsp;</p>
<h3 class="" data-start="1299" data-end="1319">Как это работает</h3>
<ol data-start="1321" data-end="2557">
<li class="" data-start="1321" data-end="1681">
<p class="" data-start="1324" data-end="1681"><strong data-start="1324" data-end="1356">Параметры типа и ограничения</strong><br data-start="1356" data-end="1359" /> В объявлении функции <code data-start="1383" data-end="1396">Swap[T any]</code> параметр типа <code data-start="1411" data-end="1414">T</code> записывается в квадратных скобках сразу после имени функции. Ограничение <code data-start="1488" data-end="1493">any</code> (это синоним для <code data-start="1511" data-end="1524">interface{}</code>) указывает, что тип <code data-start="1545" data-end="1548">T</code> может быть любым. Таким образом, функция <code data-start="1590" data-end="1596" data-is-only-node="">Swap</code> способна принимать на вход значения любых типов, например, <code data-start="1656" data-end="1661">int</code>, <code data-start="1663" data-end="1671">string</code> и другие.</p>
</li>
<li class="" data-start="1683" data-end="1980">
<p class="" data-start="1686" data-end="1980"><strong data-start="1686" data-end="1704">Обобщённый тип</strong><br data-start="1704" data-end="1707" /> Тип <code data-start="1714" data-end="1726">Box[T any]</code> представляет контейнер, способный хранить значение любого типа. Методы <code data-start="1798" data-end="1803">Get</code> и <code data-start="1806" data-end="1811">Set</code> работают с этим значением, не теряя информации о типе. При создании экземпляра типа <code data-start="1896" data-end="1901">Box</code> компилятор подставляет конкретный тип, например, <code data-start="1951" data-end="1961">Box[int]</code> или <code data-start="1966" data-end="1979" data-is-only-node="">Box[string]</code>.</p>
</li>
<li class="" data-start="1982" data-end="2270">
<p class="" data-start="1985" data-end="2270"><strong data-start="1985" data-end="2020">Компиляция и безопасность типов</strong><br data-start="2020" data-end="2023" /> При вызове обобщённой функции или создании обобщённого типа компилятор Go подставляет конкретный тип вместо параметра <code data-start="2144" data-end="2147">T</code>. Это позволяет избежать дублирования кода и одновременно гарантирует, что типизация будет проверяться на этапе компиляции.</p>
</li>
<li class="" data-start="2272" data-end="2557">
<p class="" data-start="2275" data-end="2557"><strong data-start="2275" data-end="2302">Преимущества дженериков</strong><br data-start="2302" data-end="2305" /> Благодаря обобщённым типам и функциям можно писать более универсальный и переиспользуемый код, не прибегая к использованию небезопасных преобразований типов и интерфейсов. Это увеличивает читаемость и поддерживаемость кода, снижая количество ошибок.</p>
</li>
</ol>
<p>&nbsp;</p>
<p class="" data-start="0" data-end="227">Компилятор Go создаёт отдельную, специализированную версию функции (или типа) для каждого уникального набора типовых параметров, используемых в коде. Такой подход называется <strong data-start="207" data-end="226">монопорфизацией</strong>.</p>
<h3 class="" data-start="229" data-end="244">Разъяснения</h3>
<ul data-start="246" data-end="1066">
<li class="" data-start="246" data-end="529">
<p class="" data-start="248" data-end="529"><strong data-start="248" data-end="267">Монопорфизация:</strong><br data-start="267" data-end="270" /> При компиляции для каждой инстанциации обобщённого кода создаётся конкретный вариант с подставленным типом. Например, если функция <code data-start="403" data-end="416">Swap[T any]</code> вызывается для <code data-start="432" data-end="437" data-is-only-node="">int</code> и для <code data-start="444" data-end="452">string</code>, то компилятор сгенерирует две версии — одну для <code data-start="502" data-end="507">int</code>, другую для <code data-start="520" data-end="528">string</code>.</p>
</li>
<li class="" data-start="531" data-end="823">
<p class="" data-start="533" data-end="580"><strong data-start="533" data-end="550">Преимущества:</strong><br data-start="550" data-end="553" /> Такой механизм позволяет:</p>
<ul data-start="583" data-end="823">
<li class="" data-start="583" data-end="663">
<p class="" data-start="585" data-end="663">Оптимизировать код под конкретные типы, что может улучшать производительность.</p>
</li>
<li class="" data-start="666" data-end="734">
<p class="" data-start="668" data-end="734">Сохранять строгую типизацию и выявлять ошибки на этапе компиляции.</p>
</li>
<li class="" data-start="737" data-end="823">
<p class="" data-start="739" data-end="823">Избегать накладных расходов, связанных с преобразованиями типов во время выполнения.</p>
</li>
</ul>
</li>
<li class="" data-start="825" data-end="1066">
<p class="" data-start="827" data-end="1066"><strong data-start="827" data-end="848">Возможные нюансы:</strong><br data-start="848" data-end="851" /> Хотя для каждой инстанциации создаётся своя версия, компилятор может применять оптимизации (например, инлайнинг или другие методы оптимизации кода), что помогает снизить потенциальное увеличение размера бинарника.</p>
</li>
</ul>
<p class="" data-start="1068" data-end="1226">Таким образом, реализация дженериков в Go через монопорфизацию делает возможным написание обобщённого кода без потери производительности и безопасности типов.</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1060</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>terminal-notifier</title>
		<link>https://serov.eu/?p=1056</link>
		<comments>https://serov.eu/?p=1056#comments</comments>
		<pubDate>Sat, 12 Apr 2025 15:44:52 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1056</guid>
		<description><![CDATA[terminal-notifier -title "Уведомление" -subtitle "Дополнительный заголовок" -message "Это пример уведомления с дополнительными параметрами." -sound default -open "https://www.example.com"]]></description>
				<content:encoded><![CDATA[<p><code></p>
<p>terminal-notifier -title "Уведомление" -subtitle "Дополнительный заголовок" -message "Это пример уведомления с дополнительными параметрами." -sound default -open "https://www.example.com"</p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1056</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang замена тернарного оператора</title>
		<link>https://serov.eu/?p=1049</link>
		<comments>https://serov.eu/?p=1049#comments</comments>
		<pubDate>Wed, 13 Nov 2024 10:25:48 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1049</guid>
		<description><![CDATA[golang замена тернарного оператора Name: func() string { if line.Nomenclature != nil { return line.Nomenclature.Name } return "" }(),]]></description>
				<content:encoded><![CDATA[<p>golang замена тернарного оператора</p>
<pre>

Name: func() string {
   if line.Nomenclature != nil {
      return line.Nomenclature.Name
   }
   return ""
}(),

</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1049</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostgreSQL, имитация долгого запроса</title>
		<link>https://serov.eu/?p=1046</link>
		<comments>https://serov.eu/?p=1046#comments</comments>
		<pubDate>Wed, 13 Nov 2024 10:23:09 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1046</guid>
		<description><![CDATA[PostgreSQL, имитация долгого запроса SELECT pg_sleep(10);]]></description>
				<content:encoded><![CDATA[<p>PostgreSQL, имитация долгого запроса</p>
<p><code><br />
SELECT pg_sleep(10);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1046</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>golang max int</title>
		<link>https://serov.eu/?p=1043</link>
		<comments>https://serov.eu/?p=1043#comments</comments>
		<pubDate>Wed, 13 Nov 2024 10:21:21 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1043</guid>
		<description><![CDATA[Максимальный int в зависимости от системы package main import ( "fmt" ) func main() { maxInt := int(^uint(0) >> 1) fmt.Println("Максимальное значение int:", maxInt) }]]></description>
				<content:encoded><![CDATA[<p>Максимальный int в зависимости от системы</p>
<pre>
package main

import (
    "fmt"
)

func main() {
    maxInt := int(^uint(0) >> 1)
    fmt.Println("Максимальное значение int:", maxInt)
}


</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1043</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gogs</title>
		<link>https://serov.eu/?p=1039</link>
		<comments>https://serov.eu/?p=1039#comments</comments>
		<pubDate>Wed, 23 Oct 2024 10:33:01 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1039</guid>
		<description><![CDATA[Легковесный гит-сервер, написанный на Go. Часто использует Gin для обработки веб-запросов. https://github.com/gogs/gogs]]></description>
				<content:encoded><![CDATA[<p>Легковесный гит-сервер, написанный на Go. Часто использует Gin для обработки веб-запросов.</p>
<p>https://github.com/gogs/gogs</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1039</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go-митап в Петербурге: доклады от инженеров YADRO и AvitoTech</title>
		<link>https://serov.eu/?p=1033</link>
		<comments>https://serov.eu/?p=1033#comments</comments>
		<pubDate>Sat, 12 Oct 2024 10:31:20 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Golang]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=1033</guid>
		<description><![CDATA[]]></description>
				<content:encoded><![CDATA[<p><iframe width="560" height="315" src="https://www.youtube.com/embed/DgYRmKfp3EU?si=bQpGqXok6eIqKOJ5" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=1033</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
