• Typescript vs ES7?

    vitali1995
    @vitali1995
    Без типизации в крупных проектах будет туго, да и в небольших использовать типизацию приятнее. Я полностью перешёл на TS, который постоянно меня выручает.

    Примеры:
    * В JS изменить название переменной - это целый подвиг. С TS это делает за нас IDE.
    * Забудьте про опечатки - вам не придётся с удивлением обнаруживать их в процессе выполнения и искать причину внезапного undefined.
    * Новые возможности для рефлексии, которые (например) во всю использует Angular.
    Ответ написан
    Комментировать
  • Какие есть библиотеки для ip discovery на node js?

    kirill89
    @kirill89
    В npm обычно есть модули-обертки для всех популярных утилит, если я правильно понимаю, вашу задачу можно решить с помощью nmap, для которого есть обертка.
    Ответ написан
    1 комментарий
  • Как рекурсивно распарсить скобки?

    Во-первых, заменим splitOn " " на words, который съест все пробелы. Далее, concat $ map ... - это то же, что и concatMap .... Рассмотрим sepBr. Он берёт строку без пробелов и делит её на куски, если там есть операторы, числа или скобки. Если строка уже пустая, результат - пустой список. Если строка непустая, то возможны варианты. Если первый её символ - какая-то скобка, отделяем эту скобку, а остальное делим опять при помощи sepBr. Иначе делаем так: разделим строку, чтобы сначала шли только цифры: span isDigit и посмотрим, что получилось. Если цифры есть - отделяем их, а остальное опять делим sepBr. Если цифр нет, то просто отделяем первый символ. Вот, что получилось:
    sep ∷ String → [String]
    sep = concatMap sepBr . words where
    	sepBr ∷ String → [String]
    	sepBr "" = [] -- нечего делить
    	sepBr s'@(x:xs)
    		| x `elem` "()" = [x] : sepBr xs -- скобка
    		| otherwise = case span isDigit s' of -- возьмём цифры
    			("", t:tl) → [t] : sepBr tl -- нет цифр, берём первый символ остатка
    			(n, tl) → n : sepBr tl -- есть цифры, их отдельно


    По поводу вашего второго варианта.
    if word == [] then [] else head word - т.е. a либо пустой список, либо символ, типы не совпадают. Но в вашем случае word не может быть пустым, ведь выше уже был паттерн sepBr "", так что можно просто оставить a = head word
    Далее, что такое ab? Это [a] ++ b, т.е. [head word] ++ init (tail word), т.е. это то же, что и просто init word. Аналогично bc = tail word. Вместо того, чтобы брать отдельно head и отдельно tail, можно воспользоваться паттерн-матчингом и записать (a : bc) = word.
    С учётом этого ваш вариант переписывается в
    sep2 ∷ String → [String]
    sep2 = concatMap sepBr . words where
    	sepBr ∷ String → [String]
    	sepBr ""  = []
    	sepBr " " = []
    	sepBr word
    		| a `elem` brackets = [[a]] ++ sepBr bc
    		| c `elem` brackets = sepBr ab ++ [[c]]
    		| otherwise = ([a : bc])
    		where
    			(a : bc) = word
    			c = last word
    			ab = init word
    			brackets = ['(', ')']

    И он вполне работает.
    Ответ написан
    1 комментарий
  • Payoneer: как перевести средства в рубли?

    opium
    @opium
    Просто люблю качественно работать
    Глупости говорите, доллар последние годы вообще не скакал особо, меняется только курс рубля, рубль упадет до сотки говорят за бакс, а вы решили их в рубли переводить, какой то вы не дальновидный, сейчас на бирже бакс по 58.8 за бакс, на бирже вм продают бакс по 63 рубля.
    Ответ написан
    5 комментариев
  • Стоит ли использовать RSA?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    И да и нет одновременно.

    (обновлено, ибо внезапно прочитал и половину не понял - видимо писал на "потоке")
    RSA стоит использовать лишь для шифрования других ключей - ключей симметричных алгоритмов шифрования. AES, ГОСТ 28147-89, 3DES и другие. Почему? Во-первых, симметричные алгоритмы более устойчивы к взлому при большом известном закрытом тексте, тогда как ассиметричное шифрование потенциально имеет изъяны. В том смысле, что (почти) любое ассиметричное шифрование использует задачу NP-класса (точнее - NP-полную задачу): факторизация числа (RSA), декодирование полных (общих) линейных кодов (McEliece), вычисление дискретного логарифма на элептической кривой (ГОСТ Р 34.10-2012), или в конечном поле (Elgamal). Другое дело, что любая эта задача потенциально - решаемая. В случае с симметричным шифрованием действительно стоит лишь надеяться на чудо (в ГОСТе разрешено выбирать любые s-блоки, так что криптоаналитику ничего не остаётся, как молиться пролетариату в надежде на терморектальный криптоанализ). В случае же с ассиметричным шифром в дело вступают две вещи - высокая сложность реализации действительно стойкого алгоритма (ассиметричные шифры очень сложны и полны нюансов, не учитывая которые можно запросто порушить систему), низкая скорость работы (в силу того, что приходиться использовать очень абстрактные математические функции, сложно реализуемые аппаратно и таящие в себе множество низкоуровневых операций) при требовании к очень длинным ключам заставляют использовать небольшие ключи для того, чтобы не ждать вечность.

    Однако. Здесь имеется странный парадокс. Если данные очень важные и на их защиту можно убить несколько миллионов енотов, то надо использовать только ассиметричный шифр. Потому что, он потенциально даёт большую стойкость. Парадокс здесь в том, что если классы P и NP неравны, то мы получаем едва ли не идеальную и приемлемую по стоимости защиту, так как есть возможность сложной организационной защиты.
    (здесь было многое отправлено в топку)

    Окай, посмотрим на стандартную схему с Алисой, Бобом и Евой:
    Алиса -> c = E(m, Eb) -> -------- -> D(c, Db) -> Боб (
                                     |
                                     |
                                     v
                         Ева <- c, E, D, d

    здесь m - текст, который надо передать (сообщение)
    c - шифротекст
    E - функция шифрования (получения из сообщения шифротекста)
    D - функция дешифрования, иначе - обратная функция шифрования (получения из шифротекста - сообщения)
    Eb, Db - секретный и открытый ключи Боба (в литературе используется различное обозначение, здесь так)
    Собственно, Ева знает всё о функциях шифрования и дешифрования, имеет доступ к шифротексту и будем считать, что она получает и открытый ключ.

    Теперь, что нам это даёт? А это нам даёт возможность наплодить большое количество ключей и шифровать каждое сообщение отдельным ключём. Потенциально, но если есть $$$, то можно скупить половину серверов страны, если не планеты и радоваться жизни. Хотя ровно так же можно поступить и с симметричным шифрованием, и называется это одноразовым блокнотом, используют и различные режимы шифрования и всё равно выходит профитнее. Где же профит здесь?
    Во-первых, если нужно передавать по каналу, а не хранить, то можно генерировать ключи налету и после расшифровки их уничтожать. По сути, получиться что для того, чтобы получить сообщение длины l бобу потребуется передать и ключей в общей сумме длины l. Много? Да. Профитно? Очень - ибо мы реализуем
    ассиметричный одноразовый блокнот (упс), который, однако, нет никакого смысла использовать нет - слишком дорого. Да и не всегда возможно - порой обратный канал чрезвычайно узкий.
    Во-вторых, есть способ организовать защиту, основанную на иерархии пользователей. То есть майор Алиса написала отчёт, который ей надо отправить подполковнику Бобу. При этом читать этот отчёт должны иметь право все, кто равен или выше подполковника.
    В-третьих, как писалось выше, сложность взлома достаточно велика. И не только потому, что P != NP. Даже P довольно большое получается, поэтому и используют асимметричный шифр для передачи ключей симметричных ключей. Но и взлом получается очень не простым из-за тяжёлых математических абстракций. Обычно. Да, RSA можно "взломать" перебрав все возможные делители, но это долго из-за астрономического размера ключа. А способы обхода или упрощения опираются на такой зубодробительный матан, что попытка как-то это реализовать заставит использовать сами по себе очень тяжёлые операции. Так это при работе с банальными числами (и это показывает, насколько плохо развита теория чисел), а что если уйти на эллиптическую кривую - аналитическая геометрия развита может чуть лучше, но абстракции намного тяжелее для компьютеров. И даже использование графических карт не помогает, ведь есть ещё и макэлис. Я к тому, что O(2^32) для симметричного шифра и O(2^32) для асимметричного шифра не очень таки равны. Так же не равны, как не равны день и месяц.

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

    Поэтому шифрование надо использовать соразмерно цене риска. Чем выше риск - тем сильнее шифрование, но самое главное - сложнее и дисциплинированнее организационные меры. Согласитесь - бесполезно иметь централизованное хранилище сертификатов с одним сервером в бункере за 200 км под землей и круглосуточной охраной из армии маленькой страны, всего лишь одним портом торчащим во внешний мир с каналом около 200 бит в секунду и постоянным наблюдением за организационными методами (авторизация, доступ и подобной)... Имея пароль на суперюзер - qwerty, и держа на винчестере архив с котиками.
    Ответ написан
    Комментировать
  • Можно ли майнить на блэйде?

    Jump
    @Jump
    Системный администратор со стажем.
    Разумеется можно. Пойдет любая вычислительная мощность.
    Только учтите что при текущей сложности, для майнинга одного биткойна ваш блейд скушает электроэнергии на несколько миллионов рублей.
    Ну и ни один блейд столько не живет. В лучшем случае он проработает лет тридцать это нормально для такого рода техники, но за тридцать лет вы биткойн на нем явно не намайните.

    Небольшой расчет
    --------------------
    Сейчас по биткойну сложность равна 39603666252.
    Среднестатический блейд будет потреблять примерно 200ватт в час.
    Скорость майнинга максимум будет 4мегахэша.
    При текущей сложности с такой скоростью вы будете майнить примерно 0,00002биткойна в за год. По текущему курсу биткойна к рублю это будет составлять примерно сорок копеек в год.
    За год майнинга ваш блейд потребит примерно 1700квт/ч электроэнергии, при цене электроэнергии 2рубля за киловатт это примерно 3400рублей.
    По времени - чтобы заработать один биткойн вам потребуется примерно 50тысяч лет, и 150миллионов рублей на электроэнергию.

    В случае с лайтконом все гораздо радужнее за год вы сможете намайнить если повезет чуть меньше лайткойна.
    В переводе на рубли это примерно 150рублей. Расход электроэнергиии тот же.
    Ответ написан
    Комментировать
  • Почему создатели EcmaScript (Javascript) выбрали "use strict" для строгого режима?

    OlegTar
    @OlegTar Автор вопроса
    программист .NET, Javascript, Perl
    Я поразговаривал с Алленом Вирфс-Броком (Allen Wirfs-Brock), одним из создателеей EcmaScript 5.
    Спасибо за наводку @Rrooom

    Он ответил:
    The 'use' directive idea was in the air. Maybe came from Perl. The innovation was using s string literal to avoid syntax errors.


    Идея директивы 'use' витала в воздухе. Может быть она пришла из Перла. Инновацией было использование строкового литерала, чтобы избежать синтаксических ошибок.


    С другим создателем EcmaScript 5, Пратапом Лакшаманом (Pratap Lakshman) мне связаться не удалось.

    таким образом даже создатель EcmaScript 5 точно не знает, почему use)
    Ответ написан
    Комментировать
  • Modx, почему в хроме зависает админка?

    BlaDe39
    @BlaDe39
    PHP разработчик вот уже 7 лет...
    Не поленился и разобрал что происходит. Проблема в хроме ± в ExtJS.

    Хром неверно выполняет операцию Date.add('mi',15) и забывает перемотать день, при этом в ExtJS.TimeField не предусмотрена остановка цикла по количеству итераций и он генерирует бесконечный цикл для генерации выпадающего списка времени в поле xdatetime.

    Сделал баг-репорт в хром: code.google.com/p/chromium/issues/detail?can=1&q=D...

    Ну и простенький фикс для modx: в файле /manager/assets/modext/util/datetime.js меняем строки
    ,maxTimeValue: null
    ,minTimeValue: null

    на
    ,maxTimeValue: new Date('08/10/2014').clearTime().add('mi', (24 * 60) - 16)
    ,minTimeValue: new Date('08/10/2014').clearTime()

    Что ограничивает нам время публикации на 23:44, но временно решает нашу проблему.

    Не знаю, стоит ли писать патч-реквест для modx, т.к. бага явно в хроме.
    Ответ написан
    4 комментария
  • В чём понт SAS?

    alexzeynikov
    @alexzeynikov
    Ох, сигейта нет на вас ;). Я видел отличную презентацию про отличия SAS и SATA у Игоря Макарова из Seagate. По стараюсь кратко и по существу.

    Ответов несколько и с разных сторон.
    1. С точки зрения протоколов, SAS — это протокол, направленный на максимальную гибкость, надежность, функциональность. Я бы сравнил SAS с технологией ECC для памяти. SAS — это с ECC, SATA — без. Примером могут служить следующие уникальные фичи (по сравнению с SATA).
    — 2 полнодуплексных порта на устройствах SAS в отличие от одного полудуплексного у SATA. Это дает возможность строить отказоустойчивые много дисковые топологии в системах хранения данных.
    — end-to-end data protection T.10. — набор алгоритмов SAS, позволяющий с помощью чексумм быть уверенным в том, что данные, подготовленные на запись без искажений записаны на устройство. И прочитаны и переданы на хост без ошибок. Эта уникальная функция позволяет избавиться от так называемых silent errors, то есть когда на диск пишутся ошибочные данные, но никто об этом не знает. Ошибки могут появиться на любом уровне. Чаще всего в буферах в оперативной памяти при приеме-передаче. Silent errors — бич SATA. Некоторые компании утверждают что на диске SATA объемом боле 500 ГБ вероятность повреждения данных хотя бы в одном секторе близка к единице.
    — про мультипасинг говорили в предыдущих ответах.
    — зонинг T.10 — позволяет разбить домен SAS на зоны (типа VLAN, если такая аналогия ближе).
    — и многое-многое другое. Я привел только самые общеизвестные фичи. Кому интересно — читайте спецификации SAS/SATA

    2. Не все SAS диски одинаковы. Есть несколько категорий SAS и SATA.
    — т.н. Enterprise SAS — обычно 10K или 15K оборотов в минуту. Объемы до 1 ТБ. Используются для СУБД и критичных к скорости приложений.
    — Nearline SAS — обычно 7.2K, объемы от 1 ТБ. Механика таких устройств похожа на Enterprise SATA. Но все равно два порта и другие прелести SAS. Используются в enterprise, где нужны большие объемы.
    — Enterprise SATA, иногда RAID edition SATA — почти то же самое что и NL SAS, только однопортовый SATA. Чуть дешевле NL SAS. Объемы от 1 TB
    — Desktop SATA — то что ставится в PC. Самые дешевые и самые низкокачественные диски.
    Первые три категории можно ставить в массивы на контроллерах от LSI и Adaptec. Последний — нельзя категорически. Проблем не оберетесь потом. И не потому, что у нас картельный сговор, а потому, что диски проектируются под разные задачи. То есть 8x5 или 24x7, например. Есть также такое понятие как максимальная допустимая задержка, после которой контроллер считает диск умершим. Для десктопных дисков она в разы больше. Это значит, что под нагрузкой рабочие Desktop SATA будут «вываливаться» из массива.
    Короче, ориентируйтесь на конкретные линейки под конкретные задачи. Лучше всего смотреть на сайтах производителей. Есть например специальные мало шумящие и мало греющиеся винты для домашней электроники.

    Те же подходы и к SSD, но область еще на сформировавшаяся, поэтому много тонкостей. Здесь мы ориентируемся по параметрам. Хотя все, что сказано в п., справедливо и для SSD.
    Ответ написан
    1 комментарий
  • Ошибка в nginx, не пойму в чем проблема?

    VBart
    @VBart
    Ну вот, сами донастраивались:
    Ваш putit.ru:
    upstream putit {
        # Адрес back-end'a
        server putit.ru:8080;
    }

    server {
        listen 80;
        server_name www.putit.ru putit.ru;

        access_log /home/username/domains/putit.ru/logs/nginx_access.log;
        error_log /home/username/domains/putit.ru/logs/nginx_error.log;

        # Перенаправление на back-end
        location / {
             proxy_pass backend;
             include /etc/nginx/proxy.conf;
        }

        ....
    }

    Ваш proxy.conf:
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 16k;
    proxy_buffers 16 16k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    Ответ написан
    1 комментарий