Pull to refresh
5
0
Богушевич Максим @bogushevich

User

Send message
Если писать код маленькими функциями (как и советует Макконел)

Макконел как раз утверждает, что нет ничего плохого в использовании относительно больших функций. Он предлагает не превращать маленький размер функций в самоцель, а определять размер функции в зависимости от задачи, которая на нее возложена и сложности внутренней структуры (та самая линейность, о которой говорит автор статьи). Ссылается он на исследования связи количества ошибок с размером функций, в которых они были найдены. От себя добавлю, что одна относительно большая функция, состоящая в основном из стандартных операторов, может быть значительно читабельней, чем пять маленьких ссылающихся друг на друга по цепочке.
Рекомендация про умещение в размер экрана у него тоже была, но мониторы нынче большие, шрифты маленькие, поэтому к маленьким функциям это отношения не имеет. Просто, как сказал lair, «ничем не стоит «увлекаться», а то случится беда».
Не будете же Вы для банков ПО писать на NodeJS.
PayPal в 2013 году начал переход с Java на Node.js.
There’s been a lot of talk on PayPal moving to node.js for an application platform. I’m happy to say that the rumors are true and our web applications are moving away from Java and onto JavaScript and node.js.
Не знаю насколько это актуально в обсуждаемом приложении, но все же parseInt(x) и Number(x) могут выдавать разный результат
Number('123_')
NaN
parseInt('123_')
123
Объясните, пожалуйста, если Ева взяла полный контроль над соединением, то что ей мешает по описанной вами схеме создать два шифрованных соединения по DH-алгоритму. Т.е. какое преимущество дает DH-алгоритм перед простым шифрованием открытым ключем/дешифровкой закрытым ключем в плане атаки MITM
сторона А шифрует открытым ключом стороны Б. Затем сторона Б, получив документ, сама вычисляется hash, потом расшифровывает ЭП своим закрытым ключом и сравнивает полученные hash.

Может быть все таки сторона А подписывает hash своего документа своим закрытым ключем, а затем сторона Б вычисляет hash и проверяет его открытым ключем стороны А? По тому как написано у вас, получается, что сторона А подписывает документ специально для стороны Б, а не для всех желающих удостовериться в подлинности.
Подскажите, если я ошибаюсь.
А Шерлок Холмс вообще персонаж вымышленный

Но созданный по образу реального человека — Белл, Джозеф
В любом случае „for… in“ перебирает не только функции методы прототипов, но все их свойства.
18. Оператор „for… in“
При проходе в цикле через свойстав обьекта вы также обнаружите что получаете в том числе и функции. Для избежания этого необходима проверка с if hasOwnProperty

Вы (автор или переводчик) о чем здесь вообще?
Я аж с перепугу перепроверил

var o = {a:1, f:function(){}}
for(var key in o) 
  if(o.hasOwnProperty(key)) console.log(key)
//a
//f
пришёл к выводу, что я гениален.

Девушка говорит парню:
— Вань, ты такой умный, находчивый! Ты так много историй знаешь, с тобой так интересно всегда!
— Маш… да я нормальный, это просто ты дура!

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

К сожалению уже пережила.
Muuss died in an automobile collision on Interstate 95 on November 20, 2000.[2] The Michael J. Muuss Research Award, set up by friends and family of Muuss, memorializes him at Johns Hopkins University.[3]
Сейчас как раз изучаю модульное тестирование, и возникает следующий вопрос.
Для тестирования модульного нам необходимо разбить программный код на части и предоставить каждой части поддельные внешние зависимости, иначе это будет уже тестирование интеграционное. Есть ли какие-либо общие рекомендации, что считать в данном случае модулем, а что внешней зависимостью? Модуль здесь — это обязательно класс или может быть компонент системы, состоящий из нескольких связанных классов? Внешние зависимости — это только БД, сеть, файловая система или связи между классами, компонентами?
Вопрос связан с тем, что большая часть проблем возникает именно на связи классов.
По-моему очень не конкретный вопрос. Что именно имеется ввиду?

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

Сложно ли самому программисту работать? Т.е. работает ли он на пределе своих сил?
Зависит от способностей и подготовки самого программиста. Ничего конкретнее здесь не скажешь.

Сложно ли самому программисту работать? Т.е. напрягает ли его работа?
В большинстве случаев нет. Иначе нужно менять работу.
Не все, а только те, кто способен выбросить исключения. На самом деле таких не так уж много :)

