21 мая, 10:47

PHP: заменить последнее вхождение слова

function str_lreplace($search, $replace, $subject){
    $pos = strrpos($subject, $search);
    if($pos !== false)    {
        $subject = substr_replace($subject, $replace, $pos, strlen($search));
    }
    return $subject;
}

15 февраля 2013, 19:58

javascript: ip to long / long to ip

function dot2num(dot) 
{
    var d = dot.split('.');
    return ((((((+d[0])*256)+(+d[1]) )*256)+(+d[2]) )*256)+(+d[3]);
}

function num2dot(num) 
{
    var d = num%256;
    for (var i = 3; i > 0; i--) 
    { 
        num = Math.floor(num/256);
        d = num%256 + '.' + d;
    }
    return d;
}

6 января 2013, 5:30

jQuery dot in ID selector? точка в селекторе по айди не работет! Опа? :)

$('#with\\.dot') 

4 января 2013, 0:48

Chrome javascript jquery: выполняем jsonp с сайта без Access-Control-Allow-Origin: *

При написании екстеншенов(аддонов) к хрому, частенько нужно данные выдирать с других сайтов. Сам же аддон должен работать на всех сайтах, даже на тех, на которых нет Access-Control-Allow-Origin: *. (В таких случаях просто получить ответ из-за ошибки не можем, а функция jsonp с самого аддона не предопределяется). Делаем просто jquery запрос (можно и без него), но функцию колбека определим через head.
var script = document.createElement('script');
script.textContent = 'addinfo = function(data){alert(data)}';
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);

$.ajax({"url":"https://some.com/get.json?id="+id,
    type: 'GET',
    async: false,
    contentType: "application/json",
    dataType: 'jsonp',
    jsonpCallback: "addinfo",
    success: function() {}
});

4 января 2013, 0:40

Javascript: Декодируем полученый аджаксом юникод

function qp_decode (str) {
	var r = /\\u([\d\w]{4})/gi;
	str = str.replace(r, function (match, grp) {
		return String.fromCharCode(parseInt(grp, 16)); 
	});
	return unescape(str);
}

22 декабря 2012, 18:52

JavaScript: Проверка на 404

function UrlExists(url) {
	var http = new XMLHttpRequest();
	http.open('HEAD', url, false);
	http.send();
	return http.status!=404;
}

24 ноября 2012, 3:09

Javascript: вставляем с буфера картинку в документ (Google Chrome)

document.onpaste = function(event){
  var items = event.clipboardData.items;
  document.write(JSON.stringify(items)); 
  var blob = items[0].getAsFile();
  var reader = new FileReader();
  reader.onload = function(event){
    document.write("<img src='"+event.target.result+"'/>")
  }; // data url!
  reader.readAsDataURL(blob);
}
зы: Для Фокса можно использовать просто contenteditable=’true’ и уже с него считывать картинку

12 ноября 2012, 14:07

PHP: мультибайтовою строку в массив с букв (multibyte string to array of letters)

Не думал что может быть такая проблема, но explode(’’,$string) не работал вообще, а mb_split глючил
preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);

Уже почти забыл, как пользоваться движком блога, мде :)

1 августа 2012, 13:10

apache folder / file list 2 (pure javascript :)

Пристыдили меня в предыдущем посте, что для мелких движений использовал монстра jQuery в 100кб, пришлось вспоминать родной javascript :)
Теперь без задержки в 1 секунду для загрузки jQuery :D
var 
	inArray = Array.prototype.indexOf ? 
		function (arr, val) {
			return arr.indexOf(val) != -1;
		} :
		function (arr, val) {
			var i = arr.length;
			while (i--) {
				if (a[i] === val) 
					return true;
				}
				return false;
			},
	a = document.getElementsByTagName("a"), 
	i = a.length; 

while(i--){
	if (inArray(["png","jpg","jpeg","gif"], a[i].href.split(".").pop())){
		a[i].innerHTML = "<img src='"+a[i].href+"' alt='"+a[i].innerHTML+"'/>";
	}
}

Букмарклет:

зы: только букмарклет ведет себя странно, разберусь попозже :)

29 июля 2012, 22:08

apache folder / file list Избранное

Частенько в последнее время натыкаюсь на апачевые списки файлов, картинок, а их там десятки, и что бы найти нужный необходимо «все проклацать», написал небольшой скриптец для фаербага, что ссылки на картинки превращает в картинки рядом:
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.setAttribute('src',"http://code.jquery.com/jquery-1.7.2.min.js");
document.getElementsByTagName('head')[0].appendChild(s);

