пятница, 29 апреля 2022 г.

The Time Machine by H. G. Wells

 

Прочитал то, что должен был прочесть еще давно – роман Герберта Уэллса “Машина Времени”.

Сюжет описывает деградацию и упадок человечества далёкого будушего – к 800 000 году люди пришли к двум разным эволюционным путям: к элоям – расе добрых беспечных, глупых беспомощных существ, которые весь день поют, танцуют и смеются, не работая и не имея никаких забот. И к морлокам – злобным жестоким подземным тварям, живущим в ночи и питающимися элоями (в буквальном смысле). Роман считается классикой научно-фантастического жанра, хотя на мой взгляд, в нём больше политико философского.
Новелла написана в далёком 19 веке, в контексте классового расслоения того времени между рабочими и буржуазной элитой в британском обществе, но в наше время она выглядит ещё более актуальной, на мой взгляд.
Сейчас, по прошествии времени, стало очевидно, что в постиндустриальном обществе классовые различия в странах первого мира стираются с каждым поколением, и рабочий класс уже перестал быть низшим, перейдя на ступень среднего класса. Сейчас роли морлоков и элоев отведены не классам, а цивилизациям. Элои сегодняшнего времени – это население золотого миллиарда, представители европейской цивилизации. Так же, как в романе, они беспечны, наивны, слишком добры,  миролюбивы, склонны к травоядной жизни, трусости и к моральному упадку. С другой стороны мы имеем другие цивилизации – русскую (которая отдаляется от европейской вот уже 100 лет подряд), африканскую, исламскую и китайскую. Это и есть те самые морлоки, описанные Уэллсом, которые постепенно пожирают представителей деградировавшего золотого миллиарда.
Во время чтения у меня не было пиета ни в сторону злобных ночных каннибалов, ни в сторону улыбчивых солнечных дегенератов.  Две эти эволюционные ветви человечества имели один вектор направления – направление в пропасть.  К “элоям” и “морлокам” нашего времени у меня точно такое же отношение.

суббота, 16 апреля 2022 г.

Генерирование случайных слов в JS

 

Допустим, у нас возникла идея создать скрипт на JS, который бы генерировал случайные слова (никнеймы).

Начнём для начала с самого простого подхода. Если мы просто будем брать случайные буквы и составлять их них слова, то они будут выглядеть неестественно и неприглядно. Примеры сгенерированных слов:

  • srjxdq
  • moyssj
  • ywtckmw
  • wjvzw
  • xtwey

и т.д.

Как видим, такой подход не позволяет нам генерировать слова, которые хотя бы отдалённо напоминали обычные – получается просто набор бессмысленных букв, который больше походит на пароли. Чтобы придать словам натуральность и “человечность”, нам нужно сделать как минимум две вещи (на мой взгляд):

  1. Исключить появления более двух гласных/согласных при генерировании слова. Данная задача является тривиальной и ее не имеет смысла рассматривать.
  2. Подбирать случайные буквы для слова с учётом их веса. Весами в данном случае будут являться частотность букв в английском языке. Таким образом мы должны уменьшить/увеличить шанс того, что определенная буква попадёт в наше генерируемое слово, и таких редко используемых букв, как, например, Q, Z и X будут встречаться в наших словах гораздо реже, чем E, T, A, O, I, которые по статистике являются самыми частыми в английских словах.

Используя всего два этих подхода, мы генерируем гораздо более “натуральные” слова. Примеры:

screenshot_0.png 

Разберём 2-й пункт поподробнее.

Алгоритм выбора случайных элементов массива на основе весов в JS

Относительно простой имплементацией подобного алгоритма является преобразование ряда рациональных чисел s1 (массива), являющимися весами для элементов, в ряд чисел s2, который получается посредством кумулятивного сложения чисел:

equation 

const items = [ '🍌', '🍎', '🥕' ]; 
const weights = [ 3, 7, 1 ];
  • Подготавливаем массив весов посредством кумулятивного сложения (то есть список cumulativeWeights, который будет иметь то же количество элементов, что и исходный список весов weights). В нашем случае такой массив будет выглядеть следующим образом:
cumulativeWeights = [3, 3 + 7, 3 + 7 + 1] = [3, 10, 11]
  • Генерируем случайное число randomNumber от 0 до самого высокого кумулятивного значения веса. В нашем случае случайное число будет находиться в диапазоне [0..11]. Допустим, что randomNumber = 8.

  • Проходим с помощью цикла по массиву cumulativeWeights слева направо и выбираем первый элемент, который больше или равен randomNumber. Индекс такого элемента мы будем использовать для выбора элемента из массива элементов

