/var/log/life.log

Блог программиста из солнечной Бурятии

Небезопасные расширения

С бесплатными расширениями есть одна проблема: можно пользоваться ими уже несколько лет доверять им. А потом разработчик решает начать зарабатывать на них сомнительными способами, модерации там особой на этот счёт я так понимаю нету. Так случилось с History Calendar для хрома. Вчера обнаружил, что он начал инжектить какие то левые скрипты трекинга и подмены рекламы. Заблочил их через Adblock.

vpn

Давно собирался поднять vpn на digitalocean, на всякий случай, чтобы было. Но всё руки не доходили. А тут что-то гугловское расширение для экономии трафика перестало обходить блокировки билайном рутрекера. Пришлось настраивать. На хабре хорошая инструкция по настройке.

Загрузка модели каталога из админского контроллера в opencart

На самом деле такое сделать без грязных хаков нельзя. Но можно пойти другим путём. Эта необходимость возникает, если нет желания дублировать и поддерживать код, который должен и с админской стороны и с фронтэнда отрабатывать. В opencart же загрузка моделей зависит от контекста, в котором происходит исполнение и $this->load->model('checkout/order'); в одном случае загрузит модель, в другом выдаст ошибку. Чтобы не дублировать код его нужно вынести в библиотеку, которая при необходимости будет проксировать запросы к ядерным моделям, в зависимости от контекста.
Читать полностью »

AutoHotKeys

Чтобы не потерять.
Переключение раскладки по CaspLock:

1
2
3
4
5
SetCapsLockState, AlwaysOff
+CapsLock::CapsLock

Capslock:: Send {Shift Down}{Alt Down}{Shift Up}{Alt Up}
return

Отключение кнопки NumLock и стрелок на нём:

1
2
3
4
5
6
7
SetNumLockState, AlwaysOff
NumpadUp::return
NumpadLeft::return
NumpadRight::return
NumpadDown::return
NumpadDel::return
NumpadIns::return

Вирусный спам на drom.ru

После размещения объявления на drom.ru начали приходить смс такого вида: "Николай, подмена вашему подходит, xxx.com по объявлению я".
wget'ом перекидывало на авито и google, если представиться IE6 (для IE 8 ничего не происходило), то перекинет на фишинговую страницу вконтакте. Если же с андроида, то на страницу загрузки apk под видом mms. Домены были зарегистрированы на китайскую компанию. Уже не открываются. Сегодня пришла уже более адекватная смс: Читать полностью »

Плюсы частного дома

Вас не может затопить сосед сверху. Минусы - можно по весне убрать снег с крыши, убрать снег из ограды, и получить из под бетонного основания забора потоки воды сначала от соседа сзади, ликвидировать их. А после потоп от соседа слева, по сравнению с которым предыдущий был просто ручейком. Надо будет предпринять меры, для предотвращения подобных неприятностей.

DHTMLX/scheduler и проблема 7 января hot fix

Описание проблемы http://habrahabr.ru/post/239423/
Толи фикс уже вышел, то ли нет, но сейчас поведение такое.

1
2
3
4
5
Tue Jan 06 2015 00:00:00 GMT+0800 (RTZ 7 (зима))
new Date(2015, 0, 7);
Wed Jan 07 2015 01:00:00 GMT+0900 (RTZ 7 (лето))
new Date(2015, 0, 8);
Thu Jan 08 2015 00:00:00 GMT+0900 (RTZ 7 (лето))

Что вызывает проблемы в методе увеличения даты в календаре.
У нас же календарь отказался уже 15 декабря работать, из-за особенностей реализации.
hot fix - перезаписать метод добавления времени в init методе
К оригиналу добавлено сравнение таймзон

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
scheduler.date.add=function(date, inc, mode){
            var ndate=new Date(date.valueOf());
            switch(mode){
                case "week":inc*=7;
                case "day":
                    ndate.setDate(ndate.getDate()+inc);
                    !date.getHours() && ndate.getHours()
                    && date.getTimezoneOffset()==ndate.getTimezoneOffset()
                    && ndate.setTime(ndate.getTime()+60 * 60 * 1000 *(24-ndate.getHours()));break;
                case "month":ndate.setMonth(ndate.getMonth()+inc);break;
                case "year":ndate.setYear(ndate.getFullYear()+inc);break;
                case "hour":ndate.setHours(ndate.getHours()+inc);break;
                case "minute":ndate.setMinutes(ndate.getMinutes()+inc);break;
                default:return scheduler.date["add_"+mode](date, inc, mode)}
                return ndate;
        }