Тим ·

Эксперт не знает гораздо больше вещей, чем начинающий, — это и делает его экспертом.

Тим ·

The Real Cause of the Sign In with Apple Zero-Day

Аарон Пареки написал краткий анализ недавнего бага в Sign in With Apple, за который Apple выплатили $100 000.

At the end of the day, this was a problem with Apple not verifying external input from a form submission.

Just remember, this bug was a lack of form validation.

Валидация форм часто звучит как что-то простое и рутинное, но это ощущение обманчиво — формы это главный способ пользователя и атакующего заставить сервер что-то сделать.

I've never seen Apple apps using Sign in with Apple themselves, typically they use their own built in Apple ID authentication directly. However it’s certainly possible that Apple is moving towards Sign in with Apple even for their own apps, as that would be a huge step up in security compared to what they have now, for all the same reasons that entering passwords directly in applications is dangerous.

Веб-сервисы Apple зачастую оставляют желать лучшего, и UX логина в icloud.com или appleid.apple.com стал бы сильно приятнее, если его заменить на Sign in with Apple (с опцией ввести логин/пароль, когда заходишь не со своих устройств).

Тим ·

Вышел новый выпуска журнала Increment, в этот раз — про фронтенд!

Это толстый журнал про технологии. Практически New Yorker или там NY Review of Books, но для нас. Можно читать бесплатно онлайн или же заказать себе настоящий бумажный.

Порекомендую отдельно эссе When frontend means full stack Криса Койера, создателя CSS-Tricks.com и CodePen, про меняющуся роль фронтендера.

Впрочем, заказать в Россию пока не удалось, но я написал им на почту. Такое встречал и раньше, многие магазины по-прежнему не доверяют российской почте. Если не выйдет, то закажу через пересылку. Историческая фигня!

Тим ·

Если в redux-observable невнимательно следить, то легко получить эпик, который умрёт:

const dyingEpic = (action$, state$, _) =>
  action$.pipe(
    filter(isActionOf(API_REQUEST)),
    switchMap(action => apiCallThatReturnsObservable(action.payload.id)),
    map(result => API_SUCCESS(result)),
    catchError(err => of(API_ERROR(err)))
  );

Дело в том, что ошибка в таком случае дойдёт до .pipe, и он благополучно завершится, и новых экшенов обрабатывать не будет.

const resilientEpic = (action$, state$, _) =>
  action$.pipe(
    filter(isActionOf(API_REQUEST)),
    switchMap(action => apiCallThatReturnsObservable(action.payload.id)
      .pipe(
        map(result => API_SUCCESS(result)),
        catchError(err => of(API_ERROR(err)))
      )
    );

Здесь мы создаём вторую, независимую цепочку observable, и когда она упадёт с ошибкой, то switchMap всё равно сможет переключиться на новый.

Тим ·

Бен Томпсон (Stratechery) сделал публичным свой ежедневный пост от 14 мая: Media, Regulators, and Big Tech; Indulgences and Injunctions; Better Approaches.

Пост хорош целиком (как и остальные посты Томпсона), меня больше всего зацепил один эпизод:

Google executives thought they’d found a way to dodge European regulation when, in Spain in 2014, they simply removed Google News from search results there rather than respond to regulators’ demands for compensation. But, in a sign of how things are shifting, when they tried a similar maneuver in response to France’s new regulation requiring payment for copyrighted “snippets” of news, Ms. de Silva pounced, ruling that the company’s take-it-or-leave-it approach was itself an abuse of market power. “We looked at what happened in Spain,” she said. “This is not really an avenue that is open to them because in our decision we asked them to maintain the content is as it is today.”

Let’s be crystal clear about what is happening here: Google is being compelled to do business in France against its will, precisely because news publishers need Google more than Google needs them, upsetting the entire premise of this article. Moreover, in Smith’s telling, this is the alternative to simply paying up voluntarily. It sounds radical to suggest this is blackmail, but at what point is it lying to say otherwise?

«Compelled to do business against its will» звучит как пассаж из Айн Ренд.

Тим ·

Первые ощущения от deno, тезисно:

  • ранний восторг — как когда нода только появилась, освоение Дикого Запада
  • подходит для API-сервисов и особенно для консольных команд
  • deno install и один бинарник это киллер-фича
  • подходит для обучения программированию на джаваскрипте — один и тот же код можно запустить в браузере и консоли, включая импорты
  • плоский неймспейс Deno, не надо импортировать fs, path, etc.
  • вдохновлён Go, а написан всё-таки на расте
  • тайпскрипт из коробки — медленно, но правильно
  • версии либо прибиты гвоздями, либо не прибиты вовсе — semver не работает

Написал на радостях пятьсот строк тайпскрипта в новом небольшом проекте.