function l2i() {
    $("a[href$=png],a[href$=jpg],a[href$=gif],a[href$=jpeg]").each(
        function(){
            $(this).append("<br/><img src='"+$(this).attr("href")+"' alt='"+$(this).text()+"'/>"); 
        }
    );
};
setTimeout(l2i,1000);

А впоследствии и букмарклет:

11 июня 2012, 16:15

PHP: укоротим текст без обрезки слов

substr($text, 0, strpos($text, ' ', 100));

9 июня 2012, 17:10

PHP: функции жрут память, заменим часть

Хорошая статья на эту тему у болка, скопирую «выводы»:
# занесение элемента в массив:
array_push($stack, $element);
$stack[] = $element;

# получение версии ПХП, есть ещё
# PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION, PHP_VERSION_ID и PHP_EXTRA_VERSION
if (phpversion() === "5.0.0") {}
if (PHP_VERSION === "5.0.0") {}

# способ подключения ПХП
if (php_sapi_name() === 'cli') {}
if (PHP_SAPI === 'cli') {}

# проверка существования ключа, но, увы, это не одно и тоже:
# isset не покажет true, если ключ существует, но значение null
if (array_key_exists('key1', $arr) && array_key_exists('key2', $arr)) {}
if (isset($arr['key'], $arr['key2'])) {}

# для массивов, ключи которых не перекрываются (операция «+» добавит только те ключи,
# которые отсутствуют в первом массиве)
$arr = array_merge($arr1, $arr2);
$arr = $arr1 + $arr2;

# операционная система
if (php_uname('s') === 'Darwin') {}
if (PHP_OS === 'Darwin') {}

# получение переменной окружения. Есть отличие: массив $_ENV может быть перезаписан другим кодом,
# при этом реальное значение переменной окружения не изменится, кроме того,
# getevn не сгенерирует предупреждение, если значения с таким ключом нет
if (getenv('VARNAME') === 'value') {}
if ($_ENV['VARNAME'] === 'value') {}

5 июня 2012, 14:01

UTF Code points to UTF8

html_entity_decode(preg_replace("/\\\\u([0-9a-fA-F]+)/", "&#x$1;", json_encode($array)), ENT_COMPAT, 'UTF-8');

16 мая 2012, 17:40

Типы СУБД

  • реляционные: MySQL, Oracle, Microsoft SQL Server, PostgreSQL;
  • различные варианты хеш-таблиц key-value (Redis, BigTable, memcached);
  • документо-ориентированные базы данных (MongoDB, CouchDB);
  • базы данных, основанные на графах (Neo4j, Sones GraphDB);
  • объектно-ориентированные базы данных (db4o, Cache, Jade);
  • XML-ориентированные базы данных (eXist, BaseX).
зы: MongoDB использует в качестве языка запросов BSON, eXist применяет XQuery, а Sonic GraphDB требует от разработчика знания GraphQL

24 февраля 2012, 16:05

CSS3: анимация на примере вращения картинки вокруг своей оси :)

ЦСС3 крутая вещь, круче не придумать ;)
анимировать будем при наведении мыши на картинку
@keyframes rotate{ 
	/* создаем анимацию и даем ей имя (rotate например) */
	/* дальше задаем положение в начале и в конце */
	from { 
		/* 
			для анимации используем трансформацию вращение 
			есть ешё сдвиг translate(x,y) и увеличение scale(z)
		*/
		transform:  rotate(0);
		/* можно анимировать размеры и прочие парамтры цсс */
	}	
	to {
		transform: rotate(360deg);
	}

	/* или вместо from|to пишем процент выполнения сцены, от 0% до 100%, любой нужный */
	/* 
		так как поддерживают анимацию передовики Гекко и ВебКит, 
		запись выше не работает и каждому нужно написать свою
	*/


} 
@-moz-keyframes rotate{from {-moz-transform:  rotate(0);}	to {-moz-transform: rotate(360deg);}} 

@-webkit-keyframes rotate{from {-webkit-transform:  rotate(0);}	to {-webkit-transform: rotate(360deg);}} 
	

img {
	padding-right: 13px;
}
img:hover {
	/* анимировать будем при наведении мыши на картинку */
	border: 1px solid #C0C0C0;
	/* имя анимации, длительность, продолжительность циклов, "задержки" */
	animation: rotate 0.5s infinite linear; 
	-moz-animation: rotate 0.5s infinite linear;
	-webkit-animation: rotate 0.5s infinite linear;
	/* 
	
	-webkit-animation-name —  имя анимации
	-webkit-animation-duration — время проигрывания анимации
	-webkit-animation-timing-function — метод расчета промежуточных значений свойств для анимации
	-webkit-animation-delay — задержка анимации
	-webkit-animation-iteration-count — количество циклов анимации
	-webkit-animation-direction — направление анимации
	-webkit-animation-play-state — проигрывается ли анимация или стоит на паузе

	*/}


