Показаны сообщения с ярлыком история успеха. Показать все сообщения
Показаны сообщения с ярлыком история успеха. Показать все сообщения

четверг, 16 февраля 2012 г.

Обработка нажатий вложенного div в javascript

Недавно встала задача по обработке событий onClick для 2-х div'ов - один вложен в другой. Пример:

Мне нужно было обрабатывать нажатия по коричневому div'у (который был вложен в синий div) так, чтобы onClick для синего div'а не срабатывал. Мне помог этот тред на javascript.ru.

Ну и вот пример:

 
<div id="parent" style="width: 200px;height:200px;background-color: #0000aa;">
    <div id="nested" style="width:100px; height:100px; background:#CC6600;">
    </div>
</div>
<script>
    $("#parent").click(function() {alert("parent");});

    $("#nested").bind("click", function(e) {
        alert('nested');
        stop_bubbling(e);
    });
    
    function stop_bubbling(e) {
        if (e.stopPropagation) e.stopPropagation();
        else e.cancelBubble = true;
    }
</script>

среда, 30 марта 2011 г.

Сказ о том, как из ПК часы делались

Как-то в этом месяце, на работе, было принято решение повесить в цехе красивые часы, которые будут показывать единое время для работников цеха, и оповещать их сигналом о началах и окончаниях перерыва. Занимались этим я и MAG_delta.Деньги были выделены, комплектующие были куплены, и тут началось самое интересное...

Сборка ПК

При сборке были использованы следующие комплектующие:
  • Мат. плата ASUS "AT3IONT-I Deluxe"
  • Дешевый 23" монитор от Samsung, собранный в России
  • Простенький корпус mini-ITX
  • VESA крепление для монитора
  • харды, CD-ROM'ы, периферия, прочее...

Монитор

Небольшие проблемы начались с самого начала. Приступив к осмотру пришедшего монитора, был обнаружен небольшой дефект: отверстия для крепления в корпусе были неправильно пробиты (как казалось). Сначала MAG_delta попробовал пробить новые отверстия, и это даже получилось. Отверстия пробиты, все довольны, вроде, можно приступить к следующему шагу. Но не тут-то было :) Оказалось, что если потрясти монитор, там весело что-то гремит. Посмотрев еще раз на заднюю крышку монитора, мы обнаружили, что с внутренней стороны отвалилось одно крепления для VESA держалки. Было решено разобрать монитор и посмотреть, что там за фигня происходит. Монитор не стал быстро сопротивляться и мы увидели красиво запечатанный в металл экран монитора. Очень понравилось. В общем, проблема была решена, железка для крепления приделано обратно, все довольны, монитор собран почти без повреждений (не считая утопленной вглубь лампочки питания). В общем, слава Российской сборке! На этом проблемы с монитором закончились. Начался следующий этап...

VESA крепление

Предыстория: так как в нашем любимом Ф-центре мы VESA креплений не нашли, то было решено купить его перед поездкой на работу. Приехав на савок, не долго ища, мы нашли магазин "Другой Мир" (или как-то так), в котором был богатый выбор креплений. Не долго думая, было решено купить самое-самое большое крепление, чтобы хоть одно из отверстий подошло. А продавец всё хотел втюхать какое то маленькое. Убедив продавца, что нам отлично подойдёт именно самое большое, купили его и поехали на работу )
Приехав на работу, и помучившись с монитором, мы взялись за крепление. И тут всё началось с fail'а - крепление, внезапно, оказалось слишком большим, и закрывало отверстие для VGA кабеля и кабеля питания. В общем, пришлось идти в цех и просить отрезать лишнюю часть крепления. Заодно, показали куда это всё надо вешать. В итоге, крепление было красиво отрезано и хорошо прикручено. На чем эпопея с ним закончилась. Параллельно с этим мы занимались установкой и настройкой системного блока...

Системный блок

Тут началось самое интересное. Был распакован маленький mini-ITX корпус, безжалостно вынут оттуда встроенный блок питания. Была распакована маленькая mini-ITX материнская плата, которая выглядела очень заманчиво, на первый взгляд. Было всё это собрано, подключен НЖМД на 500Гб от сигейта, CD-ROM для установки, 2Гб памяти (меньше не было :) ), включен внешний блок питания для материнской платы, и всё было к решительному моменту включения. Кнопка включения была нажата и... 0 реакции. Еще раз - тот же результат. Пришлось задуматься, что бы это могло быть. Через некоторое время раздумий мы решили, что не хватает питания. Было решено отключить жёсткий диск, оставить только CD-ROM. Со второго раза всё включилось и... вся серверная провоняла первым за этот день убитым CD-ROM'ом. Немного почесав в затылке, было решено проверить всё это на еще одном CD-ROM'е. Скажу сразу, это была плохая идея, так как серверная снова провоняла горелой проводкой. Прошло еще немного времени, мы уже вовсю прорабатывали метод установки ОС с флешки на флешку, возможность использования старого-древнего компа уже, на крайний случай, но MAG_delta было мало - он решил убить еще и жесткий диск :) Хитро подключив питание во время работы злополучного компа, это ему удалось. Так кровожадная материнка приняла очередную, и последнюю, жертву. Мы перешли к следующему шагу...

