среда, октября 13, 2010

Vkontakte Invite Group - обновление

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

javascript:if(!window.invite){var s = document.createElement('script');s.onload = function invite(){setInterval(function(){$('a:contains("Выслать приглашение")').click();}, 500)}; s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';document.body.appendChild(s);}

Обновление 2:
устранен баг с зацикливанием кликов при появлении окна с капчей


javascript:if(!window.invite){var s = document.createElement('script');s.onload = function invite(){setInterval(function(){$('a:contains("Выслать приглашение")').not('.sent').click().addClass('sent');}, 500)}; s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';document.body.appendChild(s);}

php flock

Продолжаю тему блокировки файла в PHP пришёл к такой схеме:

  1. на файл (file) создается замок/файл на запись (wlock) и замок на чтение (rlock);
  2. пред чтением создается жесткая ссылка (rlink) на замок rlock и проверяется количество ссылок на замок wlock == 1, т.е. проверяем на запись, если всё удачно, то читаем файл и в конце удаляем rlink;
  3. перед записью создаем wlink на wlock и считаем количество ссылок wlock == 2 и rlock == 1, т.е. проверяем нет ли записывающих и читающих, если всё успешно, то записываем в файл, а затем удаляем wlink;
Думаю понятен принцип.

сам код:


function get_link_count($fname){
    $fp = fopen($fname, 'r');
    if ($fp) {
        $stat = fstat($fp);
        fclose($fp);
        return $stat['nlink'];
    }
    return false;
}

function custom_flock($fname, $mode = 'r'){
    /* возвращает имя ссылки в случае удачи, иначе false
        @$fname имя файла

        @$mode режим блокировки
        r - на чтение
            или
        w - на запись
        если режим чтения, то смотрим не заблокирован ли файл на запись
        если режим записи, то смотрим не заблокирован ли файл на запись или чтение
    */
    $rlock = '.lock.' . $fname . '.read';
    $wlock = '.lock.' . $fname . '.write';

    
    clearstatcache();
    if (file_exists($fname) and touch($rlock) and touch($wlock)) {

        if ('w' == $mode){
            $link = $wlock . rand() . '.link';
            if (link($wlock, $link)){
                if(get_link_count($wlock) == 2 and get_link_count($rlock) == 1){
                    return $link;
                } else {
                    unlink($link);
                }
            } else {
                unlink($link);
            }
        } else {
            $link = $rlock . rand() . '.link';
            if (link($rlock, $link)){
                if (get_link_count($wlock) == 1){
                    return $link;
                } else {
                    unlink($link);
                }
            } else {
                unlink($link);
            }
        }
    }
    return false;
}

Данная схема не гарантирует целостности файла при падении скрипта, для этого нужно делать журнал для откатки на последнюю версию. Так же нужно автоматически удалять старые ссылки в случае падения скрипта.

код можно скачать здесь
в архиве доступны тесты которые я опробовал на тесте ab в результате тестов целостность файла была сохранена, там 2 теста test_counter.php и test_chain.php. test_chain.php как раз таки и подтверждает целостность файла.

Тест заключается в следующем последовательно пишем в файл 1 или 0 если был последний 0, то запишем 1 и наоборот в конце теста проверяем правильность последовательности 0 и 1 если последовательность правильная, то целостность файла сохраняется.

вторник, октября 12, 2010

Блокировка файла в php

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

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

Вообщем код:


function custom_flock($fname){
    /* возвращает имя ссылки в случае удачи, иначе false */
    $result = false;
    $lock_fname = '.lock.' . $fname;

    if (touch($lock_fname)) {

        $link_fname = $lock_fname . rand() . '.link';
        if (link($lock_fname, $link_fname)) {
            
            $result = $link_fname;
            
            $fp = fopen($lock_fname, 'r');
            $fstat = fstat($fp);
            if ($fstat['nlink'] != 2) {
                $result = false;
                unlink($link_fname);
            }
            fclose($fp);
        }
    }
    return $result;
}


И тест счетчика:


/* простой счетчик */

require_once 'custom_flock.php';

$fname = 'counter.txt';
$link = custom_flock($fname); // делаем блокировку файла
if ($link){ // удачно заблокировали
    $value = file_get_contents($fname);
    print 'value: ' . $value . "\n";
    file_put_contents($fname, 1 + $value);
    unlink($link); // не забываем удалять ссылку
}



Думаю этот вариант вполне рабочий.
скачать код

понедельник, октября 11, 2010

Букмарклет Вконтакте Приглашения в Группу/Bookmarklet Vkontakte Invite Group

Если вы работаете с группами Вконтакте, то вам поможет мой букмарклет "приглашения в группу".
Не для спама, а для облегчения работы.
Пока версия простая, мне хватает, не надо тыкать на ссылку "выслать приглашение" каждому пользователю, а запускаем букмарклет и все, переходим на след. страницу и все повторяем.
Конечно можно автоматизировать все эти действия, но мне че-то лень писать, позже обязательно напишу полностью автоматизированную версию букмарклета.


javascript:function invite(){$('a:contains("%D0%92%D1%8B%D1%81%D0%BB%D0%B0%D1%82%D1%8C %D0%BF%D1%80%D0%B8%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5")').click();} if(!window.jQuery){s = document.createElement('script');s.onload = invite; s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';document.body.appendChild(s);}else{invite();}

Пользуйтесь на здоровье ;)

четверг, октября 07, 2010

Show href - пользовательский скрипт для Google Chrome

По своей инициативе написал для @Puzat пользовательский скрипт (user.js), который показывает что спрятано в атрибуте "href" у тега "A". Для меня это была разминка, да и вспомнить нативный javascript без библиотек и фрейморков нужно было ;)


// ==UserScript==
// @name Show href
// @description Show href показывает, что на самом деле в атрибуте "href" у тега "A"
// @version 0.1.0
// @author Askar (Jungle) Yusupov
// @namespace http://seodiver.ru/
// @match http://*/*
// @match https://*/*
// @run-at document-start
// ==/UserScript==

(function (){
var id = 'show_href';

function findPos(el){
var leftPos = topPos = 0;
do {
leftPos += el.offsetLeft;
topPos += el.offsetTop;
} while (el = el.offsetParent);
return [leftPos, topPos];
}

function show(event){
var a = event.currentTarget;
var tooltip = document.getElementById(id);

if (!tooltip){
tooltip = document.createElement('div');
tooltip.setAttribute('id', id)
document.body.appendChild(tooltip);
}

var pos = findPos(a);
var style = 'background-color: white; font-size: small; position: absolute; border: 1px solid black; padding: 2px; z-index: 999999; ';
style += 'left: ' + pos[0] + 'px; ';
style += 'top: ' + (pos[1] + a.offsetHeight + 3) + 'px; ';

tooltip.setAttribute('style', style);
tooltip.innerText = a.getAttribute('href');
}

function hide(event){
document.getElementById(id).setAttribute('style', 'display: none');
}

var links = document.body.querySelectorAll('a[href]');
for (var i = 0; i < links.length; i++){
var a = links[i];
a.addEventListener('mouseover', show, false);
a.addEventListener('mouseout', hide, false);
}
})()

скачать Show href

update:
Ещё одна версия, только отличается тем, что ссылка добавляется в атрибут title и отображается средствами браузера. Выбирайте ту версию какая вам наиболее удобна.


// ==UserScript==
// @name Show href (in title)
// @description Show href показывает, что на самом деле в атрибуте "href" у тега "A"
// @version 0.1.0
// @author Askar (Jungle) Yusupov
// @namespace http://seodiver.ru/
// @match http://*/*
// @match https://*/*
// @run-at document-start
// ==/UserScript==

(function (){
    var links = document.body.querySelectorAll('a[href]');
    var a, href, title;
    for (var i = 0; i < links.length; i++){
        a = links[i];
        href = a.getAttribute('href');
        if (href) {
            title = a.getAttribute('title') || '';
            a.setAttribute('title', href + (title.length ? '\n' + title : ''));
        }
    }
})()

скачать Show href (in title)

Cash Stats расширение для Google Chrome

Микро анонс. На этой неделе выйдет новая версия бесплатного расширения Cash Stats для отслеживания статистики вашего заработка в партнерский программах. Будет добавлена возможность быстрого добавления новых партнерских программ в несколько кликов мышкой (пользователю не надо знать о CSS селекторах). Будет выпущено расширение под FireFox, а также версия GreaseMonkey (пользователи Opera так же не останутся без внимания ;)
Ну это ещё не всё ;)

