Смена пола и расы одним кликом

Сегодня мы узнаем, как Юникод трудится не только на поприще объединения носителей разных письменностей и языков, но и распространяет идеи толерантности и гендерного равноправия среди смайликов.

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

Потихоньку, Юникод начал продавать душу и простоту ещё давно. То селекторы начертания введут. То региональные индикаторы из которых можно лепить коды стран, типа «RU» и «IT», а айфончик будет их заменять на флаги (как будто миллиона не использованных символов мало было для того, чтобы ввести отдельные флаги).

Но тут подоспели эмоджи. И большинство населения земли стремительно переходит с общения с помощью старых письменностей на общение сугубо с помощью эмоджи. Чтобы не отстать от прогресса, Юникод, так же, становится всё больше не стандартом кодирования различных алфавитов, а стандартом кодирования смайликов и эмоджи. Каким будет светлое будущее, уже сейчас можно представить с помощью черновика стандарта UTS-52.

Все символы-эмоджи в Юникоде описаны по возможности нейтрально. Например, «человек на лыжах». Но при выводе на экран, выводится конкретный лыжник. Обычно, это белый джентльмен с достатком выше среднего. Что не всем, конечно, может нравится. Первой ласточкой стала возможность менять цвет кожи. Можно было сделать из лыжника афро-американца, афро-азиата или афро-африканца, наконец. Хотя зачем в Африке лыжи?

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

Некоторые эксперты предсказывают появление модификатора «копуляция», которым можно будет соединять различные символы (например, «котик с глазами сердечками» и «латинская буква L»), а также выстраивать с его помощью цепочки.

Узнать, как всё это будет из первых рук можно на официальном сайте. Либо прочитать русский перевод на сайте Юникод Тэйбл.

Юникод Тэйбл — самый лучший Тэйбл об Юникоде в мире!

Нужен программист, PHP, СПб, от 30 т.р.

Нужен веб-разработчик, от 30 000 р, СПб, Техноложка, СА-дизайн.

Нужно знать:

— PHP5 (>5.3 с неймспейсами и всем остальным)
— JavaScript (работать с jQuery и иметь представление о том, как она сама работает)
— MySQL
— HTML и CSS на уровне «внедрить и подправить». Верстать макеты заставлять не будем.
— Unix, хотя бы на уровне пользователя.
— ООП, MVC и т.д. и т.п.

Ключевые слова с которыми придётся столкнуться:

Git, Sphinx, Composer, PSR, phpunit,
jQuery, node.js, ES6, TypeScript, WebPack, Grunt, Gulp

Работа в команде, участие в разработке сайтов.
Примерный уровень сайтов:
unicode-table.com
arendasmeni.ru
hotel-inn.ru
sanitarim.ru

Портфолио

axy.define — бициклет на тему CommonJS

А тем временем полку бесполезных велосипедов всё пребывает.

Я забросил последнее время JavaScript, а он тут развивается семимильными шагами. Так что я решил освежить знания и посмотреть на новые веяния. Для начала взялся разобраться с TypeScript (потому что я типизированный задрот и педант), Node.js (потому что куда без него), а заодно подумать над модульной системой для клиента (потому что 21-й век на дворе).

И чтобы всё это объединить, я написал на TypeScript модульную систему, которая эмулирует окружение ноды в браузере (не полностью, конечно, но немного).

Вот — axy.define.

Имеется некая виртуальная файловая система, в которой в виде файлов лежат модули и любые другие данные, с ними можно работать с помощью модуля fs. require() ищет модули внутри этой «ФС». Полный алгоритм ноды: относительные пути, поиск по node_modules + системные каталоги, подстановка расширений, индексные файлы, package.json…

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

Частично реализованы некоторые элементы окружения, global, process, модули ядра, такие как fs, path.

Пример

Ссылка

Тестовое приложение тупо меняет цвет страницы на серый.

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

В примере тестовый проект собран вместе с node_modules в которой лежит сама утилита сборки.
В браузере же:

  1. Из «командной строки» опять запускается сборка проекта уже в виртуальной ФС.
  2. Собранный проект запускает отдельную песочницу.
  3. В песочнице опять проходит сборка с нуля.
  4. Собранный повторно проект уже запускается и меняет цвет страницы.
  5. Стандартный поток вывода перенаправлен из консоли в дивы.

Такой вот треш.

Ещё библиотечки

И ещё вдогонку библиотечек на PHP.

axy/fs-paths: пути в ФС

Работа с путями к файлам. Разбор, нормализация, вычисление относительных и всё такое прочее.
Разные типы: Unix, Windows, UNC, даже URL’ы.
Любителям статики — статика, любителям объектов — объекты :)

Допустим, мы спарсили страничку по адресу http://example.com/news/view/?id=10, а в ней ссылки.
Как узнать, куда они ведут?

use axy\fs\paths\Paths;
 
$base = 'http://example.com/news/view/?id=10';
 
$links = [
    './../archive/?page=5#10',
    '/profile/',
    'http://site.loc/',
];
 
$urls = Paths::getAdapter(Paths::TYPE_URL);
 
