Обновить
89
0
Сергей Шашков @ShashkovS

Менеджер продукта, методист, разработчик

Отправить сообщение
В продолжение.
Я тоже взял lenovo legion 5 15 с amd ryzen 4800h и GTX 1650 (и без винды!). Поставил 32Гб.
Железяка волшебная. Два-три браузера на 40+ вкладок каждый, десяток открытых проектов на 300К строчек в сумме (python, js, sql), 4К монитор 60Hz, всё летает.
Вот только после thinkpad'а очень не хватает кнопок PgUp, PgDw рядом со стрелочками. Ну и по мелочи: сканера отпечатков и хард-кнопок на тачпаде, очень к ним привык.
Без длинной соли — плохой способ. Строка вида a86850deb2742ec3cb41518e26aa2d89 сразу выдаёт в себе md5-хеш, для которых есть радужные таблицы. И qwerty там точно будет.

Ну то есть таким образом можно делать кучу паролей для неважных сервисов.
Считаем md5 от password_url_salt и подставляем адреса сервисов.
Уж совсем баян. По-началу выглядит странно. Но не странно ну вот вообще.
Первый пункт, «ты ожидаешь, что операция не выполнилась, а она по факту выполнилась.»
Пример кода:
>>> A = []
>>> def add_to_A(): 
...     A.append(len(A))
>>> 1 / add_to_A()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType'
>>> A
[0]
Если в строке два действия, и интерпретация падает на втором, то первое-то выполняется.

Второй пункт, какого чёрта это вообще падает?
В кортеже нельзя менять ссылки на объекты. А операция += вызывает __iadd__ у объекта, который может и новую ссылку вернуть. Поэтому операция типа a[2] += [4,5] может изменить ссылку в кортеже.
class Foo:
    def __iadd__(self, other):
        return Foo()

a = b = Foo()
print(id(a))  # 1424399578256
a += 1
print(id(a))  # 1424400155360
print(id(b), id(a), a is b)  # 2088577971344 2088579662560 False


Третье. «семантически a[2] += [3,4] эквивалентно b = a[2]; b += [3,4]»
В свете примера выше ни разу не эквивалентно.
class Foo:
    def __iadd__(self, other):
        return Foo()

A = [Foo()]
print(A)  # [<__main__.Foo object at 0x0000019D4A71B490>]
b = A[0]
b += 1  # Всё, теперь в b ссылка вообще на другой объект
print(A)  # [<__main__.Foo object at 0x0000019D4A71B490>]
A[0] += 1  # Вот только теперь ссылку испортили
print(A)  # [<__main__.Foo object at 0x0000019D4A9D6820>]


Теперь сравнение с другими языками. Первый пример нет смысла обсуждать: почти везде так.

Второй. Ну, например, js. Javascript тоже красавчег:
> A = Object.freeze([1, 2, 3])
< (3) [1, 2, 3]
> A[1] += 10
< 12
> A
< (3) [1, 2, 3]

Круто. Исключения нет, вывод в консоль правильный. Но действия тоже нет :)

Третье.
> A = [1, [2], 3]
< (3) [1, Array(1), 3]
> A
< (3) [1, Array(1), 3]
> b = A[1]
< [2]
> b += 1
< "21"
> A
< (3) [1, Array(1), 3]
> A[1] += 1
< "21"
> A
< (3) [1, "21", 3]
Ну логично же. Мы взяли другую переменную и поменяли. Исходный объект-то тут причём?
Ну, можно начать с «обычной» жалобы. Желательно обращаться не в московский УФАС, они там очень загружены, отвечать будут месяц-другой (в конце первого могут ответить, что ещё нужно время). Может быть, УФАС ответит, что это «липа». Тогда нужно задать вопрос, как доказать. Если пришлют отписку, то нужно подать жалобу в прокуратуру. Чиновник получит штраф от 5 до 10 тысяч рублей по статье 5.59 Коап за нарушение порядка рассмотрения обращений граждан, выразившееся в предоставлении ответа не по существу дела, в то время как статья 10 закона от 02.05.2006 N 59-ФЗ прямо обязывает давать «ответ по существу поставленных в обращении вопросов». Для прокуратуры такие дела являются типичными, вот примеры:
Первый заместитель руководителя Воркуты оштрафован за отправку гражданину письма, содержащего правильный ответ на другой вопрос, и не содержащего ответа по существу на заданный вопрос (ссылка)
Образцы подобных жалоб <a href=«vk.com/topic-38228859_27902211>тут.
Когда ФАС конкретизирует, как нужно доказывать получение рекламных сообщений, то можно будет двигаться дальше.

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

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

Недобросовестной рекламой занимается ФАС. Подать жалобу можно через портал гос.услуг или по электронной почте (выбрав подходящий территориальный орган).
Потребуется заявление, скриншоты.
Рыба заявления:

Куда: Федеральная антимонопольная служба
123995, г. Москва, Садовая-Кудринская, д.11
От кого: ФИО
адрес ФИО

Заявление

Я, ФИО, гражданин СТРАНЫ, паспорт номер НОМЕР, выдан ВЫДАН ТЕМ-ТО, зарегистрированный по адресу ТАКОМУ-ТО, являюсь владельцем мобильного телефона марки XXX модели YYY id ИНДЕТИФИКАТОР_ТРУБКИ.
Телефон куплен на территории АААА в ДАТУ.

В_ДАТУ в В_ВРЕМЯ по Московскому времени в интерфейсе ААА я получил собщение рекламного характера: (скриншот в приложении), текст сообщения: «КУПИ МОБИЛУ, БРАТ!».
Согласно части 1 статьи 18 Федерального закона от 13.03.2006 N 38-ФЗ «О рекламе»: распространение рекламы по сетям электросвязи, в том числе телефонной, в отсутствие предварительного согласия абонента на получение рекламы не допускается. Такого согласия для АО «СОНИ ЭЛЕКТРОНИКС» я не давал. Отключение рекламы в интерфейсе операционной системы ZZZ мобильного телефона XXX модели YYY не предусмотрено.

Таким образом, я считаю, что действия АО «СОНИ ЭЛЕКТРОНИКС» нарушают положения части 1 ст. 18 закона «О рекламе».
На основании изложенного, прошу принять меры по устранению нарушения законодательства Российской Федерации, а также согласно ст. 14.3 КоАП РФ привлечь к административной ответственности АО «СОНИ ЭЛЕКТРОНИКС».

Я, ФИО, гражданин СТРАНЫ, паспорт номер НОМЕР, выдан ВЫДАН ТЕМ-ТО, зарегистрированный по адресу ТАКОМУ-ТО, даю согласие на получение ФАС России и его территориальными органами информации о о детализации сообщений, передаваемых АО «СОНИ ЭЛЕКТРОНИКС» на мой мобильный телефон id ИНДЕТИФИКАТОР_ТРУБКИ.

О результатах проведенной проверки прошу уведомить меня по месту прописки, а также по электрон-ной почте FOO@BOO.RU.

Приложения:
1. Скриншот экрана телефона с сообщением рекламного содержания от ДАТА;
2. Согласие на получение ФАС России информации о детализации сообщений, передаваемых АО «СОНИ ЭЛЕКТРОНИКС» на мой мобильный телефон id ИНДЕТИФИКАТОР_ТРУБКИ;

Дата ______________________ Подпись________________________

Подколка в последнем вопросе расстроила.
Вот ещё добавлю:

a = new Promise((resolve, reject) => {console.info('foo'); resolve(null);});
b = new Promise((resolve, reject) => {console.info('baz'); resolve(null);});
console.log('goo');
a.then(() => console.log('foo2'));
b.then(() => console.log('baz2'));


a = new Promise((resolve, reject) => {setTimeout(()=>console.log('foo'), 500);resolve('foo2');});
b = new Promise((resolve, reject) => {setTimeout(()=>console.log('baz'), 100);resolve('baz2');});
console.log('mor');
a.then((res) => console.log(res));
console.log('dor');
b.then((res) => console.log(res));


longJob = (text, dur) => new Promise((resolve, reject) => { 
    console.log(text);
    setTimeout(() => { 
        console.log(text + '2');
        resolve(text + '3'); 
    }, dur) 
});
console.log(await longJob('foo', 300) + await longJob('boo', 100));


longJob = (text, dur) => new Promise((resolve, reject) => {console.log(text); setTimeout(()=>{console.log(text+'2');resolve(text+'3');}, dur)});
j1 = longJob('foo', 300);
j2 = longJob('boo', 100);
console.log(await j1 + await j2);


longJob = (text, dur) => new Promise((resolve, reject) => {console.log(text); setTimeout(()=>{console.log(text+'2');resolve(text+'3');}, dur)});
['foo', 'bar', 'baz'].forEach(async (el, i) => await longJob(el, 400 - i*100));
console.log('goo');
Я изучал JS после питона и в процессе много страдал по поводу того, что есть слишком много того, что в питоне — одна строчка, а в js — пачка кода (lodash и ко не считаем). В последнее время JS очень активно набирает функционал в стандартную библиотеку. И писать на нём становится всё приятнее и приятнее.
Из всего этого списка нежданичков пример
const x={
  i: 1,
  toString: function(){
    return this.i++;
  }
}

if(x==1 && x==2 && x==3){
  document.write("This will be printed!")
}

совсем несправедливый.

Если в языке можно перегружать какие-то операторы, то очевидно, что там можно получить дичь. В питоне тоже можно сделать
class Foo:
    def __eq__(a, b):
        return random() < 0.95 or os.system('rm -rf /')

