Vulpo One


The Sound of Pi

Звучание числа π. Окрасивленное, конечно, но всё равно круто

Примечание

Октябрь 2022: Не помню что за видео тут было, но вот все еще работающие видео на тему

Comments


Шведы шпилят в Доту

Vi sitter här i venten o spelar lite DotA o springer runt o creepar o motståndet vi sleepar.” (Мы сидим в Вентре и играем в Доту…) — слово показалось подозрительно подходящим. Пришлось порыться в интернетах и выяснить, что “шпилить” в значении “играть” идет от немецкого spielen, т.е. это реально одно и то же слово

Comments


Bastion

Неожиданно хорошая инди рпг-ха

Как будто участвуешь в неплохом аниме

Comments



Филипп морит

Думаю, оба эти ролика уже все видели, просто хочется поставить их рядом и сравнить

Баттхёрт обычного человека

Баттхёрт человека с самоиронией и задатками тролля

Кто б мне раньше сказал, что Киркоров может быть круче Макаревича. Не, конечно, Киркорова я слушать не начну, а Макаревича не перестану (ну как не перестану… особо не слушаю), но отношение к ним как к людям неслабо изменилось.

Comments



SPDY и TLS в Apache

SPDY — модная нынче замена протоколу HTTP от Google. Не просто костыль от “корпорации добра”, а поддерживаемый браузерами стандарт и кандидат на включение в HTTP/2.0

Фичи: во-первых, цель — чтобы все ресурсы страницы были отданы за 1 соединение (очень заметно, если на странице подключается много мелких файлов), во-вторых, простота настройки.

Установка в CentOS 6:

  1. качаете и устанавливаете mod-spdy-beta_current_x86_64.rpm (64 бита) или mod-spdy-beta_current_i386.rpm (32 бита)
  2. перезагружаете апачу

всё, у вас SPDY. В nginx тоже должно быть просто, но у меня Apache

Недостатки (а как же без них):

  1. Работает только через SSL (пока)
  2. несовместим с Apache mod_php

Тут в принципе всё решаемо. PHP перенастраивается на работу с FastCGI — и лучше сделать так как можно скорее, т.к. от mod_php много и других проблем, таких как чушь с правами на файлы и требование неоптимальной версии апача — Apache MPM Prefork

С SSL чуть хитрее — многие помнят (а у многих и до сих пор крутится соответствующая древность на серваках) те несладкие времена, когда для поднятия сервака на https:// требовалось каждому хосту раздать по IP-шнику. Так вот, эти времена прошли и можно без нервов сделать веб чуть безопаснее

Надо убедиться что

  1. ваш OpenSSL версии 0.9.8k и старше (и TLS в нем не выключен)
  2. апача собрана с этой версией OpenSSL
  3. установлен mod_ssl

Для CentOS 6 (не 5!) всё собрано соответственно, так что надо просто установить

Всё! У вас сервак с поддержкой SNI, которая позволяет обходить ограничения старых версий SSL

Рекомендуется еще в конфиг Apache добавть такую строку: SSLStrictSNIVHostCheck (on|off)

on закроет доступ старым браузерам, не умеющим работать с SNI (премногоуважаемый всеми IE6, Firefox младше 2.0, Safari младше 3.2.1, Opera младше 8.0, Google Chrome такое с рождения умел), off позволит им заходить, тем не менее, устрашая “неверными” сертификатами. Я подумал чутка и поставил on. Ибо нефиг

SPDY добывать здесь: code.google.com/p/mod-spdy
Инфа про SNI и TLS тут: wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

Comments


Libravatar Replace

Написал свою версию плагина для Libravatar — Libravatar Replace. Точнее, пришлось форкнуть оригинал, т.к. автор упорно молчал на мои попытки связаться. Сначала я добавил все дефолты Либраватара в список, а потом понеслось

Фичи:

  • Плагин полностью заменяет Gravatar на Libravatar в WordPress, включая всё default images (лого только меняется соответствующе)
  • Services_Libravatar содержит мой патч, исправляющий работу с портами в SRV
  • Попытался сделать поддержку BuddyPress (там свой алгоритм генерации изображний-аватаров, причем писец какой запутанный) — вроде работает

Comments


Про утечку ресурсов в генераторах PHP

Очень интересный и полезный момент сегодня всплыл в комментариях на Хабре. В PHP 5.5, как известно, сделали поддержку функций-генераторов, по типу питоновских. Там раньше были итераторы, но с адовым синтаксисом (как всё в SPL), а теперь ввели оператор ‘yield’ и всё волшебным образом упростилось.

Например, можно написать такой генератор, читающий построчно файл:

<?php
function getLines($file) {
    f = fopen($file, 'r');
    while ($line = fgets($f)) {
        yield $line;
    }
    fclose($f);
}

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

<?php
foreach (getLines("file.txt") as $line) {
      echo $line;
}

Удобно? Очень удобно. Оператор ‘yield’ выдаст все строки файла, а потом, когда файл закончится, произойдёт обычный ‘return’ из функции, который закроет генератор (и закончит цикл).

Но как известно, если всё идёт хорошо, значит, вы чего-то не заметили. Немного изменим наш цикл:

<?php
foreach (getLines("file.txt") as $n => $line) {
    if ($n > 5) break;
    echo $line;
}

Предположим, нас интересуют только первые шесть строк файла, а дальше мы хотим прервать цикл оператором ‘break’. Имеем на то полное право. Но что в этом случае произойдёт внутри генератора? А ничего. Он останется стоять на последнем исполненном yield-е и никогда не дойдёт до строки ‘fclose($f)’. И наш файл останется незакрытым.

Мы получили утечку ресурса (открытого файла). Понятно, что внутри генератора могут быть открыты любые ресурсы и объекты, и их необходимо правильно и предсказуемо закрывать. Но как это сделать, если юзер может в любой момент сделать break? Обычная документация (http://www.php.net/manual/en/language.generators.overview.php) никаких намёков не даёт.

Так вот, оказывается (и за это спасибо юзеру weirdan с Хабра: https://habr.com/ru/post/189796/#comment_6594776), что читать в этом случае надо не документацию, а RFC по генераторам: https://wiki.php.net/rfc/generators#closing_a_generator. А в нём сказано, что при освобождении ссылки на генератор, у него внутри обязаны выполниться все блоки ‘finally’. И тогда мы получаем очень простой, красивый и безопасный код:

<?php
function getLines($file) {
    f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

В этом случае блок ‘finally’ выполнится и при нормальном выходе из цикла по генератору и при выходе по break-у. Ура.

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

ru-php.livejournal.com/1566325.html

Comments