А пока пользователи Google Chrome могут установить себе расширение Cash Stats

пятница, апреля 09, 2010

Конвертация шаблона из Blogger в шаблон Zebrum Lite

Представляю скрипт, который переводит шаблон из Blogger в шаблон Zebrum Lite. Т.к. переводить темы из Wordpress в Zebrum Lite довольно сложно мой скрипт мог перевести не все шаблоны, то было решено упростить задачу и был выбран Blogger.

Шаблон Blogger представляет из себя xml файл, который можно легко перевести в шаблон Zebrum Lite.
Скрипт представляет из себя консольную программу написанную на python.
На вход подаем всего 2 параметра - это путь к шаблону Blogger и путь куда сохранить шаблон Zebrum Lite.
~/repo/python/tconv/tconv$ python conv.py /home/jungle/Downloads/blogger_themes/orangy-template/orangy-template.xml /home/jungle/www/zebrum/themes/orangy
Т.к. в Blogger шаблоне в css указанны ссылки на сторонние сервера, то в процессе конвертации будут скачаны эти самые картинки. В конце работы скрипта получаем готовый шаблон, который можно загрузить к себе на сервер.

В config.ini Zebrum'а прописываем следующие настройки:
[rss]
; адрес ленты на этом сайте
rss.feed_url = /feeds/posts/default
[blogger]
blogger.post_date_format = 'Y-m-d'
blogger.post_labels_label = 'метки'

blogger.prev_page_title = 'Назад'
blogger.next_page_title = 'Вперёд'

blogger.timestamp_label = 'опубликованно'

blogger.label_title = 'Метки'

Все шаблон готов к работе!
Скрины:
Click here to view full size


Click here to view full size


Click here to view full size



Click here to view full size


Click here to view full size


Click here to view full size

Как приобрести скрипт нужно отправить 25 WMZ на кошелек Z388891718090 с протекцией на 1-2 суток, с примечанием "Blogger2Zebrum".
Код протекции на почтовый ящик devex.soft@gmail.com
В течении суток высылаю скрипт.
Если же не успею выслать по каким-либо причинам, деньги вам возвратятся назад (используйте протекцию).

UPD: готовые шаблоны результат работы скрипта