среда, октября 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