19 февраля 2012, 16:21

jQuery: Как получить значение css %параметра% блока в процентах

В чем проблема? Все, кроме вебкита, заданный параметр в процентах, например #wrp {left: 150%;}, возвращают в пикселях.
$(document).ready(function() {
    var lft = $('#wrp').css("left")+"";
    if (lft.match("px")) {
        lft = parseInt(lft) / $('#wrp').parent().width()*100;
        if ($.browser.msie)
            lft = lft>0 ? Math.ceil(lft) : Math.floor(lft);
        lft += "%";                     
    }

    $('#out span').html(lft);
});

В примере параметром будет left, а для ИЕ как всегда костыль ;)

25 января 2012, 15:52

ИЕ8 и тени со скругленными уголками вместе

Для тени очень хорошо работает свойство фильтр, но как только пытаешься применить к блоку с тенью какой нить хтц плагин для скругленных уголков или дд_раунди, это блок и разработчик тоже получают дикий баттхерт, потому что тень теперь у текста, блок стал выше на длину тени, но зато есть уголки. Пришлось на коленке писать приблуду, которая почему-то не хочет работать в ИЕ7, нужно наверное там джиквери с 1.4.2 обновить до 1.7.1
<!--[if lte IE 8]>
	<script type="text/javascript" src="<?=SITE_TEMPLATE_PATH?>/roundie.js"></script>
	<script type="text/javascript">
		if (document.all) {
			DD_roundies.addRule('.div-onmain .n-det, .div-onmain .news-list, #t-m ', '3px');
		}
		$(document).ready(function() {
			$(".div-onmain .news-list, #t-m").each(function(){
				var 
					w = $(this).innerWidth(),
					h = $(this).innerHeight();
				
				$(this).css({
					"z-index":3,
					"overflow": "visible",
					"margin-top": -h*1+15 + "px"
				});
				
				$(this).parent().css({
					"z-index":1
				});
				
				$(this).before(
					$("<div class='shadow'>&shy;</div>").css({
						"z-index":2,
						"margin-top": "-15px",
						"overflow": "hidden",
						"width": w,
						"height": h,
						"overflow": "visible"
					})
				);
			});
			
			$(".shadow").css({
				"background": "#fff",
				"filter": "progid:DXImageTransform.Microsoft.Shadow(color='#EEEEEE', Direction=0, Strength=15)"
			});
		});
	</script>
<![endif]-->

22 января 2012, 13:47

Это нужно сохранить :) Простое объяснение ajax«а

Простое объяснение ajax

5 января 2012, 23:42

JavaScript: определяем браузер по работе с масивами

JavaScript: определяем браузер по работе с масивами
<script type="text/javascript">
function browser() {
  if(-[1,]){
    var f = 1; var d={4294967296:'opera', d:'firefox', 4294967295:'chrome', '1' :''};
    for(var i in d) if(f) f=0; else return d[i];
  } else return 'ie';
}
document.write(browser());
</script>

Найдено на хабре

5 января 2012, 23:33

С новым годом

