#!/usr/bin/python
import MySQLdb
import sys
import shutil
cache='/var/cache/zoneminder/events'
try:
conn=MySQLdb.connect(host="localhost", user="zmuser", passwd="******", db="zm")
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
cursor=conn.cursor()
cursor2=conn.cursor()
cursor.execute("SELECT * FROM Monitors")
while (1):
row = cursor.fetchone ()
if row == None:
break
sql = 'SELECT YEAR(StartTime) AS y, MONTH(StartTime) AS m, DAY(StartTime) AS d, DATE_FORMAT(StartTime, "%m") AS mf, DATE_FORMAT(StartTime, "%d") AS df, DATE_FORMAT(StartTime, "%y") AS yf '
sql += 'FROM Events '
sql += 'WHERE MonitorId=%s AND StartTime <= DATE_ADD(CURDATE(), INTERVAL -4 DAY) ' % row[0]
sql += 'GROUP BY m,d; '
cursor2.execute(sql)
while (1):
row2 = cursor2.fetchone()
if row2 == None:
break
directory = "%s/%s/%s/%s/%s/" % (cache,row[0],row2[5], row2[3],row2[4],)
print directory
shutil.rmtree(directory)
cursor.close ()
cursor2.close ()
conn.close ()
Видалення старих фоток в zoneminder
Простенький пайтоновський скрипт, який затирає кеш з фотками з 4 дні
Танці з бубном навколо керованого комутатора 3COM Baseline 2226 Plus
Попалась б.к. САБЖ-залізяка. Пробував ресетити, курив мануали, пробував знайти ІР і залогінитись, але все безуспішно. Рідний софт-діскавері також не знаходив ІР. Гугл сказав що проблема досить таки глобальна. І найприкріше те, що девайс не має інтерфейсу rs-232. Але десь в коментарях під якоюсь статтею вичитав, що на материнці все ж є колодка, але не виведена на зовні. Отож, зірвав гарантійну лейбу, розкрутив і побачив порт. Знайшов перехідник на якомусь старому залізі і підключив кабель.
Підключився терміналом і побачив абракадабру. Методом тику підібрав параметри підключення і отримав командний рядок CLI
А далі все просто. Поставив собі потрібну ІР, зайшов на веб-інтерфейс (login: admin; password: <пустий>)
Сподіваюсь може колись комусь пригодиться.
А далі все просто. Поставив собі потрібну ІР, зайшов на веб-інтерфейс (login: admin; password: <пустий>)
Сподіваюсь може колись комусь пригодиться.
gammu і відсилка sms
Підключаю до Ubuntu по USB свою стару Nokia N85, в менюшці на телефоні обираю Nokia PC Suite. Далі потрібна мінімальна конфігурація gammu
$ gammu-detect
...
[gammu]
device = /dev/ttyACM0
name = Nokia N85
connection = at
...
Пишу цей кусочок у відповідне місце ~/.gammurc або ж за допомогою утиліти gammu-config вписую відповідні дані.
Відіслати SMS можна командою:
$ echo "Тестування СМС розсилки. Тест кирилиці іїє ІЇЄґҐ" | gammu sendsms TEXT +38063ХХХХХХХ -unicode
$ gammu-detect
...
[gammu]
device = /dev/ttyACM0
name = Nokia N85
connection = at
...
Пишу цей кусочок у відповідне місце ~/.gammurc або ж за допомогою утиліти gammu-config вписую відповідні дані.
Відіслати SMS можна командою:
$ echo "Тестування СМС розсилки. Тест кирилиці іїє ІЇЄґҐ" | gammu sendsms TEXT +38063ХХХХХХХ -unicode
flask
Якось зайшла мова в одній комюніті про легкий фреймворк на Python для невеличких сайтів.
Ось невеличка презентація. Буде трошки вільного часу, треба буде покурити мануал і потестувати.
Ось невеличка презентація. Буде трошки вільного часу, треба буде покурити мануал і потестувати.
Перша оптимізація Django
Закінчив загальну свою першу оптимізацію проекту на Django. Цікаво і круто. Підгадаю, на стартовій сторінці в мене виконувалось більше 300 запитів, від чого я мало не впав і не розчарувався в "Object-relational mapping". Оптимізація з кешуванням зараз дає результат в 30 дуже легеньких запитів і в час неактуальності кешу ще біля десятка, але також легеньких.
Основне зло, з яким довелось боротись:
Висновок: Django дуже рулить. Все надзвичайно слухняне + хороша реалізація фреймворку кешування = хороший результат.
Основне зло, з яким довелось боротись:
- django-tagging. Дуже корисна і зручна бібліотека міток, але має в post-init два запити і любе звертання до моделі, в якій використовується поле міток множить кількість запитів на 3. Там де мітки не використовуються, лікується через .defer('tags');
- В мене кілька пов'язаних моделей і використовується в URL два slug з різних моделей. Звісно по документації описав генерацію URL у get_absolute_url і в результаті отримав у вибірках кількість запитів * 2. Так як в мене кешуються ці моделі, то у шаблонах через template tags по ID я вибирав потрібні значення з інших моделей з кешу, в результаті позбувся цього зла;
Висновок: Django дуже рулить. Все надзвичайно слухняне + хороша реалізація фреймворку кешування = хороший результат.
оптимізація і django-tagging
Взявся за оптимізацію проджекту, запустив монітор запитів і офігів, на стартовій більше 300 запитів.
А виною всього виявився django-tagging, який запускає post-init і на кожен об'єкт отримуємо + 2 додаткових запити.
Вирішується досить просто. У запит додаємо defer('tags')
django-tagging і get_by_model з логікою OR
Хороша ліба django-tagging, яка дозволяє тегувати все що завгодно. Вибірку по тегах можна зробити методом get_by_model.
TaggedItem.objects.get_by_model(Post, [u'духовність',u'культура',u'мистецтво'])і ми отримаємо об'єкти з наступними тегами але з логікою "і". Але мені потрібно такий самий метод, але з логікою "або", тобто вибрати об'єкти де зустрічається хоча би один з перелічених тегів. Мій варіант методу. Трошки говнокод, але працює. Колись може дойдуть руки навести есетичний марафєт.
def get_by_model_or(self, queryset_or_model, tags):
tags = get_tag_list(tags)
tag_count = len(tags)
if tag_count == 0:
queryset, model = get_queryset_and_model(queryset_or_model)
return model._default_manager.none()
queryset, model = get_queryset_and_model(queryset_or_model)
content_type = ContentType.objects.get_for_model(model)
opts = self.model._meta # return tagging.taggeditem
tagged_item_table = qn(opts.db_table) # `tagging_taggeditem`
where = []
where.append('%s.content_type_id = %%s' % tagged_item_table,)
or_string = "("
or_tuple = ()
params = [content_type.pk]
for i in range(len(tags)):
if i == 0:
or_string += "%s.tag_id = %%s "
else:
or_string += "OR %s.tag_id = %%s "
or_tuple += (tagged_item_table,)
params.append(tags[i].pk)
or_string += ")"
where.append(or_string % or_tuple)
where.append('%s.%s = %s.object_id' % (qn(model._meta.db_table),
qn(model._meta.pk.column),
tagged_item_table))
return queryset.extra(
tables=[opts.db_table],
where=where,
params = params
)
Підписатися на:
Дописи (Atom)



