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'>­</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]-->
3 комментария5 января, 23:42
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
Вы на новом серваке, у вас рут, но пароля нет, или вы его забыли, попасть в БД нельзя. Просто нужно выполнить вот такую последовательность ;)
- /etc/init.d/mysql stop
- mysqld_safe —skip-grant-tables
- mysql -u root
- Теперь вы в мускуле выполняете следующие команды
mysql> use mysql;
mysql> update user set password=PASSWORD(«NEW-ROOT-PASSWORD») where User=’root’;
mysql> flush privileges;
mysql> quit
- /etc/init.d/mysql stop
- /etc/init.d/mysql start
14 июля 2011, 17:36
Затарить и разтарить
tar czf new-tar-file-name.tar.gz file-or-folder-to-archiveHere 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.gzHere 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); }
14 апреля 2011, 8:33
Новый PHP новые правила :) Лечим быстро растущий еррор_лог
На одном проекте, написанном н-лет назад обновили апачь+пхп+мускул+нгинксс, и скорость толстения логов просто поражала. Например за сутки лог апача из-за ошибок пхп выростал до 2ух гиг :)
За 1 заход простого юзера плюс 1-20МБ, это конечно замечательно, но нужно было как-то «пофиксить». Самым толстым ворнингом был такой:
Пхп, просто хотел знать дефаулт тайм-зоун, и ругался на все функции которые работают с датой :) В начале «главного» скрипта пишем:
Следующий ворнинг:
Это значит что, эти функции ereg()/eregi()/ereg_replace() нихт_арбайтен, то есть не работают, вообще. Да, в новом пхп их убили, почитать что убили можно здесь
«-Что же делать?», воскликнет читатель. Есть два пути.
За 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
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 “ß” 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 поддерживает отображения, в виде разложения, то есть для одного символа “ß” одной языковой группы может соответствовать пара других символов “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);

