25 января, 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 января, 13:47

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

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

5 января, 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 января, 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

23 декабря, 13:28

импорт джаваскриптов и стилей через джиквери (import javascripts and styles via jQuery)

По следам моих старых-старых статей
$('head').append($("<script></"+"script>").attr({
	'type':'text/javascript'
	'src':"path_to_file.js",
}));

$('head').append($("<link/>").attr({
	"rel": "stylesheet",
	"type": "text/css",
	"href": "path_to_file.css",
}));

23 декабря, 12:41

Как в jQuery получить html код самого элемента

$(".selected_element").wrap("<div>").parent().html()

Все делает функция wrap, которая обволакивает выбранный элемент выбранным тэгом, в зависимости от контекста, он можеть быть любым :)

10 декабря, 20:16

Скролл сверху и снизу блока

Wow, who is back. Да — это я с новым ДОУ (deer.org.ua, lol)

Разминка для мозгов :)
<style type="text/css">
  #doublescroll { overflow: auto; overflow-y: hidden; }
  #doublescroll p { margin: 0; padding: 1em; white-space: nowrap; }
</style>

<div id="doublescroll">

  <p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
    enim ad minim veniam, quis nostrud exercitation ullamco laboris
    nisi ut aliquip ex ea commodo consequat.
  </p>
</div>

<script type="text/javascript">
function DoubleScroll(element) {
    var scrollbar= document.createElement('div');
    scrollbar.appendChild(document.createElement('div'));
    scrollbar.style.overflow= 'auto';
    scrollbar.style.overflowY= 'hidden';
    scrollbar.firstChild.style.width= element.scrollWidth+'px';
    scrollbar.firstChild.style.paddingTop= '1px';
    scrollbar.firstChild.appendChild(document.createTextNode('\xA0'));
    scrollbar.onscroll= function() {
      element.scrollLeft= scrollbar.scrollLeft;
    };
    element.onscroll= function() {
      scrollbar.scrollLeft= element.scrollLeft;
    };
    element.parentNode.insertBefore(scrollbar, element);
  }

  DoubleScroll(document.getElementById('doublescroll'));
</script>

Код честно взят со стакексчендж (стаковерфлоу раньше). Я просто сделал с него джиквери решение
$("#doublescroll")
	.before($("<div></div>")
		.append($("<div></div>")
  			.css({
  				"padding-top":"1px",
  				"width": $("#doublescroll")[0].scrollWidth+"px"
  			})
  			.text('\xA0')
  		)
		.css({
			"overflow":"auto",
			"overflowY":"hidden"
		}).
		bind("scroll",function(){
			$("#doublescroll")[0].scrollLeft = $(this)[0].scrollLeft;
		})
	)
	.bind("scroll",function(){
		$(this).prev()[0].scrollLeft = $(this)[0].scrollLeft;
	})

Примера не будет, мне лень.

27 августа 2011, 14:06

Проверка типа данных

var toType = function (obj) {
    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
}
Наткнулся на ноут-киппер, решил себе схоронить :)

14 августа 2011, 16:48

Recover MySQL root Password

Вы на новом серваке, у вас рут, но пароля нет, или вы его забыли, попасть в БД нельзя. Просто нужно выполнить вот такую последовательность ;)
  1. /etc/init.d/mysql stop
  2. mysqld_safe —skip-grant-tables
  3. mysql -u root
  4. Теперь вы в мускуле выполняете следующие команды
mysql> use mysql;
mysql> update user set password=PASSWORD(«NEW-ROOT-PASSWORD») where User=’root’;
mysql> flush privileges;
mysql> quit
  1. /etc/init.d/mysql stop
  2. /etc/init.d/mysql start

14 июля 2011, 17:36

Затарить и разтарить

tar czf new-tar-file-name.tar.gz file-or-folder-to-archive
Here is the command explanation:
*.tar — the tar command.
*.c — create new archive.
*.z — compress the archive using gzip.
*.f — use archive file.
tar -xzf tar-file-name.tar.gz
Here is the command explanation:
*.tar — the tar command.
*.x — extract the archive.
*.z — uncompress the archive using gzip.
*.f — use archive file.

18 июня 2011, 16:36

GIT: шпора

Начал активно пользовать гыт, так что начну здесь копить шпору:
Global setup:
 Download and install Git
  git config --global user.name "Vitaliy"
  git config --global user.email vitlik@gmail.com
        
Next steps:
  mkdir i-just-forget-somthing
  cd i-just-forget-somthing
  git init
  touch README
  git add README
  git commit -m 'first commit'
  git remote add origin git@github.com:deerua/i-just-forget-somthing.git
  git push -u origin master
      
Existing Git Repo?
  cd existing_git_repo
  git remote add origin git@github.com:deerua/i-just-forget-somthing.git
  git push -u origin master

31 мая 2011, 19:07

PHP: array_key_exists for multidimensional arrays

function array_key_exists_r($needle, $haystack)
{
    $result = array_key_exists($needle, $haystack);
    if ($result) return $result;
    foreach ($haystack as $v) {
        if (is_array($v)) {
            $result = array_key_exists_r($needle, $v);
        }
        if ($result) return $result;
    }
    return $result;
}

27 мая 2011, 18:38

PHP: MySQL get FOREIGN KEY

