Сообщение об ошибке

  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
test

Debian GNU\Linux 8 + broadcom wi-fi + ядро 3.18

С каждым годом мои заметки про Wi-Fi под линуксом становятся все короче. И вот вам очередная.
Решил я собрать ядро Zen-Kernel 3.18 себе, прошлое 3.15 было. И не велико дело собрать сейчас ядро, вопрос с дровами на wi-fi. Попробовал собрать из исходников под 3.15 что были, патчи накладывал, качал более свежую версию дров, но все никак Wi-Fi не заводился. Работать нужно, забил на пару недель. И вот снова...
В итоге все очень просто оказалось.

Дрова Broadcom разбиты по разным пакетам в Debian репозитории.
К примеру BCM43 поддерживает чипсеты: BCM4301, BCM4306, BCM4311, BCM4312, BCM4318, BCM4321 and BCM4322
Мой же чипсет в пакете brcm80211: BCM4313,BCM43224,BCM43225 Установка описана прямо на странице. Единственное что оставалось сделать, переинициализировать модуль с дровами в системе, именно из-за этого и не завелся wi-fi сразу, не смотря на то что пакет сам у меня стоял и дрова подхватились, но устройство в iwconfig -a так и не появлялось. Итак, заветные строчки:
modprobe -r brcmsmac
modprobe brcmsmac


Теперь iwconfig -a показывает:
-a        No such device


А нифига он нормально не показывает. Показывает что нет устройства. Но это уже после подключения к точке доступа, до этого показало мое устройство :-D . Сеть появилась, а это главное, по принципу занятого Zen-линуксоида, остальное пока меня мало волнует. Работает - не трогай. Пока не поломалось.

К слову сказать, зато ifconfig -a выдает наш wlan0:
wlan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx 
          inet addr:192.168.1.105  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: xxxx:xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:134 errors:0 dropped:0 overruns:0 frame:0
          TX packets:167 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:50
          RX bytes:26716 (26.0 KiB)  TX bytes:39745 (38.8 KiB)


Ну в общем-то на этом все. Можно вписать куда-нибудь в автозагрузку заветные строки по переинициализации модуля и забить пока работает. До след. компиляции ядра.
test

Gearadmin + PHP: получение списка задач, количества воркеров, количества задач на выполнении

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

function action_index()
    {
        $info = shell_exec('gearadmin --status');
        $count = explode(chr(10),$info);
        $tasks = array();
        foreach ($count as $row){
            $record = explode("\t",$row);
            if (count($record)>3){
                $tasks[$record[0]] = array(
                    'name'=>$record[0],
                    'queue'=>$record[1],
                    'running'=>$record[2],
                    'workers'=>$record[3],
                );
            }

        }
        return $tasks;
    }
Вот и весь код.
test

DBF в MySQL: Как я конвертировал ФИАС.

Добрый день, уважаемый читатель!

Вот, как всегда мне достаются весьма увлекательные задачи. В этот раз нужна была база улиц Челябинска и Казани. Те кто с подобным сталкиваются наверняка слышали о КЛАДР-е. Это такой себе список городов, улиц и т.д. Но он к 2011 году успел устареть морально и в плане разработки его забросили. К слову, тот же самый разработчик решил начать с чистого листа и в 2011г, и по текущее время разрабатывает базу ФИАС. База большая, архив 2ГБ, в распаковке около 10Гб. И вот я решил загнать всю эту базу в MySQL. Заодно скилы подтянуть. В дополнение ко всему единственный нормальный конвертер dbf2mysql для линукса поддерживает кодировку только latin1.

Выкладывают эту базу на сайте Федеральной Налоговой Службы(ФНС)
Выкладывают ее там в формате DBF и XML. Мы будем работать с DBF.

Итого, имеем платформу Debian GNU\Linux на 8-ядерном сервере, 12Гб ОЗУ и базу данных разбитую файликами на 10Гб в формате DBF.

Сам скрипт конвертации вышел таким вот:
test

Реферальный спам

Актуальная ныне проблема, переходы с совсем левых сайтов, которые в аналитиках портят все отчеты. И так как проблема актуальная, решение нашлось действительно быстро. Блокируем трафик на уровне nginx:

В секцию http добавляем:
map $http_referer $bad_referer {
    hostnames;
    default                         0;
    .semalt.com                     1;
    .kambasoft.com                  1;
    .savetubevideo.com              1;
    .descargar-musica-gratis.net    1;
    .7makemoneyonline.com           1;
    .baixar-musicas-gratis.com      1;
    .iloveitaly.com                 1;
    .iloveitaly.co                  1;
    .fbdownloader.com               1;
    .econom.co                      1;
    .buttons-for-website.com        1;
    .srecorder.co                   1;
    .darodar.com                    1;
    .priceg.com                     1;
    .blackhatworth.com              1;
    .adviceforum.info               1;
}

А в секцию server для нужных сайтов добавляем:
if ($bad_referer) {
    return 444;
}
test

Установка Su для Android(из Debian GNU\Linux)

В целом по интернету как не почитаешь, так получить доступ к руту под андроидом целая сказка. Но вся эта сказка сводиться всего к нескольким командам, которые выполняются на свой страх и риск.
  1. Держим на заметке подсказки что и какая команда делает.
  2. Ставим ADB - утилиту для низкоуровнего управления телефоном.
    Я ставил прямо из дистрибутива командой:
    apt-get install android-tools-adb android-tools-fastboot android-tools-fsutils
  3. Подключаем телефон
  4. Коннектимся к его консоли командой: adb shell
  5. Находим наш системный раздел командой: # mount | grep system
  6. Переподключаем его с правами на чтение-запись(было ведь только чтение):
    mount -o rw,remount -t ext4 /system
  7. Так как файл su у меня уже есть в системе, я просто создаю на него симлинк:
    ln -s /system/xbin/su /system/bin/su
  8. И назначаю права
    chmod 6755 /system/xbin/su
  9. Возвращаю доступ только на чтение файловой системе:
    mount -o ro,remount -t ext4 /system

Дальше на телефоне запускаю SuperSu который говорит что все в порядке.
Все.
test

Небольшой TuneUp производительности Linux

Уменьшаем интенсивность логирования

В дистрибутиве, при установке по умолчанию, логирование включено очень детально. Но если это не сервер то логировать столь детально и интенсивно возможно не нужно. По этому можно отключить отпределенное логирование закомментировав ненужные строки в конфигурационном файле /etc/rsyslog.conf:
auth,authpriv.*                        /var/log/auth.log
*.*;auth,authpriv.none         -/var/log/syslog
cron.*                         /var/log/cron.log
daemon.*                       -/var/log/daemon.log
kern.*                         -/var/log/kern.log
lpr.*                          -/var/log/lpr.log
mail.*                         -/var/log/mail.log
user.*                         -/var/log/user.log

Тут так же могут быть правила для -/var/log/debug и -/var/log/messages, так же |/dev/xconsole.
Сообщения ядра ведутся в два лога kern.log и syslog. Комментируем устанавливая символ '#' в начале соответствующей строки. При надобности точно так же включаются логи при наличии проблем в системе.

Оптимизируем кеш директорий

Приложения, такие как браузер и менеджер окон, которые используют дисковый кеш, могут соответствовать спецификации стандарта XDG Base Directory Specification. В этом случае, переменная окружения XDG_CACHE_HOME указывает директорию в которой сохраняются файлы кеша. Поместив кеш в память(ramdisk) можно сильно ускорить производительность таких приложений, в противном случае браузер и другие приложения, не поддерживающие стандарт, так и продолжат использовать тяжелый для записи дисковый кеш. Для примера, установленный в Debian Wheezy LXDE, может хранить настройки в файле /etc/alternatives/x-session-manager. При добавлении строки
export XDG_CACHE_HOME="/dev/shm/.cache"
в начале этого файла, программы запущенные из X, поддерживающие стандарт, будут использовать ramdisk в /dev/shm для хранения кеша.

В большинстве дистрибутивах основанных на Debian, tmpfs устройство находиться по пути /run/shm (должно присутствовать в /etc/fstab), и x-session-manager как бинарный файл, но вы так же можете добавить ту же строку в новый файл, в директории /etc/profile.d/, например /etc/profile.d/xdg_cache_home.sh, который будет выполняться при каждом входе в систему. Содержимое файла:
#!/bin/bash
export XDG_CACHE_HOME="/dev/shm/.cache


Используем tmpfs

Для монтирования /tmp и /var/tmp (эти директории часто используются для хранения временных файлов многих программ) в памяти(ramdisk), вам нужно добавить следующие строки в /etc/fstab:
tmpfs    /tmp        tmpfs    defaults    0 0
tmpfs    /var/tmp    tmpfs    defaults    0 0
Так же нужно добавить строку, если ее нету для /dev/shm как tmpfs:

tmpfs    /dev/shm    tmpfs    defaults    0 0


Взято отсюда.
test