foreach ($links as $link) {
    echo $link.' --> '.$urls->resolve($base, $link).PHP_EOL;
}

Результат:

./../archive/?page=5#10 --> http://example.com/news/archive/?page=5#10
/profile/ --> http://example.com/profile/
http://site.loc/ --> http://site.loc/

axy/callbacks: колбэки

В дополнение к стандартному callable связывание аргументов:

$callback = new Callback(['obj', 'sum'], [1, 2]);
$callback(3, 4); // $obj->sum(1, 2, 3, 4);

Или так:

$callback = ['obj', 'sum', [1, 2]];
// ...
Callback::call($callback); // $obj->sum(1, 2);

И связывание контекста заодно:

class MyClass
{
    public function getEventHandler()
    {
        return new Callback([$this, 'onEvent'], ['click'], true);
    }
 
    private function onEvent($event)
    {
        echo 'Event '.$event.'!';
    }
}
 
$obj = new MyClass();
$handler = $obj->getEventHandler();
 
// click
$handler(); // "Event click!". Private method was called

axy/magic: магия

Работа с магическими свойствами: отложенное создание магических свойств, надстройки над массивами, read-only и всё такое прочее.
Всё в виде трейтов, комбинируется, как угодно.

axy/envnorm: нормализация окружения

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

— Перехватить все ошибки и предупреждения и выдавать вместо них нормальное исключение.
— Перехватить исключения на верхнем уровне.
— Выводить ошибки при разработке и отключить на продакшене.
— Настроить недонастроенное окружение: правильную кодировку, таймзону путь к сендмайлу и т.п.

Просто пишем нужный конфиг и выполняем вначале:

use axy\envnorm\Normalizer;
 
$config = [
    'errors' => [
        'exceptionHandler' => 'myExceptionHandler',
    ],
    'datetime' => [
        'timezone' => 'Europe/Moscow',
    ],
];
 
Normalizer::createInstance($config)->normalize();

Всё в composer’е, на гитхабе и с документацией на подобии инглиша.

Source map и PHP

Написал библиотечку для работы с source map из нашего любимого похапе.

Если кто не знает что такое source map

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

Единственная проблема, что в сжатом файле теперь у нас какая-то херь, которую совершенно невозможно дебажить. И сообщения об ошибках ведут теперь совершенно непонятно куда.

Однако, все современные минификаторы могут при сжатии ещё создавать файл source map.
В нём хитрым образом закодировано соответствие позиций в сгенерированном файле и в исходных.
В конце сжатого файла можно дописать ссылку на карту:

//# sourceMappingURL=script.min.js.map

И происходит волшебство. Грузится сжатый файл, а в отладчике браузера показываются исходные. Более того, так как в map-файле содержится только соответствие строк и столбцов между файлами, то можно спокойно дебажить TypeScript или какой-нибудь там Coffee прямо в браузере:

Ну, то есть вообще, что угодно:

Остальной текст под катом

JavaScript, суррогатные пары и фекалии

Если кратко: JavaScript не поддерживает суррогатные пары. Что в общем и правильно, так как в большинстве случаев это не нужно, а только лишние расходы. Однако, в меньшинстве случаев из-за этого придётся повозиться.

Теперь рассмотрим подробнее, что означает этот набор слов.

UTF-16 vs UCS-2

Как, наверняка, знают все здесь присутствующие, строки в компьютерах представляются, как последовательность байтиков. А каким образом эти байтики соответствуют буковкам, это определяет кодировка.

Старые добрые кодировки, вроде Windows-1251 были однобайтными. Одному символу — один байт. Работать с ними было одно удовольствие. Хочешь узнать длину строки (количество символов): это просто количество байт. Нужен 5-й символ: просто нужен пятый байт от начала строки. Единственный минус: в нашем многополярном мире 256 различных символов, это слишком мало. Особенно для китайцев с их тысячами иероглифов.

Поэтому теперь мы все любим Unicode. В юникоде много разных кодировок на все случаи жизни. Вот, например, UTF-8: в нём можно закодировать любой Unicode-символ хитрой переменного размера последовательностью байт. При этом базовая ASCII в нём остаётся такого же вида, как и в старых кодировках. Можно читать английские тексты не думая о кодировках, исходники программ и HTML/XML файлы сохраняют свою структуру, а наиболее популярные символы занимают меньше места, чем всякие иероглифы, что тоже приятно.

Неудобно его только обрабатывать. Чтобы узнать длину строки или найти N-й символ, нужно проходить по всем байтам сначала и производить над каждым разные вычисления. Что напрягает. Поэтому в памяти строки лучше хранить в какой-нибудь кодировке фиксированного размера.
Остальной текст под катом

Регистрация, пароли и одно место (ч.I½)

А вот гражданин Proton в камментах к предыдущему опусу не повёлся на мой вброс и даже привёл конструктивную критику. Попробую что-нибудь ответить.

1. Пароль на почту — не секьюрно.

Ну, правил на все случаи нет, всегда головой нужно думать. Если важна безопасность, можно и не высылать на почту, можно и вводить мышкой на виртуальной клавиатуре. Плюс https, двухфакторная авторизация, usb-токен и бумажное письмо с паролем почтой России. Хотя последнее я бы не рекомендовал.

