воскресенье, 30 октября 2011 г.

Геолокация и геотаргетинг. php и не только

Для определения страны и города по ip есть замечательный сервис ipgeobase.ru. Правда города он может определять только по России, Украине и .. в общем ближнее зарубежье, а вот Америка и т.д. только название страны. Но он бесплатный =).

Сервис расположен по адресу http://ipgeobase.ru:7020/geo?ip=1.2.3.4

 Т.е. делаем

$xml = simplexml_load_file('http://ipgeobase.ru:7020/geo?ip='.$_SERVER['REMOTE_ADDR']);

и наслаждаемся жизнью. в переменной $xml данные о городе и о стране. Если ip нет в их базе, то естественно ответ тоже будет пустым.

четверг, 27 октября 2011 г.

php Функция для работы с xml

simplexml_load_file

Пример:

 $xml = simplexml_load_file('http://somehost.com/some.xml');

Возвращает объект, в котором в массиве перечислены вложенные объекты. К атрибутам можно обратится тоже через массив.

Если xml уже есть в какой то текстовой переменной, то

$xml = simplexml_load_string($string);


Для того, что бы добраться до значений в @attributes в возвращаемом объекте, нужно использовать

$fieldName = (string)$xmlObject->attributes()->fieldName

среда, 19 октября 2011 г.

Перенаправление. php javascript

Элементарщина, но постоянно забываю. Перенаправление

php:    Header('Location: http://yandex.ru/');

javascript:    window.location.href = "http://www.scriptsite.ru"

среда, 5 октября 2011 г.

Подключение нестандартного шрифта css

Надо скормить сайту http://www.fontsquirrel.com/fontface/generator шрифт, после чего скопировать на сайт сгенерённые файлики и прописать в css стили, которые отдаст сайт. После чего можно использовать шрифт как обычный.

вторник, 27 сентября 2011 г.

Получить первую пару ключ=>значение. php

Понадобилось получить первую пару ключ=>значение из массива со строковыми ключами.

array_shift мне не подошел, так как он вырезает из массива пару ключ=>значение и ключ теряется.

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

function get_first_element($arr)
{
    foreach ($arr as $value)
    {
        return $value;
    }
}


поискал еще и нашел кое-что получше:

function get_first_element($arr)
{
    $ret=each($arr);
    return $ret['value'];
}

понедельник, 26 сентября 2011 г.

Как определить день недели по дате. php

Понадобилось определить день недели по дате. Яндекс по запросу понаходил кучу каких то полувелосипедных функций. Но если посмотреть чуть повнимательнее, то все оказывается просто. У php есть мегафункция JDDayOfWeek().

Пример использования:

$date='02.14.2012';
$day_of_week=JDDayOfWeek($date,1);

Поправка  JDDayOfWeek дает день недели по юлианскому календарю

для определения номера недели по григорианскому календарю надо использовать

JDDayOfWeek(cal_to_jd(CAL_GREGORIAN, '02', '14', '2012'),1);

Пример:

$day_of_week=JDDayOfWeek(cal_to_jd(CAL_GREGORIAN, '02', '14', '2012'),1);
echo $day_of_week;


Или функцию  date('w') . На мой взгляд самый простой способ

Пример:

echo date('w',strtotime('14.02.2012'));

вторник, 30 августа 2011 г.

Скругление углов картинки средствами php

function AoElipse($AoEKey, $width=40, $height=40)
{
    /*
      $width - ширина картинки
      $height - высота картинки

      коды углов:
      1 - левый верхний
      2 - правый верхний
      3 - правый нижний
      4 - левый нижний
     */

    //создаем картинку

    $img = imageCreate($width, $height); //создаем картинку
    $white = imageColorAllocate($img, 255, 255, 255); //определяем белый цвет
    //imageFill($img, 1, 1, $white);//закрашиваем картинку белым цветом
    //нарисуем элипс

    switch ($AoEKey)
    {
        case 1: $s = 180;
            $e = 270;
            $x = $width - 1;
            $y = $height;
            break;

        case 2: $s = 270;
            $e = 0;
            $x = -1;
            $y = $height;
            break;

        case 3: $s = 0;
            $e = 90;
            $x = -1;
            $y = 0;
            break;

        case 4: $s = 90;
            $e = 180;
            $x = $width - 1;
            $y = 0;
            break;
    }
    // $s - начальный угол в градусах
    // $e - конечный угол в градусах
    // $x - координата X описываемого прямоугольника
    // $y - координата Y описываемого прямоугольника
    $w = $width * 2; //ширина описываемого прямоугольника
    $h = $height * 2; //высота описываемого прямоугольника
    $black = imageColorAllocate($img, 0, 0, 0); //определим цвет линии элипса
    imageArc($img, $x, $y, $w, $h, $s, $e, $black); //рисуем элипс
    imageFill($img, $width / 2, $height / 2, $black); //закрашиваем элипс

    imageColorTransparent($img, $black); //сделаем прозрачным черный цвет

    return $img; //возвращаем картинку
}

