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 комментарий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);
24 марта 2011, 12:45
PHP: strtolower, strtoupper и кириллица
Эти функции на кириллицу просто так не обращают внимания. Строки остаются без изменений, печаль и т. д. В данном случае могут помочь mb_* мультибайтовые аналогичные функции, но если их нет, нужно просто правильно поставить локаль, и простая функция заработает как нужно.
setlocale(LC_ALL, 'ru_RU'); $name = strtolower($name);
20 марта 2011, 23:35
PHP: sort multiple array (ASC, DESC)
function array_orderby(){ $args = func_get_args(); $data = array_shift($args); foreach ($args as $n => $field) { if (is_string($field)) { $tmp = array(); foreach ($data as $key => $row) $tmp[$key] = $row[$field]; $args[$n] = $tmp; } } $args[] = &$data; call_user_func_array('array_multisort', $args); return array_pop($args); } $results = array_orderby ($results, "P", SORT_DESC, "GD", SORT_DESC);
В похапе 5.3 мы получим болт а не сортировку, потому пришлось искать замену, и первое что приглянулось, это вот такой код с анонимными функциями и усорт
function sort_multi_array ($array, $key){ $keys = array(); for ($i=1;$i<func_num_args();$i++) { $keys[$i-1] = func_get_arg($i); } // create a custom search function to pass to usort $func = function ($a, $b) use ($keys) { for ($i=0;$i<count($keys);$i++) { if ($a[$keys[$i]] != $b[$keys[$i]]) { return ($a[$keys[$i]] < $b[$keys[$i]]) ? -1 : 1; } } return 0; }; usort($array, $func); return $array; }
Здесь мы получим сортировку АСК по всем ключам, что бы сделать обратную используем аррай_реверс, а что бы ключи работали в функции — нужно подумать, может когда будет нужно переделаю, на данном этапе мне достаточно этого.
чиирз
17 марта 2011, 10:46
PHP: превращаем слово единственного числа в множественное
Нужно было, быстро на коленке стряпать такую вот функцию. Изначально она была сделана по примерам возможных слов, и приняла такой вид:
Взглянув на это, стало как-то печально, особенно если учитывать что примеров может быть намного больше, взял и автоматизировал/оптимизировал:
Вот так родился такой монстрик ;) А сами окончания наверное правильнее будет передавать в функцию, хотя если они останутся в ней, база нарастёт быстрее.
function make_multiple($word) { $word = trim($word); $lst1 = substr($word,-1);$rest1 = substr($word,0,-1); $lst2 = substr($word,-2);$rest2 = substr($word,0,-2); $lst3 = substr($word,-3);$rest3 = substr($word,0,-3); if ($lst3 == "нки") $word = $rest3."нков"; elseif ($lst2 == "ки" || $lst2 == "ка") $word = $rest2."ок"; elseif ($lst2 == "ры") $word = $rest2."р"; elseif ($lst2 == "ия") $word = $rest2."ий"; elseif ($lst2 == "рь") $word = $rest2."рей"; elseif ($lst1 == "ы") $word = $rest1."ов"; return $word; }
Взглянув на это, стало как-то печально, особенно если учитывать что примеров может быть намного больше, взял и автоматизировал/оптимизировал:
function make_multiple($word) { $word = trim($word); // массив возможных вариантов $ends = array( "нки" => "нков", "ки" => "ок", "ка" => "ок", "ры" => "р", "ия" => "ий", "рь" => "рей", "ы" => "ов" ); // ищем самое большое окончание, то есть его длину $itrs = max(array_map('strlen', array_keys($ends))); $poly = array(); // строим массив этих окончаний, и слов без них for ($i = $itrs; $i > 0 ; $i--) { // в таком виде что бы избежать циклов в цикле $poly[$i] = array(substr($word,-$i),substr($word,0,-$i)); } // строим нужно слово, когда найдём сопадение foreach ($ends as $what => $to) { if ($poly[strlen($what)][0] == $what) { return $poly[strlen($what)][1].$to; } } return $word; }
Вот так родился такой монстрик ;) А сами окончания наверное правильнее будет передавать в функцию, хотя если они останутся в ней, база нарастёт быстрее.
10 марта 2011, 13:49
Мускул апдейт, ORDER BY RAND() не работает / not work
После обновления мускула, просто перестал работать такой запрос, все время одно и тоже число :)
Вместо NOW() можно вставить и UNIX_TIMESTAMP(), но блин, может и не помочь, если часто обращаться.
SELECT * FROM your_table ORDER BY RAND() LIMIT 1; #Теперь нужно так: SELECT * FROM your_table ORDER BY RAND(NOW()) LIMIT 1;
Вместо NOW() можно вставить и UNIX_TIMESTAMP(), но блин, может и не помочь, если часто обращаться.
3 марта 2011, 16:36
Универсальный print_r
Окончательный ремейк будет выглядеть вот-так:
if (!function_exists('printr')) { function printr($array) { $args = func_get_args(); if (count($args) > 1) { foreach ($args as $values) printr($values); } else { if (is_array($array) || is_object($array)) { echo "<pre>"; print_r($array); echo "</pre>"; } else echo $array; } } } printr($arr1,$arr2);
28 февраля 2011, 17:01
UFT8 и PHP
Казалось бы, как только начинаешь использовать мультибайт, тебя спасут теже функции, только с mb_ в начале, оказалось показалось %).
В них желательно не забывать указывать какую именно кодировку вы используете
Для почитать на досуге, советую:
PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
В них желательно не забывать указывать какую именно кодировку вы используете
mb_substr($var,0,99,'utf-8')Что-то типа такого, и да, мануалы в помощь.
Для почитать на досуге, советую:
PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
30 января 2011, 22:53
Firefox CSS3 render fail (scroll lag)
На работе я разбаловался довольно мощным компом, потому многих вещей я просто не замечал. Этой весной моему домашнему бучеку будет 5 лет. Я им вполне доволен, 17» экран, 125фпс в ку3 (на настройках для игры) — но, фокс 3.6.13 очень лагает, когда на странице есть цсс3 градиентики и бокс-шадовс. Он просто реально умирает, и проц 100%. В остальных браузерах, вебкиты, говнооперы и ИЕ все ок, «ТАКИХ» лаг нет.
Что печально, это никак не лечится, разве что реально мощным железом. Наверное не зря «эпл» выбрала такой путь, ведь их сафари без производительности очень лажовое говно, так же как айтюнс и куча-куча прочего.
Частичной панацеей для бокс-шадов есть такая конструкция:
, ну а градиенты картинками, чего очень не хочется.
зы: и ещё, о цсс3 — для инпутов в ФФ до сих пор бордер-радиус не применяются, пока им не сменишь их бордер на любой другой.
Что печально, это никак не лечится, разве что реально мощным железом. Наверное не зря «эпл» выбрала такой путь, ведь их сафари без производительности очень лажовое говно, так же как айтюнс и куча-куча прочего.
Частичной панацеей для бокс-шадов есть такая конструкция:
.shadow {-moz-border-image: url("/imgs/shadow.png") 10 / 3px;}Где картинка выглядит вот-так
, ну а градиенты картинками, чего очень не хочется.зы: и ещё, о цсс3 — для инпутов в ФФ до сих пор бордер-радиус не применяются, пока им не сменишь их бордер на любой другой.
27 января 2011, 16:22
Обновления скриптов
- Заканчивая курить мануал по мускулу, и продолжая обновлять старые проекты новыми ЦМСками, всплыло пару багов, и добавилось фич — в итоге обновил вчерашний скрипт.
- Ещё переписал Регексп-тестер для PHP
- Так же апнул свою коллекцию утилиток
27 января 2011, 12:29
Mysql show create
mysql> show create database AAA; +----------+-----------------------------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------------------------+ | AAA | CREATE DATABASE `AAA` /*!40100 DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin */ | +----------+-----------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show create table charset_test2; +---------------+------------------------------------------------------------------------------+ | Table | Create Table | +---------------+------------------------------------------------------------------------------+ | charset_test2 | CREATE TABLE `charset_test2` ( `str` varchar(20) collate cp1251_bin default NULL, `str2` varchar(20) character set cp1251 default NULL ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin | +---------------+------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
26 января 2011, 19:02
PHP&MYSQL:Сравнение нескольких таблиц в БД и генерация скрипта обновления
Полгодика назад я написал артикль на тему сравнение таблиц в двух БД (и больше), основная идея которого была в том, что бы быстро сравнить 2 таблицы одинаковой системы с разными версиями и обновить старую БД. Делал всё руками, так как изменений было не много.
А тут настал час, когда нужно проделать тоже, но руками это будет адски долго. Уделив 2 часа на курение мускул-синтаксиса, я на коленке написал, так сказать, версию 2.0 :)
Полная генерация «апдейт ескуель»:
А тут настал час, когда нужно проделать тоже, но руками это будет адски долго. Уделив 2 часа на курение мускул-синтаксиса, я на коленке написал, так сказать, версию 2.0 :)
Полная генерация «апдейт ескуель»:
- альтер чендж
- альтер адд
- криейт тейбл
- адд индексес
- ремув индексес
- сам УИ импрувементс
25 января 2011, 11:35
PHP: get google.PR end yandex.QI (тИЦ)
25 января 2011, 11:13
javascript: выколиглаз
20 января 2011, 17:58
Прикол с аддоном IE Tab Plus
Дебажив сайты, случайно обнаружил, что у меня на всех сайтах грузятся одни и те же скрипты, которых я как бы не заказывал, а именно:
зы: я помню, о том что бы расписать как работает анимация в цсс3, сделаю это на выходных :)
- htt ps://www.superfish.com/ws/sfw.jsp?clientVersion=1.2.0.7&dlsource=ietab&userId=RzSKuZipQ5KcdowsVZukzg&statsReporter=false
- htt ps://www.superfish.com/ws/js/sf_conduit.js?ver=4.0.1
- htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/dojo.xd.js
- htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/io/script.xd.js
- htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/window.xd.js
- htt ps://www.superfish.com/ws/getSupportedSitesJSON.action?ver=2.1&callback=SF_isURISupported
зы: я помню, о том что бы расписать как работает анимация в цсс3, сделаю это на выходных :)
14 января 2011, 12:53
Динамические субдомены из субфолдеров :)
Обяснение:
Пример:
Создаете папку в папке субдоменов имя папки будет соответствовать субдомену.
RewriteEngine on Options +FollowSymlinks +Indexes RewriteBase/ RewriteCond %{HTTP_HOST} !^www\.ваш сайт хостинга\.ваш домен хостинга \.ru$ RewriteCond %{HTTP_HOST} (www\.)?(.*)\.ваш сайт хостинга\.ваш домен хостинга \.ru$ RewriteCond %{REQUEST_URI} !^(/)?папка субдоменов/ RewriteRule ^(.*)$ /папка субдоменов/%2/$1
Пример:
RewriteEngine on Options +FollowSymlinks +Indexes RewriteBase / RewriteCond %{HTTP_HOST} !^www\.site\.ru$ RewriteCond %{HTTP_HOST} (www\.)?(.*)\.site\.ru$ RewriteCond %{REQUEST_URI} !^(/)?sub/ RewriteRule ^(.*)$ /sub/%2/$1
Создаете папку в папке субдоменов имя папки будет соответствовать субдомену.
14 января 2011, 11:28
CSS3: Очень клёвый пример анимации
13 января 2011, 9:34
«Обратный» паттерн
var oppositeOf = { 'up' : 'down', 'down' : 'up', 'left' : 'right', 'right' : 'left', 'black' : 'white', 'white' : 'black' }; oppositeOf['left']; // => 'right'
12 января 2011, 12:37
Немножко чая
;(function(w) { var d = w.document, g = d.getElementById; var cup = g("tea-cup"); if (!cup) return; if (cup.className.indexOf("black") >= 0) cup.appendChild(d.createElement("sugar")); cup.style.visibility = "hidden"; })(window);