Идея этого подхода заключается в том, что более высокие веса будут “занимать” больше числового пространства. Следовательно, существует более высокая вероятность того, что случайное число попадет в “числовое ведро” с более высоким весом.

Попробую наглядно показать это на примере своего скрипта:

const weights = [3, 7, 1 ];

const cumulativeWeights = [3, 10, 11];

// В псевдопредставлении мы можем представить cumulativeWeights следующим образом:

const pseudoCumulativeWeights = [

1, 2, 3, // <-- [3] числа

4, 5, 6, 7, 8, 9, 10, // <-- [7] чисел

11, // <-- [1] число

];

Как видим, более тяжёлые весы занимают более высокое числовое пространство, а следовательно, имеют более высокий шанс быть случайно выбранными. Процентное соотношение шанса выбора для элементов weights будет таким:

Элемент 3: ≈ 27%,

Элемент 7: ≈ 64%,

Элемент 1: ≈ 9%

В общем случае функция выглядит примерно так:

function weightedRandom(items, weights) {
    if (items.length !== weights.length) {
        throw new Error('Массивы элементов и весов должны быть одинакового размера');
    }

    if (!items.length) {
        throw new Error('Элементы массива не должны быть пустыми');
    }
    const cumulativeWeights = [];
    for (let i = 0; i < weights.length; i += 1) {
        cumulativeWeights[i] = weights[i] + (cumulativeWeights[i - 1] || 0);
    }

    const maxCumulativeWeight = cumulativeWeights[cumulativeWeights.length - 1];

    const randomNumber = maxCumulativeWeight * Math.random();

    for (let itemIndex = 0; itemIndex < items.length; itemIndex += 1) {
        if (cumulativeWeights[itemIndex] >= randomNumber) {
            return items[itemIndex];
        }
    }
}

Как можно еще лучше алгоритм генерации слов?

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

  • satlenl
  • tohhi
  • tiowh
  • aahepw

и т.д.

Самым простым решением этого вопроса является ограничение на чередование более двух гласных/согласных слов:

if (vowelCounter >= maxVowelsInRow) {
i -= 1;
continue;
}

и

if (consonantCounter >= maxConsonantsInRow) {
i -= 1;
continue;
}

Пусть значения maxConsonantsInRow = 1 и maxVowelsInRow = 1, тогда сгенерированные слова будут выглядеть примерно так:

screenshot_1.png

Отмечу здесь, что th и ae являются диграмами, и считаются как одна буква.

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

С полной версией скрипта можно ознакомиться здесь: https://github.com/bernd32/nickname-generator

 

 

четверг, 31 марта 2022 г.

Быстрый, безопастный и бесплатный(*) shadowsocks+v2ray-сервер с обфускацией трафика через TLS

 

Данный гайд написан благодаря анонам из 2ch.hk/s, в частности благодаря этому и этому доброму анону.

Преамбула.

В свете нынешних событий в России, тема блокировок интернета стала актуальной, как никогда. На сегодняшний день самым популярным способом обхода блокировок являются VPN-сервисы. Однако они имеют довольно значительные недостатки, которые полностью или частично решаются поднятием своего собственного shadowsocks-сервера. В этом гайде я опишу, как это сделать.

Сразу возникает резонный воппрос – а зачем так заморачиваться, когда есть VPN? Итак, для начала перечислю плюсы и минусы VPN перед shadowsocks-сервером:

+ От пользователя не требуется никаких технических знаний и траты времени на настройку – поставил ВПН и забыл. Настройка же SS-сервера, тем более с обфускацией трафика, требует некоторых умений и знаний, которых нет у большинства пользователей.

– ВПН серверы работают медленно, даже платные. Про бесплатные вообще говорить не приходится – это просто дно, которым невозможно пользоваться на постоянной основе. Причины медленной скорости кроются в том, что российские провайдеры анализируют трафик и умышленно режут скорость подозрительного зашифрованного трафика. Всё это решается обфускацией трафика с помощью обычного TLS-шифрования, который для провайдера выглядит как легитимный.

– VPN небезопасен для пользователя. При желании товарища майора, вас очень быстро найдут: либо вас сольёт сам ВПН-провайдер, либо вас вычислят с помощью т.н. атаки сравнений – это когда товарищ майор, имея пакет яровой и данные о трафике, а так же данные с серверов (что актуально для всего рунета) для того, чтобы найти злобного оппозиционера, который пишет плохие вещи про власть через впн, сравнивает, с какого айпи пользователь это писал и кто в этот момент времени подключался к айпи-адресу, с которого это писали, и вычисляет мамкиного копротивленца.  SS+v2ray+tls в этом плане гораздо безопаснее для пользователя, живущего в таких тоталитарных странах, как Россия и Китай, к примеру. Поэтому вполне естественно, что протокол shadowsocks и v2ray были созданы в КНР.

