заметки на полях

Блокнот разработчика

Archive for the ‘неразобранное’ Category

MySQL различные UTF – utf8_bin и utf8_general_ci

Чем же отличаются эти два collate для таблиц?
utf8_bin – использует сравнения по двоичным значениям каждого символа
utf8_general_ci – использует сравнения на основе языковых особенностей и игнорирует регистр символов.

Для наглядности приведем небольшой эксперимент.

CREATE TABLE  peoples (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
first_name VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
last_name VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) ENGINE = INNODB CHARACTER SET utf8;

INSERT INTO  peoples (first_name, last_name) VALUES ('Петя',  'Иванов'), ('андрей',  'иванов'), ('Иван',  'Петров'), ('Андрей',  'Сидоров');
INSERT INTO  peoples (first_name, last_name) VALUES ('Петр',  'Большой'), ('Пётр',  'Большои');

Read more »

перебор options в Interner Explorer

При использовании цикла for(i in ...) для перебора элементов списка вида

<select name="city" id="city-list">
    <option value="1">Москва</option>
    <option value="2">Домодедово</option>
</select>

таким вот образом

var obj = document.getElementById("city-list");
for (i in obj.options) {
    if (obj.options[i].value == ...) {
        ...
    }
}

в ишаке получаем ошибку. Переваривается только такой вариант

var obj = document.getElementById("city-list");
for (i = 0; i < obj.options.length; i++) {
    if (obj.options[i].value == ...) {
        ...
    }
}

Неплохая статья на тему работы со списками: Javascript SELECT – динамические списки

Дэбианщики шутят )


Всякого, кто использует этот апплет, нужно отправлять на психиатрическое обследование.

YUI 2 Dom setAttribute в Interner Explorer

В YUI 2 метод YAHOO.util.Dom.setAttribute() не работает для элементов созданных посредством DOM во всех версиях Interner Explorer (от 6 до 8), например так будет ошибка:

var button = document.createElement("button");
YAHOO.util.Dom.setAttribute(button, "type", "button");

для задания необходимо пользоваться стандартными методами DOM:

var button = document.createElement("button");
button.setAttribute("type", "button");

Причем остальные методы кроме setAttribute отрабатывают нормально:

var button = document.createElement("button");
YAHOO.util.Dom.addClass(button, "ok-button");
YAHOO.util.Dom.setStyle(button, "margin", "1em");

Установка Redmine на Ubuntu

Решил попробовать что-то отличное от trac для управления проектами. Выбор остановился на redmine. Поднималась для себя как единственного пользователя и на локальной машине, поэтому пока не стал заморачиваться загонять под nginx (стандартные процедуры установки предлагают поставить модулем apache, а у меня его нет).
Read more »

Локальный postfix c релеем на GMail

Почтовые сервера категорически не хотят принимать письма с локальной машины, из-за отсутствия обратной зоны и даже не кладут эти письма в спам – мочат на корню. Решил использовать GMail в качестве SMTP а для отправки postfix. Приступим.
Read more »

Вирус требующий SMS

Принес мне товарищ ноутбук с вирусом, который при загрузке блокирует все действия и требует отправить SMS для разблокировки. Ну вещь вроде бы довольно распространенная в последнее время, а переустанавливать все заново было жалко времени – решил полечить. Read more »

Список городов по странам и регионам

В архиве дамп трех табличек:

  • страны
  • регионы (с привязкой к стране)
  • города (с привязкой к региону и стране)

Кодировка файла UTF-8. Размер архива 4,7Мб. Забирать здесь.

После заливки желательно прицепить ключи:

ALTER TABLE region ADD constraint fk_region_ref_country FOREIGN KEY (country_id) REFERENCES country (id) ON DELETE restrict ON UPDATE cascade;
ALTER TABLE city ADD constraint fk_city_ref_region FOREIGN KEY (region_id) REFERENCES region (id) ON DELETE restrict ON UPDATE cascade;
ALTER TABLE city ADD constraint fk_city_ref_country FOREIGN KEY (country_id) REFERENCES country (id) ON DELETE restrict ON UPDATE cascade;

Как float зависит от локали?!

На такой казалось бы элементарный вопрос далеко не тривиальный ответ, и столкнувшись с ним может пострадать не один монитор или клавиатура от нелепости ситуации, мне повезло – я вовремя нагуглил правильный ответ :) Теперь собственно к делу. Вот код и ожидаемый результат его выполнения:

$float = "3.14";
echo $float; // 3.14
echo floatval($float); // 3.14

У меня же получился другой вариант, от которого я честно говоря подвис:

$float = "3.14";
echo $float; // 3.14
echo floatval($float); // 3,14

Выяснилось что результат зависит от установки локали, у меня стояло: setlocale(LC_ALL, "ru_RU.UTF8"); пока остановился на таком варианте:

setlocale(LC_CTYPE, "ru_RU.utf8");
setlocale(LC_TIME, "ru_RU.utf8");

PHP у меня 5.2.10, а баг сей я так понимаю тащится аж с 2002 года версии 4.3.0 RC2: Bug #17079 setlocale changes the internal representation of floats

Перевод сайта c cp1251 на UTF-8

Для начала перевести БД из cp1251 в utf8.
Сделать дамп mysqldump -u svd -n --skip-opt --skip-set-charset --triggers --disable-keys svdev > dump.sql – получится чистый дамп без упаминания кодировок, можно получить отдельно данные: mysqldump -u svd -nt --skip-opt --skip-set-charset --disable-keys svdev > data.sql, поменять кодировку полей в схеме, вместо:

name varchar(64) character SET cp1251 NOT NULL

сделать

name varchar(64) character SET utf8 NOT NULL

или же убрать упоминание кодировки из полей вовсе:

name varchar(64) NOT NULL

так как при установке правильной кодировки для БД кодировки для текстовых полей создаваемых таблиц будут устанавливаться верно сами, затем изменить кодировку самой БД:

ALTER DATABASE svdev DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

и залить назад в обратном порядке – сначала структуру, затем данные.
Следующим шагом необходимо изменить кодировку файлов, для этого я набросал простенький скрипт (подключаемые библиотеки которые трогать не надо – типа tiny просто вынес сначала из проекта, а затем вернул обратно: Read more »