Хостинг с которым я работаю. Так что это даже как-бы не реклама

Хостинг unihost.com плюс домен бесплатно
Пользовательский поиск

Понравилось? Поделитесь с знакомыми и друзьями!

Gearman + PHP = после обновления не подключается воркеры к серверу

После обновления перестали подключаться воркеры к Gearman. Долго не мог понять в чем причина, ведь и в логах чисто, и в настройках сервера все в порядке. Но в англоязычном сегменте интернета с этим уже сталкивались. Вся проблема заключалась в том что теперь нужно указывать хост и порт для подключения.
То есть было:
$client->addServer();
А стало:
$client->addServer('127.0.0.1',4730);


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

Модификация заголовков(HTTP Headers) в Chrome/Chromium

Заметка в этот раз будет очень короткая.

Иногда стоит задача, как например замена и/или добавление заголовков в передаваемый запрос. К примеру стоит задача написать парсер, который парсит картинку, но картинка отдается сервером только после проверки заголовка Referer.

В этом классно помогает расширение для Chrome/Chromium: Modify Headers for Google Chrome

Работать очень просто, нажимаем плюсик справа вверху. Заполняем появившуюся строчку. Нажимаем стрелочку запуска слева вверху. И теперь во все открываемые страницы.

Вот собственно и все.

Debian GNU\Linux: работа над ошибками

В здоровом теле, здоровый дух. Как-то так и с компьютерами и софтом.

Итак, решил я прошерстить свою систему на предмет возникающих ошибок и разобраться хотя бы с частью из них. Для того чтобы увидеть какие ошибки сыпятся можно смотреть логи, а можно в дополнение ко всему запускать софт из терминала, как то делаю я:
#chromium&


При этом весь поток всякой чепухи будет литься в консоль. Можно сделать перенаправление вывода в файл в виде:
#chromium >/tmp/chomium.log&


Смотрим.

Ошибка 1.

Fontconfig error: Cannot load default config file


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)


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

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;
    }
Вот и весь код.

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

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

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

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

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

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

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

Актуальная ныне проблема, переходы с совсем левых сайтов, которые в аналитиках портят все отчеты. И так как проблема актуальная, решение нашлось действительно быстро. Блокируем трафик на уровне 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;
}

Установка 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 который говорит что все в порядке.
Все.

Небольшой 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


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

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

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

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


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

Подружить 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
Все вроде. Это позволяет подружить приложения между собой.

Перестраиваем 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;

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 ####:###::##...

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

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

Верстка под 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 отображаемом для выбранного устройства. Выглядит это так:


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

Для тех кто столкнулся с невозможностью установки 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.

Вот и все.

Страницы

Subscribe to Nelex.in.ua RSS