Задать вопрос
  • Как подключиться к Tor используя Golang и Colly?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    ТОР это Сокс5

    твоя шняга поддерживает
    https://github.com/gocolly/colly/blob/master/proxy...

    меняй код
    proxy.RoundRobinProxySwitcher("http://203.28.8.37:80")
    Ответ написан
    1 комментарий
  • Как переквалифицироваться из программиста в аналитики?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Вроде не маленький, опыт работы 10+ лет, а вопросы детские.
    Сходи по собеседованиям на аналитика, там всё и поймёшь
    Ответ написан
    Комментировать
  • Как переквалифицироваться из программиста в аналитики?

    Jacen11
    @Jacen11
    большой опыт работы программистом (10+ лет),

    Недавно случайно прочитал, что есть такая профессия - бизнес-аналитик

    это как вы так умудрились?

    вообще разработчик может спокойно сразу идти в аналитики. Но я впервые слышу чтобы разработчик не знал кто такие аналитики. Возможно у вас нет нормального опыта командного взаимодействия.

    какие могут пути для переквалификации в аналитики?
    можете идти сразу искать вакансии, скорее всего все таки уже все знаете, на работе доучат своим инструментам

    только там зарплаты меньше, самая большая что я видел это 300к с учетом премии, хотя потом будет легко в ПО уйти
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Похоже вас поймали на том что в js кто-то решил переопределить термин "замыкание"... Т к javascript далеко не первый язык, в котором есть нечто, претендующее называться термином "замыкание", то следует в первую очередь рассмотреть общее определение. Возьмём его из википедии:

    Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
    Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе.
    Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
    В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.[1]
    Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.


    Как видим из этого длинного определения (а не только его первого предложения) интервьюер оказался формально прав (что является неожиданностью и для меня самого. Кто знает, возможно это веяние нового или всё же творчество чрезмерного ЧСВ js-кодерков, но не будем предвзятыми) Посмотрим дальше...Переходим в английскую версию той же страницы в википедии:

    In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment.[1] The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] Unlike a plain function, a closure allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.


    О! А тут нет никаких "функций, вложенных в функцию" и нет никаких "создающихся каждый раз" Хм... Интересно. Ну за то есть абзац о том как появились замыкания:

    The concept of closures was developed in the 1960s for the mechanical evaluation of expressions in the λ-calculus and was first fully implemented in 1970 as a language feature in the PAL programming language to support lexically scoped first-class functions.[2]

    Peter J. Landin defined the term closure in 1964 as having an environment part and a control part as used by his SECD machine for evaluating expressions.[3] Joel Moses credits Landin with introducing the term closure to refer to a lambda expression whose open bindings (free variables) have been closed by (or bound in) the lexical environment, resulting in a closed expression, or closure.[4][5] This usage was subsequently adopted by Sussman and Steele when they defined Scheme in 1975,[6] a lexically scoped variant of Lisp, and became widespread.


    Ага. Оказывается первоначально они появились в такой не конвенциональной, с сегодняшней точки зрения VM, как SECD... И их создатель прямо говорит, что это код плюс данные. Далее термин применяют к лямбда-выражениям. Ничего не говорится, должны ли эти выражения возвращаться функцией, или достаточно того, что бы они захватывали переменные из своего лексического (или динамического, как в common lisp) окружения. Далее нам сообщают, что некие мистеры, Сасман и Стил, спустя каких то 11 лет добавили это в свой язык Scheme... Ну что же. Посмотрим замыкания в Scheme... А именно откроем книгу Сасмана и соавторов "Структура и интерпретация компьютерных программ" или "SICP" Первый раз (исключая содержание) слово "замыкание" встречается в главе 2 "Поcтроение абстракций c помощью данных"


    Важная идея в работе с составными данными — понятие замыкания (closure): клей для
    сочетания объектов данных должен позволять нам склеивать не только элементарные
    объекты данных, но и составные.


    Но, как выяснилось, это не те замыкания... Это замыкание в том смысле, что структуру одного типа (в данном случае пары) могут ссылаться на самих себя. И это то как термин "замыкание" понимают математики. Далее в SICP никаких других определений замыканий нет (несмотря на то, что само их использование конечно же есть) Ну ничего не остаётся как посмотреть что же сегодня называют замыканиями в языке Scheme... Гугл по этому запросу выдал первой ссылкой: https://www.cs.utexas.edu/ftp/garbage/cs345/schint....
    Цитирую:

    Procedures are Closures
    Scheme procedure's aren't really just pieces of code you can execute; they're closures.

    A closure is a procedure that records what environment it was created in. When you call it, that environment is restored before the actual code is executed. This ensures that when a procedure executes, it sees the exact same variable bindings that were visible when it was created--it doesn't just remember variable names in its code, it remembers what storage each name referred to when it was created.

    Since variable bindings are allocated on the heap, not on a stack, this allows procedures to remember binding environments even after the expressions that created those environments have been evaluated. For example, a closure created by a lambda inside a let will remember the let's variable bindings even after we've exited the let. As long as we have a pointer to the procedure (closure), the bindings it refers to are guaranteed to exist. (The garbage collector will not reclaim the procedure's storage, or the storage for the let bindings.)

    Here's an example that may clarify this, and show one way of taking advantage of it.

    Suppose we type the following expression at the Scheme prompt, to be interpreted in a top-level environment:

    Scheme> (let ((count 0))
               (lambda ()
                  (set! count (+ count 1))
                  count)))

    ##

    Evaluating this let expression first creates a binding environment with a binding for count. The initial value of this binding is 0. In this environment, the lambda expression creates a closure. When executed, this procedure will increment the count, and then return its value. (Note that the procedure is not executed yet, however--it's just created.) This procedure, returned by the lambda expression, is also returned as the value of the let expression, because a let returns the value of its last body expression. The read-eval-print loop therefore prints a representation of the (anonymous) procedure.


    Что имеем ? В Scheme - вообще любая функция - это замыкание! Т к она всегда захватывает контекст, даже если там пусто!. Что видим в коде ? Ну с точки зрения Scheme тут конечно вложенная функция, т к let - это на самом деле lambda, но так происходит потому, что в Scheme нет переменных в понимании js. В js же можно считать, что глобальный контекст - результат действия нечто, что эквивалентно let. Захватывает ли любая функция в js этот контекст ? Не знаю. Но точно знаю, что в вашем примере это определенно так - х часть контекста, который захватывается функцией. Кто хочет поспорить - идите спорьте с создателями Scheme (скажите, когда попкорн покупать, я посмотрю как вас пороть будут. Набежало тут вайтишников =)) Кто то может сказать "а вот у нас в js замыкания определяются не так" На что я отвечу: знаете, товарищи, а идите ка вы лесом! Если есть однажды созданный и определенный термин, нужны весьма веские причины что бы менять его определение. Желания левой ноги очередного вайтишника тут не достаточно.
    Ответ написан
    30 комментариев
  • Поможет ли запись информации на весь возможный объем памяти после удаления - избежать восстановления информации?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    поможет ли запись бессмысленной информации - стереть предедущую и предотвратить ее восстановление?

    Да, поможет. Однако, необходимо держать в голове специфику вашего устройства.

    На жёстких дисках (HDD) у вас есть возможность записать новые данные поверх именно в те сектора, где хранился стираемый файл. Благодаря этому вы можете взять программу наподобие Eraser и стирать информацию "таргетированно".

    Сейчас эта ситуация начинает изменяться - у самых новых жёстких дисков начали появляться трансляторы, похожие на те, которые используются в SSD.
    Кроме того, часть моделей использует технологию Shingled Magnetic Recording (SMR), из-за которой возникает вопрос о том, что происходит с лентой, которая сначала записывается в медиакэш. Под капотом эта технология далеко не так проста, как кажется, но говоря кратко, даже формально будучи временным, дублирование информации в разных областях диска оставляет поводы для сомнений.

    На твердотельных накопителях (SSD), флешках, и картах памяти записать информацию в нужный сектор не получится из-за механизма wear leveling, равномерно "размазывающего" данные по всему объёму флэш-памяти.

    Однако, у ССД есть TRIM, на который отчасти можно положиться, и который часто становится причиной безвозвратной потери информации после случайного удаления.
    Но в связи с тем, что наша цель - гарантированное удаление, безопаснее будет действительно заполнить свободное место какими-либо неважными данными.

    И HDD и SSD можно затереть целиком, запустив тест записи "по всей поляне", любым софтом, который такое умеет. Например, Р.тестером. В качестве бонуса к затиранию бесплатно получите отчёт о состоянии поверхности/памяти.

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

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

    Но если вы удаляете какую-то серьёзную корпоративную информацию, или секреты государственной важности, о последнем абзаце стоит помнить и рассмотреть идею физического уничтожения диска (либо его размагничивания специальными устройствами). Это наиболее безопасный способ, который поможет всем участникам процесса (в т.ч. и диску - ba-dum-tss!) спать спокойно.
    Ответ написан
    Комментировать
  • А есть какие-нибудь сообщества блокчейн разработчиков?

    Noizefan
    @Noizefan
    их, обычно, называют айтишниками, и обитают они в основном в привычной среде - на форумах. там открывают целые филиалы касающиеся отдельных тематик - вероятно, в это число входит и блокчейн.

    Смысл делать на каждый пук отдельный чат/форум/сайт?))
    Ответ написан
    Комментировать
  • Чем плох md5(md5($pass)) для пароля?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Иногда смотришь на вопрос и не понимаешь, о чем он.
    Судя по вопросу и цифрам в нем, автор и так уже осведомлен о правильных способах хэширования и должен уже знать ответ на свой вопрос.

    Ну если до сих пор не ясно, то цифры здесь приведены для цпу общего назначения, а не для железа, предназначеного для вычисления хэшей. На котором ситуация для мд5 будет совсем плачевная.

    Возможно, непонимание происходит оттого, что существует не один, а несколько векторов атаки на пароль.
    1. Поиск хэша по "радужным таблицам" (rainbow tables): огромным базам данных, где собираются заранее посчитанные хэши для любых возможных строк.
    2. Метод грубой силы (bruteforce): перебирать все комбинации символов и применять к ним хэширующую функцию до тех пор, пока она не вернёт искомый хэш.
    3. Поиск по словарю. Похож на брутфорс, но перебор не всех возможных значений, а всего нескольких тысяч самых популярных паролей, типа "123", "password" и пр.
    phpfaq.ru/tech/hashing

    И только одного элемента недостаточно, а нужны все в комплексе:
    - Хэширующая функция должна иметь большую вычислительную сложность, чтобы усложнить подбор перебором. по этой причине md5() не подходит
    - Хэш должен быть посолен уникальной солью, чтобы нельзя было, затратив 1 раз кучу вычислительных усилий, заранее построить хэши для любых комбинаций символов. По этой причине фарш без соли - деньги на ветер.
    - Пароль не должен быть слишком простым, иначе даже медленный перебор его раскроет. Этот момент тоже надо учитывать
    Ответ написан
    Комментировать
  • Какой лучший бесплатный CRUD генератор для Laravel?

    @lolrofl01
    Сколько не брал разные готовые решения - все равно приходилось разбираться что к чему, читать доку, часть переписывать. Лично я не увидел какой-то большой экономии времени по сравнению с самостоятельным написанием. Если часто пишете админки, то зачем каждый раз писать разное? Суть то одна, возьмите crud из предыдущей админки.
    Ответ написан
    1 комментарий
  • Можно ли найти некий список оферов на работу?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Прежде чем использовать слово - стоит узнать, что оно значит :)

    Оффер (англ. offer - предложение, предлагать) - в терминах англоязычного рынка труда это предложение конкретному Вам занять конкретное место в конкретной компании, направленное этой самой компанией. Оно да, может содержать условия по релокейту (как и многие другие условия)

    Но:
    - оффер делается конкретному человеку Джону Смиту, для Джона Буля он уже может быть ваще другим. Соответственно никакого каталога офферов нет и быть не может.
    - оффер обычно делают специалистам, которые представляют для компании интерес (если мы говорим про оффер с релокейтом). Джунов/ждунов (замечательное выражение от DevMan !) обычно хватает по самые розовые ушки и в самой стране, где компания находится :)
    Ответ написан
    Комментировать
  • Можно ли найти некий список оферов на работу?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Оффер - это предложение конкретному человеку выйти на конкретную позицию на определённых условиях, который выдаётся после собеседований. Очевидно, списка офферов нигде не существует. Видимо, вы имели ввиду слово "вакансия", а не "оффер".
    Ответ написан
    Комментировать
  • Можно ли найти некий список оферов на работу?

    DevMan
    @DevMan
    вы начитались, а скорее просто неверно интерпретировали, какой-то хрени.
    релокейтают очень охотно и с удовольствием. но только тех, кто уже состоялся.
    джунам/ждунам в этой поляне ничего не светит. кроме завязок.
    Ответ написан
    Комментировать
  • Как спроектировать страницу авторизации с точки зрения паттерна MVC на PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Или же я вообще пишу глупость

    В целом да. Но

    вся эта логика прекрасно будет в index.php лежать?

    - это гораздо большая глупость.
    Ну то есть лежать-то будет, но к MVC уже никакого отношения не будет иметь.

    По пунктам

    Юзер не должен принимать в конструкторе логин и пароль.
    Вот сейчас эта страница отображает мне двух юзеров помимо меня. Их обоих надо создавать с логином и паролем, серьёзно?

    Что такое AuthPage вообще непонятно. Модель, контроллер? По базе проверяет модель, куки пишет контроллер. А здесь какой-то кадавр.

    Перед тем как писать авторизацию "в стиле MVC", надо сначала разобраться, что такое модель, что такое контроллер, и что такое вью.

    Модель - это вся логика приложения.
    Контроллер - это интерфейс для общения модели с браузером. Делает всё, связанное с обработкой НТТР запросов.
    Вью - отображение.

    Как правильно.

    Соответственно в модели должен быть класс User с методом auth(), который принимает логин и пароль и возвращает инстанс класса Юзер.
    В конторе делается экшен: отдельный метод, который
    - проверяет, если был запрос методом ПОСТ, то берет из него логин и пароль,
    - валидирует их, если валидация не прошла, то создает ошибку, которую надо показать юзеру
    - если прошла, то вызывает метод auth() модели User, передавая в него логин и пароль
    - если совпали, то пишет в сессию ид юзера, и делает редирект куда-нибудь
    - если не совпали, то создает ошибку, которую надо показать юзеру
    - вызывает вью с формой для логина и пароля

    Для регистрации делается еще один экшен, который
    - проверяет, если был запрос методом ПОСТ, то берет из него данные для регистрации,
    - валидирует их, если валидация не прошла, то создает ошибку, которую надо показать юзеру
    - если прошла, то то заполняет класс User данными и выполняет метод save() и делает редирект куда-нибудь
    - вызывает вью с формой для регистрации

    Для личного кабинета делается третий экшен, который берет из сессии ид юзера, обращается к методу read() модели User и через View показывает личный кабинет

    Варианты реализации

    Самый простой вариант реализации контроллера - это папочка с отдельными файлами-экшенами. Ничего плохого в такой архитектуре нет, этот этап надо пройти, если раньше так не делали.

    То есть папка user в которой есть, скажем, файл index.php который является экшеном личного кабинета.
    Он проверяет юзера в сессии, и если нету, то перекидывает на auth.php
    в auth.php есть форма и ссылочка на register.php
    Все три файла инклюдят в себя файл user.php из папки model, в котором есть функции auth(), register() и profile()

    Но в более классическом варианта к трем буквам MVC добавляется ещё одна - R, роутер. Специальный сервис, который разбирает адресную строку, и видя, например, что к сайту обратились по адресу /user/register, создаёт экземпляр класса UserController и вызывает его метод register()
    Ответ написан
    4 комментария
  • Где найти книги или курсы по PHP, где даётся проектирование приложений с учётом ООП?

    @Kirill-Gorelov
    С ума с IT
    Эх дружище, так я тебя понимаю......
    Но сколько бы я сам книг не прочитал, курсов не пересмотрел, тут дело в одной штуке, опыт.
    Который приходит только через боль, пот, мучения, стыд, страдания, несколько лет ужасного кода и потом будет приходить видение как сделать классно и правильно, потому что пока ты все это на себе испытаешь ты очень многому научишься.
    Поэтому продолжай читать, писать, учиться и все придет само собой.
    Ответ написан
    Комментировать
  • Как рекламировать пиво на яндексе и гугле?

    Jump
    @Jump
    Системный администратор со стажем.
    Как рекламировать пиво на яндексе и гугле?
    Никак. Это незаконно и неэтично.

    и как быть с SEO ведь органическое продвижение не попадает под закон о рекламе
    Что это за фрукт - "SEO ведь органическое продвижение" неизвестно, поэтому нельзя сказать попадает или нет.
    Под закон о рекламе попадает реклама.
    Ответ написан
    4 комментария
  • Где хранить большой массив объектов в реакт приложении?

    Zraza
    @Zraza
    Помог ответ? Отметь решением!
    Мой взгляд, на истину не претендую:

    Я сторонник того, что на клиенте вообще не стоит хранить большие объемы данных. Т.е. запрашивает только те, которые нам нужны для работы/отображения в конкретный момент. Все фильтры/сортировка/пагинация на стороне сервера. Понятно, что это не всегда возможно, поэтому идем дальше...

    В хранении большого объема данных в редаксе не вижу ничего плохого, если они редко меняются. Если часто - неприятно, нужно поддерживать иммутабельность, затраты на garbage collector.
    Плюсы - быстрый доступ до данных, т.к. хранятся они в памяти.
    Минусы - поддержка иммутабельности и затраты на память.

    Если уж отходить от редакса - можно воспользоваться каким-то стором на основе мутабельных объектов, например mobx.

    Если всё это держать в памяти не хочется - то действительно можно взять IndexedDB. Хранится на диске, между перезагрузками сохраняется, асинхронное апи, есть индексы по полям. Нужно учесть, что на браузерах в режиме инкогнито может не работать или работать ограниченно (для предотвращения отслеживания).

    Ну и, конечно, вопрос в объеме данных. Просто 2к объектов - не то, чтобы сильно много. Вопрос, насколько тяжелых объектов.
    Ответ написан
    2 комментария
  • Какой IDE выбрать вместо Borland C++?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    А почему не CLion ? Вроде тоже хороший IDE. Либо Visual Studio.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы контейнер Docker был запущен постоянно?

    @Tiasar
    Web Developer
    Контейнер живет ровно столько сколько жив процесс запущенный в нем командой ENTRYPOINT [ "php", "./index.php" ], как только Ваш скрипт index.php завершает работу контейнер останавливается.
    Какую задачу Вы хотите решить? От этого зависит как сделать правильно.
    Ответ написан
    3 комментария
  • Насколько полное изучение Java c работой над реальными проектам поможет php программисту в его работе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Несмотря на то что в вопросе немного каша, а в ответах - ад, ответ на вопрос, в общем-то, очевидный.

    В первую очередь с точки зрения простой житейской логики. Есть возможность? Надо воспользоваться. Вылезти из-под своей коряги посмотреть на неё со стороны всегда полезно, в любом деле.
    Возможность узнать что-то новое - всегда полезна. Может быть ты и вправду, как тут вещают некоторые ораторы, проникнешься омерзением к пхп и пойдешь писать на яве.

    Но помимо общих соображений есть и вполне практические.
    Надо понимать, что ООП везде один и тот же. Пхпшники учат ООП по книжкам, где все примеры на яве. То есть в предположении что никакой пользы потому что синтаксис разный ты неправ. Уровень синтаксиса в какой-то момент перестает иметь значение, когда ты начинаешь думать не синтаксисом, а паттернами.
    При том что учить ООП работая с по сути процедурным языком, и с исходно ОО-языком - две большие разницы.
    То есть, ты абсолютно прав том посыле, что изучение явы придаст мощное ускорение твоему пониманию ООП в пыхе.

    Хайлоад же проекты - это из немного другой области. Тут идет откат скорее в обратном направлении. Это как с денормализацией - БД должна быть нормализована, но из соображений производительности иногда приходится денормализовывать. ПОСЛЕ того как нормализовал.
    SOLID помогает делать большие проекты управляемыми. Но когда большой проект сталкивается с высокими нагрузками, иногда приходится жертвовать принципами ради производительности. Но тут главное, опять же, не путать направление: СНАЧАЛА делаем правильный дизайн, и только потом в критических точках снижаем накал абстракции, переходим на более низкий уровень. Самый наглядный пример - ORM, когда критические запросы переписываются на чистый SQL.

    Ну и пройти "полный курс" не имеет ничего общего с "полным изучением". С полного курса изучение всегда только начинается.
    Ответ написан
    Комментировать
  • Как перейти на вторую html страницу без перезагрузки?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Поменять любой контентный кусок на загруженной странице - можно ОДНОЙ функцией с помощью includeHTML.
    PS: звёзды приветствуются!
    Ответ написан
    Комментировать
  • Как оформить на CSS вертикальные загнутые срелки?

    hzzzzl
    @hzzzzl
    сейчас придет кто-нибудь и нарисует svg, но я не умею, а на css/scss можно начать как-то так

    Ответ написан
    Комментировать