Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (19)

Лучшие ответы пользователя

Все ответы (46)
  • Порядок действий для оформления самозанятого, для иностраных платежей и выбор банка?

    @falconandy
    Мой недавний опыт
    1. На сайте Альфа-банка заказал бесплатную дебетовую карту с выдачей в отделении (отделение выбрал центральное с "моментальной" выдачей). Альфа-банк, потому что в моем регионе у них есть банкоматы с приемом/выдачей валюты. Заранее установил мобильное приложение Альфа-банка. Через пару часов туда подъехал, по-моему по моей заявке еще никто ничего не делал. Поинтересовались, для чего мне их карта и выдали мне именную рублевую дебетовую карту (в заявке указывал MasterCard, но принесли Visa - мне было непринципиально), и дополнительно я попросил долларовую (собственно для этого я и забирал лично, хотя можно было заказать доставку) - выдали неименную. Мобильное приложение Альфы понадобилось, чтоб тут же активировать карты. Всё заняло минут 20-25, но мои данные у них уже были, несколько лет назад я получал через них зарплату.
    2. Зарегистрировался как самозанятый через веб-доступ налоговой (в моем регионе доступно с июля 2020 г.).
    3. Установил мобильное приложение Мой Налог. В мобильном приложении Альфа-банка зарегистрировался как уже зарегистрированный самозанятый.
    4. Добавил 2 новых счета (рублевый и долларовый), назвал их, чтоб было понятно что они для учета доходов от самозанятости.
    5. Добавил эти счета в Upwork (рублевый "Direct to Local Bank" и долларовый "Wire Transfer")
    6. С рублевым счетом проблем не было, а в долларовом не совпало моё имя (в Альфе было еще отчество и транслитерация одной буквы не совпадала) - отправил запрос в поддержку Upwork и счет в течение нескольких часов одобрили.
    7. Добавленные счета становятся доступными для вывода через 3 дня.
    8. Через 3 дня вывел в долларах через "Wire Transfer", на счет Альфы пришло на следующий день. Никакого явного валютного контоля не было, документы не просили, комиссий не снялось (только $30 снял Upwork как и положено).
    9. Самостоятельно посчитал пришедшую сумму в рублях по курсу ЦБ на дату получения денег на счет.
    10. В мобильном приложении Альфы создал новый чек от иностранной организции (Upwork Global Inc.), указал сумму в рублях. Проверил в приложении Мой Налог, что чек нормально ушел и начислился налог (по факту реального налога пока нет, т.к. действует налоговый бонус около 22000 руб. = 10000 руб + чуть больше 12000 руб.)
    11. На всякий пожарный случай: скачал шаблон Confirmation of Service, заполнил и отправил в поддержку Upwork. Полученный от них подписанный экземпляр сохранил.
    Ответ написан
  • Go пакеты для комфортной работы с json Есть?

    @falconandy
    В некоторых случаях удобно использовать
    для чтения https://github.com/tidwall/gjson
    для записи https://github.com/tidwall/sjson
    Ответ написан
    1 комментарий
  • Не будет гонки и повреждения данных в памяти?

    @falconandy
    По-моему вы переусложняете без необходимости. Если значения из конфига только читаются, то потокобезопасность не нужна. Если же у вас предполагается еще и изменение, то в пул возвращаются указатели на "порченные" объекты, что тоже неправильно.
    Если возможно, конфиг лучше прочитать в начале выполнения, а также паниковать на уровне main.
    В результате и код проще, и тормозить нечему:
    package config
    
    import (
    	"encoding/json"
    	"fmt"
    	"os"
    )
    
    type Cfg struct {
    	// Fields
    }
    
    var (
    	cfg *Cfg
    )
    
    func Config() *Cfg {
    	return cfg
    }
    
    func LoadConfig() error {
    	f, err := os.Open("./config/config.json")
    	if err != nil {
    		return fmt.Errorf("can't open config file: %w", err)
    	}
    	defer f.Close()
    
    	dec := json.NewDecoder(f)
    	var c *Cfg
    	if err := dec.Decode(c); err != nil {
    		return fmt.Errorf("can't decode config file: %w", err)
    	}
    
    	if err := validate(c); err != nil {
    		return fmt.Errorf("can't validate config file: %w", err)
    	}
    	
    	cfg = c
    
    	return nil
    }
    
    func validate(cfg *Cfg) error {
    	// Logic
    	return nil
    }
    Ответ написан
    Комментировать
  • Почему после сборки приложения картинки не сохраняются?

    @falconandy
    1. Можно использовать embed, чтобы вшить картинку в бинарник.
    2. Но если посмотреть исходники beeep, то окажется, что библиотека работает с файлами и пока не умеет работать с массивом байт (Support for supplying image-data as a blob).
    3. Поэтому вы можете вшить картинку, но перед вызовом beeep.Notify вам надо будет сохранить вшитую картинку во временный файл и передать в beeep.Notify путь к нему.
    Ответ написан
    52 комментария
  • Что не так с потоками?

    @falconandy
    С "потоками" всё так, просто вы неправильно работаете с "массивом".

    perftracing = append(perftracing, 0) при исчерпании выделенной памяти выделяет новый блок памяти (по-моему удвоенного размера) и копирует текущие элементы в новый блок. Соответственно часть (половина) горутин пишет по старым адресам, а в выхлопе данные из последнего выделенного блока памяти.

    ...
    0 0 0 0 5197273 5671085 5177800 5797080 
    0 0 0 0 5197332 5671147 5177908 5797137 
    0 0 0 0 5197388 5671208 5178008 5797195 
    0 0 0 0 5197450 5671269 5178118 5797248
    ...


    Если создать "массив" заранее со всеми элементами, то всё выводится нормально:
    threads := 4
    perftracing := make([]int64, threads)
    for i := 0; i < threads; i++ {
    	go thread(&perftracing[i])
    	time.Sleep(1)
    }


    ...
    5593758 7107822 5575001 6449763 6321574 5535152 5728000 7196092 
    5593813 7107884 5575056 6449859 6321628 5535209 5728060 7196153 
    5593879 7107959 5575122 6449976 6321695 5535275 5728122 7196217 
    5593936 7108030 5575180 6450079 6321757 5535339 5728190 7196285 
    ...
    5594008 7108109 5575251 6450199 6321821 5535403 5728251 7196349


    Ну и вместо time.Sleep(1) вы наверно имели в виду что-то типа time.Sleep(time.Second * 1)

    Go 1.19.3, Kubuntu 22.04
    Ответ написан
    Комментировать