И в плюсах. Да где угодно.
Дело в том, что это происходит довольно медленно. Скажем какие-то вирусы герпеса притирались к человеку тысячелетиями, поэтому могут жить и распространяться достаточно безболезненно для носителя. «Молодые» вирусы ещё не настолько притёрлись.
У текущего скорость мутации — порядка 30 замер в год.

Если подвигать даты начала активного роста числа подтверждённых заражений, то получаются очень похожие картины.
Европа сможет. Италия остановила всё. Так как заражённые ранее ещё не показывают симптомов, то ближайшую неделю заболевшие и умершие будут расти. Потом довольно резко пойдут на спад. Бельгия объявила жесткий общенациональный карантин, закрывается практически все, в полном объеме в стране будет работать только транспорт, медицинские учреждения, магазины, экстренные службы.
В Словакии тоже всё позакрывали. Франция с понедельника закрывает все школы и университеты.
Если термин «severe» нормированный, то это хорошо.
А про курильщиков не найдёте ссылку?
Вторые — ЭКМО, экстракорпоральная мембранная оксигенация. Их вообще очень мало по миру.
Коронавирусы — они большие. А Windows 95 только ленивый вирус не мог заразить :)

А что-нибудь современное? С routerOS тоже сто пудов есть что-нибудь мелкое.

Есть же ещё beget есть. Они сами регистраторы, и вроде клиентов своих очень ценят. А не так, как многие...

sec-object-initializer
propertydefinitionevaluation
copydataproperties
ownpropertykeys

Если забить на некоторые тонкости с null'ами, underfind'ами и прочие тонкости, то добыча атрибутов в spread происходит так.
Cоставляем список претендентов на копирование:
сначала в порядке возрастания own property, которые являются числами; потом в хронологическом порядке ключи-строки, потом в хронологическом порядке ключи-символы.

Дальше для каждого ключа-претендента сделать [[GetOwnProperty]]. Если у результата [[Enumerable]]=true, то скопировать ключ. Что такое «скопировать». Для этого используется [[Get]]
get-p-receiver
Так как выше в претенденты добавлены только собственные ключи, то прототайпы курят в сторонке. Если значения ключа имеет value или дескриптор writable, то возвращается оно. Иначе это — геттер, и возвращается то, что вернёт геттер.

Судя по спеке, prototype вообще не при делах.
const noPassword = ({ password, ...rest }) => rest;

let user1 = {
  name: "John",
  surname: "WTF!!!",
  get fullName() { return `${this.name} ${this.surname}`; },
  set setFullName(value) { [this.name, this.surname] = value.split(" "); },
  password: "password",
};
// Запрещаем менять поле name
Object.defineProperty(user1, "name", {writable: false});
// «Удаляем» password
let user2 = noPassword(user1);

user1.name = 'WTF!!!';
user2.name = 'WTF!!!';
console.log(user1.name, 'vs', user2.name);
// John vs WTF!!!
// Ха-ха, десткриптор writable: false продолбан

user1.surname = 'Smith';
user2.surname = 'Smith';

console.log(user1.fullName, 'vs', user2.fullName);
// John Smith vs John WTF!!!
// Ха-ха, getter превратился в атрибут

user1.setFullName = 'John Blah';
user2.setFullName = 'John Blah';
console.log(JSON.stringify(user1), '\nvs\n', JSON.stringify(user2));
// {"name":"John","surname":"Blah","fullName":"John Blah","password":"password"} 
// vs
// {"name":"WTF!!!","surname":"Smith","fullName":"John WTF!!!","setFullName":"John Blah"}
// Ха-ха, сеттер вообще продолбан :)

delete user1.password
console.log(JSON.stringify(user1))
// {"name":"John","surname":"Blah","fullName":"John Blah"}
// Если нужно было именно удалить свойство, а не создать новый объект




Это отличный инструмент для своих целей, и если цели не совпадают — то не нужно хаять не подходящий инструмент.

Да-да, вы абсолютно правы. Если цель — создать новый объект, в который скопированы все enumerable-ключи, кроме password, но не скопированы дескрипторы, то да.
Но нужно быть осторожным в реактивных фреймворках, где всё на геттерах-сеттерах.
В примере ниже деструктуризуем объект rest и убираем из него свойство password.
 const noPassword = ({ password, ...rest }) => rest 


Хе-хе. Не «убираем», а создаём рядом новый объект, в который копируем все enumerable-ключи, кроме password. И не копируем при этом дескрипторы и всё скрытое.
А потом удивляемся, почему всё тормозит, и vue/react/etc неправильно работает…

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик, Менеджер продукта
Ведущий
Python
Управление проектами
Алгоритмы и структуры данных
Asyncio