function MElipse($img, $Ew=40, $Eh=40)
{
    $width = imageSX($img);
    $height = imageSY($img);

    $imgE = AoElipse(1, $Ew, $Eh);
    imageCopyResized($img, $imgE, 0, 0, 0, 0, $Ew, $Eh, $Ew, $Eh);
    $imgE = AoElipse(2, $Ew, $Eh);
    imageCopyResized($img, $imgE, $width - $Ew, 0, 0, 0, $Ew, $Eh, $Ew, $Eh);
    $imgE = AoElipse(3, $Ew, $Eh);
    imageCopyResized($img, $imgE, $width - $Ew, $height - $Eh, 0, 0, $Ew, $Eh, $Ew, $Eh);
    $imgE = AoElipse(4, $Ew, $Eh);
    imageCopyResized($img, $imgE, 0, $height - $Eh, 0, 0, $Ew, $Eh, $Ew, $Eh);

    return $img;
}

//пример использования:
//
//$img=ImageCreatefromJpeg($img_path);
//$img=MElipse($img,5,5);
//
//imagejpeg($img, $img_path);

вторник, 23 августа 2011 г.

Конвертация базы MySQL в cp1251

Если надо конвертировать табличку в cp1251  (ну или в что ни будь еще) надо сначала привести ее к бинарному типу, а затем в ну нужную кодировку.


ALTER TABLE my_table CHANGE `my_field` `my_field` mediumtext CHARACTER SET BINARY NOT NULL;

привели к бинарному типу

ALTER TABLE my_table CHANGE `my_field` `my_field` mediumtext CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL

выставили кодировку

ALTER TABLE my_table DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
выставили сравнение

=)

Симметричное шифрование для php (python)

Переписал функцию на питоне. Планирую использовать ее на google app engine. Пришлось несколько изменить алгоритм. deflate заменил на compress.

сама функция xor:

    def xor_it(str,key):
        code=''
        y=0

        for i in xrange(0, len(str)):
            if y==len(key): y=0
            code+=chr(ord(str[i:i+1])^ord(key[y:y+1]))
            y+=1
        return code


функция шифрования скрипта:

# -*- coding: utf-8 -*-
def add_armor(code,cookie_name,cookie_key):
    def xor_it(str,key):
        code=''
        y=0

        for i in xrange(0, len(str)):
            if y==len(key): y=0
            code+=chr(ord(str[i:i+1])^ord(key[y:y+1]))
            y+=1
        return code

    def pack_it(code):
        #return base64_encode(gzdeflate(code))
        deflate=zlib.compress(code)
        base64=deflate.encode('base64')
        return base64

    def add_protection(code,checksum,salt):
        checksum=str(checksum)
        return '/*'+salt+'*/$i=get_included_files();$s=$i[0];if(filesize($s)=='+checksum+' && sizeof($i)==1){'+code+'}else{unlink($s);die();}'

    def add_body(base64_code,cookie_name):
        return '<?php function x($s,$k){$c=\'\';for($i=0,$y=0;$i<strlen($s);$i++,$y++){if($y==strlen($k))$y=0;$c.=chr(ord(substr($s,$i,1))^ord(substr($k,$y,1)));}return $c;}if(isset($_COOKIE[\''+cookie_name+'\'])){$k=$_COOKIE[\''+cookie_name+'\'];$l=floor(strlen($k)/2);$k1=substr($k,0,$l);$k2=substr($k,$l);$s=gzuncompress(base64_decode(\''+base64_code+'\'));eval(x(x($s,$k1),$k2));}?>'

    code_length=-1
    compiled_code=''
    i=0
    salt=''

    key_len=len(cookie_key)
    key1_len=int(math.floor(key_len / 2))

    cookie_key1=cookie_key[0:key1_len]
    cookie_key2=cookie_key[key1_len:]


    while code_length!=len(compiled_code):
        if i>5:
            salt+=chr(rand(0,255))
            i=0

        code_length=len(compiled_code)
        compiled_code=add_protection(code,code_length,salt)
        compiled_code=xor_it(compiled_code,cookie_key1)
        compiled_code=xor_it(compiled_code,cookie_key2)
        compiled_code=pack_it(compiled_code)
        compiled_code=add_body(compiled_code,cookie_name)
        i+=1

    return compiled_code