У меня таких сайта четыре, где я готов поеб.цо ради безопасности. Ещё есть полтора десятка сайтов, утеря доступа к которым принесла бы мне некий дискомфорт.

И ещё есть сотня разных форумов, рассылок, coub’ов, весёлых картинок, эксклюзивных фоточек котеков и остальной порнографии. Когда у меня сопрут почту, я больше буду волноваться за саму почту, чем за этот трэш.

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

Итого: если у вас банк, вы можете требовать от клиентов каких-то действий ради их же безопастности.
А если у вас фоточки котиков и вы хотите удержать случайного посетителя, чтобы он зарегистрировался и написал в камментах «ми-ми-ми», то будьте проще. И в первую очередь подумайте, зачем вам вообще эта регистрация сдалась.

2. «один клик по полю с паролем и lastpass генерит мне уникальный пароль необходимой мне сложности и длины и заполняет оба поля»

Да, не надо забывать и о более прошаренных боярах. Значит просто вкладочка «ввесть пароль самому» и вкладочка «создать пароль и прислать».

Регистрация, пароли и одно место (ч.I)

Ну, или вот, скажем, регистрация и авторизация. Что может быть проще. Однако, почему-то все через задницу делают.

Вот, например, форма:

Значительное количество граждан, наконец, поняло, что если есть мыло, то отдельный «логин» в большинстве случаев не требуется. Не все, но значительное количество. Это радует.

Что огорчает:

1. Я должен придумать себе какой-то пароль. Уникальный и сложный. А я не люблю ничего придумывать и мозги напрягать, я лучше уйду с сайта. И потом эти люди удивляются, что половина паролей — «123456».

2. Я должен его куда-то записать. На бумажку или в файлик. Так чтобы всегда его найти. Куда мне его записать? Я опять должен насиловать себе мозг. Ну его в баню.

3. Я должен идти к себе на почту и жать на какую-то ссылку.

Делаем чуть лучше

Просто ввожу своё мыло и мне на него приходит:

«Здравствуйте, Вася! Мы рады приветствовать вас на сайте «Весёлые Шлюшки».
Ваши данные для входа:
e-mail: my@email.loc,
пароль: D32nD38Neu23
Вы всегда можете сменить пароль на свой любимый 123456 в личном кабинете.»

1. Я ничего не придумываю, за меня сами всё придумают. И придумают сложный и уникальный пароль.

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

3. Я его просто запомню в браузере и забуду.

4. Если я авторизовался на сайте по паролю, который мне прислали на почту, то это уже значит, что почта моя. Не нужно никаких ссылок для активации.

Напоминание пароля

Точно также. Не ссылку на ввод нового пароля, который нужно опять запоминать. А «вот ваш новый пароль — F348rNh64, а вот ссылка на его активацию, если это не вы запросили, игнорируйте». Мой новый пароль опять у меня на почте, в любой момент я могу его найти.

Продолжим при следующей встрече.

Symfony — фигимфони

Продолжаю излагать своё глупое и дерзкое имхо. На сей раз речь пойдёт о деяниях богоравного Фабьена, да живёт он вечно.

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

И фреймворки тоже подтягиваются. Прошло время php-нюков и жумл. Теперь php-человек использующий Symfony ощущает себя не говнокодером, но Программистом. Наконец-то, на php-форумах начали появляться фразочки типа «dependency injection», «service container» и другая чертовщина. Наконец-то, на php начали писать расширяемый, повторно используемый и тестируемый код. Symfony — рулит!

Но, воспаде, господа, это же Java! Это же не PHP ни разу.
Ява, конечно, это прекрасный и достойный образец для подражания. Но может нужно знать меру?

Несомненно, Symfony сейчас, это самое продвинутое, что есть в мире Похапе. Все остальные решения сосут у неё по полной. Но ведь и она сама точно также сосёт у Явы. Потому что, это Ява, написанная на Похапе.

Собственно, к чему это. Вот есть, допустим, человек, которому надоело говнокодить на пыхе. Его тянет к трёхэтажным паттернам. Его манят аннотации и огромные xml-конфиги. Он хочет чтобы логика была размазана ровным слоем по десятку пакетов. Чтобы всё наследовалось и расширялось. Он готов потратить немалое количество своего времени на изучение Symfony и связанной с ней инфраструктуры.

Может ему лучше потратить это время на изучение Java и её инфраструктуры? Мне кажется толку будет больше.

Таблица символов Юникода и Зигмунд Фрейд

Одна из новых фич сайта Unicode Table: возможность отредактировать название символа.

Если вам не понравилось то, как мы перевели название, просто щелкните по нему и введите то, которое, как вам кажется, является правильным:

Понятно, что хотя мы вам, несомненно, доверяем, название не изменится сразу же, а отправится к нам на проверку.

Приходящие к нам исправления, как и обычно, делятся на две группы:

1. Полезные.
2. Херня.

Как вы понимаете, в этой статье мы будем рассматривать вторую группу, как самую интересную.
Остальной текст под катом

По страницам:123456789101112131415