Решил поискать слово throw в исходниках стандартных модулей. Так вот 36 модулей из 25 содержат функции/методы выбрасывающие исключения.
Мне тоже больше нравится в своем коде передавать ошибку первым параметром callback, но вызов любой внешней функции потенциально может завершиться исключением.
CTRL + / Вставить/убрать комментарий для строки/выделения (вставляется типовой для языка
программирования, в зависимости от типа файла)

Притом для HTML файлов, в которых может быть намешано сразу несколько языков, формат комментария выбирается в зависимости от конкретно языка.
<!-- <title>test</title> -->
<script>
// var a = 1;
</script>
ReadFile в данном случае выполняется, как синхронная операция, блокирующая поток, в котором происходит чтение.
1. В цитате из msdn, которую вы привели написано:
Если файл открыт с FILE_FLAG_OVERLAPPED, то необходима структура OVERLAPPED, иначе она может быть NULL. А может и не быть. Поэтому никакого нарушения здесь нет.
2. Обратите внимание на инициализацию переменной overlapped_ptr:
if (offset != -1) {
    memset(&overlapped, 0, sizeof overlapped);

    offset_.QuadPart = offset;
    overlapped.Offset = offset_.LowPart;
    overlapped.OffsetHigh = offset_.HighPart;

    overlapped_ptr = &overlapped;
  } else {
    overlapped_ptr = NULL;
  }

offset здесь — это смещение, с которого начнется чтение файла

Из инициализации видно, что
— overlapped_ptr здесь используется для указания смещения (есть у структуры OVERLAPPED и такая функция).
— overlapped_ptr может быть равен NULL, что в принципе недопустимо при асинхронной работе с файлами
Количество потоков, которые будут обслуживать собственно работу с IO задаются при создании completion port, параметр NumberOfConcurrentThreads

Вот создание IOCP порта (выполняется это однократно при запуске node.js):

loop->iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1);

Параметр NumberOfConcurrentThreads равен 1. Насколько я понимаю — этим единственным потоком является основной поток node.js
Может быть я в чем-то и ошибаюсь. Давайте разберемся.
1. Вот цитата из документации:
The libuv filesystem operations are different from socket operations. Socket operations use the non-blocking operations provided by the operating system. Filesystem operations use blocking functions internally, but invoke these functions in a thread pool and notify watchers registered with the event loop when application interaction is required.

2. Вот ссылки на исходники:
создание потока
QueueUserWorkItem(&uv_fs_thread_proc, 
req, 
WT_EXECUTEDEFAULT)


— вот функция uv_fs_thread_proc, выполняющаяся уже в порожденном потоке. Она вызывает функцию fs_open, и выполняет макрос POST_COMPLETION_FOR_REQ

открытие файла внутри функции fs_open
file = CreateFileW(req->pathw,
                     access,
                     share,
                     NULL,
                     disposition,
                     attributes,
                     NULL);

Флаги открытия файла зависят от параметров, с которыми вызвана функция open еще в JS и FILE_FLAG_OVERLAPPED я в функции fs_open не вижу.

Если вы меня ткнете носом в то место, где я ошибся, я буду только рад. Правда :)
Спасибо за комментарий. Учту.
Я не знаю, как реализована приостановка и запуск потока в Windows, это внутренний механизм операционной системы, который используется во многих других Win API функциях. Вот здесь вы можете найти их список.
Из msdn:
«Wait functions allow a thread to block its own execution. The wait functions do not return until the specified criteria have been met. The type of wait function determines the set of criteria used. When a wait function is called, it checks whether the wait criteria have been met. If the criteria have not been met, the calling thread enters the wait state until the conditions of the wait criteria have been met or the specified time-out interval elapses.»

«Блокирующие функции позволяют потоку приостановить свое выполнение.… При вызове блокирующая функция проверяет переданное ей условие. Если условие не выполнено, то поток получает ожидающий статус и функция не возвращает своего значения до тех пор пока условие не выполнится »

Под условием имеется ввиду не логическое выражение, а, допустим, некоторый объект, через который можно получить событие. В нашем случае условием является наличие или отсутствие событий в очереди IOCP.
Просто представьте, что функция GetQueuedCompletionStatus() не будет ничего возвращать до того, как в очереди не появятся события.
Просто на будущее, что бы исправиться. Что именно не понравилось в статье? Плохое изложение, привязка к Windows, описание только файловой операции при громком заголовке? Ответьте, пожалуйста.
1

Information

Rating
Does not participate
Location
Чита, Забайкальский край, Россия
Date of birth
Registered
Activity