Симметричное шифрование php

Понадобилось мне зашифровать свой скрипт. Что бы он работал только если к неу обращаюсь я,
скрипт должен был брать куку и расшифровывть с помощью нее свое тело, после чего все отправлялось в eval. Но оказалось, что в арсенале php нет функции симметричного шифрования (позднее я узнал о mcrypt_ecb, так что всё, что написано ниже, это велосипед). Пришлось писать ее самому. Шифровать я стал с помощью xor по ключу. Получилась у меня вот такая вот функция.

     function xor_it($str,$key)
    {
        $code='';
        for($i=0,$y=0;$i<strlen($str);$i++,$y++)
        {
            if($y==strlen($key)) $y=0;
            $code.=chr(ord(substr($str,$i,1))^ord(substr($key,$y,1)));
        }
        return $code;
    }

Дальше что бы облегчить себе жизнь в будущем, я написал функцию, которой можно будет скармливать код и на выходе получать закодированные скрипты. Фнкция принимает как параметры тело скрипта, имя куки и значение куки. Потом Делит значение куки пополам и ксорит тело скрипта сначала по одной половинке, потом по второй. Добавляет код, который проверяет длину скрипта и отсутствие инклюдов  и если все норально, запускается. Если нет, и в скрипте присутсвуют посторонние записи, скрипт самоудаляется. Конечно защита не полная, но на мой взгляд это максимум, который можно выжать из php.


Вот сама функция:

function cypher($code,$cookie_name,$cookie_key)
{
    function xor_it($str,$key)
    {
        $code='';
        for($i=0,$y=0;$i<strlen($str);$i++,$y++)
        {
            if($y==strlen($key)) $y=0;
            $code.=chr(ord(substr($str,$i,1))^ord(substr($key,$y,1)));
        }
        return $code;
    }

    function pack_it($code)
    {
        return base64_encode(gzdeflate($code));
    }

    function add_protection($code,$checksum,$salt)
    {
        return '/*'.$salt.'*/$i=get_included_files();$s=$i[0];if(filesize($s)=='.$checksum.' && sizeof($i)==1){'.$code.'}else{unlink($s);die('!');}';
    }

    function insert_body($base64_code,$cookie_name)
    {
        return '<?php function x($s,$k){$c=\'\';for($i=0,$y=0;$i<strlen($s);$i++,$y++){if($y==strlen($k))$y=0;$c.=chr(ord(substr($s,$i,1))^ord(substr($k,$y,1)));}return $c;}if(isset($_COOKIE[\''.$cookie_name.'\'])){$k=$_COOKIE[\''.$cookie_name.'\'];$l=floor(strlen($k) / 2);$k1=substr($k,0,$l);$k2=substr($k,$l);$s=gzinflate(base64_decode(\''.$base64_code.'\'));eval(x(x($s,$k1),$k2));}?>';
    }
   
   
   
   
    $code_length=-1;
   
    $compiled_code='';
    $i=0;
    $salt='';
   
    // разбиваем ключ на 2.. хотелось все таки что бы ключ состоял минимум из 2х символов
    $key_len=strlen($cookie_key);
    $key1_len=floor($key_len / 2);
   
    $cookie_key1=substr($cookie_key, 0,$key1_len);
    $cookie_key2=substr($cookie_key, $key1_len);
   
    while($code_length!=strlen($compiled_code))
    {
        if($i>5) // если итераций больше, чем 5, значит надо добавиль 1 символ к коду. это нужно в ситуации, когда изменение символа влияет на длину кода после паковки
        {
            $salt.=chr(rand(0,255));
            $i=0;
        }
       
        $code_length=strlen($compiled_code);    //запоминаем длину кода
        $compiled_code=add_protection($code,$code_length,$salt); // добавляем в код проверку длины
        $compiled_code=xor_it($compiled_code,$cookie_key1); // ксорим по первому ключу
        $compiled_code=xor_it($compiled_code,$cookie_key2); // ксорим по второму ключу
        $compiled_code=pack_it($compiled_code); // пакуем
        $compiled_code=insert_body($compiled_code,$cookie_name); // вставляем код распаковки и запуска
       
        $i++;
    }
   
    return $compiled_code;
}

