Если основная цель — познакомить учеников с элементами программирования в сжатые сроки, а не целенаправленно программированию обучать, то лучше все-таки подойдет Python.
Я знаю человека, который пытался учиться программированию у такого типа. После вопросов вроде «а как сделать, чтобы программа была в отдельном файле и без браузера запускалась» стало очень грустно — они на занятиях что-то там копипастили в Jupyter Notebook и даже лопатили какие-то данные в Pandas, при этом не имея практически никакого понимания о структурах и типах данных, переменных.
Python, безусловно, хороший язык. Jupyter — отличный инструмент для прототипирования, но от паскаля в данном случае было бы куда больше пользы. Он как минимум не менее выразителен, чем Python, а статическая типизация только в кассу.
Да, на удивление бесполезная фича: вводишь, например, 1500/28.8, ожидая оказаться в результатах поиска с калькулятором, а тебя вместо этого отправляет на 0.0.5.220/28.8. Хорошо, что ещё осталась отдельное поле ввода для поиска.
Оффтоп: вот так и работает "опенсорсность" Chromium — форкнуть-то можно, но поддерживать форк и вливать изменения из апстрима никто не в силах. Прямо печалька.
Но во многих случаях, язык позволяет избежать лишних удивлений, явно используя Function.prototype.bind или вовсе так:
setTimeout(() => this.n += 1, 1000);
Оставляя в стороне «явные» отличия в поведении обычных и стрелочных функций (от которых у Гвидо волосы на спине бы встали дыбом), this настолько не стыкуется с синтаксисом классов, что надо или выпилить bind (=сделать код обратно несовместимым), или добавить self.
Утрированный пример: допустим, есть графики D3 или highcharts, которые используют контекст в своих колбеках на всю катушку, и «старый» класс с классическим that = this, который строит конфигурацию для графика:
function Config () {
let self = this;
self.field = 'foo';
this.getConfig = function() {
return {
tooltip: {
formatter: function () {
return 'Value of ' + self.field + ' for X=' + this.x + ' is ' + this.y;
}
}
}
}
}
Если всё это дело попытаться переписать с использованием «новых» классов, сразу возникают нестыковки:
class Config {
constructor() {
this.field = 'foo';
}
getConfig() {
return {
tooltip: {
// Так потеряется значение this.field
formatter: function () {
return 'Value of ' + this.field + ' for X=' + this.x + ' is ' + this.y;
},
// Так станут недоступными this.x и this.y
formatter: () => {return 'Value of ' + this.field + ' for X=' + this.x + ' is ' + this.y},
}
}
}
}
Но как же хорошо, что в JS существует столько явных возможностей, среди которых есть даже IIFE. Так язык позволяет избежать лишних удивлений:
formatter: (self => function() {return 'Value of ' + self.field + ' for X=' + this.x + ' is ' + this.y})(this)
(Да, это потому, что либы писались ещё за царя Гороха. Но самое страшное, что так продолжают писать! Потому что пока в языке есть этот чёртов this, каждый будет вертеть им как хочет)
Последний раз, когда я пользовался маком, в диалоге выбора файла ввести путь к директории можно было только через какой-то трёхпальцевый хоткей, а имя файла — невозможно вообще.
Зачем такое вообще нужно: в директории 9000 файлов с названиями вида eventXXXXXXXXXX.log, а у меня в буфере есть название event1217548800.log.
Кстати, примерно такая же фигня в GTK. По сравнению с ними диалоги открытия/сохранения файла в KDE/Qt/Windows — просто шедевр юзабилити.
Ещё были попытки у pysandbox, но там также признали поражение:
so many restrictions have needed to be added, pysandbox cannot be used for anything «more complex than evaluating '1+(2*3)'». Basic language constructs like «del dict[key]» have been removed because they can be used to modify __builtins__ and break out of the restricted namespace
PyPy пытались, но их sandbox «is not actively maintained. You will likely have to fix some issues yourself».
Наверное, единственный работающий способ — переписать интерпретатор и где-то внизу перехватывать системные вызовы (ZeroVM Python), но это совсем не имеет смысла, проще уже в контейнер засунуть.
Чересчур мощная интроспекция — python невозможно посадить в песочницу. Конечно, зависит от задачи, но в игровых скриптах возможность делать что-то такое мне видится нежелательной:
[x for x in ().__class__.__base__.__subclasses__() if x.__name__ == 'Popen'][0]('calc.exe')
Да, не совсем корректный термин. Химики используют «разрушение эмульсии», и сила тяжести там не единственная причина (броуновское движение, силы Ван-дер-Ваальса...)
Я тоже несколько запутан. Видимо, имеется в виду, что взвесь масла в воде без внешнего воздействия отстоится и разделится на компоненты. Согласно закону неубывания энтропии выходит, что раз система сама пришла из взвеси в разделённое состояние, то последнее имеет большую энтропию. Это довольно контринтуитивно, если мы считаем энтропию мерой неупорядоченности, ведь «вперемешку» кажется более хаотичным состоянием.
3d-secure это опция мерчанта, которой он прежде всего прикрывает свою задницу, а не клиента. Не банк-эмитент определяет, что «для этой карты обязательно надо везде вводить код из СМС» (за редким исключением вроде Индии), а именно конкретный мерчант, который решает, что неизбежное снижение конверсии от включения 3D-secure (клиент не совершил покупку т.к. банк-эмитент не поддерживает, не дошла СМС, нет телефона под рукой...) принесёт убытков меньше, чем возврат средств по позже оспоренным транзакциям (который в отсутствие 3D-secure должен выполнять мерчант).
Для очень крупных магазинов эти дополнительные заказы окупают все разборки с фродом, поэтому на AliExpress или Amazon запросто может не быть 3D-secure и ничто не мешает использовать краденную карту там. Если вы вовремя заметите лишнее списание, сходите в банк и напишете заявление — через 30 дней, возможно, деньги вернут.
Python, безусловно, хороший язык. Jupyter — отличный инструмент для прототипирования, но от паскаля в данном случае было бы куда больше пользы. Он как минимум не менее выразителен, чем Python, а статическая типизация только в кассу.
А меню выбора кодировки страницы тоже?
Оффтоп: вот так и работает "опенсорсность" Chromium — форкнуть-то можно, но поддерживать форк и вливать изменения из апстрима никто не в силах. Прямо печалька.
Утрированный пример: допустим, есть графики D3 или highcharts, которые используют контекст в своих колбеках на всю катушку, и «старый» класс с классическим that = this, который строит конфигурацию для графика:
Если всё это дело попытаться переписать с использованием «новых» классов, сразу возникают нестыковки:
Но как же хорошо, что в JS существует столько явных возможностей, среди которых есть даже IIFE. Так язык позволяет избежать лишних удивлений:
(Да, это потому, что либы писались ещё за царя Гороха. Но самое страшное, что так продолжают писать! Потому что пока в языке есть этот чёртов this, каждый будет вертеть им как хочет)
Думаю, если бы JS наконец обзавёлся тем, что в других языках называется «стандартной библиотекой», проблем бы немного убавилось.
Зачем такое вообще нужно: в директории 9000 файлов с названиями вида eventXXXXXXXXXX.log, а у меня в буфере есть название event1217548800.log.
Кстати, примерно такая же фигня в GTK. По сравнению с ними диалоги открытия/сохранения файла в KDE/Qt/Windows — просто шедевр юзабилити.
И даже
и попросил найти в ней уязвимости. Конец немного предсказуем: tav.espians.com/a-challenge-to-break-python-security.html
Ещё были попытки у pysandbox, но там также признали поражение:
lwn.net/Articles/574215
lwn.net/Articles/574323
nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
В стандартной библиотеке был модуль rexec, но он также признан опасным и удалён в 3 версии
docs.python.org/2/library/rexec.html
PyPy пытались, но их sandbox «is not actively maintained. You will likely have to fix some issues yourself».
Наверное, единственный работающий способ — переписать интерпретатор и где-то внизу перехватывать системные вызовы (ZeroVM Python), но это совсем не имеет смысла, проще уже в контейнер засунуть.
Новый модный декодер MP3 на ES6
Не перестаю удивляться способностям некоторых людей продавать что угодно.
Для очень крупных магазинов эти дополнительные заказы окупают все разборки с фродом, поэтому на AliExpress или Amazon запросто может не быть 3D-secure и ничто не мешает использовать краденную карту там. Если вы вовремя заметите лишнее списание, сходите в банк и напишете заявление — через 30 дней, возможно, деньги вернут.