Установка ОС

Установить на эти кровожадные часы-убийцу было решено самый знакомый и близкий мне дистрибутив - AgiliaLinux. Также он поддерживает легкую установку на флешку, что было очень важно для нас. Так как флешка была всего одна (и та - моя), наш хитрый план был примерно таким: записать установщик на флешку, загрузиться с неё, установить Агилию на эту же флешку, дальше - по обстоятельствам. Внезапно, оказалось, что всё это вполне реально и возможно, и даже работает. Загрузившись с флешки, мы смогли лицезреть приглашение логина. Теперь немного о программной части...

Программное обеспечение

Для самого показа часов было испробовано множество вариантов, даже conky, но мы остановились на xdaliclock, который был в репозитории (правда, только для 64-х битного варианта, но собрать пакет - дело не долгое). Были подобраны опции запуска, настроен автостарт. При помощи пользователя "medved" jabber конференции agilialinux был быстро настроен автовход в иксы под нужным пользователем, в общем, всё это само запускалось и работало. Дальше, мы собрали вместе системный блок, монитор, кучу проводов и ИБП и понесли всё это в цех.

Сборка всего вместе и установка

Придя на место, мы еще раз подивились красиво установленному и отрезанному креплению, водрузили туда монитор, поставили в соседнее помещение системник с ИБП, соединили всё это и включили... загрузка пошла, как это не удивительно :) AgiliaLinux загрузился, но максимальное разрешение экрана было - 1024х768. Как оказалось, проблема была в предварительно заказанном VGA кабеле, который брался "с запасом". В общем, его длина была 30 метров, это говорит само за себя). Плюнув на это дело, поставили разрешение (пришлось бегать за клавой-мышью) 800х600, чтобы наверняка, поправили параметры запуска часов и взялись за протягивание сетевого кабеля. Но через 10 минут было обнаружено, что благодаря настройкам энергосбережения монитор выключается сам через эти самые 10 минут. В спешке настроив сеть, я записал магические строчки

xset s off &
xset -dpms &
xset s noblank &

в autostart.sh, и эту проблему тоже удалось решить. На этом можно считать первую часть настройки компочасов оконченной. Ждите новостей на следующей неделе.

Итоги

В итоге, потратив не более 8 часов, нам удалось собрать, настроить и установить отличные часы, которые синхронизируются с ntp сервером каждый час, показывают большое, видно на всей территории цеха, время, поддерживают удаленное управление и предоставляют кучу других возможностей. Причем всё это собрано в компактном, бесшумном корпусе (из движущихся частей - только маленький кулер на корпусе, который почти не шумит).
Из еще не решенных задач: создание аудио оповещений, доработка часов под себя.

"Слайды" :)







С этими, некоторыми другими фото Вы можете ознакомиться по этой ссылке :)

понедельник, 14 марта 2011 г.

Эффективное управление вебкамерой с использование motion + bluetooth

"Everything is better with bluetooth" (c) The Big Bang Theory.

Предисловие

Для наблюдения за посещением серверной я уже больше года использую отличную программу motion. Единственная сложность, возникающая при использовании - не забыть выключать видеонаблюдение при входе в серверную и включать при выходе из серверной (что делалось по ssh). Недавно мне это надоело, тем более, что под руку попал USB донгл с bluetooth.

Немного магии shell

после этого меня посетила интересная мысль. Так как я и мой друг и напарник в одном лице mag_delta (спасибо ему за техническую базу :) ) имеем телефоны с поддержкой bluetooth, то почему бы не сделать автоматическое включение камеры, когда оба наших устройства находятся вне области доступности, и автоматическое выключение, как только мы в ней появляемся? Реализовать это все было задумано на bash. В общем, после пары минут написания и тестирования, я написал вот такой простенький скрипт:


#!/bin/sh
#Переменная,в которой хранится предыдущее состояние (в серверной мы или нет)
HERE=0
#Бесконечный цикл
while [ 1 -eq 1 ]; do
#Сканирование на предмет наличия наших телефонов
hcitool info XX:XX:XX:XX:XX:XX > /dev/null
V1RUS=$?
hcitool info XX:XX:XX:XX:XX:XX > /dev/null
MAG=$?
#В случае, если хоть один из телефонов в области досигаемости
if [ $V1RUS -eq 0 -o $MAG -eq 0 ] ; then
#Выводим на stdout сообщения...
echo "HE IS HERE"
if [ $V1RUS -eq 0 ] ; then
echo "V1RUS HERE"
fi
if [ $MAG -eq 0 ] ; then
echo "MAG HERE"
fi
#И, если предыдущее состояние равно нулю (нас здесь не было, а теперь появились), то убиваем motion, останавливая видеонаблюдение
if [ $HERE -eq 0 ]; then
echo "Stopping motion..."
killall motion
fi
#Устанавливаем переменную в значение 1 (мы здесь)
HERE=1
else
#Тоже самое, только включаем motion, если мы перед этим здесь были
echo "HE IS NOT HERE"
if [ $V1RUS -eq 1 ] ; then
echo "V1RUS NOT HERE"
fi
if [ $MAG -eq 1 ] ; then
echo "MAG NOT HERE"
fi

if [ $HERE -eq 1 ]; then
echo "Starting motion..."
motion
fi
HERE=0
fi
#Для избежания разных неприятных эффектов, устанавливаем интервал сканирования в примерно 10 секунд.
sleep 10
done


Итого:

Этот простой скрипт, хоть и написан в спешке, может быть сколь угодно расширен (например, можно добавлять данные о посещаемости в БД :)), а также он экономит кучу времени и нервов. Надеюсь, он кому-нибудь пригодится.

PS.

Вы можете спросить, почему используется hcitool info MAC_ADDRESS, а не hcitool scan? Ответ прост: bluetooth на телефоне может быть в скрытом режиме, и hcitool scan его не обнаружит, в то время как hcitool info найдет его.

пятница, 14 января 2011 г.

ISPManager session save path

Если вдруг при использовании ISPManager и PHP в режиме CGI (FastCGI) скрипты будут ругаться на невозможность записать сессию:

[Fri Jan 14 20:33:36 2011] [warn] mod_fcgid: stderr: PHP Warning: Unknown: open(/var/lib/php/session/sess_dfb2m61u4ugabc729c3pl8ioc4, O_RDWR) failed: Permission denied (13) in Unknown on line 0
[Fri Jan 14 20:33:36 2011] [warn] mod_fcgid: stderr: PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0
[Fri Jan 14 20:33:36 2011] [warn] mod_fcgid: stderr: PHP Warning: session_start() [function.session-start]: open(/var/lib/php/session/sess_dfb2m61u4ugabc729c3pl8ioc4, O_RDWR) failed: Permission denied (13) in /var/www/xxx/yyy.php on line 2

То в файле /etc/php.ini надо закомментировать строку

session.save_path = /var/lib/php/session/

После этого надо перезапустить веб сервер, и всё заработает.

вторник, 5 октября 2010 г.

Redmine

Пару недель назад внедрил redmine для управления небольшим проектом и учетом багов. Пока всё очень нравится - "из коробки" руссифицированный интерфейс, тикеты создаются понятным для простых людей способом. Неплохие инструменты для администрирования. Единственный минус - redmine на ruby, который я знаю чуть-менее, чем никак. Поэтому возможности по расширению минимальны.

суббота, 19 июня 2010 г.

Оптимизация таблиц MySQL

Сегодня решил еще раз посмотреть на запрос в электронном офисе, выполняющийся пару минут. Решил посмотреть профилировщиком, что же там так долго выполняется. В общем, вспомнил я что-то про индексы. Сделав столбцы, используемые при выборке (WHERE XXX или LEFT XXX ON XXX.Y = YYY.Z) индексными, я получил прирост более 9000% производительности. Если раньше запрос выполнялся 84.68 сек. на моем Core 2 Quad, то теперь он выполняется всего 0.22 сек!

После этого случая я подумал, что надо будет всё-таки посмотреть пару книжек о MySQL. )

PS. Еще я наконец-то почти портировал его на Linux (Осталось сделать работу выгрузки файлов).

четверг, 15 апреля 2010 г.

sshfs

Недавно вспомнил, что давненько хотел посмотреть на sshfs. Первое что попалось - этот мануал. Собственно, оказалось, что sshfs прост в установке и импользовании. Испытав это чудо, решил, что больше не вернусь к Filezilla :)