среда, октября 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: готовые шаблоны результат работы скрипта

суббота, февраля 06, 2010

Я стал ДЯДЕЙ!

Ура!!!
Мальчик - рост 52 см, вес 3 кг.
:)))))))))))

среда, февраля 03, 2010

Набираю тестеров. (адаптер тем wordpress > zebrum lite)

Набираю тестеров. Цена для тестеров 25 WMZ.
Что получат тестеры сам скрипт и доступ к сервесу (в разработке).
Про сервис в двух словах: сервис предоставляет адаптацию + конвертацию тем, не буду сейчас говорить более подробно, о сервисе чуть позже расскажу.

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

Что жду от тестеров, собственно тестирование и сообщения о багах.


Ещё скриншот:


пятница, января 29, 2010

Адаптер Wordpress'ких тем под Zebrum Lite

Скриншоты тем WordPress работающие под Zebrum'ом
Скриншоты тем WordPress работающие под Zebrum'ом
Допиливаю адаптер тем, который позволяет адаптировать темы wordpress'а под Zebrum Lite.
Не путать с конвертацией тем! Адаптация тем не изменяет wordpress'кую тему, а лишь дополняет её, т.е. происходит эмуляция API тем.

Конечно же не со всеми wordpress'кими темами будет работать адаптер, это касается в первую очередь тех тем, которые не использют API тем wordpress'а и темы работающие на API до 2 версии (пока не поддерживает).

Как адаптировать тему? Очень легко! Нужно скачать вордпрессовскую тему распаковать и запустить в консоли адаптер:
jungle@jungle-desktop:~/repo/php/theme_adapter$ php utils.php test/girl test/zebrum/themes
где utils.php - есть адаптер, далее следует папка с вордпрессовской темой test/girl, а за ней папка тем зебрума test/zebrum/themes.

В результате остается в конфиге прописать новую тему и всё!

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

Suggestion parser

Suggestion parser - это консольный парсер (написан на питоне) для выборки поисковых фраз\слов. На входе подается ключевое слово, а на выходе получаете файл с ключевыми словами. На данный момент парсятся данные с:
  1. Google
  2. Youtube
  3. Yandex
  4. Yahoo
  5. Amazon
Можно установить задержку между запросами.

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