• Есть ли языки/нотации для записи бизнес-логики?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    У нас для хранения бизнес-правил использовался BPML. Это XML-описание схемы процесса, которую можно представить визуально. То есть человекочитаемый формат тут — именно визуальная диаграмма, схема процесса. Для автоматизации же есть много клиентов и библиотек для работы с таким форматом.
    Ответ написан
    Комментировать
  • Как сделать регулярное выражение для положительных и отрицательных чисел?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Вариант решения:
    /^-?\d+\.?\d*$/

    Расшифровка:
    ^ - начало строки
    -? - символ "минус" ноль или один раз
    \d+ - цифры, минимум одна штука
    \.? - символ точки ноль или один раз
    \d* - снова цифры, но в этот раз минимум ноль раз
    $ - конец строки

    Без символов ^$ регексп будет матчиться с подстрокой, например он сработает на строку "123abc"
    Ответ написан
    Комментировать
  • Почему текстовый узел добавляется только в одну ячейку строки?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    for (var i = 0; i < 5; i++) {
        let td = document.createElement("td");
        element.appendChild(td);
        td.appendChild(cnt);
      }
    Нельзя вставить одну и ту же ноду в несколько родителей.

    Вместо этого нужно создавать новую ноду в каждой итерации цикла:
    for (var i = 0; i < 5; i++) {
        let td = document.createElement("td");
        element.appendChild(td);
        let node = document.createTextNode("Help");
        td.appendChild(node);
      }


    Подробнее см. ссылку от 0xD34F:
    узел не может находиться в двух точках документа одновременно.
    Ответ написан
    Комментировать
  • Как поправить ошибку "Uncaught TypeError: addToCart is not a function"?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    У вас вызывается функция при нажатии на кнопку:
    <button id="toCart" onclick = "addToCart()">Добавить в корзину</button>

    Однако объявление этой функции находится внутри цикла и не попадает в область глобальной видимости.
    // Добавление товаров в корзину 
      for(let j; j < products.length; i++) {
        function addToCart(j) {
          cart.push(products[j]);
          console.log(cart)
        };
      }
    Поэтому при нажатии на кнопку выбрасывается ошибка "нет такой функции".

    Скорее всего тут просто перепутаны местами строки. Должно быть:
    // Добавление товаров в корзину 
    function addToCart(j) {
        for(let j; j < products.length; i++) {
          cart.push(products[j]);
          console.log(cart)
        };
      }
    Ответ написан
    Комментировать
  • Как упростить код javascript?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Зависит от того, что с этим кодом планируется делать в дальнейшем.

    Если это разовая работа вида "сдал и забыл", исходники которой которую никому не предполагается смотреть, то можно оставить как есть и не париться. Всё и так работает, а интерпретатору всё равно, насколько понятно написан данный код.

    Однако, как писал Мартин Фаулер, "хороший программист пишет код, понятный человеку". Рано или поздно возникнет необходимость этот код читать. За примерами далеко ходить не надо: обсуждая данный вопрос, мы уже столкнулись с такой необходимостью, а в будущем возможны доработки либо изменения (исправления багов). Следовательно, хороший код должен быть написан понятно, причём понятно для всех, а не только для его автора. Судя по отсутствию каких-либо ответов и комментариев вот уже больше суток, данный код этому критерию не соответствует — никто просто не хочет выполнять бессмысленную работу, разбираясь с длинным запутанным листингом.

    Но что значит "понятно"? Кому понятно? Но что такое вообще "хорошо написанный код"? Как узнать, что с данным конкретным кодом что-то не так, и главное, как это исправить? На эту тему было написано множество книг, многие из которых стали классикой разработки: Р. Мартин, Г. Ларман, М. Фаулер, "банда четырёх" и прочие. Это целая наука, на одно знакомство с которой может потребоваться не один год; нет никакой возможности уместить всё в один ответ из нескольких абзацев.

    Вдвойне сложно обсуждать это на данном конкретном примере — к сожалению, он сделан в том стиле, в котором веб-разработка находилась примерно лет двадцать назад. Тогда сложных веб-приложений было мало, и в общем-то являлось нормой смешивать логику и представление в одном файле, в итоге превращая его в спагетти из html, php и javascript. От такой практики отошли, разделяя представление (разметку) и поведение (код на php) и вынося клиентские скрипты, где затем их можно было декомпозировать на отдельные переиспользуемые элементы.

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

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

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

    Думать о будущем. Чтобы оценить качество написанного кода, проверьте его на так называемую "устойчивость к изменениям". Представьте, что у вас возникла необходимость что-то добавить в уже существующее поведение, причём добавлять будете не вы, а другой программист, который видит ваш код впервые в жизни. Насколько легко ему будет это сделать?

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

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    document.getELementById is not a function

    Метода "getELementById()" у объекта document нет, есть только "getElementById()". Как и подавляющее большинство языков программирования, JavaScript чувствителен к регистру, поэтому здесь мы получаем ошибку.
    Ответ написан
  • Почему в консоли написано, что контекст null, но если раскрыть объект current - то видно, что контекст есть?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Сложно сказать точно не видя кода, но скорее всего, вывод в консоль происходит до присваивания значения полю current. Получение значений полей происходит непосредственно при раскрывании объекта в консоли, поэтому отображается значение, которое там действительно есть в момент раскрывания, но которого не было в момент логирования.

    Есть несколько вариантов, как обойти эту проблему:
    • Логируйте непосредственное значение, которое вас интересует: console.log(mapRef.current)
    • Сериализуйте объект перед логированием, чтобы увидеть его значения на момент логирования: console.log(JSON.stringify(mapRef))
    • Логируйте значения непосредственно перед использованием

    Каждый из них имеет свои недостатки, поэтому лучший способ — перейти от отладки через console.log на использование браузерного отладчика.
    Ответ написан
    Комментировать
  • Кто хорошо знает javascript, элементарный вопрос?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Если совсем в двух словах. Интерпретатор делает не то, что мы от него хотим, а то, что мы от него запросили. А знаком "плюс" в JS можно запросить две разные операции.

    Одна — это склеивание строк: "aaa" + "bbb" = "aaabbb"

    Вторая — это арифметическое сложение: 333 + 222 = 555

    В остальной арифметике — деление, вычитание и т.п. — такой двойственности нет. Нельзя, например, вычесть одну строку из другой: "aaa" - "bbb" = ?, поэтому для строк при использовании знака "минус" JS автоматически приводит строку к числу и мы получаем ожидаемый результат: "333" - "222" = 111

    Но для знака "плюс" такое не работает, т.к. интерпретатор не знает, что нам нужно, и делает то, что ему сказали:
    333 + 222 = 555
    
    "333" + "222"  = "333222"

    Поэтому приведение строки к числу должны запросить мы сами явно. Для этого мы и вызываем функцию parseInt(), которая делает такое приведение, т.е. превращает строку в число.
    Ответ написан
    1 комментарий
  • C# программисты, какие сайты вы читаете каждый день?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Ответ написан
    Комментировать
  • Как взламывают сим-карты?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Честно говоря, после внимательного прочтения всех описанных вами фактов, у меня не сложилось впечатления, что за вами следят, или что ваш телефон взломан. Большинство из описанных вещей происходит каждый день, с разными людьми, безо всякой слежки.

    Парни и девушки действительно хотят со смартфонами и ковыряются в них. На телефон действительно могут поступать звонки с неизвестного номера, при перезванивании на который автоответчик говорит "номер не зарегистрирован" - так спам-боты массово собирают номера для рассылок. Люди действительно подолгу сидят в машинах с тонированными стёклами, в том числе ковыряясь при этом в телефонах. Студенты в самом деле ходят с рюкзачками, при этом совершенно не обязательно они должны при этом за кем-то следить. Отправка смс с сайта операторов и в самом деле порой не работает - вы не первый человек, от которого я слышу такую жалобу. Телефон при включении с той же сим-картой и в самом деле не спрашиват пин-код - так и должно быть. Мобильная связь и безо всякого взлома может не работать - например, из-за помех.

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

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

    Самые большие (на мой взгляд) описанные вами странности - это проблемы со связью. Это не очень нормально, когда человек не может дозвониться, и ещё более ненормально - когда регистрируются звонки якобы от него, которых он не делал. Но по вашему описанию пока что нельзя понять, насколько систематичны были эти проблемы. Был ли "фальшивый" звонок разово, или это повторялось регулярно? Сколько раз? Он проявлялся только в наличии СМСки о пропущенном вызове? Видел ли кто-либо ещё эту СМСку? Как её прокомментировал сам вызывавший? Не было ли в его журнале вызовов исходящего звонка (может, случайно нажал)? Вполне вероятно, эти аномалии окажутся обычной технической неисправностью, безо всякого криминала.

    Можете попробовать провести эксперимент - купите дешёвый "контрольный" телефон с сим-картой того же оператора, оставьте его дома и никогда не берите с собой. Потом сравните качество связи с вашим старым телефоном - пусть друг при вас позвонит сначала на один, потом на другой. Потом отправит смс. Если с одним будет всё работать, а с другим нет (и более того - эта нерабочесть унаследуется при переставлении симки) - повод заподозрить неладное. По крайней мере так у вас будут неоспоримые факты.

    А пока что собранные "доказательства" напоминают известную шутку о том, что огурцы смертельно ядовиты - ведь подавляющее большинство умерших в прошлом году людей употребляли в пищу огурцы. Это одностороннее псевдо-доказательство, без проверки опровергающих гипотез. У вас начались какие-то неполадки со связью - вы начали замечать другие странности вокруг, это понятно. Это вовсе не значит, что этих странностей не было вокруг вас ранее.
    Ответ написан
    3 комментария
  • Можно ли написать скрипт, удаляющий программу, а потом устанавливающий ее?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    "Удаление программы" и "установка программы" при использовании инсталлятора - не более чем запуск определённого процесса (собственно инсталлятора, напр. msiexec) с определёнными параметрами (напр. /i - установить, /x - удалить). Регулярно выполнять какую-либо команду с параметрами можно через Планировщик Windows, powershell для этого не обязателен. Конкретный ответ тут будет зависеть от того, какой конкретно используется инсталлятор.
    Ответ написан
    Комментировать
  • Безопасное программное шифрование строки в windows?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Задача сформулирована не полностью. Когда и при каких условиях сама программа (а не злоумышленник) должна расшифровывать пароль? И должна ли? Почему не подходит хэширование?

    Шифрование предполагает создание шифротекста на основе исходной строки плюс некоего ключа. Ключ может быть ассиметричным, но он должен быть. Зашифровать без ключа нельзя по определению.

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

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Ultimate-редакция VS показывает количество вызовов на методах, можно вполне безопасно удалять методы с нулём вызовов. Хотя зависит от проекта, конечно.
    Ответ написан
    Комментировать
  • Как объединить два офиса по средствам DNS?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Вы пытаетесь подключать ПК к домену напрямую через интернет, выдав домен-контроллеру внешний ip. Такой подход не даст желаемого результата, а продолжение попыток его применить поставят под угрозу безопасность обоих офисов.

    Нужно соединить две ваши локалки через VPN. Получатся две подсети и маршрутизация между ними. Домен контроллеры и ПК должны находиться внутри локальной сети и иметь локальные адреса. К интернету ПК будут подключаться через отдельный прокси или шлюз. Домен-контроллер к интернету подключаться не должен! Если на нём находится DNS, который должен ресолвить внешние адреса, настройте форвардинг через DNS шлюза.
    Ответ написан
    Комментировать
  • Что выбрать для написания сервера real-time 2D игры?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Насколько я представляю, сервер можно реализовать в самом Unity-проекте www.paladinstudios.com/2013/07/10/how-to-create-an...
    Ответ написан
    Комментировать
  • Как реализовать синхронизацию самовыделения сервера в одноранговой сети клиент-серверного приложения С#?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Можно добавить промежуточную фазу перед назначением сервера, в которой клиент будет запрашивать сеть на аналогичные "кандидаты в сервера", и, в случае их наличия, перезапускать выборы.
    Ответ написан
    Комментировать
  • Где я ошибся при написании кода?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Есть версия, что падает в box.Text += webClient.ResponseHeaders.ToString()+ "\r\n";

    Если ответа не было получено, то ResponseHeaders будет null.
    Ответ написан
    Комментировать
  • Как побороть ужасную фрагментацию баз Касперского?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Папку SysWHist можно очищать полностью, работоспособности сканера это не помешает.
    Ответ написан
  • Защита от читеров в клиент-серверной игре

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Пожалуйста, уточните условие «Пользователи будут проходить квесты и получать за это какие-то бонусы, которые затем через обычный HTTP GET/POST будут передаваться на сервер». Кто будет передаваться? Бонусы?

    Если квесты проходятся локально на клиенте, а через HTTP посылается готовый результат — то как ни защищайся, читы не предотвратишь (слишком много векторов атаки, возможна не только подделка трафика, но и вмешательство в работу самой игры). Если же прохождение квестов отслеживается со стороны сервера, а через HTTP игроку даётся лишь конечный интерфейс — то и читерить не получится.
    Ответ написан
  • CMS/Wiki, ориентированная на переводы контента?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Для Drupal есть модули, реализующие указанный функционал.
    Ответ написан
    Комментировать