[][([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+
!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+
([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<­!![]+
!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]][([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+
([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<­!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
(([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])[+!![]]+
([]+[][{}])[-~[]]+([]+{})[~[]+(+!![]<<­!![]+!![]+
!![])]+([]+![])[!![]+!![]+!![]]+([]+![])[!![]<<­!![]+
!![]]+([]+![])[!![]+!![]]+([]+![])[-[]])()
[([{}-{}]+[])[-~[]]+([]+![])[!![]+!![]]+([]+![])
[!![]<<­!![]+!![]]+([]+!![])[-~[]]+([]+!![])[+[]]](
[][([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+
!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+
([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<­!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
[([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+
([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<­!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
(([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])
[+!![]]+([]+[][{}])[-~[]]+([]+{})[~[]+(+!![]<<­!![]+
!![]+!![])]+([]+![])[!![]+!![]+!![]]+([]+![])
[!![]<<­!![]+!![]]+([]+![])[!![]+!![]]+([]+![])
[-[]])()[([]+![])[-~[]]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+{})[!![]+!![]]](([]+![])[-~[]]+
([][([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])
[+![]]+([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+
([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+!![])[+![]]+
([]+{})[-~[]]+ ([]+!![])[+!![]]]+[])[(-~[]+[+![]])-!![]])+
([]+![])[-~[]]+
(/!/[([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})[-~[]]+([]+[][{}])
[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+!![])[+!![]]]+[])[+!![]+[!![]<<­!![]-~[]]]+
(/!/[([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})[-~[]]+([]+[][{}])
[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+!![])[+!![]]]+[])[+!![]+[!![]<<­!![]-~[]]]+
([]+[~[]/[]])[[[!![]+!![]]*[!![]+!![]]]*[!![]+!![]]]+
([]+{})[~[]+(+!![]<<­!![]+!![]+!![])]+
([]+[][{}])[-~[]]+
([]+{})[-~[]<<[-~[]+-~[]]]+
([][([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])
[+![]]+([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+
(!![]<<­!![]+!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]][([]+{})[-~[]+(!![]<<­!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+
([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+
(!![]<<­!![]+!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]](([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])[+!![]]+([]+[][{}])
[-~[]]+([]+{})[~[]+(+!![]<<­!![]+!![]+!![])]+([]+![])
[!![]+!![]+!![]]+([]+![])[!![]<<­!![]+!![]]+([]+![])
[!![]+!![]]+([]+![])[-[]])()+[])[([]+![])[!![]+!![]+
!![]]+([]+![])[!![]+!![]]+([]+[][{}])[!![]+(!![]<<­!![]+!![])]+
([]+{})[!![]+(!![]<<­!![]+!![])]+([]+!![])[!![]+!![]+!![]]](~[]+~[])[-[]]+
([]+{})[~[]+(+!![]<<­!![]+!![]+!![])]+
(~[]/[]+[])[-~[]<<-(~[]+~[]+~[])]+
([~[]<[]]+[])[-[~[]+~[]+~[]]]+
([{}-{}]+[])[-~[]]+
 ([]+!![])[+!![]]+
(/!/+[])[-~[]])

Это Женя Степанищев написал здесь такое вот поздравление. Как-то раз я уже описывал, как работает данный «обфускатор», почему-то не могу найти, повторюсь :)

Пока я искал, все появилось в комментариях :)
Теперь немного о том как это сделано.

Проще всего получить буквы I, N, O, a, b, c, d, e, f, i, j, l, n, o, r, s, t, u, y. Они встречаются в различных словах самого языка. Например, нам нужна буква «f». Нет ничего проще, берём значение «false», вырезаем первую букву: «false»[0].

Перевести что угодно в строку можно прибавляя слева пустой массив, напимер «[]+![]» будет «false». Получить нулевой символ тоже легко, нужно перевести массив в число. Получается: «([]+![])[+[]]». Можно получать менее очевидные вещи: «[]+{}» будет «[object Object]», «{}-{}» — NaN, а «~[]/[]» — «-Infinity».
Здесь он продолжил:
С некоторыми другими буквами пришлось повозиться. Например, над «w» я долго ломал голову, наконец решил попробовать получить глобальный «window», преобразовать в строку и взять букву из него.

Очевидный способ через пустой call какого-нибудь метода отказался работать в Файрфоксе (строгий режим они что ли включили?), поэтому я добрался до него в два приёма.

Во-первых, сначала мне нужен был конструктор какого-нибудь метода, чтобы вызвать конструктор Function. Это я решил так: [].sort.constructor (sort — хорошее имя метода, все буквы просто достаются), точнее, вот так [][’sort’][’constructor’], буквы подставляются методом, описанным чуть выше.

Во-вторых, вызовом конструктора я создал функцию, которая вернула self: [].sort.constructor(’return self’)()

Дальше — дело техники. Я отрезал последние две буквы (в зависимости от браузера я могу получить объект «window» или «DOMWindow», первая буква не годится) и взял первую: [][’sort’][’constructor’](’return self’)()[’slice’](-2)[0]
А тут закончил:
Кстати, «alert» вызывается аналогичным образом — надо добраться до window и вызвать у него «alert»: window[’alert’](’параметры’). Собственно, то же с любой другой глобальной функцией. Я, например, использую ещё atob, чтобы получить букву «h» в слове «happy». Вызов window[’atob’](’aA’) даст искомую букву.

Букву «a» для параметра «atob» получить просто, можно, например, отрезать её от «false», а большой «A» сложнее. Я поступил следующим образом: преобразовал конструктор массива к строке: «[]+[].constructor». Получается следующее:
function Array() {
[native code]
}
Искомая буква там — под номером девять (если считать с нуля), я девятку получил вот так: +([-~[]]+-![])+~[] (в строковом представлении сложил один и ноль, преобразовал число, прибавил минус один).

В итоге, буква «h» получается как-то так: [].sort.constructor(’return self’)()[’atob’](«false»[1] + ([]+[].constructor)[9])
И добавил
О! Надо ещё про букву «p» рассказать. Я получил её из объекта «RegExp», знакомым уже способом: «([]+/!/.constructor)[14]».
FIN
Ctrl +  Ранее