• Кто должен логировать? Функция или тот, кто её вызывает?

    artemgapchenko
    @artemgapchenko
    То, что вы описали, называется в англоязычной литературе cross-cutting concerns - это такие области кода, которые решают не саму бизнес-задачу, а являются как бы перпендикулярными к ней, и относятся скорее к функционированию системы. Вы правы насчёт того, что добавлять логирование в саму функцию - это, наверное, не совсем правильный выбор, так как во-первых, функция начинает решать две задачи, что сразу же уменьшает время на понимание её работы, а во-вторых, возможно будут варианты вызова функции, при которых её выполнение логировать не обязательно.
    Я бы, возможно, попробовал зайти к этой задаче со стороны паттерна Декоратор (дальше пишу на Java, так как этот язык для меня основной, но принципы должны быть понятны).

    Определяем интерфейс:

    interface ClientHandler {
    	void blockUser(User user);
    	void unblockUser(User user);
    }

    Дальше пишем реализацию, которая будет заниматься блокированием/разблокированием пользователя:

    public final class ClientHandlerImpl implements ClientHandler {
    	public void blockUser(User user) {
    		// Логика блокирования пользователя
    	}
    
    	public void unblockUser(User user) {
    		// Логика разблокирования пользователя
    	}
    }

    А теперь ход конём: пишем декоратор, который будет оборачивать собой написанную нами имплементацию (и в аргументе конструктора пробрасываем ClientHandlerImpl):

    public final class ClientHandlerLoggingDecorator implements ClientHandler {
    	private final ClientHandler handler;
    
    	public ClientHandlerLoggingDecorator(final ClientHandler handler) {
    		this.handler = handler;
    	}
    
    	public void blockUser(User user) {
    		Log.d("User " + user.getName() + " blocked!")
    		handler.blockUser(user);
    	}
    
    	public void unblockUser(User user) {
    		Log.d("User " + user.getName() + " unblocked!")
    		handler.unblockUser(user);
    	}
    }


    Дальше можно будет создать, например, фабрику ClientHandler'ов, которая по запросу будет возвращать нам новый инстанс ClientHandler'а:

    public final class ClientHandlerFactory {
    	public static ClientHandler getClientHandler() {
    		return new ClientHandlerLoggingDecorator(new ClientHandler());
    	}
    }

    Чего мы добились:
    1. Код логирования вынесен из реализации ClientHandler, если вам нужно будет изучить реализацию блокирования/разблокирования, вы просто открываете ClientHandlerImpl, и изучаете её.
    2. (связано с предыдущим пунктом) Реализацию блокирования/разблокирования и логирования теперь можно менять независимо друг от друга.
    3. Логирующее поведение становится скрытым для пользователей ClientHandler - они просто получают новый инстанс при обращении к фабрике, и используют его. Хотите отключить логирование? Меняете реализацию фабрики, и она начинает возвращать ClientHandlerImpl. Хотите сделать это поведение настраиваемым? Пишете дополнительный код, который на старте читает конфигурацию, и начинает использовать либо ту реализацию фабрики, которая возвращает ClientHandler, покрытый декоратором, либо реализацию, которая возвращает голый ClientHandler. Либо же зашиваете этот выбор внутрь самой фабрики.
    Ответ написан
    Комментировать
  • Библиотеки для работы с web в Haskell?

    hrls
    @hrls
    Ответ написан
    Комментировать
  • Компиляция .NET Core?

    Насколько я могу судить по описанию у вас включена компиляция сразу и под .net core и под .net framework одновременно. У меня было подобное. Отключить можно через настройки solution-а, либо удалить все упоминания о .net framework с project.json
    Ответ написан
    Комментировать
  • Как перебрать все сочетания?

    x67
    @x67
    1. Анализ. Каковы свойства появления нечетных чисел? Ч+Ч=Ч; НЧ+НЧ=Ч; НЧ+Ч=НЧ. Бинго! Исходя из вышесказанного, нам нужно сложить сколь угодно четных чисел и нечетное количество нечетных чисел.
    2. Определяемся со свойствами наборов. Сколько цифр? А цифры ли это или числа?
    3. Когда задача будет однозначно и четко поставлена, не составит труда сначала отфильтровать наборы, которые не дают в сумме нечетное число, затем те, чьи цифры/числа не являются достаточно высокими (выше среднего, к примеру), а из оставшегося множества уже простым перебором найти наибольшую сумму.
    Ответ написан
    Комментировать
  • Как перебрать все сочетания?

    AnnTHony
    @AnnTHony
    Интроверт
    Зачем перебирать все сочетания?
    Отсортировать набор цифр.
    Взять указанное количество самых больших
    Если их сумма четная - заменить самую младшую на предыдущую из списка пока сумма не станет нечетной.
    n = [1, 5, 3, 4, 9, 7, 6]
    k = [3]
    n_sort = [1, 3, 4, 5, 6, 7, 9]
    k_sum = 6 + 7 + 9 = 22 - четное число
    Меняем 6 на 5, k_sum = 5+ 7 + 9 = 21 - PROFIT!
    Ответ написан
    3 комментария
  • Range-based циклы?

    По той же причине, по которой аргументы функции модифицируются только через ссылку.
    Ответ написан
    Комментировать
  • Реально ли скрыть свое местоположение в интернете?

    @madion
    Покупаешь планшет с симкой на китайском сайте. Покупаешь симку без паспорта. Выезжаешь подальше от своего дома. Ставишь whonix и делаешь свои грязные дела. Важно не юзать этот планшет в личных целях, а только по "работе". Периодически менять симку, устройство, местоположение.
    Ответ написан
    2 комментария
  • Реально ли скрыть свое местоположение в интернете?

    Jump
    @Jump
    Системный администратор со стажем.
    Реально ли скрыть свое местоположение в интернете?
    Вполне реально, но сложно.
    Можно это сделать и с помощью TOR или VPN, но нужно четко понимать что и для чего вы делаете. Простое использование TOR и VPN не поможет.

    Может ли кто либо узнать мой адрес проживания у провайдера?
    Разумеется. И не обязательно у провайдера, а у любого кто его знает.

    Хотя если пользоваться моб. интернетом то там адрес не привязан.
    Ошибаетесь, Мобильный в этом плане ничем не отличается от проводного.

    Что скажете на счет GPS на пк и смартфонах, достаточно их просто отключить?
    Не сложно. даже школьники справляются. Галочку в настройках поставить. Хотя можно и антенну выдернуть.
    Только надо понимать - для того чтобы определить местоположение телефона GPS не нужен.

    И если проделать какие то манипуляции типа Тор + vpn + vpn + виртуалка. то как проверить работает ли все это?
    Ну если в интернет получиться выйти значит работает.

    Если пишите что то типа, если захотят, найдут и т.д. то пишите как это можно примерно сделать?
    Запросто, опишите ситуацию и как выходите в интернет, и я скажу, как вас найти.
    Ответ написан
    8 комментариев
  • Реально ли скрыть свое местоположение в интернете?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Реально ли скрыть свое местоположение в интернете?
    Нет! Это - фантастика!
    Хотите узнать: что такое пакетная мимикрия на уровне чипов устройства, участвующего в передаче данных (пк, сервер, смарт, телек, чайник, роутер и прочее)?
    Сразу говорю - не советую!
    После того, как найдут Вас, даже и не поймёте никогда потом: как так произошло?...
    maxresdefault.jpg
    Ответ написан
    1 комментарий
  • Реально ли скрыть свое местоположение в интернете?

    А что вы хотите с этим делать и от кого что прятать? Спрятать IP можно, если понимать для чего это нужно и от чего защищает.
    Среднестатистическому пользователю Tor не даст ничего, потому что не имеет смысла в одном и том же браузере в одном окошке прятать свой IP а в другом грузить фоточки с геотаггингом во вконтактик.
    Ответ написан
    8 комментариев
  • Как Работает вирус?

    @Mercury13
    Программист на «си с крестами» и не только
    Добавлю от себя.

    Сейчас вирусы на ассемблере пишут редко, и этому есть две причины.
    1. Сложная полезная вредная нагрузка: загрузка чего-то через Интернет, сетевые эксплойты, дистанционное управление.
    2. Сложный формат PE, крайне редкий обмен софтом, цифровые подписи на критических файлах и UAC. Потому встраиваться в файлы тяжело и малопродуктивно. UPD — существует немало «вирусов-спутников», но цифровые подписи на критических файлах и UAC не пробить и им.

    Эксплойту с внедрением кода нужно небольшое тело, и его пишут на ассемблере или Visual C. А если это обычный EXE/DLL — то на языке, для которого в ОС гарантированно есть runtime-среда. В основном Visual C и .NET старых версий.

    Вирусы, эксплуатирующие ошибки в runtime-средах (JS-движках, Java, .NET) — разумеется, на языке среды (JS/Java/C#). Если ошибка предполагает внедрение кода — см. выше.

    UPD2. Я не писал вируса, но как бы я его заставил работать?

    Прошёлся бы по дискам. Создал бы скрытую папку с микрософтоподобным именем и потихонечку бы шифровал в неё файлы. Вдруг в момент Икс я переименовываю исходные файлы в ту самую папку, затираю пару килобайт начала, переименовываю скрытые на их место и вывожу: ваш компутер зашифрован! Если человек мешкает — затираю остатки файлов, а потом и удаляю их.

    Остаётся придумать, как этот вирус протащить на компьютер жертвы и как прикинуться легитимной программой. Простейший вариант, по-моему — прикинуться сайтом программ, в каждую поместить вирус и сделать активное SEO. Что будет, когда попадусь — не знаю. А прикинуться программой — придумаю какую-нибудь службу-технотуфту от Microsoft. Хотя настоящие вирусописатели покупают на чёрном рынке эксплойты, я с этим делом не знаком.
    Ответ написан
    Комментировать
  • Почему не получается создать TypeScript проект в VS?

    yarosroman
    @yarosroman
    C# the best
    не установлен IIS Express. Запустите установку VS и выберете опцию Web разработка
    Ответ написан
    Комментировать
  • Почему не получается подключить неуправляемую dll?

    @Sumor
    Посмотрите на разрядность библиотеки и программы на C#.
    Программа на C#, если ничего не менять, запускается под x64. TDM-GCC скорее всего компилирует для x86.
    Подключаемые библиотеки должны соответствовать программе из которой они вызываются.
    Приведите всё к x64 или x86.
    Ответ написан
    Комментировать
  • Как программно создать ярлык в MS VC++ 14.0 Windows 10?

    Adamos
    @Adamos
    Вообще-то в этом веке за создание программой файлов в той же папке, где находится программа, бьют по пальцам рельсой.
    Потому что даже до "подоконников" уже дошло, что папка, откуда что-то запускается, не должна быть доступна кому попало на запись.
    Программа по умолчанию должна иметь право создавать какие бы то ни было файлы только по пути %APPDATA%/(название этой программы)/.
    Ну, может спросить пользователя, куда он предпочитает этот файл сохранить.

    А валить файлы себе же под ноги - это каменный век IT, и именно это неумение и нежелание организовать безопасное пространство - причина того, что по Виндам табунами ходят вирусы.
    Ответ написан
    2 комментария
  • Почему в С++ не работает цикл for?

    @khrisanfov
    Программист
    Потому что там не запятая нужна, а точка с запятой
    for(int a=0; a <= 10; a++) {}
    Ответ написан
    7 комментариев
  • На каком ал языке можно представить алгоритм перевода десятичных чисел в восьмеричные?

    Adamos
    @Adamos
    Нет никаких десятичных и восьмеричных чисел.
    Есть числа, а есть их запись - двоичная, восьмеричная, десятичная, шестнадцатеричная...
    Число одно и то же, но строчка текста, представляющая его - разная.
    Ответ написан
    3 комментария
  • Какой смысл в фильтрах Visual Studio?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Очевидно, что кому-то удобнее физически располагать файлы иначе, чем их отображать в IDE. В C++ зачастую хэдеры кладут отдельно, в папочку include, а сорцы - в src. Согласитесь, стремно было бы воспроизводить логическую иерархию дважды. А с помощью фильтров (aka виртуальных папок) можно легко всё сгруппировать так, как душе угодно.

    Про C#
    В .NET-проектах все немного иначе, потому что там существуют модули с метаданными и объявления типов не нуждаются в отделении от определения.
    Ответ написан
    Комментировать
  • Какой смысл в фильтрах Visual Studio?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Фильтры в Visual C++ - это методика организации рабочего пространства. Это старая и проверенная методика, зарекомендовавшая себя в MSVC++ еще с очень старых времен.
    Система фильтров позволяет организовать любую лапшу из файлов сторонней библиотеки, в которой все сделано по принципу: "Работает == Не трогай". Этим она чрезвычайно полезна.
    Так же фильтры позволяют сделать более тонкую организацию в тех местах, где на уровне файловой структуры она бессмысленна.

    Я бы не был так поспешен, ругая инструмент за то, что им пользуются явно неорганизованные или неграмотные "специалисты". В подавляющем большинстве проектов ты просто видел невежество. И ничего больше.
    Да, фильтры никак не привязаны к реальным папкам, а это и не надо. Да, на диске все можно хранить в одной папке (и в этом реальный плюс фильтров). Да, фильтры позволяют организоваться только внутри пространства самой среды.
    Но и ничего больше.
    Многие люди не считают должным разделять заголовки и исходный код по разным папкам, пеняя на "слишком сложную" организацию Include Directories. Только это не проблема среды, это такой у людей стиль организации рабочего пространства.
    Ответ написан
    3 комментария
  • Как заинтересовать человека(студента) в IT?

    tema_sun
    @tema_sun
    IT сейчас модно и кажется, что все должны им интересоваться. Но задайте этот же вопрос с указанием другой темы, и вы поймете всю абсурдность этой затеи. Например, "как заинтересовать человека бухгалтерией?" или"как заинтересовать человека дойкой коров?"
    Ответ написан
    1 комментарий