Блог пользователя Nelex

test

Сравнение производительности: XMLHttpRequest с jQuery get и post,

На любопытную страничку наткнулся на просторах интернета. А искал я сравнение производительности XMLHttpRequest с jQuery get и post. И в общем-то на страничке можно провести сразу тест для конкретной своего браузера и посмотреть результаты других.

И получилось у меня что xhr3 всех быстрее, ну и раза в два быстрее jQuery методов. Оно в принципе и не удивило бы ни кого, скорее удивило бы обратное. Но все же интереснее смотреть на цифры.

P.S. К сожалению время от времени сайт не доступен, хотел картинку сюда вставить, но увы. Пробуйте, время от времени он все же работает.
test

Сниппет SizeOf для JavaScript( получение размера переменной)

Функции SizeOf для JavaScript нету, но зная типы данных и их размер, можно такую написать самостоятельно. А так как мы люди ленивые, то просто посмотрим гугл и найдем подходящий:

function roughSizeOfObject( object ) {
    var objectList = [];
    var recurse = function( value ) {
        var bytes = 0;

        if ( typeof value === 'boolean' ) {
            bytes = 4;
        } else if ( typeof value === 'string' ) {
            bytes = value.length * 2;
        } else if ( typeof value === 'number' ) {
            bytes = 8;
        } else if (typeof value === 'object'
                 && objectList.indexOf( value ) === -1) {
            objectList[ objectList.length ] = value;
            for( i in value ) {
                bytes+= 8; // assumed existence overhead
                bytes+= recurse( value[i] )
            }
        }
        return bytes;
    }
    return recurse( object );
}
test

Оптимизация InnoDB таблиц



Проработавшая база данных, некоторый период времени, не исключая, а по некоторым данным и утверждая что InnoDB тем более, фрагментируется, и начинает работать медленно. Требуется оптимизация. Скрипт найденный на stackoverflow.com, проверен на личном опыте.
Делайте Backup, не надейтесь на то что повезет, 1 раз если не повезет, будет хуже чем если 100 раз повезет

Создаем файлик optimizedb.sql
set @a=null,@c=null,@b=concat("show tables where",ifnull(concat(" `Tables_in_",database(),"` like '",@c,"' and"),'')," (@a:=concat_ws(',',@a,`Tables_in_",database(),"`))");

Prepare `bd` from @b;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;

set @a:=concat('optimize table ',@a);
PREPARE `sql` FROM @a;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;

set @a=null,@b=null,@c=null;


Ну и скармливаем его нужной базе данных:
mysql -p mydb < ./optimizedb.sql


Дальше ждем результат. После окончания скрипт выведет результаты и завершиться.
test

Yandex Карта на сайте

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

Так вот, Яндекс.карты это не сложно. Есть два вида геокодирования, прямое и обратное. В одном случае мы получаем по текстовому адресу координаты на карте, во втором - по координатам получаем текстовый адрес. Вариантов размещения точек на карте API карт тоже имеет не один.

Небольшое отступление: Для себя я использую фреймворк Kohana 3, но в общем, это не вносит практически никаких корректив в код. Использую ORM, но не думаю что для кого-то будет сложность заменить $object->title на $row['title']. Главная же цель, показать что все не так сложно как кажется. Еще что следует учесть, что мы используем координаты заранее сохраненные в базе. Для этого в конце статьи есть ссылка к Yandex API, по которой можно получать координаты. Лучше всего один раз спросить API карт и сохранить результат у себя, чем лишними запросами дергать их API

Остальное внутри

test

Работа над ошибками 2 или неприятности линуксоидов

Pre: Тем кто столкнется с подобным...


Внутри:
  • Загрузка в частично слетевший Grub2 и его восстановление
  • wicd не подключается к Wi-Fi роутеру
  • W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168h-1.fw for module r8169
  • Нет Awesome в GDM
  • Awesome WM не применяются настройки из ~/.config/awesome/
test

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

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


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

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

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

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

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

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

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

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

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

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


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


Смотрим.

Ошибка 1.

Fontconfig error: Cannot load default config file


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");


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

Страницы

Subscribe to RSS - Блог пользователя Nelex