Pull to refresh
8

Программист

Send message
Это работает только с ключами формата PKCS#11. Если у вас ключ формата КриптоПро CSP (вы выбираете при входе «Ключ ЭП», а не «Рутокен ЭЦП 2.0 и 3.0»), то без КриптоПро не получится.
Вход в Личный кабинет с помощью Рутокен ЭЦП 2.0 и Рутокен ЭЦП 3.0

Там есть ссылки — одна на Рутокен Плагин, вторая на браузерное расширение Адаптер Рутокен Плагин (в зависимости от браузера)

Для Linux еще наверно нужны шаги отсюда, точно сейчас не помню: Рутокен ЭЦП в операционных системах GNU/Linux
forum.rutoken.ru/topic/3387
Да, для максимальной безопасности ваших закрытых ключей нужно генерировать ключи на Рутокен ЭЦП 2.0 2100, серт. ФСБ, используя библиотеку PKCS#11 (формат «как для ЕГАИС»), тогда они будут неизвлекаемыми и, действительно не покинут память токена. Их нельзя будет ни перехватить, ни скопировать.

Если на Рутокен из семейства ЭЦП будет сгенерированы пассивные ключи формата КриптоПро CSP, как на Рутокен Lite, они так же будут извлекаемыми. В ФНС проставляют запрет экспорта, который будет запрещать копирование штатными средствами.
Получал подпись в налоговой на Рутокен 3.0 в формате неизвлекаемого ключа PKCS#11.
Для этого формата ключа КрипоПро формально не нужен — по крайней мере, в личном кабинете ИП всё работает без установленного КриптоПро, нужно только рутокеновское ПО.
Но, например, Эльба пока не может работать без КриптоПро. Декларацию, созданную в утилите от ФНС, тоже без КриптоПро подписать не получится.

Эксперимент по безвозмездному предоставлению пользователям Удостоверяющего центра ФНС России 
программного обеспечения для работы с электронной подписью
вроде как закончился 28.10.2022, но я получал подпись в конце ноября и вшитая ограниченная лицензия на КрипоПро всё еще присутствует.
В четвертом тесте основные тормоза — это вроде как update. Если не делать одновременный update (в случае sqlite вроде бы так и рекомендуется, по крайне мере с настройками по-умолчанию), то работает в разы быстрее. Что-то типа:
var mu sync.Mutex