– (*) Помимо скорости и безопасности, обход блокировок с помощью SS+v2ray может быть абсолютно бесплатным! Для этого нужно найти какой-нибудь условно-бесплатный виртуальный сервер (например Oracle Cloud) и бесплатный домен (например, .tk, который предоставляет freenom). О том, как получить бесплатную VPS-ку, можно почитать эту статью на Хабре, но есть одно но – свете последних событий Oracle не предоставляет услуги россиянам, поэтому просто так там зарегистрироваться не получится – только если у вас нет иностранной симки и иностранной банковской карты, с которой единоразово снимается 1 доллар в качестве проверки.

– VPN провайдеры ограничивают трафик/количество устройств и как правило используют стоковый OpenVPN или немного модифицированный.

понедельник, 14 февраля 2022 г.

зарёкся смотреть аниме с русабами

Начал смотреть Shinsekai yori, но дропнул на первой серии. Но не из-за того, что аниме говно, а из-за русских субтитров. И сегодня я окончательно зарёкся смотреть аниме с русскими сабами. Хотя я и раньше смотрел с русабами только новое аниме, потому что они хоть как-то терпимы по качеству перевода, а вот русабы к старым тайтлам (всё что до 2010-х годов) в подавляющем большинстве случаев - просто нереально тошнотворное дерьмо, которое делали неграмотные школьники и быдлоанимешники, и которые не подходят по смыслу оригинала чуть более, чем полностью.

Но с лучшим пониманием устного японского я стал замечать всё больше и больше откровенной бредятины в русских переводах даже нового аниме, даже от как бы именитых фансаб-групп. Иногда перевод даже близко не подходит по смыслу к тому, что говорят в оригинале. Таких моментов вроде как и немного (на взгляд "знатока" японского уровня N2-3), но каждый раз из-за этого хочется просто удалить весь тайтл к чертям и скачать нормальный релиз с ансабами (с нормальной кодировкой и таймингом сабов в качестве бонуса). И да, в английских сабах такого дебилизма в разы меньше, что логично, если учесть, русабы - это почти всегда перевод перевода, который априори говно. Русских переводов с оригинала очень, очень мало.

В общем, русабы - это зло и больше я к этому дерьму прикасаться не буду. Хотя жаль, смотреть аниме с хорошими русабами мне нравится больше, чем с ансабами. И дело совсем не в том, что я плохо знаю английский, а в том, что русский текст вызывает у меня больший эмоциональный отклик, больше чувств что ли... В то же время английский язык я всю жизнь использовал только для работы и учёбы, поэтому английский у меня ассоциируется лишь с сухой документацией, учебниками, научными статьями и т.п.
Но всё-таки точность важнее, поэтому придётся привыкать...

воскресенье, 13 февраля 2022 г.

Chuunibyou demo Koi ga Shitai! (1-й и 2-й сезоны)

Chuunibyou demo Koi ga Shitai!Chuunibyou demo Koi ga Shitai! 

Chuunibyou demo Koi ga Shitai! Ren

***

Навернул тут на днях, сразу два сезона. А что, мне, внезапно, понравилось. Хотя помню, что дропнул на первой серии еще в 2012 году, когда оно выходило в онгоинге. Мне тогда казалось, что это очередная штампованная хуета для малолетних дебилов. Ну, в общем-то, я не был тогда далёк от истины, но всё же стоит добавить, что это ОЧЕНЬ качественная хуета для малолетних дебилов, с отличным графоном, ВНЕЗАПНО интересными персонажами (что редко для такого жанра), хорошим добрым юморком и даже с серьёзной ололо-драмой ближе к концу, которая не выглядела уёбищно, как часто бывает в гаремниках для дрочеров. Фансервиса довольно мало, и что важно -  это не вызывает отторжения и рвотных позывов из-за своей неуместности и вымученности. Алсо, футфетишисты будут рады, но недолго.

