Есть у меня простая табличка в ORACLE, в которой есть 2 поля: ИД и BLOB (картинка в PNG). Понадобилось отображать эту картинку на клиенте (Delphi XE3). Погуглив, нашел подходящий вариант, доработал под себя и вот что получилось:
вівторок, 27 грудня 2016 р.
субота, 27 серпня 2016 р.
Raspberry Pi, датчик движения и отправка смс через Twilio
Появилось свободное время, которое я решил потратить на Raspberry Pi. Пару месяцев назад, я уже пробовал фиксировать движение с помощью датчика, подключенного к малине. О проблеме, которая возникла в тот момент я написал в блоге. Сейчас, я решил продолжить развивать эту тему и прикрутить смс оповещение в момент срабатывания датчика. Погуглив, я нашел сайт Twilio, который предоставляет бесплатный вариант отправки смс на верифицированный номер.
Далее я зарегистрировался на сайте, прошел верификацию своего номера, получил триальный номер Twilio и закачал пакет для работы с Twilio:
Также в интернете нашел пример работы с Twilio, который соединил вместе с кодом для работы с датчиком, внес кое-какие свои корректировки и вот что получилось:
Смс приходит следующего вида:
Sent from your Twilio trial account
- Some movement. Time: 2016-08-27 16:34:09
Фото процесса:
Далее я зарегистрировался на сайте, прошел верификацию своего номера, получил триальный номер Twilio и закачал пакет для работы с Twilio:
sudo pip3 install twilio
Также в интернете нашел пример работы с Twilio, который соединил вместе с кодом для работы с датчиком, внес кое-какие свои корректировки и вот что получилось:
Смс приходит следующего вида:
Sent from your Twilio trial account
- Some movement. Time: 2016-08-27 16:34:09
Фото процесса:
понеділок, 22 серпня 2016 р.
Pythonchallenge №10
Продолжаю изучать Python и пробую выполнять задачки с его помощью. На этот раз сайт pythonchallenge.com задание номер 10.
Суть задания заключается в нахождении длины 30-го элемента списка. Также даны начальные элементы последовательности, которую надо продолжить:
Понять алгоритм, по которому строится список мне помог гугл и википедия: https://en.wikipedia.org/wiki/Look-and-say_sequence
В википедии, я обратил внимание на вот этот абзац:
"No digits other than 1, 2, and 3 appear in the sequence..."
и согласно этому ограничению написал свой алгоритм решения этой задачи:
Суть задания заключается в нахождении длины 30-го элемента списка. Также даны начальные элементы последовательности, которую надо продолжить:
a = [1, 11, 21, 1211, 111221,
Понять алгоритм, по которому строится список мне помог гугл и википедия: https://en.wikipedia.org/wiki/Look-and-say_sequence
В википедии, я обратил внимание на вот этот абзац:
"No digits other than 1, 2, and 3 appear in the sequence..."
и согласно этому ограничению написал свой алгоритм решения этой задачи:
середа, 17 серпня 2016 р.
Projecteuler проблема №5
Недавно начал изучать Python и нашел интересный сайт с задачками, которые пробую решать с помощью Python.
Решил выложить свой вариант решения проблемы №5:
По поводу сайта https://projecteuler.net/problem=N: для перехода к новому заданию меняем N на номер "проблемы"
Решил выложить свой вариант решения проблемы №5:
По поводу сайта https://projecteuler.net/problem=N: для перехода к новому заданию меняем N на номер "проблемы"
неділя, 31 липня 2016 р.
Как убрать метод ввода РУС-US в windows 10
У меня данная проблема проявилась при удаленном подключении к моему рабочему компьютеру. Вот как она выглядит:
Добавляя и удаляя разные языки в панели инструментов ни к чему не привели. Погуглив я нашел вот такое решение:
В регистре, в [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] добавить ключ "IgnoreRemoteKeyboardLayout"=dword:00000001
Добавляя и удаляя разные языки в панели инструментов ни к чему не привели. Погуглив я нашел вот такое решение:
В регистре, в [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] добавить ключ "IgnoreRemoteKeyboardLayout"=dword:00000001
середа, 30 березня 2016 р.
Определяем блокирующие сессии
Запрос не мой. Помогает, если не могу скомпилировать пакет - находим блокирующую сессию и киляем ее. Вылаживаю, что бы был под рукой.
select distinct orakill from (
select
/*+ ordered */
w1.sid waiting_session,
h1.sid holding_session,
w.kgllktype lock_or_pin,
w.kgllkhdl address,
(
select 'ALTER SYSTEM DISCONNECT SESSION ''' || s.SID || ',' || s.SERIAL# || ''' IMMEDIATE;' sqll1
from v$session s , v$process p
where s.PADDR=p.ADDR and s.sid = h1.sid
) orakill,
decode (h.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown' ) mode_held,
decode (w.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown' ) mode_requested
from dba_kgllock w,
dba_kgllock h,
v$session w1,
v$session h1
where ( ( (h.kgllkmod != 0)
and (h.kgllkmod != 1)
and ((h.kgllkreq = 0)
or (h.kgllkreq = 1)) )
and ( ((w.kgllkmod = 0)
or (w.kgllkmod = 1))
and ((w.kgllkreq != 0)
and (w.kgllkreq != 1)) ) )
and w.kgllktype = h.kgllktype
and w.kgllkhdl = h.kgllkhdl
and w.kgllkuse = w1.saddr
and h.kgllkuse = h1.saddr
)
select distinct orakill from (
select
/*+ ordered */
w1.sid waiting_session,
h1.sid holding_session,
w.kgllktype lock_or_pin,
w.kgllkhdl address,
(
select 'ALTER SYSTEM DISCONNECT SESSION ''' || s.SID || ',' || s.SERIAL# || ''' IMMEDIATE;' sqll1
from v$session s , v$process p
where s.PADDR=p.ADDR and s.sid = h1.sid
) orakill,
decode (h.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown' ) mode_held,
decode (w.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown' ) mode_requested
from dba_kgllock w,
dba_kgllock h,
v$session w1,
v$session h1
where ( ( (h.kgllkmod != 0)
and (h.kgllkmod != 1)
and ((h.kgllkreq = 0)
or (h.kgllkreq = 1)) )
and ( ((w.kgllkmod = 0)
or (w.kgllkmod = 1))
and ((w.kgllkreq != 0)
and (w.kgllkreq != 1)) ) )
and w.kgllktype = h.kgllktype
and w.kgllkhdl = h.kgllkhdl
and w.kgllkuse = w1.saddr
and h.kgllkuse = h1.saddr
)
Пересоздание отключенного триггера включает его
Сегодня столкнулись с проблемой - начала выполняться лишняя проверка. Оказалось, что проверка выполнялась в триггере, который уже очень давно был disable, а сейчас он enable. Посмотрели по логам: один из наших программистов внес изменения в функцию и решил везде, где вызывается эта функция внести те же изменения. Поиск всех мест вызовов он проводил через поиск в PL/SQL Developer. Наш триггер тоже попал в результаты поиска. Проблема только в том, что в окне поиска PL/SQL Developer не пишется, что триггер отключен. И вот, он открыл на редактирование триггер с формы поиска, внес корректировки и нажал F8 (компил). После этого триггер стал enable.
По-умолчанию триггеры создаются сразу включенными. Только после создания их статус можно поменять через ALTER TRIGGER. Начиная с 11 версии Оракла можно явно, при создании, задавать в каком статусе будет создан этот триггер.
Наш триггер начинался с текста:
CREATE OR REPLACE TRIGGER ...
И оказывается, что при REPLACE также происходит включение триггера.
По-умолчанию триггеры создаются сразу включенными. Только после создания их статус можно поменять через ALTER TRIGGER. Начиная с 11 версии Оракла можно явно, при создании, задавать в каком статусе будет создан этот триггер.
Наш триггер начинался с текста:
CREATE OR REPLACE TRIGGER ...
И оказывается, что при REPLACE также происходит включение триггера.
вівторок, 22 березня 2016 р.
Второй раз запрос выполняется намного дольше первого или Cardinality feedback
Недавно столкнулся с проблемой, когда запрос первый раз выполняется за 1 секунду, а второй и последующие разы за 30 секунд. Если добавить пробел или поменять регистр любой буквы в запросе, что бы oracle вновь сделал парсинг - то запрос снова выполняется за 1 секунду. Поиски привели меня к Cardinality feedback. В двух словах, это фича, которая позволяет оптимизатору учится на своих ошибках. То есть при первом выполнении делается предполагаемая оценка, а в процессе выполнения собирается реальная оценка и если они отличаются - правильная оценка сохраняется для последующего использования. В следующий раз, когда запрос выполняется, то он будет оптимизирован снова и на этот раз оптимизатор будет использовать скорректированные оценки вместо своих обычных оценок.
В моем случае это приводило к зависаниям при последующих вызовах запроса. И что бы отключить фичу можно использовать либо параметр сессии:
alter session set "_OPTIMIZER_USE_FEEDBACK"=FALSE;
либо хинт:
/*+ opt_param('_OPTIMIZER_USE_FEEDBACK','FALSE') */
В моем случае это приводило к зависаниям при последующих вызовах запроса. И что бы отключить фичу можно использовать либо параметр сессии:
alter session set "_OPTIMIZER_USE_FEEDBACK"=FALSE;
либо хинт:
/*+ opt_param('_OPTIMIZER_USE_FEEDBACK','FALSE') */
понеділок, 14 березня 2016 р.
Raspberry Pi & PIR-датчик & перемычка
Купил себе на новый год "малинку" и сразу решил, что соединю ее с датчиком движения, прикручу ее где-то в коридоре и, в случае, когда кто-то посторонний будет шастать - буду отправлять себе смс, что в квартире есть движение.
Вот такая модель пришла: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/
Датчик движения hc-sr501 и пару проводков мама-мама купил в местном интернет-магазине.
Когда все детальки были собраны, свободное время выделено, я нашел две статьи, по которым планировал научиться только детектить движение:
https://www.raspberrypi.org/learning/parent-detector/worksheet/
http://diyhacking.com/raspberry-pi-gpio-control/
О том, как установить операционку писать не буду, в интернете есть много статей.
Подключил датчик к Raspberry, как описано в первой статье, оттуда же скопировал скрипт. Запускаю... На мониторе пишет, что движение есть, хотя я до запуска, специально, развернул датчик в стену. Ну, думаю, стена мешает - повернул в пустой коридор. Все равно пишет, что есть движение. Подумал, что допустил ошибку в скрипте - проверил, все правильно. В общем пробовал, я и так и сяк - датчик выдает, что движение есть и хоть ты тресни. На самом датчике есть два винтика, которые регулируют чувствительность и время реагирование на движение. Покрутил и один и второй - то же самое "Есть движение". Подумал, что датчик поломанный.
Попробовал во время выполнения скрипта отсоединить провод от GP4 - появилась надпись "Движения нет". Ага, значит датчик исправен. Решил покопаться в интернете: перепробовал и дополнительные параметры в процедурах библиотеки GPIO, и подключение к другим пинам, и другие скрипты - результат тот же.
В итоге на поиски в интернете потратил около 3 часов, а результата нет.
Захожу еще на один форум, где люди кидали ссылки с алиэкспресса/ибея на датчики движения, которые они используют. В основном это были hc-sr501, точно такие как и у меня. Решил узнать сколько стоят датчики в Китае (свой брал в Киеве) - открываю ссылку, смотрю цену, смотрю фотки датчика и вижу, что у моего датчика расположение конденсаторов другое. У меня по одному конденсатору с каждого угла, а на фотке тоже 4 конденсатора, только 2 из них находятся рядом. Решил найти такую же модель, как и у меня. По одной из ссылок на ибей нашел "мой" датчик, но самое главное на картинке было описание некоторых элементов датчика:
Вот такая модель пришла: https://www.raspberrypi.org/products/raspberry-pi-2-model-b/
Датчик движения hc-sr501 и пару проводков мама-мама купил в местном интернет-магазине.
Когда все детальки были собраны, свободное время выделено, я нашел две статьи, по которым планировал научиться только детектить движение:
https://www.raspberrypi.org/learning/parent-detector/worksheet/
http://diyhacking.com/raspberry-pi-gpio-control/
О том, как установить операционку писать не буду, в интернете есть много статей.
Подключил датчик к Raspberry, как описано в первой статье, оттуда же скопировал скрипт. Запускаю... На мониторе пишет, что движение есть, хотя я до запуска, специально, развернул датчик в стену. Ну, думаю, стена мешает - повернул в пустой коридор. Все равно пишет, что есть движение. Подумал, что допустил ошибку в скрипте - проверил, все правильно. В общем пробовал, я и так и сяк - датчик выдает, что движение есть и хоть ты тресни. На самом датчике есть два винтика, которые регулируют чувствительность и время реагирование на движение. Покрутил и один и второй - то же самое "Есть движение". Подумал, что датчик поломанный.
Попробовал во время выполнения скрипта отсоединить провод от GP4 - появилась надпись "Движения нет". Ага, значит датчик исправен. Решил покопаться в интернете: перепробовал и дополнительные параметры в процедурах библиотеки GPIO, и подключение к другим пинам, и другие скрипты - результат тот же.
В итоге на поиски в интернете потратил около 3 часов, а результата нет.
Захожу еще на один форум, где люди кидали ссылки с алиэкспресса/ибея на датчики движения, которые они используют. В основном это были hc-sr501, точно такие как и у меня. Решил узнать сколько стоят датчики в Китае (свой брал в Киеве) - открываю ссылку, смотрю цену, смотрю фотки датчика и вижу, что у моего датчика расположение конденсаторов другое. У меня по одному конденсатору с каждого угла, а на фотке тоже 4 конденсатора, только 2 из них находятся рядом. Решил найти такую же модель, как и у меня. По одной из ссылок на ибей нашел "мой" датчик, но самое главное на картинке было описание некоторых элементов датчика:
Видите слева перемычку и 3 пина, и подпись repeatable trigger - как вы уже наверное догадались, у меня перемычка стояла в положении non-repeatable trigger. Поменял и ВСЕ ЗАРАБОТАЛО. Я был счастлив =)
Позже я нашел еще несколько картинок, где положения перемычки значились как "L"(Low) и "H"(High)-position.
Підписатися на:
Дописи (Atom)