func routine(db *sql.DB, age, id int, ch chan<- string) {
	if age%2 == 0 {
		queryUpdate := fmt.Sprintf("UPDATE users SET salary = salary + 1 WHERE id = %d", id)
		mu.Lock()
		db.Exec(queryUpdate)
		mu.Unlock()
Нормально. Есть соглашение, что при нарушении обратной совместимости мажорная версия пакета должна быть увеличена. Мажорные версии присутствуют в полном имени пакета как последний элемент (за исключением версий 0 и 1) — с т.з. тулинга это просто разные пакеты т.к. имена разные. Подробнее и точнее — go.dev/doc/modules/version-numbers
Вот, например, зависимости более-менее большого приложения — github.com/mattermost/mattermost-server/blob/master/go.mod
Не знаю, есть ли аналог такого приложения на C# (чтобы сравнить кол-во), но если пробежаться по зависимостям, то наверно что-то и окажется в стандарном .Net, но скорее всего в разы количество внешних пакетов не сократится.

В Go все пакеты распространяются в виде исходников — нет такой проблемы, что в репозитории один код, а в nuget/npm выложено что-то другое. Это же упрощает навигацию по внешним исходникам, их отладку и модификацию. Можно стандартным тулингом все внешние пакеты завендорить (все внешние исходники будут в папке vendor), провести их полный аудит, а затем при обновлении зависимостей проверять уже только диффы в папке vendor.
Хотя по сравнению с nodejs и гошниками, ситуация с c# ещё детский лепет. Там вообще оторопь берёт.

Пожалуйста, про гошников поконкретнее.
Нет, не яблоки с апельсинами, а только яблоки — «время». Не уверен, как оно для вас читается (секунда плюс 42 секунды?), но в данном конректном кейсе выглядит опечаткой как минимум — возможно вместо * ошибочно написан +.

Аналогичный тип для «массы» выглядел бы примерно так:
type Mass int64

const (
	Milligram Mass = 1
	Gram           = 1000 * Milligram
	Kilogram       = 1000 * Gram
)

var mass = Gram + 42
Написал выше про возможную доработку линтера durationcheck
В данном случае 42 — это не апельсины, а 42 наносекунды (те же яблоки). Вышеупомянутый линтер durationcheck наверно можно доработать так, чтобы он ловил такое использование констант без явного указания «единицы времени», т.е вместо
var duration time.Duration = 100
time.Sleep(300)
time.Sleep(time.Second + 42)

надо было бы явно писать
var duration = time.Nanosecond * 100
time.Sleep(time.Nanosecond * 300)
time.Sleep(time.Second + time.Nanosecond*42)
Внутри Duration это всего лишь int64:
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64

Ваш пример конечно компилируется, но компилятор можно/нужно дополнять линтерами. Например, golangci-lint покажет сообщение от линтера durationcheck:
Multiplication of durations: `time.Second * time.Second` (durationcheck)
time.Sleep(time.Second * time.Second)
В Go используется тип time.Duration:
time.Sleep(time.Second * 30)
time.Sleep(time.Millisecond * 300)

time.Sleep(300) // nanoseconds
Спасибо
Нет нюансов.

В довольно старом обсуждении Upwork и ПСН можно ли (again)? по каким-то моментам так и к однозначному мнению не пришли. Например, как доказывать налоговой при возможной проверке, что деятельность соответствует патенту.
Вроде как пишут, что на УСН 6% меньше вопросов как от налоговой (платится 6% от всего дохода ну и ладно) и от банка (не срабатывает триггер, что налоги не платятся или платятся слишком мало).
Куда как больше «гимороя» с закрывающими документами по выполненным работам, договорами и т.д… Которые, сюрприз, на самозанятости нужны не меньше, хотя очень многие на это забивают и потом изрядно удивляются последствиям.

Проясните пожалуйста для варианта самозанятость/Upwork (иностранные клиенты) — никаких документов в этой варианте вроде не нужно и никто не требует.

По патенту, насколько я в курсе, могут быть ньюансы с местом ведения деятельности (в случае того же Upwork) и налогами/отчетностью на неосновной доход (проценты по вкладу ИП?), которые могут попать под ОСН, если до перехода на патент не подать заявление на УСН.
Я еще использовал nhooyr/websocket
  1. defer срабатывают в обратном порядке
  2. Если вы добавите return где-то в середине функции или случится panic, то код в defer всё равно отработает
  3. В другом языке можно было бы использовать try/finally — по сравнению с defer код «очистки» находится далеко от кода «создания», а также добавляется дополнительный (дополнительные) уровень вложенности
Навскидку пара замечаний по коду:

1. Работа с clients не потокобезопасна.
2. Закрытие соединения и удаление из clients — использовать defer:
connection, _ := upgrader.Upgrade(w, r, nil)
defer connection.Close()

server.clients[connection] = true // Сохраняем соединение, используя его как ключ
defer delete(server.clients, connection)
Дженерики выйдут в версии Go 1.18 в феврале 2022 г. В ветке master они уже доступны, можно их попробовать, используя gotip:
pkg.go.dev/golang.org/dl/gotip

Пока что generic-функции для работы со slices и maps будут доступны как экспериментальные (чтобы обкатать их), но потом их перенесут в стандартную библиотеку:
slices.go
maps.go
Где там написано про «какое-то рандомное значение»? Значение вполне определенное и зависит от типа переменной — ноль, false, пустая строка, nil.

Information

Rating
Does not participate
Location
Ижевск, Удмуртия, Россия
Registered
Activity

Specialization

Бэкенд разработчик, Фулстек разработчик