.NET C#
Контакты
Местоположение
Россия, Санкт-Петербург и область, Санкт-Петербург

Достижения

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

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

Все теги (80)

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

Все ответы (101)
  • Что нужно для анонимности в сети? Какие средства для этого имеются? Как скрыть своё местонахождение и действия с финансовыми операциями?

    @Sing303
    Для анонимности нужно:
    1) Анонимная ОС в виртуалке, например Whonix
    2) 2xVPN + Tor (И то и другое обязательно)
    3) Никакой электронной почты (или на собственном сервере, который оплачен анонимно)
    4) Правильно настроенный браузер (Самый гибкий сейчас firefox со спец. расширениями)
    5) Телефон: либо звонилка без ОС, либо андроид со спец. прошивкой типа CYANOGENMOD (там на самом деле много тонкостей)
    6) Сим карта оформлена не на тебя (Геолокация по ней все равно будет возможна, но связать с тобой будет нельзя)
    7) Использование криптовалют для оплаты, подобие биткойнов
    8) Никаких соц. сетей вообще
    9) Обязательное шифрование всех устройств (жёсткие диски, облако, системные диски, смартфон и т.д.)
    10) Использование анонимных поисковых систем (никаких гуглов)

    После этого, связать вашу деятельность в сети будет на порядок сложнее. Но это не всё, что нужно для полной анонимности. Кстати, ваш провайдер и так знает где вы, но связать вас с посещёнными сайтами из-за VPN не сможет.

    Чем больше анонимности, тем менее удобно жить :)
    Безопасность != удобство
    Ответ написан
    7 комментариев
  • Cast vs Convert vs Parse?

    @Sing303
    Cast - если возможно, лучше использовать его (не всегда есть возможность)
    Parse - создан для работы со строками, если у вас есть строка, в которой хранится число, то лучше использовать этот вариант. Важно помнить, что если строка будет равна null, то метод выкинет исключение ArgumentNullException
    Convert - для строк вызывает внутри себя метод Parse, при этом, если строка null, то метод не выкидывает исключение, а возвращает 0. Так же он может принимать любой объект, который реализует интерфейс IConvertible, поэтому его лучше использовать когда не известно, что именно строка придёт в метод. Ещё у Convert есть возможность конвертировать в любой тип в generic методах. Для строк Parse чуть чуть отработает быстрее, чем Convert

    P.S. В интернете куча ответов на этот вопрос, учитесь искать на английском - 95% информации там
    Ответ написан
    Комментировать
  • Как высыпаться за 6 часов?

    @Sing303
    Все попытки спать меньше могут сказаться на здоровье в будущем
    Время нужно освобождать не за счёт дефицита сна
    Ответ написан
    Комментировать
  • Как заработать преподавая программирование?

    @Sing303
    Есть 2 варианта:
    1. Ты гребёшь бабло и учишь говнокодить
    2. Ты учишь хорошо, но деньжат нормально срубить не получится

    Чтобы люди охотно учились:
    1. Все сделать красивенько
    2. Делать интересные и простые для понимания уроки, без деталей.
    3. Добавить социальную составляющую
    4. Добавить пафосное описание и поставить себя как гуру с зашкаливающим опытом
    5. Постоянно делать скидосы, и чутка бесплатного контента для ознакомления
    При таком подходе деньги будут, а вот обучить людей хоть чему-то полезному, нет. Очередной Попов)

    Стоит в такую схему добавить хоть что-то сложнее if/for: углублённое изучение OOP, DDD, паттерны, SOLID, testing, workflow, CVS. То, что может пригодиться в работе. Сразу же уйдут те, кто думал, что все просто и интересно.

    Поэтому, либо учишь, либо зарабатываешь.
    Ответ написан
    3 комментария
  • Я сделал Code Review, может быть я где-то ошибся или у вас есть что добавить?

    @Sing303
    Опишу, как бы комментировал я
    public sealed class DataProvider : IDisposable
    {
        // nit: Предложил бы названия firstValue, secondValue либо более осмысленные, если возможно
        public extern int LongRunningCalculation(int value, int value2);
        public extern void Dispose();
    }
    
    // nit: сразу бы хотелось видеть уровень доступа и sealed (если класс не планируется наследовать)
    // Class2 - дать нормальное имя
    // { - перенести на 2ю строку по рекомендациям code style от microsoft (если не принято иных)
    class Class2 {
        // Синхронизация не нужна, если убрать метод Init, а Create вызвать в статическом конструкторе
        private readonly object _sync = new object();
        
        // _ht - дать осмысленное название
        // Судя по использованию, value может быть int`ом. Не зачем иметь лишний boxing и проверки на тип
        // _ht статический, значит к нему могут быть обращения из разных потоков, лучше сделать его ConcurrentDictionary
        // Прям сходу не могу сказать, но, возможно, использовал бы какой то другой тип Dictionary <key, key, val> (самописный или существующий), кажется, так было бы быстрее чем массив в ключе
        private static Dictionary<int[], object> _ht; 
    
        // nit: хотелось бы имена со смыслом
        public int GetValue(int index, int index2)
        {
            // Лишний метод, удалить. Create вызовем в static конструкторе
            Init();
            // Если ключ у нас объект, то необходимо реализовать IEqualityComparer для этого Dictionary (иначе не понятно как по нему искать)
            var key = new[] {index, index2};
            // Проверка на тип не нужна, Dictionary сделаем типа int
            if (_ht.ContainsKey(key) & _ht[key].GetType() == typeof(int))
                // приведение типов больше не нужно
                return ((int)_ht[key]);
            // nit: else не обязателен
            else
                // int не может быть null, будет ошибка, вернуть либо default, либо возвращаемое значение должно быть int?
                return null;
        }
    
        // Метод удалить, вызовем Create в статическом конструкторе без lock
        public void Init() 
        {
            if (_ht == null)
                lock (_sync)
                    Create();
        }
        
        // Нет смысла делать метод public, сделать private
        public static void Create() 
        {
            // nit: и так видно какой тип создаём, можно использовать var
            // Обернуть в using
            DataProvider provider = new DataProvider();
            
            // Тут следует инициализировать значение _ht, т.к. ранее оно нигде не создаётся
            // Не забыть передать реализацию IEqualityComparer в конструктор
            
            // nit: хотелось бы видеть использование фигурных скобок (если не принят иной code style)
            // nit: вместо int можно var
            // i и j, похоже, несут какой то смысл, можно попробовать придумать нормальное название (иначе не понятно почему 100 и 12, их можно в константы класса)
            // nit: возможно можно использовать Parallel.ForEach
            for (int i = 0; i < 100; i++)
                for (int j = 1; j <= 12; j++)
                    _ht[new [] { i, j }] = provider.LongRunningCalculation(i, j);
        }
    }

    А переписал бы так (если не убирать массив в dictionary)
    public interface IDataProvider : IDisposable
    {
        int LongRunningCalculation(int firstValue, int secondValue);
    }
    
    public sealed class DataProvider : IDataProvider
    {
        public extern int LongRunningCalculation(int firstValue, int secondValue);
        public extern void Dispose();
    }
    
    public sealed class DataProviderService
    {
        public DataProviderService(IDataProvider dataProvider)
        {
            _dataProvider = dataProvider;
        }
    
        private static readonly ConcurrentDictionary<int[], int?> _calculatedCache = new ConcurrentDictionary<int[], int?>(new CalculatedEqualityComparer());
        private readonly IDataProvider _dataProvider;
    
        public int? GetValue(int firstValue, int secondValue)
        {
            var isNotSupportedValues = firstValue > 100 || firstValue < 0 || secondValue < 1 || secondValue > 12;
            if (isNotSupportedValues)
            {
                return null;
            }
    
            var key = new[] { firstValue, secondValue };
            if (!_calculatedCache.TryGetValue(key, out var result))
            {
                result = _dataProvider.LongRunningCalculation(firstValue, secondValue);
                _calculatedCache.TryAdd(key, result);
            }
            
            return result;
        }
    }
    Ответ написан
    5 комментариев

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

Все вопросы (25)