Сейчас я использую две ИИ, это codex и Claude Code
Codex 5.5, а вот Claude из за того что это подписка github все еще Sonnet 4.6
И клод прям существенно отупел за последнюю недели, он пару раз уже писал код, которые вообще не нужен, то есть он делает какие то вычисления, потом эти вычисления никуда не применяет. Один раз написал авто тест который на самом деле ничего не тестирует
Теперь всегда передаю на ревью codex код, написаный Claude
Установка и настройка Jitsi Meet на Ubuntu 22.04
https://trueconf.ru/blog/baza-znaniy/ustanovka-servera-dlya-videokonferenczij-jitsi-meet
Jitsi Meet — это бесплатное программное обеспечение с открытым исходным кодом, которое позволяет создавать и развертывать решения для видеоконференцсвязи. Jitsi Meet работает на базе открытой технологии WebRTC. Это позволяет использовать для проведения конференций браузер, а также клиентские приложения для Linux, macOS, Windows, iOS и Android.
заставить macOS сделать полный бэкап в Time Machine с нуля
disk="/Volumes/TimeMachine" && \
sudo rm -rf "$disk/Backups.backupdb" && \
for snap in $(tmutil listlocalsnapshots / | awk -F. '{print $4}'); do sudo tmutil deletelocalsnapshots $snap; done && \
tmutil startbackup --block --auto --rotation
дженерики в go с версии Go 1.18
С введением дженериков (с версии Go 1.18) можно писать функции и типы, которые работают с различными типами данных, обеспечивая при этом строгую типизацию и переиспользование кода.
Пример кода
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())
}
Как это работает
-
Параметры типа и ограничения
В объявлении функцииSwap[T any]параметр типаTзаписывается в квадратных скобках сразу после имени функции. Ограничениеany(это синоним дляinterface{}) указывает, что типTможет быть любым. Таким образом, функцияSwapспособна принимать на вход значения любых типов, например,int,stringи другие. -
Обобщённый тип
ТипBox[T any]представляет контейнер, способный хранить значение любого типа. МетодыGetиSetработают с этим значением, не теряя информации о типе. При создании экземпляра типаBoxкомпилятор подставляет конкретный тип, например,Box[int]илиBox[string]. -
Компиляция и безопасность типов
При вызове обобщённой функции или создании обобщённого типа компилятор Go подставляет конкретный тип вместо параметраT. Это позволяет избежать дублирования кода и одновременно гарантирует, что типизация будет проверяться на этапе компиляции. -
Преимущества дженериков
Благодаря обобщённым типам и функциям можно писать более универсальный и переиспользуемый код, не прибегая к использованию небезопасных преобразований типов и интерфейсов. Это увеличивает читаемость и поддерживаемость кода, снижая количество ошибок.
Компилятор Go создаёт отдельную, специализированную версию функции (или типа) для каждого уникального набора типовых параметров, используемых в коде. Такой подход называется монопорфизацией.
Разъяснения
-
Монопорфизация:
При компиляции для каждой инстанциации обобщённого кода создаётся конкретный вариант с подставленным типом. Например, если функцияSwap[T any]вызывается дляintи дляstring, то компилятор сгенерирует две версии — одну дляint, другую дляstring. -
Преимущества:
Такой механизм позволяет:-
Оптимизировать код под конкретные типы, что может улучшать производительность.
-
Сохранять строгую типизацию и выявлять ошибки на этапе компиляции.
-
Избегать накладных расходов, связанных с преобразованиями типов во время выполнения.
-
-
Возможные нюансы:
Хотя для каждой инстанциации создаётся своя версия, компилятор может применять оптимизации (например, инлайнинг или другие методы оптимизации кода), что помогает снизить потенциальное увеличение размера бинарника.
Таким образом, реализация дженериков в Go через монопорфизацию делает возможным написание обобщённого кода без потери производительности и безопасности типов.
terminal-notifier
terminal-notifier -title "Уведомление" -subtitle "Дополнительный заголовок" -message "Это пример уведомления с дополнительными параметрами." -sound default -open "https://www.example.com"
golang замена тернарного оператора
golang замена тернарного оператора
Name: func() string {
if line.Nomenclature != nil {
return line.Nomenclature.Name
}
return ""
}(),
PostgreSQL, имитация долгого запроса
PostgreSQL, имитация долгого запроса
SELECT pg_sleep(10);
golang max int
Максимальный int в зависимости от системы
package main
import (
"fmt"
)
func main() {
maxInt := int(^uint(0) >> 1)
fmt.Println("Максимальное значение int:", maxInt)
}
Gogs
Легковесный гит-сервер, написанный на Go. Часто использует Gin для обработки веб-запросов.
https://github.com/gogs/gogs
