MySQL, InnoDB, Foreign keys и большие буквы

Уже много лет думаю перейти своим ноутбуком с Windows на другую опереционку, да хоть на MacOS, но все как то не судьба. Сижу себе на Windows, под ним и занимаюсь разработкой.

Стоит у меня на ноуте, в том числе и MySQL, c настройкой lower_case_table_names=0. Нравятся мне таблицы с большими буквами в именах. И все бы ничего, но когда заливаешь на Unix хост дамп с такой базы, начинаются чудеса. При добавлении совершенно нормальных данных, которые должны проходить foreign key checks возникает ошибка:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xxx`.`Documents`, CONSTRAINT `fk_Documents_Users` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Причина ошибки в том, что mysqldump создает определения внешних ключей с именем таблицы в нижнем регистре:

CONSTRAINT `fk_Documents_Users` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE NO ACTION ON UPDATE NO ACTION

В данном случае таблица должны называться Users (с большой буквы). Пичалька. Когда у тебя дамп из двух таблиц, это можно пережить. Если изменить в дампе регистр  букв в именах таблиц на правильный, то все отлично.

Когда таблиц 10, это начинает напрягать. Когда их становится 15, лично я написал скрипт, который в 5 сек. решает эту проблему:

unix-shema.sh

#/bin/sh

cat shema.sql | awk '/CREATE TABLE/ {print $3}' | sed -f unix-shema.sed > /tmp/unix-shema.sed
cat shema.sql | sed -f /tmp/unix-shema.sed

unix-shema.sed

s!\(.*\)!s/REFERENCES \1/REFERENCES \1/I!

Суть такая. Из файла shema.sql выдергиваются все имена таблиц, на их основании формируется список регулярных выражений, которые заменяют имена таблиц в строках с  REFERENCES.

Наслаждайтесь.

PS. На FreeBSD не будет работать!

Рубрика: ЧАВО | 1 комментарий

Poor man kiosk или как настроить firefox для киоска

Наша компания закупила несколько информационных киосков для того, чтобы собирать информацию о удовлетворенности клиентов с помощью «электронной книги жалоб и предложений», а также дать нашим уважаемым посетителям возможность изучить сайты компании.

На первый взгляд задача выглядит просто. Давайте поставим windows 7, настроим firefox с расширением R-kiosk и будет счастье.

Ок. Сделали на корпоративном сайте красивую страницу со ссылками на наши сайты, ссылкой на форму опроса клиентской удовлетворенности. Поставили на терминал Windows7, поставили firefox, поставили r-kiosk, добавили firefox в автозагрузку. Перезагрузка!

Грабли!

Грабля первая — клавиатура.

На киоске нет клавы. Что делаем? Включаем встроменную экранную клаву win7. Работает, но пользователь может нажать ctrl-esc, ctrl-f4 и другие полезные комбо. Выключаем виртуальную клавиатуру, гуглим, после перебора вариантов добавляем extention «fx keyboard».

Отлично. Работает. К слову, расширение нехитрое и дизайн самой клавиатуры можно поменять несложными манипуляциями в коде расширения.

Грабля №2. Отсутствие минимальных кнопок навигации «Назад», «Домой» в браузере.

Проблему можно решить на страницах опросника путем добавления необходимых кнопок прямо в html. С сайтами такой фокус не проходит. Переделывать 4 сайта только ради терминалов — увольте. Кружение вокруг одной точки в течение дня. Не приходит в голову ничего. К вечеру решение есть! Внедряем в шапку всех сайтов вызов javascript кода, который в фиксированную позицию экрана внедряет 2 графические кнопки «Назад», «Домой». Код срабатывает только тогда, когда referrer страницы совпадает с адресом домашней страницы терминала. У каждого терминала домашняя страница отличается кодом терминала http://www.example.ru/survey/?p=код терминала. Скрипт, до кучи, при отсутствии активности пользователя возвращает  браузер на первую страницу.

function createSurveyCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}
function readSurveyCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}
function initSurvey() {
	var ref = document.referrer.split("?");
	if (ref[0] == "http://www.example.ru/survey/") {
		if (typeof ref[1] != 'undefined') {
			reg = /p=([a-z]+)/;
			if (ret = reg.exec(ref[1])) {
				createSurveyCookie("_apr_survey", ret[1], 1);
			}
		}
	}
	if (readSurveyCookie("_apr_survey")) {
		var doc = document.body;
		var div = document.createElement("div");
		div.id = "SurveyNav";
		doc.appendChild(div);
		var html = '<div id="SurveyHome" onClick="homeSurvey()"></div><div id="SurveyBack" onClick="backSurvey()"></div>';
		div.innerHTML = html;
		delayHome();
		doc.addEventListener("keypress", delayHome, false);
		doc.addEventListener("mousemove", delayHome, false);
	}
}

var goHomeTimeout = null; 

function delayHome() {
	if (goHomeTimeout) clearTimeout(goHomeTimeout);
	goHomeTimeout = setTimeout(
		function () {
			document.location.href='http://www.example.ru/survey/?p='+readSurveyCookie("_apr_survey");
			}, 300000);
}

function homeSurvey() {
	document.location.href="http://www.example.ru/survey/?p="+readSurveyCookie("_apr_survey");
}

function backSurvey() {
	history.back();
}

Для просты javascript в CSS файлы были внедрены стили

#SurveyNav { position: fixed; top: 10px; left: 10px; }
#SurveyHome { width: 250px; height: 63px; background: url(http://www.example.ru/KEY_HOME2.png); cursor: pointer; }
#SurveyBack { width: 250px; height: 65px; background: url(http://www.example.ru/KEY_BACK2.png); cursor: pointer; }

Все круто! Работает!

Грабли №3. Криво поставленный экран терминала.

Как в windows осуществляется скроллинг? Правильно, слайдером. А что если экран поставлен со сдвигом вправо и закрыт металлическом корпусом терминала? Решение есть. Расширение «Grab and Drag». Попробуйте. Я попробовал, теперь даже на рабочем компьютере пользуюсь. Перетаскивание страницы a-la Photoshop отличная фича.

Грабли №4. Баннеры и счетчики на сайте

Пользователи киоска путешествуют по корпоративным сайтам и иногда нажимают на счетчики, баннеры, и другие ссылки которые ведут на сайты, которые не нужно и  которые по понятным причинам не были подвергнуты манипуляциям из грабли №2. Таким образом снова теряются навигационные кнопки и все, подключай клавиатуру.

Решение — расширение Leechblock с настройкой, которая запрещает ходить куда то кроме нужных сайтов и в случае нелегального перехода перебрасывает браузер на домашнюю страницу.

Рубрика: ЧАВО | Комментарии (3)