Во втором сезоне появился новый персонаж - няшечка Шичимия, которая настолько няшечка, насколько это вообще возможно в аниме такого жанра. Жаль, что её, как персонажа, раскрыли лишь по верхам, частично. И ещё жаль, что в аниме не было полноценной любовной драмы на основе любовного треугольника между Шичимией, ОЯШем и Рикой. А если бы еще эта драма была такой же эпичной, как, скажем, в Kimi ga Nozomu Eien, то цены второму сезону не было бы вообще. Но увы, второй сезон получился даже немного слабее первого. 

А так - да, говоря откровенно - тайтл состоит из качественного говна и штампов чуть более, чем полностью (как почти все тайтлы KyoAni). Но, как говорил Какун, говно и штампы - есть суть всего аниме. И в момент, когда ты перестаешь получать удовольствие от качественно выполненного штампованного говна, ты перестаешь быть анимуфагом. Вот я, по-видимому, еще не перестал, спустя столько-то лет. 

Осталось просмотреть еще две полнометражки и на этом всё. Но пока не буду с этим спешить.

Tonari no Kaibutsu-kun

Tonari no Kaibutsu-kun

***

Средненькое сёдзё с интересными героями, но крайне унылым и банальным сюжетом. Все 13 серий - это попытки Хару и Сидзуку построить отношения, но из-за сложных характеров обоих героев, каждые такие попытки в итоге оборачиваются если не фейлом, то уж точно ничем. Ну, собственно, на этом и строится весь сюжет, который мусолится на протяжении всех серий, и обсуждать тут решительно нечего. И да, никакого прогресса сюжета в аниме нет, а последняя серия ничем не отличается, скажем, от 2-й или 3-й. Ах да, есть еще второстепенные персонажи и посвященные им параллельные сюжетные ветки, но они еще более унылые, чем основная канва. А вот главные герои мне пришлись по нраву: холодная и неприступная няша Сидзуку и чудаковатый ёбнутый и асоциальный Хару, в котором я увидел себя юные школьные годы. И каждый из них имеет сильный волевой и немного эгоистичный характер. Интересный пэйринг, только вот мне кажется, что в реале такие отношения обречены на неудачу. Да даже в самом аниме всё это со стороны выглядит так, что перспектив у них нема. Хотя понятно, что в манге они 100% построили полноценные гармоничные отношения, ага, кто бы сомневался (мангу не читал, кстати, и не собираюсь). В общем, так себе. Ожидал гораздо большего, если честно.

понедельник, 17 января 2022 г.

Psycho-pass (первый сезон)

Psycho-Pass 

***

После длительного (полугодичного) перерыва, я решил продолжить упарываться японскими мультиками для маленьких девочек. Начать решил с Psycho-pass.

Сразу хочется отметить забавный момент. В киберпанк-мире Психопаспорта существует система "Сивилла", определяющая "коэффициент преступности" каждого гражданина. Эта концепция сразу же мне напомнила о системе социального кредита в Китае. Аниме вышло в 2012, а сюжет писался еще раньше, и тогда про эту систему еще никто не знал. Получается, сценаристу удалось предвосхитить то, что будет введено всего через пару-тройку лет в другой азиатской стране, а не через 100. В каком-то смысле хорошо, что я начал смотреть это аниме в 2022, а не в 2012, потому что в нынешних реалиях сюжет смотрится не таким уж и фантастичным. Как-то больше веришь происходящему что ли.

Касательно персонажей, то Psycho-pass - это тот случай, когда антагонист кажется гораздо более симпатичным, чем протагонисты. И это большой плюс, потому что неоднозначность героев гораздо более интересна, чем топорная черно-белая дихотомия абсолютного зла и абсолютного добра. С одной стороны мы имеем антагониста Макисиму - обаятельного интеллектуала, нонконформиста и пассионария, который борется с поистине фашистским кибергулагом. Правда, борется очень неоднозначными методами, которые зачастую заканчиваются смертями невинных людей. С другой имеем протагонистов - детективов, которые пытаются его поймать, по сути защищая при этом угнетающий граждан кибергулаг. Впрочем, и среди как бы "положительных" героев есть симпатичные персонажи. К примеру, исполнитель Когами, который плевал на всю эту систему и государство, а так же на свою работу и своих боссов. Он охотится за Макисимой лишь ради мести. К слову, всё это очень похоже на то, что было в аниме Monster.

В общем, первый сезон оказался очень даже неплох и превзошёл мои ожидания. 8/10. 

Update. Посмотрел  второй сезон и полнометражку. Говно. Сюжет скучный, персонажи очень блеклые. Первый сезон как-то ярче и живее был. Разочарование... Осталось еще пара полнометражек глянуть, но не уверен, что осилю. Нужно как минимум сделать большой перерыв.