Ion.RangeSlider баг с шкалой

ion.RangeSlider Слайдер Ion.RangeSlider мне очень нравиться, работать удобно, гибкость большая. Но есть в нем один неприятный баг(может и больше, но мне попался именно этот). А именно, если слайдер инициализируеться в не отображаемом блоке, то его ширина сбрасывается и значение каждого значения шкалы будет left:-1;

Исправляется это легко. Просто при отображении скрытого блока, в котором у нас и находиться один или несколько слайдеров, вызываем функцию update, даже без параметров. Выглядит это так:
$(".ionrange").ionRangeSlider("update");


Сам баг уже описан и там же отвечен.
test

Подружить PulseAudio + Skype + MOCp + другие

skype
Когда у кого не было проблем с PulseAudio? Все они решабельные в основном, но их хватает. И вот после обновления скайпа сейчас без пульсаудио никак не обойтись, но возникает множество проблем. Например звук в Skype не работает когда работает MOCp. Или другие приложения которые используют звук. Решение не новое, но мало ли, может кто еще не видел.

Здесь подсказано отличное решение. Это запуск приложения с параметром к PulseAudio.
Редактируем ярлык добавив параметр PULSE_LATENCY_MSEC=30 перед самым запускаемым файлом.
[Desktop Entry]
Name=Skype
Comment=Skype Internet Telephony
Exec=PULSE_LATENCY_MSEC=30 skype %U
Icon=skype.png
Terminal=false
Type=Application
Encoding=UTF-8
Categories=Network;Application;
MimeType=x-scheme-handler/skype;
X-KDE-Protocols=skype


Ну или если с консоли запускаем то просто пишем команду:
PULSE_LATENCY_MSEC=30 skype&
Ну или тот же MOCP:
PULSE_LATENCY_MSEC=30 mocp
Все вроде. Это позволяет подружить приложения между собой.
test

Перестраиваем Nested Sets в PrestaShop SQL запросом

Добрый человек описал алгоритм и функцию перестройки левого и правого индексов для Nested Sets.
Статья на хабре
Код на SQL Fiddle

Происходит восстановление индексов для значения по id_parent

Для PrestaShop этот код выглядит так:
-- По умолчанию у индексов значение 0, сменим на NULL
alter table pref_category modify nleft int unsigned default null;
alter table pref_category modify nright int unsigned default null;

DELIMITER //

-- Создаём ту самую функцию
DROP FUNCTION IF EXISTS rebuild_nested_set_tree//
CREATE FUNCTION rebuild_nested_set_tree()
RETURNS INT DETERMINISTIC MODIFIES SQL DATA
BEGIN
-- Изначально сбрасываем все границы в NULL
UPDATE pref_category t SET nleft = NULL, nright = NULL;

-- Устанавливаем границы корневым элементам
SET @i := 0;
UPDATE pref_category t SET nleft = (@i := @i + 1), nright = (@i := @i + 1)
WHERE t.id_parent = 0;

forever: LOOP
-- Находим элемент с минимальной правой границей -- самый левый в дереве
SET @id_parent := NULL;
SELECT t.id_category, t.nright FROM pref_category t, pref_category tc
WHERE t.id_category = tc.id_parent AND tc.nleft IS NULL AND t.nright IS NOT NULL
ORDER BY t.nright LIMIT 1 INTO @id_parent, @parent_right;

-- Выходим из бесконечности, когда у нас уже нет незаполненных элементов
IF @id_parent IS NULL THEN LEAVE forever; END IF;

-- Сохраняем левую границу текущего ряда
SET @current_left := @parent_right;

-- Вычисляем максимальную правую границу текущего ряда
SELECT @current_left + COUNT(*) * 2 FROM pref_category
WHERE id_parent = @id_parent INTO @parent_right;

-- Вычисляем длину текущего ряда
SET @current_length := @parent_right - @current_left;

-- Обновляем правые границы всех элементов, которые правее
UPDATE pref_category t SET nright = nright + @current_length
WHERE nright >= @current_left ORDER BY nright;

-- Обновляем левые границы всех элементов, которые правее
UPDATE pref_category t SET nleft = nleft + @current_length
WHERE nleft > @current_left ORDER BY nleft;

-- И только сейчас обновляем границы текущего ряда
SET @i := (@current_left - 1);
UPDATE pref_category t SET nleft = (@i := @i + 1), nright = (@i := @i + 1)
WHERE id_parent = @id_parent ORDER BY id_category;
END LOOP;

