All streams
Search
Write a publication
Pull to refresh
30
0

Software engineer

Send message

каким вы запомнили Рунет в его юные годы? какой сайт стал для вас первым впечатлением?

Рунет был свободный, как дикая природа.

А CITForum.ru был одним из моих первых источников знаний, лет 25 назад. Тогда это была одна из немногих доступных технических библиотек на русском языке. У меня даже была локальная копия на диске. Спасибо ему!

Ага. После редактирования статья стала не так похожа на статью твинка. А то были совсем уж идентичные тексты, фразы и стили иконок:

Что почитать:
Что посмотреть:
Хорошего дня!

Что-то в последнее время как под копирку публикуются такие "дайджесты" типа от разных пользователей. Но, как говорится, найдите 10 отличий: Дайджест полезных материалов из мира Golang за неделю

Хабру такие куски словаря в перспективе явно не на пользу. Это же не нормальный текст, а по-сути наборы фраз с повторяющимися терминами. У Яндекса "Использование SEO-текстов" - это номер один в нарушениях, за которые он может понизить рейтинг сайту.

Префикс all: используется для включения не только файлов из каталога, но и всех вложенных каталогов и их файлов рекурсивно.

Префикс `all:` в embed всего лишь позволяет включать файлы, у которых имя начинается с точки или подчёркивания. К рекурсивному включению вложенных каталогов и файлов он отношения не имеет.

Написание кода - это удивительный и чарующий процесс.

Особенно когда всё уже делается на автомате, независимо от языка. Руки пишут всё сами, а глазам остаётся только делать код-ревью. Предполагаю, что у автора это так и получается.

Для тимлида написание кода может быть вообще одним из немногих доступных видов отдыха после бесконечных созвонов-митингов-плэнингов.

В докуберные времена многие системы выглядели примерно так же. Одна-две базовых технологий, классические SQL-базы, файловые хранилища, балансировщик. Всё простое и понятное. До чего же тёплые воспоминания...

Всё зависит от того, кто начал шутить первым. Иногда ответная шутка может всё значительно упростить и ускорить.

В гитхабе "сделать репозиторий приватным на один день" = потерять всех вотчеров, связи с форками и звёзды. И вероятность надолго вылететь из поискового индекса.

Да. Например, в Termux так и сделано - там кроме основного репозитория есть опциональные: game, science, x11. Это удобно.

Ещё и зарплату придётся платить за 13-й месяц. Бизнес не одобрит.

Иногда "бахнуть массив" может оказаться гораздо эффективнее алгоритмов. Таблицы Брадиса, например, были вычислены больше 100 лет назад, но до сих пор хороши и удобны. И даже в космос по ним летали и самолёты строили.

Это всего лишь один пакет. Весь комплект dotnet-пакетов (runtime, sdk, source-built-artifacts, targeting-pack) в Арче = 4.3 GB (5.5 GB в распакованном виде).

Я уже очень много лет назад сделал локальное зеркало.

Синхронизирую его с глобальным время от времени. Часть пакетов мне не нужна, и они добавлены у меня в исключения.

Пост - статистика с тем, какие пакеты в Арче сегодня самые крупные.

Пакетов с играми много. Я перечислил только самые крупные. Добавлять пакеты по отдельности в список исключений - да, я иногда так и делаю. Но за всеми не уследишь.

В Арче тенденция не к разделению, а к слиянию репозиториев - это видно, например, по судьбе репозитория community. В результате сейчас есть:

  • core

  • малая авгиева конюшня (extra)

  • miltilib (спасибо, что это вынесено отдельно)

И почему я обязательно должен писать напрямую мейнтейнерам Арча? У любого процесса может быть ещё и внешний фон, а не только внутренняя кухня, которая варится сама в себе.

Я оборачиваю функцию Write перед обработкой данных в io.Copy()

В настоящей прокси всего побольше, и код приёма/передачи данных там выглядит вот так:

type writeFunc func(bytes []byte) (int, error)

func (wf writeFunc) Write(bytes []byte) (int, error) {
	return wf(bytes)
}

func (c *connect) transmit() {
	writeWrapper := writeFunc(func(bytes []byte) (int, error) {
		n, err := c.targetConn.Write(bytes)
		log.Println(logPrefix, "TX:", c.clientAddr, "->", c.targetAddr, n)
		c.proxyStats.RegTx(c.clientHost, c.targetHost, int64(n))
		return n, err
	})
	if _, err := io.Copy(writeWrapper, c.clientConn); err != nil {
		log.Println(logPrefix, "TX err:", c.clientAddr, "->", c.targetAddr, err)
		c.proxyStats.RegError(c.clientHost, c.targetHost)
	}
	c.targetConn.Close()
}

func (c *connect) receive() {
	writeWrapper := writeFunc(func(bytes []byte) (int, error) {
		n, err := c.clientConn.Write(bytes)
		log.Println(logPrefix, "RX:", c.clientAddr, "<-", c.targetAddr, n)
		c.proxyStats.RegRx(c.clientHost, c.targetHost, int64(n))
		return n, err
	})
	if _, err := io.Copy(writeWrapper, c.targetConn); err != nil {
		log.Println(logPrefix, "RX err:", c.clientAddr, "<-", c.targetAddr, err)
		c.proxyStats.RegError(c.clientHost, c.targetHost)
	}
}

connect - это по-сути Handler

proxyStats - структура для хранения статистики, а RegTx и RegRx - функции для регистрации объёма перекачиваемых данных

Вот тут детали того, как я это сделал: https://github.com/detoxy-proxy/detoxy-proxy/tree/master/internal/httpproxy

Ага. Тут используется стандартный go net/http сервер. Контроль над соединением получается через интерфейс Hijacker, а он, согласно документации:

The default ResponseWriter for HTTP/1.x connections supports Hijacker,
but HTTP/2 connections intentionally do not.

Но для прокси, по-хорошему, http-сервер и не нужен вовсе. На обычных сокетах можно сделать. Кода чуть больше получится, но и возможностей на порядок больше.

Мы ходим похожими путями.

Поначалу у меня это тоже был сокс-прокси (правда тогда я использовал либу с гитхаба: github.com/things-go/go-socks5). Потом переделал всё на свой простой HTTP CONNECT.

И gomobile мне тоже очень помог на старте. Но так как я не использую его GoNativeActivity и сам собираю APK, то вместо `gomobile build` я делаю:

GOOS=android GOARCH=arm64 CGO_ENABLED=1 \
  CGO_CFLAGS="-I/home/user/android_sdk/sources-misc/android-10.0.0_r47/platform/system/netd/include" \
  CC=/home/user/android_sdk/ndk/26.2.11394342/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang \
  CXX=/home/user/android_sdk/ndk/26.2.11394342/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++ \
  go build -ldflags -w -trimpath -buildmode=c-shared -o tmp/android-29/arm64/libdetoxy_proxy.so ./mobile/detoxy-proxy

И получаю точно такую же so-шку, которую делает gomobile, но зато с большим контролем над CGO_CFLAGS и CGO_LDFLAGS

Нужно стараться не усложнять и обходиться без C :-)

Хотя реальность далека от намерений. А в андроиде реальность ещё суровее: даже если нужная либа есть в системе (например, /system/lib64/libc++.so), то линкер не разрешит её загрузить. В старых версиях (до Android 8) можно было, а потом запретили.

В этом случае приходится таскать свою копию файла libc++.so в комплекте с приложением.

Information

Rating
Does not participate
Registered
Activity