В обоих случаях будет выведено что-то типа <map object at 0x7fbcfd40eba8>, потому что вы генератор не превратили в печатный объект.
Вы точно уверены в этом? ;)
Это, как раз, нормально новичками принимается.
Даже тем, кто перешли со второй ветки на третьей?
Тогда нельзя ли, всё-таки, сказать: чем именно вы недовольны.
Я не говорил, что недоволен языком. Я считаю неправильным пытаться доказать, что язык плох или непонятен, приведя «забавные» куски кода. Моими примерами я лишь хотел намекать, что в Python (как и в случае с JavaScript или другим ЯП) без чтения документации могут возникнуть определённые трудности.
тем что append возвращает None [...] Из всего этого разнообразия меня удивило, когда я впервые столкнулся с python, разве что тот факт, что append ничего не возвращает — но в приличных тьюториолах на это особо обращается внимание… так что это может быть не самое логичное решение в языке, но если ворон на уроках не считать и не пробовать писать на python не читая доки вообще (как я лет 10 назад) — то неожиданностей быть не должно.
Уверен, не только Вас удивило. Но, как я уже говорил ранее и как сейчас Вы сами признали, не нужно пытаться угадать, ведёт себя ЯП логически или нет, просто нужно читать документацию и понять как всё работает. Да, иногда некоторые моменты обнаруживаются с опытом, но считаю неправильным оскорблять разработчиков, по крайне мере, потому что они дают людям бесплатные инструменты, с помощью которых они зарабатывают на жизнь. И не важно, что это за язык.
или тем, что is и == ведут себя по разному?
Какое отношение имеет is к ==? Я имел в виду, что здесь можем столкнуться с нелогичным поведением оператора is или функцией id(). Например, могут возникнуть вопросы, почему указанный мной код возвращает [False, False, False] а вот b = 'b!'; print b is 'b!' возвращает True.
От объяснения легче не стало. Может вы не туда ссылку дали? Я вижу там такой код: [...] Он использует Mapу в полном соответствии с её описанием в Wikipedia. Либо объясните где вы видите тут нарушение концепции, либо дайте ссылку на тот код, который что-то там нарушает.
Если Вас смущает, то, что в моих примерах «элементы обрабатываются по-разному», то Вас должно смущать и тот код, где элементы также не будут «обрабатываться одинаковым образом». И ещё раз: я не сказал, что тот код нарушает «концепцию map».
Это обозначает что объекты обрабатываются Mapой независимо [...] А вот таких, где была бы под Mapой понималось нечто странное, в духе JavaScript — я не видел.
Вы точно-точно уверены, что (map f)⚬(map g) = map (f ⚬g) это и означает? Давайте я покажу Вам пример кода, который объясняет это уравнение, показывает почему Ваши рассуждения неверны и почему JavaScript не нарушает «фундаментальную концепцию map»:
function f(n) {
return 'F' + n;
}
function g(n) {
return 'G' + n;
}
function fg(n) {
return f(g(n));
}
var values = [1, 2, 3];
console.log(values.map(g).map(f));
//-> ["FG1", "FG2", "FG3"]
console.log(values.map(fg));
//-> ["FG1", "FG2", "FG3"]
Только не называйте её Mapой! Назовите, как в C++, transform или там foreach.
Вам не кажется, что transform и foreach, это немного другое? При этом, Вы уверены что завтра не будут обвинять JavaScript, что нарушает «концепцию foreach»? Кстати, в JavaScript есть forEach.
Вы ещё ссылки на статьи, где объясняется почему угол в равностороннем треугольнике — не нужно называть «прямым». Именно не доказательство того, что он не «прямой». А объяснение того, чем плохо называть его прямым. А чо? Назовём угол в 60 градусов прямым, создадим «альтернативную геометрию». Удобно же. Нет таких. А почему нет, собственно?
Нет, спасибо. Я спросил о другом. Дело в том, что для меня выглядит странным, то, что Вы говорите «JavaScript нарушает фундаментальную концепцию map поскольку (map f)⚬(map g) = map (f ⚬g) и это означает, что map не может передать дополнительные аргументы и функция не может обработать элементы по-разному», при этом требуете ссылки на научные журналы доказывающие, почему некоторые разработчики считают, что Вы неверно интерпретируете описание функции map.
Если это действительно нужно, то нужно эту информацию передать в функция явно.
А разве в JavaScript это не передаётся явно?
Кроме того, если у вас действительно петабайты этих самых обменных курсов, то, возможно нужно обработку вести каким-то другим способом, а не передавая петабайт данных функции, обрабатывающей один элемент.
Вы верно отметили: «возможно». Ведь проведение тестов ещё не отменили. К тому же, может оказаться, что функция map оптимизирована таким образом, что необязательный аргумент не влияет отрицательно на производительность, когда создание копии переменной вполне может.
А нельзя, наоборот, не тратить время на вычисление ненужной информации? А то так можно ещё туда календарь на текущий год передать и кусрсы валют на сегодня. Четвёртым и пятым параметром. А чего? Вдруг пригодится.
Если Вам не нужны эти аргументы и у Вас нет подобных задач — просто игнорируйте их. JavaScript позволяет Вам этого делать. К тому же, для меня выглядит неправильно судить других по себе и решить за них, что им должно быть удобнее.
Это замечательно если фунцию писали вы. А если нет?
То же самое можно сказать про любой язык и любой функции. Я не припомню точно, но, почти уверен, что видел код, написанный на Python, который менял обрабатываемый список. Не стал искать примеры, но знаю, что по крайне мере в Python это возможно через self.mylist или global.
Тут-то откуда PHP может возникнуть?
быстродействие + время разработчики + стоимость поддержки инстанса
Очень просто: я просто тупо приплюсовываю к цене вашего хостинга цену за пару часов моей работы.
Ну да, платить больше за хостинг всегда проще. Но если окажется, что разработка на PHP занимает меньше времени, при этом приложение работает быстрее и потребляет меньше ресурсов?
Извините — но это неправда. Всё зависит от того, что именно ваше приложение хранит в памяти между запросами.
Согласен. Но, мне кажется, для большинство задач связанные с вебом данное соотношение не будет меняться. В любом случае, именно поэтому нужно всё тщательно тестировать.
Но даже и это неважно: важно не только то, какой скорости вам позволит та или иная технология (если бы это было так, то мы бы писали всё до сих пор на ассемблере), а в какую цену вам обойдётся разработка плюс хостинг.
Именно это я и сказал с самого начала. Только Вы упускаете из виду, что «цена за разработку плюс хостинг» и «быстродействие приложения» могут жить дружно.
И если вам потребуется заплатить чуть больше за более дорогой хостинг, но при этом вы сделаете систему быстрее и ошибок там будет меньше — то это вполне неплохой компромисс.
А иногда можно делать систему быстрее и стабильнее, при этом платить меньше за хостинг.
PHP недаром на 7м месте сейчас и уверенно движется к вылету из десятки — а когда-то, было время, в тройку входил
В данный момент лично меня не волнует, сколько страниц возвращает Google по запросу «PHP» или «Python». Но если мне придётся выбрать технологию согласно «тренду», то я буду руководиться звёздочками на Github.
Больше всего запросов вам позволит обработать модуль на C++ для NGINX. Но это не значит, что я для каждого сайта буду его писать. Хотя, в зависимости от задачи, вполне умею и его изобразить.
Как я сказал, для меня важно «быстродействие + время разработчики + стоимость поддержки инстанса». Поскольку я не пишу на C++, в зависимости от задачи, выбираю лишь оптимальные технологии из того, что лично я умею готовить.
Что этой ссылкой вы пытаетесь доказать? Что оба языка имеют скорость между «жутко медленно» и «о… ть как медленно»? Если вы уж так любите эту пузомерку — то взгляните уж сюда.
Если для Вас скорость и потребление ресурсов лишь пузомерки, не означает, что другие разработчики думают также, и думаю, что Вы ведёте себя неправильно оскорбляя их за это и за то, что они не разделяют Вашу точку зрения.
На самом деле, я лишь хотел показать, что есть задачи, для которых Python будет работать в разы медленнее и будет потреблять больше ресурсов, чем PHP. Если добавить к этому, то что, например, такие задачи решаются довольно быстро на PHP даже по сравнению с C++ (не говоря уже о Java) — то лично для меня выбор очевиден.
Даже больше скажу: если окажется, что кто-то выбрал node.js вместо Python или PHP, я не стану его судить, ведь может оказаться, что, например, есть задачи, которые выполняются в node.js в 33 раз быстрее чем в Python и 13 раз быстрее чем в PHP.
И самое главное: хоть я считаю, что в определённых ситуациях какое-то решение лучше с разных точках зрения, я не призываю Вас перестать использовать Python, также как и не обзываю то, что делаете Вы. Я лишь хотел донести до Вас, почему некоторые разработчики могут выбрать «неправильные ЯП». С другой стороны, Ваши заявления и оскорбления лишь доказывают, что Вами руководит не профессионализм, а фанатизм.
Поскольку для меня выкинуть это: return this.getAll().map(this.markupRows).discardSomeRows()
Вы что — считаете, что это нормально, когда на каждый чих табличка формируется с нуля?
Нет, конечно. И я этого не сказал. Хотя уж точно есть задачи, когда эффективнее применить разметку заново.
Плохой код рождается от непонимания того, что и где у вас происходит в программе, в первую очередь. А для такого понимания — нужно, чтобы программа состояла из простых компонент.
Спросите начинающего программиста, что делает map(lambda(x) : "| " + x, HelloReader()) и насколько это легко читается. Также, положа руку на сердце, скажите, что никогда не видели плохой код написанный на Python.
Вот вы можете сказать что сделает вот такой простой код: [1, 2, 3].map((x, i, a) => a.push(i))
То есть, придумываем «интересную задачу», потом виним язык, что делает «неправильные» вещи? Тогда встречный вопрос, что будет выводить следующий код и насколько интуитивно понятен результат с точки зрения новичка?
values = [['a!'], ['b!'], ['c!']]
print(map(lambda v : v.append('x!'), values))
А этот?
values = ['a!', 'b!', 'c!',]
print(map(lambda v : v is 'b!', values))
Я не знаю что именно вы искали и почему то, что вы нашли нарушает концепцию Mapы, извините.
Ну почему же Вы так? Я ведь специально цитировал Ваши слова, причём мне кажется сложно забыть собственные слова, когда выделяете их полужирным текстом. Цитирую: «Все эти вещи очень-очень сильно выходят за рамки простой концепции Mapы, которая предполагает обработку множества элементов одинаковым образом». Объясняю: «по той ссылке есть код, который с этой точки зрения, технически, не отличается от моего примера». И нет, я не сказал, что тот код нарушает «концепцию map», я имел в виду, что он нарушает «Вашу концепцию».
А очень просто — в той же википедии, если бы прочитали статью до конца, вы бы увидели там фундаментальное свойство Mapы: (map f)⚬(map g) = map (f ⚬g)
Знаете, это очень сильное утверждение, которое очень многое меняет. Поэтому, хотел бы узнать, что же это означает? Почему функция не может обрабатывать элементы по-разному? Почему map не может передать несколько аргументов? Как можно доказать это уравнение в Python? Почему данное «фундаментальное свойство» нарушается в JavaScript?
Так зачем использовать неподобающее имя?
Возможно, всё-таки это правильное имя, учитывая что она применяет функцию к каждому элементу списка?
Отчасти да.
Вот и я о том же. Только, трудно признать это удобным, если такое изменение появилось в «неправильном ЯП»?
Накидайте-ка ссылок на научные журналы с обсуждением функций высшего порядка, совместимых с примером выше? Нету? А почему нету?
Я не искал таких ссылок. Но я буду очень признателен, если Вы поделитесь ссылками на научные журналы, где рассказывают, почему map не может передать несколько аргументов и почему функция не может обрабатывать элементы по-разному.
Когда мы обрабатываем петабайты данных. Что мы должны передать в Mapу в качестве третьего аргумента и зачем?
Например, у нас есть обменные курсы из разных источников за пару лет и при применении map хотим чтобы функция имела возможность сравнивать каждый день с другими днями из всего списка и проводить определённые операции.
Тут, вы, конечно, можете передать в Mapу генератор — но какой в этом смысл и что вы там с ним будете делать?
В этом конкретном примере — ничего не нужно делать. Как я уже сказал раньше, если Вам не нужны дополнительные аргументы, просто игнорируйте их. А если кому-то нужны — пусть использует их на здоровье.
А что будет происходить с вашей Mapой если функция начнёт из контейнера объекты удалять?
Лично я считаю, что map не должен изменить обрабатываемый список. Если же решили сделать это, убедитесь, что понимаете, что происходит. То есть, угадать это недостаточно.
А зачем мне может потребоваться такое приложение?
Я и не сказал, что Вам нужно создать такое приложение (хотя я допускаю, что как пользователь Вы пользуйтесь подобными, просто Вы не знаете этого). Я лишь хотел намекнуть, что правильно выбирая свои инструменты, можно добиться очень хорошими результатами не тратя время и деньги впустую.
Если это мой проект — то я, уж как-нибудь найду $5, чтобы не вмазываться в это гуано
А вот это, мягко говоря, непрофессионально. Как Вы можете написать такое, не зная, что это за приложение и какие данные оно обрабатывает? Вы думаете, что сервер в два раза дороже гарантирует вдвое более мощности? Или что «гиг памяти и 25GB на SSD» обязательно сделает любое приложение быстрее? А если и так, Вы ведь понимаете, что если на слабой машине технология X была в десять раз быстрее чем Z, то на более мощной машине это соотношение практически не меняется?
Чтобы не было вопросов, почему иногда я выбираю ту или иную технологию, напомню, что делаю это неспроста, а потому что, например, ab и siege подсказывают, какая технология будет обработать больше всего запросов. Ну, а для тех, кто не любит проводить тесты самостоятельно, рекомендую: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php.html
Как можно осмысленно выбирать языки если не знать и сильных и слабых сторон?
Прошу отметить, что вырвать фразы из контекста не очень хорошо, ведь я написал другое. Цитирую: «лично я не пытаюсь искать слабые места каждого языка. Наоборот, я рассматриваю его сильные стороны в определённый момент для конкретной задачи». Например, если на php-fpm+nginx я смогу создать некое веб-приложение, которое будет работать на VPS за $2.99, обработать сотни тысячи запросов в день и держать load average ниже 0.1, при этом мне не придётся кувыркаться из-за простых вещей вроде strip_tags, то я не перестану использовать PHP только из-за идеологических соображений. Однако это не означает, что всегда буду использовать PHP. Также как, я не буду рекомендовать кому-либо изучить PHP в качестве первого ЯП (конечно, бывают исключения).
Вы никогда не задумывались почему JavaScript и PHP — это «ужас летящий на крыльях ночи», почему C — это коллекция граблей, за которые вас всё время стремится наказать компилятор и так далее?
Как я уже сказал, для меня каждый язык программирования лишь очередной инструмент и я указал, как выбираю свои инструменты. В таких случаях, лично я, далеко не в первую очередь буду рассуждать о плохом синтаксисе, идеологии или грабли ЯП.
Потому что представьте себе, что вы добавили „классы для стилизации таблицы“ — а потом, в рекламируемом тут .chained подходе выкинули часть элемнтов? И что будет с вашими „первыми n элементами“, если их число, дальшейними фильтрами, изменится?
Во-первых, мой пример уже содержит тот самый .chained, иначе без него я бы написал let users = this.getAll(); users.map(this.markupRows); (т.е. определить ненужную переменную и написать больше кода). Во-вторых, как уже сказал, я считаю, что плохой код рождается по вине разработчика и если разработчик сначала будет сделать всю тяжёлую работу, а потом выкинуть часть обработанных элементов — ни один язык его не спасёт. Для меня выглядит «немного неправильно» получить все записи сортированные в определённом порядке, применить HTML разметку для каждой записи, а потом выкинуть часть элементов.
Все эти вещи очень-очень сильно выходят за рамки простой концепции Mapы, которая предполагает обработку множества элементов одинаковым образом.
Получается, даже разработчики Python нарушают эту концепцию? Например, беглый поиск находит это (уверен, это не единственный случай). Но, главное, мне интересно, где написано, что нужно обрабатывать элементы одинаковым образом? Например, Википедиа говорит, что map применяет некую функцию к каждому элементу списка и возвращает обработанные элементы в том же порядке. Лично я не видел какие-либо ограничения, на что должна возвращать функция, также как и какие аргументы, она должна получать. И разве, это не те «самые лошади», когда другие не могут усовершенствовать функцию из-за боязни/нежелании сломать «старые концепции»?
Ну разумеется нет. Если вы передаёте в function этот самый object — то вы должны гарантировать, во-первых, что этот object во-первых существует
Если честно, не понял, что Вы имеете в виду, и как передача дополнительных аргументов влияет на это.
а во-вторых никто к нему, кроме этой функции Map доступа не имеет.
Хм. Почему никто не должен иметь доступ к этому объекту?
Спасибо большое за столь развёрнутый ответ. Не понимаю, почему Вам поставили минус.
В принципе, со многими мыслями согласен, особенно с тем, что нужно выбрать правильные инструменты и всегда нужно стремиться писать хороший код, скорость и удобочитаемость которого должны быть на первом месте.
Тоже не понимаю эту тягу к использованию JavaScript на бэкенде и для создания десктопных приложений. Ну, я понимаю, когда разработчик, зная лишь JavaScript, делает свой маленький проект, но мне трудно согласиться с теми, кто переходят на JavaScript, несмотря на то, что из-за этого проект будет работать в разы медленнее и будет рождать куча новых интересных приключений.
Тем не менее, я думаю, что плохой код, прежде всего, рождается по вине разработчика. Возможно, это не очень правильная позиция, но лично я не пытаюсь искать слабые места каждого языка. Наоборот, я рассматриваю его сильные стороны в определённый момент для конкретной задачи.
Поскольку моя работа связана с вебом, для меня главные показатели при выборе языка это быстродействие + время разработчики + стоимость поддержки инстанса. Если есть возможность, использую ab и siege, чтобы понять, что должен выбрать. А если нет, просто выбираю технологии, полагаясь на свой интуицию опыт.
Пока вы ещё не привели пример ни одной задачи
Извините, но не заметил такой вопрос. Например, в JavaScript имеем возможность написать this.getAll().map(this.markupRows) а метод markupRows сможет:
— сравнивать текущий элемент с предыдущем/следующим элементом
— узнать еслу текущий элемент это последний/первый элемент
— обработать первые n элементов особым образом
— добавить классы для стилизации таблицы-зебры
а почему мы передаём в функцию три аргумента, а не, скажем, десять?
К сожалению, не могу ответить, поскольку не изучал этот вопрос, но полагаю потому что эти три аргументы более чем достаточно, чтобы принимающая функция смогла обрабатывать текущий элемент в рамках всего списка.
если вам так уж нужен индекс вариант map(function, enumerate(object))
Возможно я ошибаюсь, но думаю что оптимальнее всё-таки использовать map(function, object), при этом map должен передать функции все необходимые аргументы, а уже в function будем решать, что делать с ними (в том числе, игнорировать ненужные аргументы).
если менеджер порождает скрипт для закачки файлов в VBA в Excel
Признаюсь, у меня тоже есть парочку xlsm и docm файлов в которых использую VBA, чтобы при определённых событьях отправить или загрузить данные прямо из Excel или Word. Более того, у меня есть много мелких «помошников» с использованием Autoit, Bash, HTA, Perl, Powershell, Windows Batch. Как правило, они рождались довольно спонтанно и без долгих раздумий (или из желания узнать что-то новое), но для меня важен лишь тот факт, что на протяжения многих лет они делали всю кропотливую работу.
Что касается идеальных языках, Вы не задумались, почему они не стали популярными? Быть может, не такие они уж идеальны? Например, (не считая BASIC, который был лишь детской забавой), мой первый язык программирования был Pascal и, опираясь на мои давние воспоминания, лично я не могу называть его идеальным ЯП. Возможно я ошибаюсь, но мне кажется ни один язык не сможет стать идеальным для всех задач и для всех людей.
Для меня грабли в языках программирования скорее философский вопрос: я пишу на разных языках и почти не вижу никаких проблем с граблями — каждый ЯП это лишь очередной инструмент со своими особенностями. И кстати, возможно, мои задачи не являются комплексными, но мне кажется, в JavaScript исправили одно из фундаментальных граблей: простой способ получить индекс при использовании map. Конечно, это не означает, что я сразу же перейду на JavaScript и буду использовать его вместо Python или PHP.
Кстати, как насчёт «опасных языках» и чтение документации? Вы действительно думаете, что не стоит использовать те языки и что не нужно читать документацию? Спрашиваю, не холивара ради, а потому что ниже Вы пишите правильные вещи (ну, с моей точки зрения), и мне действительно интересен честный ответ на эти вопросы.
Читайте эти выражения как getVar() + getInput() и getVar() * getInput(), потом спросите себя, что вызывает больше путаницы для начинающего программиста, который не читает документацию: «неверное» поведение map или «неверный» результат этих выражений?
Я не знаю, откуда у Вас такие данные, что «для такого случая спеку читать большинство людей не будет», но я более чем уверен, что хорошие программисты всё-таки читают документацию. И это правильно.
Ого! То есть, C#, C++, Go, Java, JavaScript, PHP и другие, это опасные языки и не стоит ими пользоваться? Возможно, только Python правильнее всех, но и у него тоже есть свои «тараканы»?
Получается, нам нужно срочно создать новый идеальный язык?
В этих популярных языках сознательно решили обрабатывать данное выражение по-разному и разработчики, которые ежедневно используют эти языки, считают это удобным, при этом могут недоумевать, что в других языках это работает иначе (например, «как это, два+два на одной машине ровно 52, а на второй машине вообще другое значение?» или «почему я должен каждый раз указать тип данных, когда язык может легко угадать делать всё вместо меня?»). Поэтому, если решили работать с новым языком, не пытайтесь сравнивать его с теми языками, с которыми работали ранее. Прежде всего, нужно читать документацию и понять что происходит, а не полагаться на то, что «язык будет делать то, что мне нужно, а не то, что я ему сказал».
Например, имеем выражения '2'+2 и '2'*2. Как думаете, не читая документацию и не имея опыт работы с C#, Java, JavaScript, PHP и Python, Вы сможете сказать, каков будет результат этих выражений для каждого языка? Думаю, ответ очевиден: при таких условиях, ни Вы, ни кто-либо другой не сможет правильно ответить на этот вопрос. И в этом нет ничего удивительно, поскольку у каждого языка есть свои тараканы «единственные правильные способы» решить тут или иную задачу.
Будь это мой сервис — я бы выкатил фикс уже через 5 минут.
А уязвимость, всё равно не была бы исправлена ;)
Хакинг априори не совсем этичное занятие.
Хакинг — это лишь знания, и всё зависит от человека, как он будет распоряжаться ими. То, что делаете Вы, конечно, не этично, поскольку Вы пытаетесь нанести ущерб репутации компании и поставить под угрозу безопасность/конфиденциальность других.
Как правило, не нужно тестировать на наличие уязвимостей, если Вас не просили. А если и решили сделать доброе дело, просто не ждите награды и уж тем более не сообщите об этом в открытом доступе без согласия пострадавшего.
Если хотите носить белую шляпу и при этом хорошо зарабатывать, посмотрите в сторону bugcrowd.com, hackerone.com и других сервисов, где действует программа Bug Bounty.
Регулярное выражение /[A-Z0-9]/g будет пропускать QwErTy12 и даже <XSS> или <123>, поскольку Вы проверяете если строка содержит по крайне мере одну цифру или строчную букву (то есть, остальные символы не обязательно должны быть из этого списка).
В этом случае, для правильной валидации нужно указать, что строка должна содержать цифры и строчные буквы от начала до конца строки (то есть, использовать /^[A-Z0-9]+$/).
Лечение должно быть лишь временная мера (точнее, пока не подняли новый сервер).
При переносе данных обратите внимание не только на исполняемые или конфигурационные файлы, но и всё что может содержать вредоносные команды (например, в MySQL это может быть CREATE TRIGGER или CREATE EVENT). Также, не забывайте о .html, .js, .php, .py и других публичных файлах (в идеале эти файлы, как и другие данные, должны быть восстановлены из локального или другого доверенного хранилища).
Если на сервере имеются секретные ключи или балуетесь «безопасностью через неясности» — считайте, что всё скомпрометировано. Поэтому, необходимо сбросить/сгенерировать новые ключи и залатать «плохие решения». Возможно, стоит проверить исходящий трафик, дабы выявить аномалии и понять: утекло всё или только часть данных?
И ещё, вместо «сладких снов» — не забывайте, что отсутствие зловреда или других следов взлома, не означает, что Ваш сервер не был взломан. У плохих парней было достаточно времени, чтобы подготовить более изящный способ использования этой уязвимости и скрыть факт взлома, a не просто вешать табличку с надписью «Эй! Твой сервер был взломан. Нажми delete, чтобы удалить вирус».
Дальше все снова пошло хорошо [...] распарсили Math.Jax
Если я правильно понял, то данная библиотека используется далеко не на всех страницах. Поэтому считаю плохой идеей подключить неиспользуемую библиотеку (особенно, если она весит 492.25 KB).
Подробное описание инцидента: blog.cloudflare.com/how-verizon-and-a-bgp-optimizer-knocked-large-parts-of-the-internet-offline-today
Даже тем, кто перешли со второй ветки на третьей?
Я не говорил, что недоволен языком. Я считаю неправильным пытаться доказать, что язык плох или непонятен, приведя «забавные» куски кода. Моими примерами я лишь хотел намекать, что в Python (как и в случае с JavaScript или другим ЯП) без чтения документации могут возникнуть определённые трудности.
Уверен, не только Вас удивило. Но, как я уже говорил ранее и как сейчас Вы сами признали, не нужно пытаться угадать, ведёт себя ЯП логически или нет, просто нужно читать документацию и понять как всё работает. Да, иногда некоторые моменты обнаруживаются с опытом, но считаю неправильным оскорблять разработчиков, по крайне мере, потому что они дают людям бесплатные инструменты, с помощью которых они зарабатывают на жизнь. И не важно, что это за язык.
Какое отношение имеет
is
к==
? Я имел в виду, что здесь можем столкнуться с нелогичным поведением оператораis
или функциейid()
. Например, могут возникнуть вопросы, почему указанный мной код возвращает[False, False, False]
а вотb = 'b!'; print b is 'b!'
возвращаетTrue
.Если Вас смущает, то, что в моих примерах «элементы обрабатываются по-разному», то Вас должно смущать и тот код, где элементы также не будут «обрабатываться одинаковым образом». И ещё раз: я не сказал, что тот код нарушает «концепцию map».
Вы точно-точно уверены, что
(map f)⚬(map g) = map (f ⚬g)
это и означает? Давайте я покажу Вам пример кода, который объясняет это уравнение, показывает почему Ваши рассуждения неверны и почему JavaScript не нарушает «фундаментальную концепцию map»:Вам не кажется, что
transform
иforeach
, это немного другое? При этом, Вы уверены что завтра не будут обвинять JavaScript, что нарушает «концепцию foreach»? Кстати, в JavaScript есть forEach.Нет, спасибо. Я спросил о другом. Дело в том, что для меня выглядит странным, то, что Вы говорите «JavaScript нарушает фундаментальную концепцию map поскольку
(map f)⚬(map g) = map (f ⚬g)
и это означает, что map не может передать дополнительные аргументы и функция не может обработать элементы по-разному», при этом требуете ссылки на научные журналы доказывающие, почему некоторые разработчики считают, что Вы неверно интерпретируете описание функции map.А разве в JavaScript это не передаётся явно?
Вы верно отметили: «возможно». Ведь проведение тестов ещё не отменили. К тому же, может оказаться, что функция map оптимизирована таким образом, что необязательный аргумент не влияет отрицательно на производительность, когда создание копии переменной вполне может.
Если Вам не нужны эти аргументы и у Вас нет подобных задач — просто игнорируйте их. JavaScript позволяет Вам этого делать. К тому же, для меня выглядит неправильно судить других по себе и решить за них, что им должно быть удобнее.
То же самое можно сказать про любой язык и любой функции. Я не припомню точно, но, почти уверен, что видел код, написанный на Python, который менял обрабатываемый список. Не стал искать примеры, но знаю, что по крайне мере в Python это возможно через
self.mylist
илиglobal
.быстродействие + время разработчики + стоимость поддержки инстанса
Ну да, платить больше за хостинг всегда проще. Но если окажется, что разработка на PHP занимает меньше времени, при этом приложение работает быстрее и потребляет меньше ресурсов?
Согласен. Но, мне кажется, для большинство задач связанные с вебом данное соотношение не будет меняться. В любом случае, именно поэтому нужно всё тщательно тестировать.
Именно это я и сказал с самого начала. Только Вы упускаете из виду, что «цена за разработку плюс хостинг» и «быстродействие приложения» могут жить дружно.
А иногда можно делать систему быстрее и стабильнее, при этом платить меньше за хостинг.
В данный момент лично меня не волнует, сколько страниц возвращает Google по запросу «PHP» или «Python». Но если мне придётся выбрать технологию согласно «тренду», то я буду руководиться звёздочками на Github.
Как я сказал, для меня важно «быстродействие + время разработчики + стоимость поддержки инстанса». Поскольку я не пишу на C++, в зависимости от задачи, выбираю лишь оптимальные технологии из того, что лично я умею готовить.
Если для Вас скорость и потребление ресурсов лишь пузомерки, не означает, что другие разработчики думают также, и думаю, что Вы ведёте себя неправильно оскорбляя их за это и за то, что они не разделяют Вашу точку зрения.
На самом деле, я лишь хотел показать, что есть задачи, для которых Python будет работать в разы медленнее и будет потреблять больше ресурсов, чем PHP. Если добавить к этому, то что, например, такие задачи решаются довольно быстро на PHP даже по сравнению с C++ (не говоря уже о Java) — то лично для меня выбор очевиден.
Даже больше скажу: если окажется, что кто-то выбрал node.js вместо Python или PHP, я не стану его судить, ведь может оказаться, что, например, есть задачи, которые выполняются в node.js в 33 раз быстрее чем в Python и 13 раз быстрее чем в PHP.
И самое главное: хоть я считаю, что в определённых ситуациях какое-то решение лучше с разных точках зрения, я не призываю Вас перестать использовать Python, также как и не обзываю то, что делаете Вы. Я лишь хотел донести до Вас, почему некоторые разработчики могут выбрать «неправильные ЯП». С другой стороны, Ваши заявления и оскорбления лишь доказывают, что Вами руководит не профессионализм, а фанатизм.
return this.getAll().map(this.markupRows).discardSomeRows()
Нет, конечно. И я этого не сказал. Хотя уж точно есть задачи, когда эффективнее применить разметку заново.
Спросите начинающего программиста, что делает
map(lambda(x) : "| " + x, HelloReader())
и насколько это легко читается. Также, положа руку на сердце, скажите, что никогда не видели плохой код написанный на Python.То есть, придумываем «интересную задачу», потом виним язык, что делает «неправильные» вещи? Тогда встречный вопрос, что будет выводить следующий код и насколько интуитивно понятен результат с точки зрения новичка?
А этот?
Ну почему же Вы так? Я ведь специально цитировал Ваши слова, причём мне кажется сложно забыть собственные слова, когда выделяете их полужирным текстом. Цитирую: «Все эти вещи очень-очень сильно выходят за рамки простой концепции Mapы, которая предполагает обработку множества элементов одинаковым образом». Объясняю: «по той ссылке есть код, который с этой точки зрения, технически, не отличается от моего примера». И нет, я не сказал, что тот код нарушает «концепцию map», я имел в виду, что он нарушает «Вашу концепцию».
Знаете, это очень сильное утверждение, которое очень многое меняет. Поэтому, хотел бы узнать, что же это означает? Почему функция не может обрабатывать элементы по-разному? Почему map не может передать несколько аргументов? Как можно доказать это уравнение в Python? Почему данное «фундаментальное свойство» нарушается в JavaScript?
Возможно, всё-таки это правильное имя, учитывая что она применяет функцию к каждому элементу списка?
Вот и я о том же. Только, трудно признать это удобным, если такое изменение появилось в «неправильном ЯП»?
Я не искал таких ссылок. Но я буду очень признателен, если Вы поделитесь ссылками на научные журналы, где рассказывают, почему map не может передать несколько аргументов и почему функция не может обрабатывать элементы по-разному.
Например, у нас есть обменные курсы из разных источников за пару лет и при применении map хотим чтобы функция имела возможность сравнивать каждый день с другими днями из всего списка и проводить определённые операции.
В этом конкретном примере — ничего не нужно делать. Как я уже сказал раньше, если Вам не нужны дополнительные аргументы, просто игнорируйте их. А если кому-то нужны — пусть использует их на здоровье.
Лично я считаю, что map не должен изменить обрабатываемый список. Если же решили сделать это, убедитесь, что понимаете, что происходит. То есть, угадать это недостаточно.
Я и не сказал, что Вам нужно создать такое приложение (хотя я допускаю, что как пользователь Вы пользуйтесь подобными, просто Вы не знаете этого). Я лишь хотел намекнуть, что правильно выбирая свои инструменты, можно добиться очень хорошими результатами не тратя время и деньги впустую.
А вот это, мягко говоря, непрофессионально. Как Вы можете написать такое, не зная, что это за приложение и какие данные оно обрабатывает? Вы думаете, что сервер в два раза дороже гарантирует вдвое более мощности? Или что «гиг памяти и 25GB на SSD» обязательно сделает любое приложение быстрее? А если и так, Вы ведь понимаете, что если на слабой машине технология X была в десять раз быстрее чем Z, то на более мощной машине это соотношение практически не меняется?
Чтобы не было вопросов, почему иногда я выбираю ту или иную технологию, напомню, что делаю это неспроста, а потому что, например, ab и siege подсказывают, какая технология будет обработать больше всего запросов. Ну, а для тех, кто не любит проводить тесты самостоятельно, рекомендую: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php.html
strip_tags
, то я не перестану использовать PHP только из-за идеологических соображений. Однако это не означает, что всегда буду использовать PHP. Также как, я не буду рекомендовать кому-либо изучить PHP в качестве первого ЯП (конечно, бывают исключения).Как я уже сказал, для меня каждый язык программирования лишь очередной инструмент и я указал, как выбираю свои инструменты. В таких случаях, лично я, далеко не в первую очередь буду рассуждать о плохом синтаксисе, идеологии или грабли ЯП.
Во-первых, мой пример уже содержит тот самый
.chained
, иначе без него я бы написалlet users = this.getAll(); users.map(this.markupRows);
(т.е. определить ненужную переменную и написать больше кода). Во-вторых, как уже сказал, я считаю, что плохой код рождается по вине разработчика и если разработчик сначала будет сделать всю тяжёлую работу, а потом выкинуть часть обработанных элементов — ни один язык его не спасёт. Для меня выглядит «немного неправильно» получить все записи сортированные в определённом порядке, применить HTML разметку для каждой записи, а потом выкинуть часть элементов.Получается, даже разработчики Python нарушают эту концепцию? Например, беглый поиск находит это (уверен, это не единственный случай). Но, главное, мне интересно, где написано, что нужно обрабатывать элементы одинаковым образом? Например, Википедиа говорит, что map применяет некую функцию к каждому элементу списка и возвращает обработанные элементы в том же порядке. Лично я не видел какие-либо ограничения, на что должна возвращать функция, также как и какие аргументы, она должна получать. И разве, это не те «самые лошади», когда другие не могут усовершенствовать функцию из-за боязни/нежелании сломать «старые концепции»?
Если честно, не понял, что Вы имеете в виду, и как передача дополнительных аргументов влияет на это.
Хм. Почему никто не должен иметь доступ к этому объекту?
В принципе, со многими мыслями согласен, особенно с тем, что нужно выбрать правильные инструменты и всегда нужно стремиться писать хороший код, скорость и удобочитаемость которого должны быть на первом месте.
Тоже не понимаю эту тягу к использованию JavaScript на бэкенде и для создания десктопных приложений. Ну, я понимаю, когда разработчик, зная лишь JavaScript, делает свой маленький проект, но мне трудно согласиться с теми, кто переходят на JavaScript, несмотря на то, что из-за этого проект будет работать в разы медленнее и будет рождать куча новых интересных приключений.
Тем не менее, я думаю, что плохой код, прежде всего, рождается по вине разработчика. Возможно, это не очень правильная позиция, но лично я не пытаюсь искать слабые места каждого языка. Наоборот, я рассматриваю его сильные стороны в определённый момент для конкретной задачи.
Поскольку моя работа связана с вебом, для меня главные показатели при выборе языка это быстродействие + время разработчики + стоимость поддержки инстанса. Если есть возможность, использую ab и siege, чтобы понять, что должен выбрать. А если нет, просто выбираю технологии, полагаясь на свой
интуициюопыт.Извините, но не заметил такой вопрос. Например, в JavaScript имеем возможность написать
this.getAll().map(this.markupRows)
а методmarkupRows
сможет:— сравнивать текущий элемент с предыдущем/следующим элементом
— узнать еслу текущий элемент это последний/первый элемент
— обработать первые n элементов особым образом
— добавить классы для стилизации таблицы-зебры
К сожалению, не могу ответить, поскольку не изучал этот вопрос, но полагаю потому что эти три аргументы более чем достаточно, чтобы принимающая функция смогла обрабатывать текущий элемент в рамках всего списка.
Возможно я ошибаюсь, но думаю что оптимальнее всё-таки использовать
map(function, object)
, при этом map должен передать функции все необходимые аргументы, а уже вfunction
будем решать, что делать с ними (в том числе, игнорировать ненужные аргументы).Признаюсь, у меня тоже есть парочку xlsm и docm файлов в которых использую VBA, чтобы при определённых событьях отправить или загрузить данные прямо из Excel или Word. Более того, у меня есть много мелких «помошников» с использованием Autoit, Bash, HTA, Perl, Powershell, Windows Batch. Как правило, они рождались довольно спонтанно и без долгих раздумий (или из желания узнать что-то новое), но для меня важен лишь тот факт, что на протяжения многих лет они делали всю кропотливую работу.
Для меня грабли в языках программирования скорее философский вопрос: я пишу на разных языках и почти не вижу никаких проблем с граблями — каждый ЯП это лишь очередной инструмент со своими особенностями. И кстати, возможно, мои задачи не являются комплексными, но мне кажется, в JavaScript исправили одно из фундаментальных граблей: простой способ получить индекс при использовании map. Конечно, это не означает, что я сразу же перейду на JavaScript и буду использовать его вместо Python или PHP.
Кстати, как насчёт «опасных языках» и чтение документации? Вы действительно думаете, что не стоит использовать те языки и что не нужно читать документацию? Спрашиваю, не холивара ради, а потому что ниже Вы пишите правильные вещи (ну, с моей точки зрения), и мне действительно интересен честный ответ на эти вопросы.
getVar() + getInput()
иgetVar() * getInput()
, потом спросите себя, что вызывает больше путаницы для начинающего программиста, который не читает документацию: «неверное» поведение map или «неверный» результат этих выражений?Я не знаю, откуда у Вас такие данные, что «для такого случая спеку читать большинство людей не будет», но я более чем уверен, что хорошие программисты всё-таки читают документацию. И это правильно.
В этих популярных языках сознательно решили обрабатывать данное выражение по-разному и разработчики, которые ежедневно используют эти языки, считают это удобным, при этом могут недоумевать, что в других языках это работает иначе (например, «как это, два+два на одной машине ровно 52, а на второй машине вообще другое значение?» или «почему я должен каждый раз указать тип данных, когда язык может легко
угадатьделать всё вместо меня?»). Поэтому, если решили работать с новым языком, не пытайтесь сравнивать его с теми языками, с которыми работали ранее. Прежде всего, нужно читать документацию и понять что происходит, а не полагаться на то, что «язык будет делать то, что мне нужно, а не то, что я ему сказал».Например, имеем выражения
'2'+2
и'2'*2
. Как думаете, не читая документацию и не имея опыт работы с C#, Java, JavaScript, PHP и Python, Вы сможете сказать, каков будет результат этих выражений для каждого языка? Думаю, ответ очевиден: при таких условиях, ни Вы, ни кто-либо другой не сможет правильно ответить на этот вопрос. И в этом нет ничего удивительно, поскольку у каждого языка есть своитараканы«единственные правильные способы» решить тут или иную задачу.map()
передаёт несколько аргументов. Таким образом, всю эту Санта-Барбару можно сократить до: RTFM.Хакинг — это лишь знания, и всё зависит от человека, как он будет распоряжаться ими. То, что делаете Вы, конечно, не этично, поскольку Вы пытаетесь нанести ущерб репутации компании и поставить под угрозу безопасность/конфиденциальность других.
Как правило, не нужно тестировать на наличие уязвимостей, если Вас не просили. А если и решили сделать доброе дело, просто не ждите награды и уж тем более не сообщите об этом в открытом доступе без согласия пострадавшего.
Если хотите носить белую шляпу и при этом хорошо зарабатывать, посмотрите в сторону bugcrowd.com, hackerone.com и других сервисов, где действует программа Bug Bounty.
/[A-Z0-9]/g
будет пропускатьQwErTy12
и даже<XSS>
или<123>
, поскольку Вы проверяете если строка содержит по крайне мере одну цифру или строчную букву (то есть, остальные символы не обязательно должны быть из этого списка).В этом случае, для правильной валидации нужно указать, что строка должна содержать цифры и строчные буквы от начала до конца строки (то есть, использовать
/^[A-Z0-9]+$/
).При переносе данных обратите внимание не только на исполняемые или конфигурационные файлы, но и всё что может содержать вредоносные команды (например, в MySQL это может быть
CREATE TRIGGER
илиCREATE EVENT
). Также, не забывайте о .html, .js, .php, .py и других публичных файлах (в идеале эти файлы, как и другие данные, должны быть восстановлены из локального или другого доверенного хранилища).Если на сервере имеются секретные ключи или балуетесь «безопасностью через неясности» — считайте, что всё скомпрометировано. Поэтому, необходимо сбросить/сгенерировать новые ключи и залатать «плохие решения». Возможно, стоит проверить исходящий трафик, дабы выявить аномалии и понять: утекло всё или только часть данных?
И ещё, вместо «сладких снов» — не забывайте, что отсутствие зловреда или других следов взлома, не означает, что Ваш сервер не был взломан. У плохих парней было достаточно времени, чтобы подготовить более изящный способ использования этой уязвимости и скрыть факт взлома, a не просто вешать табличку с надписью «Эй! Твой сервер был взломан. Нажми
delete
, чтобы удалить вирус».http://37285994/
C:\Windows\System32>ping 0x0238f06a
Pinging 2.56.240.106 with 32 bytes of data:
Reply from 2.56.240.106: bytes=32 time=97ms TTL=56
Reply from 2.56.240.106: bytes=32 time=97ms TTL=56
Reply from 2.56.240.106: bytes=32 time=97ms TTL=56
Reply from 2.56.240.106: bytes=32 time=97ms TTL=56
Да и в браузере тоже:
http://0x0238f06a/