-- Возвращаем самый самую правую границу для дальнейшего использования
RETURN (SELECT MAX(nright) FROM pref_category t);
END//

DELIMITER ;


Запускаем переиндексацию:
SELECT rebuild_nested_set_tree();


Вот и все, дерево переиндексировано. Вернем на место значения по умолчанию для индексов, так как с null индексы не работают, их и не должно быть:
alter table pref_category modify nleft int unsigned default 0;
alter table pref_category modify nright int unsigned default 0;
test

C++ Отправка писем через Защищенное соединение SSL SMTP Yandex с использованием libcurl

cURL
Ну вот, добрался я таки до своего любимого C++. Разное использовал: PHP, JS, JQuery, C#, Asterisk и прочее с ними взятое. Все это в большей степени под Debian GNU\Linux. Но больше всего люблю именно C++. И вот стала задача, переписать воркеры(самостоятельные демоны для сайта), которые висят в фоне в определенном количестве, получают задачу от Gearman и выполняют ее. Вот один из них просто отправляет почту. Используем для этих целей smtp Yandex.ru. Все удобно и стабильно. До этого роль воркера выполняли PHP+Swiftmailer, но PHP не язык для подобных целей. Итак, хватит введения.
Можно подключаться через 25-й порт на smtp:://smtp.yandex.ru:25, но много провайдеров которые блокируют 25 порт и тем самым вы увидите сообщение:
Immediate connect fail for ####:###::##: Network is unreachable Trying ####:###::##...

По этому же поводу я общался со своим провайдером.

Комментариев особо не будет. Все достаточно просто. Сам код я взял отсюда, попутно поправив пару моментов.
Итак, сам код:
test

Верстка под Android с помощью смартфона и Developers Tools

Всем кто занимается версткой под андроид не хватает Developer Tools в Chrome на смартфонах и планшетах Android. Но не каждый знает что можно с компьютера использовать Developer Tools для подключенного к нему планшету/смартфону. А делается все очень просто.
  1. Подключаете через USB устройство
  2. Подключаемое устройство выведет меню и в нем мы разрешаем отладку (Отладка по USB | "Enable USB debugging on your Android device")
  3. На компьютере в Chrome/Chromium в строке для URL вводим chrome://inspect и жмем Enter.
  4. На вкладке Devices Включаем Discover USB devices
  5. В списке появятся подключенные к компьютеру устройство
  6. Под нужным устройством нажимаем inspect
После этой последовательности действий Chrome/Chromium создаст новое окно в Developer Tools отображаемом для выбранного устройства. Выглядит это так:


Более подробно можно глянуть здесь.
test

Для тех кто столкнулся с невозможностью установки Adobe Flash Player под Chromium(Chrome) в Linux

Обновился до Chromium "Версия 35.0.1916.114 Debian jessie/sid (270117)".
Как итог, отсутствие Adobe Flash Player. Не долго гуглив оказалось что уже создан пакет PepperFlashPlayer который поддерживается Google-м. Достал Adobe, наверное это у него такой маркетинговый ход, заявлять о себе путем багов и отсутсвия плеера в браузерах.
В общем, пакет присутствует в Non-free, так что в /etc/apt/source.list не забудьте дописать "non-free" в строке репозитория.
После этого
# apt-get update
# apt-get install pepperflashplugin-nonfree

Перезапускаем браузер и в адресной строке браузера вводим chrome://plugins. Там должен был появиться Adobe Flash Player.

Вот и все.
test

Создаем темы для Chromium v34+(aka Google Chrome)

Бывает так что существующие темы уже попросту допекли. Хочется создать свою тему. А иногда просто хочется разгрузить мозги и сделать что-то простое и приятное. Чем и займемся. Сильно с темизацией конечно не разгонишься, но кое-что приятное сделать можно. Если что-то будет непонятным, есть официальный гайд по созданию темы для браузера хром. Немного анатомии тем для хромиума/хрома.

Картинки

Используется 5 картинок: 1) Фрейм темы – Картинка отображается как рамка для кнопок "Закрыть", "Развернуть", "Свернуть". Если вы решите их не использовать(не добавите в свою тему), браузер будет использовать картинки с дефолтной темы. Требование к картинкам: Минимальная высота: 30px. Нет ограничений по ширине. Панелька(toolbar) – Фоновая картинка для кнопок "Назад", "Вперед", "Обновить" и всего этого ряда кнопок. Требования: Минимальная высота: 120px. Нет ограничений по ширине. Бекграунд для вкладок(табов) – Картинка используется для неактивных вкладок, когда открыто несколько вкладок. Требования: Минимальная высота: 65px. Бекграунд для вкладки "Добавить новую" – Эта картинка отображается в основной части окна для вновь созданной вкладки. Минимальный рекомендуемый размер 800x600, но любая картинка будет масштабирована под разрешение. Атрибуты темы – Картинка отображаемая в правом нижнем углу любой темы для Хрома.
test