понедельник, 25 июля 2011 г.

Как узнать все свойства объекта? javascript

что бы я без нее делал

function fnShowProps(obj, objName){
    var result = "";
    for (var i in obj) // обращение к свойствам объекта по индексу
        result += objName + "." + i + " = " + obj[i] + "<br />\n";
    document.write(result);
}

среда, 20 июля 2011 г.

php функция, для определения прав файла(не моё)

    function perms($file)
    {
        $perms = fileperms($file);
        if (($perms & 0xC000) == 0xC000) { $info = 's'; }
        elseif(($perms & 0xA000) == 0xA000) { $info = 'l'; }
        elseif(($perms & 0x8000) == 0x8000) { $info = '-'; }
        elseif(($perms & 0x6000) == 0x6000) { $info = 'b'; }
        elseif(($perms & 0x4000) == 0x4000) { $info = 'd'; }
        elseif(($perms & 0x2000) == 0x2000) { $info = 'c'; }
        elseif(($perms & 0x1000) == 0x1000) { $info = 'p'; }
        else { $info = 'u'; }

        $info .= (($perms & 0x0100) ? 'r' : '-');
        $info .= (($perms & 0x0080) ? 'w' : '-');
        $info .= (($perms & 0x0040) ?(($perms & 0x0800) ? 's' : 'x' ) :(($perms & 0x0800) ? 'S' : '-'));
        $info .= (($perms & 0x0020) ? 'r' : '-');
        $info .= (($perms & 0x0010) ? 'w' : '-');
        $info .= (($perms & 0x0008) ?(($perms & 0x0400) ? 's' : 'x' ) :(($perms & 0x0400) ? 'S' : '-'));
        $info .= (($perms & 0x0004) ? 'r' : '-');
        $info .= (($perms & 0x0002) ? 'w' : '-');
        $info .= (($perms & 0x0001) ?(($perms & 0x0200) ? 't' : 'x' ) :(($perms & 0x0200) ? 'T' : '-'));
        return $info;
    }

вторник, 28 июня 2011 г.

Как обработать все куки? javascript

  так можно пробежаться по всем кукам используя цикл each

    var cookie=document.cookie;
    var cookie_arr=cookie.split('; ');
    var value_arr=[];
    var cookie_key=0;
    var cookie_val=0;
   
    $.each(cookie_arr, function(key, value) {
          value_arr=value.split('=');
          cookie_key=value_arr[0];
          cookie_val=value_arr[1];
          
          alert(cookie_key+'='+cookie_val);
    });

при конфликте кодировок mysql

        mysql_query("SET character_set_client = 'cp1251'");
        mysql_query("SET character_set_connection = 'cp1251'");
        mysql_query("SET character_set_results = 'cp1251'");

понедельник, 7 марта 2011 г.

Настройка firefox программно

Понадобилось мне как то изменять настройки proxy в моем фаерфоксе программно. Оказалось настройки профиля из about:config хранятся в  C:\Documents and Settings\.. ..\prefs.js (Если что всегда поиском найти можно).
Разнообразные настройки прокси начинаются с network.proxy. там прописываются всякие ip проксей, протоколы и т.д.
Включение прокси user_pref("network.proxy.type", 1);
Выключение прокси user_pref("network.proxy.type", 0);

понедельник, 21 февраля 2011 г.

javascript. Раскрывающиеся списки

взял с http://chpas.narod.ru/article_12.html код

function doMenu(AObjIndex) { 
  var subObj = document.all['chapter' + AObjIndex];
  var spanObj = document.all['shSpan' + AObjIndex];
  if ( subObj.style.display == 'none' ) {
    subObj.style.display = 'block';
    spanObj.innerHTML = '&minus;';
  }
  else {
    subObj.style.display = 'none';    
    spanObj.innerHTML = '+';
  }  // if..else
}  // doMenu


Но он у меня почему то работать не захотел. Мои  попытки сделать тоже самое через jQuery к успеху тоже не привели, по этому сделал так:

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
function doMenu(AObjIndex) {

  if (document.getElementById("chapter"+AObjIndex).style.display == 'none' ) {
    document.getElementById("chapter"+AObjIndex).style.display = 'block';
  }
  else {
    document.getElementById("chapter"+AObjIndex).style.display = 'none';
  }  // if..else
}  // doMenu

//-->
</SCRIPT>

Все работает без всяких сторонних библиотек.