$result = mysql_query("SHOW CREATE TABLE $table_name");
while ($rowI = mysql_fetch_assoc($result, MYSQL_NUM)) {
	if(preg_match_all(
 		'/FOREIGN KEY \(`(.*)`\) REFERENCES `(.*)` \(`(.*)`\)/',
 		$rowI[1],
 		$matchArr)) {
			printr($matchArr);
	}
}	

6 мая 2011, 13:35

MySQL: error #1235

Когда пытаешься выполнить например такой запрос:
UPDATE `learn_answer` 
SET `QUESTION_ID` = QUESTION_ID - 1 
WHERE `learn_answer`.`ID` IN (
	SELECT ID
	FROM `learn_answer`
	WHERE `QUESTION_ID` > 367
)

Получаешь чудо ошибку. Ошибка эта гласит:
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


Когда идём в мануал, там сразу же лежит решение. Нам просто нужно использовать АЛИАС, что бы бля сделать тоже самое:
UPDATE `learn_answer` 
SET `QUESTION_ID` = QUESTION_ID - 1 
WHERE `learn_answer`.`ID` IN (
	SELECT * FROM (
		SELECT ID
		FROM `learn_answer`
		WHERE `QUESTION_ID` > 367
	) Alias
)

29 апреля 2011, 14:58

PHP: detect UTF8 :D

function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);

}
php   utf8

14 апреля 2011, 8:33

Новый PHP новые правила :) Лечим быстро растущий еррор_лог

На одном проекте, написанном н-лет назад обновили апачь+пхп+мускул+нгинксс, и скорость толстения логов просто поражала. Например за сутки лог апача из-за ошибок пхп выростал до 2ух гиг :)

За 1 заход простого юзера плюс 1-20МБ, это конечно замечательно, но нужно было как-то «пофиксить». Самым толстым ворнингом был такой:
Warning: strtotime()/strftime()/date() [function.strftime]: It is not safe to rely on the 
system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() 
function. In case you used any of those methods and you are still getting this warning, you most likely 
misspelled the timezone identifier.

Пхп, просто хотел знать дефаулт тайм-зоун, и ругался на все функции которые работают с датой :) В начале «главного» скрипта пишем:
date_default_timezone_set('UTC');


Следующий ворнинг:
PHP Deprecated:  Function ereg()/eregi()/ereg_replace() is deprecated in *

Это значит что, эти функции ereg()/eregi()/ereg_replace() нихт_арбайтен, то есть не работают, вообще. Да, в новом пхп их убили, почитать что убили можно здесь

«-Что же делать?», воскликнет читатель. Есть два пути.
  • заменить все дохлые функции живыми аналогами
    // Все меняем на preg_match
    ereg("\.([^\.]*$)", $this->file_src_name, $extension);
    preg_match("/\.([^\.]*$)/", $this->file_src_name, $extension);
    // да, на preg_match
    $this->file_dst_name_body = ereg_replace("[^A-Za-z0-9_]", "", $this->file_dst_name_body);
    $this->file_dst_name_body = preg_replace("/[^A-Za-z0-9_]/", "", $this->file_dst_name_body);
    // тут появится модификатор regexpа
    eregi("\.([^\.]*$)", $this->file_src_name, $extension);
    preg_match("/\.([^\.]*$)/i", $this->file_src_name, $extension);
  • в настройках включить поддержку старых функций, которая отрубает поддержку новых
    mbstring.func_overload = 7
Если код старый и ТОЛСТы, можно обойтись и заменой в хтакцесс, а если нет, то лучше да ;)
bugs   php

9 апреля 2011, 16:52

CSS: nth-child параметры псевдокласса

Значение Номера элементов Описание
1 1 Первый элемент, является синонимом псевдокласса :first-child.
5 5 Пятый элемент.
2n 2, 4, 6, 8, 10 Все четные элементы, аналог значения even.
2n+1 1, 3, 5, 7, 9 Все нечетные элементы, аналог значения odd.
3n+2 2, 5, 8, 11, 14
-n+3 3, 2, 1
5n-2 3, 8, 13, 18, 23
even 2, 4, 6, 8, 10 Все четные элементы.
odd 1, 3, 5, 7, 9 Все нечетные элементы.

6 апреля 2011, 11:17

MySQL: utf8_unicode_ci и utf8_general_ci

Увидел в проекте странный коллейшон у базы utf8_unicode_ci. Решил почитать что за зверь, и нашёл на сайте мускула простой ответ:
For any Unicode character set, operations performed using the _general_ci collation are faster than those for the _unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages “&#223;” is equal to “ss”. utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.
Дам вольный перевод:
Для всех юникодовых кодировок операции сравнения происходят быстрее с _general_ci (на 30%), но они менее правильные чем с _unicode_ci (ещё генерал_си не чувствительна к регистру). _unicode_ci поддерживает отображения, в виде разложения, то есть для одного символа “&#223;” одной языковой группы может соответствовать пара других символов “ss” другой языковой группы. _general_ci есть наследственным коллейшеном, что не поддерживает расширений, сокращений или игнорируемых символов.


То есть желательно от неё избавиться, хотя могут возникнуть некоторые проблемы с поиском и тегами :)

1 апреля 2011, 20:07

Javascript Capitalize :D

var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1)

1 апреля 2011, 19:42

PHP: отладка в сложнодоступных местах :)

ob_start();

	print_r(get_defined_vars());
	
$output = ob_get_contents(); 
ob_end_clean();

$f = fopen('output.txt', 'w+');

fwrite($f, $output);
fclose($f);
Ctrl +  Ранее