Используем Gearman(менеджер очередей) в Kohana 3 или любом другом PHP сайте

Gearman stack

Что такое Gearman?

Введение весьма неплохо описано тут
Если вкратце то Gearman это менеджер очередей состоящий из трех компонентов:
  • сервер задач — является центральной частью Gearman, именно сюда будут приходить задачи и результаты от клиентов и исполнителей, и именно отсюда будут высылаться задания и результаты, исполнителям и клиентам соответственно.
  • исполнитель — является основной частью, где необходима реализация какой-либо функциональности. Исполнитель принимает и пытается выполнить задание от сервера.
  • клиент — также имплементируется отдельно, создаёт и отсылает задачу на сервер и, в некоторых случаях (о них — позже), получает результат.
Картинка в топе поста показывает алгоритм работы с Gearman-ом.

Кратко от авторов Gearman

  • Open Source и BSD лицензия.
  • Мультиязычность - Большой список поддерживаемых языков.
  • Гибкость - Вы не ограничены какими-либо паттернами проектирования.
  • Скорость - Gearman работает на простом протоколе и с оптимизированным интерфейсом, потоками. Сервер написан на C/C++ для минимизации оверхедов.
  • Встраеваемый - быстры и легкий, удобен для любых масштабов приложений. Так же легко внедряется в существующие приложения с минимальным оверхедом.
  • Нет единой точки отказа - Gearman помогает не только в масштабировании систем, но и в повышении отказоустойчивости.
  • Нет ограничений на размер сообщения - Gearman поддерживает размер каждого сообщения до 4Гб в размере. Нужно больше? Не проблема, Gearman может делить сообщения на части.
  • Обеспокоены масштабированием? - Не стоит. Craig’s List, Tumblr, Yelp, Etsy,… откройте для себя то о чем они уже знают годами.
Пример, прекрасно иллюстрирующий для чего он нужен так же описан был на хабре весьма точно:
Пользователь закачал фотографию на сайт, и хочет показать её всем своим друзьям. Необходимо быстро подготовить различные размеры данной фотографии, для использования по всему сайту. Да, до определённого момента все работы по генерации графики можно проводить в основном коде системы, а потом придёт хабраэффект, и вся система рухнет под наплывом желающих. Теперь рассмотрим как эту задачу можно решить с использованием Gearman — при получении фотографии, мы создаём задачу для gearman сервера, в которую входит необходимая информация о фотографии (в принципе возможно включить в задачу даже саму фотографию, но, мне кажется, это будет накладно, лучше использовать адрес) и отправляем её на выполнение. Сервер задач выбирает (round robin) свободного исполнителя (как Вы наверное уже догадались, исполнителей может быть несколько) и отсылает задачу на выполнение. Исполнитель получает всю необходимую информацию, обрабатывает её как нам бы этого и хотелось — и отправляет ответ об успешно выполненной задаче и, если задача была синхронная, результат работы.
Врапперов к языкам для работы с Gearman достаточно много, так что все основные языки будут иметь возможность взаимодействовать с ним, среди них perl, php, python, java, C и другие. Сервер имеет возможность сохранять очередь задач в какое-либо хранилище, чтобы при рестарте была возможность восстановить весь процесс без потери данных. Хранилищем может выступать MySQL/drizzle, memcached, PostgreSQL или sqllite. Основной обьект над которым происходит вся работа в системе - Задача(Task), имеющая параметры. Идентифицируются задачи по ключу Название/Параметры. При полном совпадении ключей двух задач, будет выполнена только одна, остальные идентичные ей будут отброшены.

Установка

apt-get install gearman gearman-server gearman-job-server gearman-tools  php5-gearman
test

Выбор между альтернативными версиями приложений/библиотек в Debian/Ubuntu Linux

В Debian-based системах бывают по несколько версий приложений одного и того же типа. К примеру может быть установлено несколько текстовых редакторов. Если вы хотите выбрать приложение по умолчанию то команда update-alternatives вам пригодиться. Запустите команду и получите список альтернатив для выбора. Я покажу пару команд для выбора приложения по умолчанию.

Страницы

Subscribe to Nelex.in.ua RSS