среда, 28 декабря 2011 г.

Замена лампочек в подъезде, парадной

Решил сразу написать пост по поводу замены лампочек на лестничной площадке.

Когда мы снимали квартиру, лампочки заменяли сами жильцы. Один раз даже собирали денежку на энергосберегающую лампочку :)

Там где мы сейчас живём всё проще, если не лениться:

Звонишь в ремонтно-эксплуатационную службу, и оставляешь заявку на "освещение N-го этажа, в N-ом подъезде". Телефон службы у меня указан на счёте за коммунальные услуги.

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

PPS: Сейчас пробую пройти квест с ремонтом уличного освещения в Петербурге.

Замена, ремонт почтового ящика

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

вторник, 27 декабря 2011 г.

Вкусные шорткаты Midnight Commander Key Mappings MC



Для каталогов:

Alt-y перемещение к предыдущему каталогу (который был открыт, не к верхнему)
Alt-u перемещиени к следующему каталогу
Alt-i Сделать текущий каталог текущим на второй панели
Alt+o открыть текущий каталог на второй панели
Alt+t переключение режимов

Alt+p Перемещение на предыдущую команду
Alt+n Перемещение на следующую команду

Ctrl+x t (Ctrl+x Ctrl+t) копирует помеченые файлы в командную строку

Django ORM без Джанги

Буду краток.

Проблема: использовать прелести Django ORM, а он хорош, но для проекта, который не для веба.

Есть ответы на  stackoverflow
http://stackoverflow.com/questions/579511/using-only-the-db-part-of-django
а вот это я не пробовал
http://pypi.python.org/pypi/django-standalone

четверг, 1 декабря 2011 г.

Использование редактора Sublime Text 2

Sublime Text 2
Настройка
В sublime интересная система настроек: не нужно выбирать кучу флажочков и ползать по меню. Для этого есть несколько текстовых файлов с настройками.
Опишу некоторые настройки их.

вторник, 29 ноября 2011 г.

Как упростить себе жизнь в shell/bash

Сочетания клавиш bash, shell. Удобно пользоваться.


Быстро перемещаться по строчке
Ctrl + A Переход в начало строки
Ctrl + E Переход в конец строки

Alt + F Прыгать вперёд на слово (ещё может работать Ctrl+ стрелочка вправо)
Alt + B Прыгать назад на слово (ещё может работать Ctrl+ стрелочка влево)

Удобно удалять
Ctrl + H как backspace только ближе :)

Ctrl + W Удалить слово перед курсором
Ctrl + K Удалить до конца строки

Ctrl + L  очистка экрана, как команда clear
Ctrl + U чистит от курсора до начала строки, если в конце, удалит всё


Менять местами
Ctrl + T поменять 2 буковки местами перед курсором
Alt + T поменять два слова слева от курсора местами


Работа с процессами

Ctrl + C убить что выполнялось
Ctrl + D выйти из текущего shell
Ctrl + Z Засунуть в фон, вернуть fg

Другая вкусняшка
Tab заканчивает названия команд и названия файлов/папок
Ctrl + R  поиск по истроии
! - вызов уже исполнявшейся команды пишем восклицательный знак и первые символы команды, будьте аккуратны с брутальными командами типа rm -rf :)
!xxx:p - где xxx, это тоже самое, что и в !(первые буквы(а)) команды, "флаг" :p позволяет не выполнять эту команду, а только отобразить, безопасный пример:
>rm -rf *
>!r:p
rm -rf *

Есть ещё много разных, но забивать себе голову ими не хочу. Этого должно хватить

среда, 9 ноября 2011 г.

WYMeditor Django-cms попробуй забори

В общем сабж. В интернете нашёл только краткий пост Ивана Маркеева

Я не прочитал внимательно строчку: Приведенные WYM_STYLES определяют то, как контент будет выглядеть в редакторе. 
То есть просто как он будет выглядеть в редакторе :) В окошке редактирования


1. Для кастомизации WYMeditora в рамках Django-cms следует изменить свой файл настроек django проекта settings.py
дописав в него примерно следующее:

#WYMEditor
WYM_TOOLS = ",\n".join([
"{'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'}",
"{'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'}",
"{'name': 'Superscript', 'title': 'Superscript', 'css': 'wym_tools_superscript'}",
"{'name': 'Subscript', 'title': 'Subscript', 'css': 'wym_tools_subscript'}",
"{'name': 'InsertOrderedList', 'title': 'Ordered_List', 'css': 'wym_tools_ordered_list'}",
"{'name': 'InsertUnorderedList', 'title': 'Unordered_List', 'css': 'wym_tools_unordered_list'}",
"{'name': 'Indent', 'title': 'Indent', 'css': 'wym_tools_indent'}",
"{'name': 'Outdent', 'title': 'Outdent', 'css': 'wym_tools_outdent'}",
"{'name': 'Undo', 'title': 'Undo', 'css': 'wym_tools_undo'}",
"{'name': 'Redo', 'title': 'Redo', 'css': 'wym_tools_redo'}",
"{'name': 'Paste', 'title': 'Paste_From_Word', 'css': 'wym_tools_paste'}",
"{'name': 'ToggleHtml', 'title': 'HTML', 'css': 'wym_tools_html'}",
#"{'name': 'CreateLink', 'title': 'Link', 'css': 'wym_tools_link'}",
#"{'name': 'Unlink', 'title': 'Unlink', 'css': 'wym_tools_unlink'}",
#"{'name': 'InsertImage', 'title': 'Image', 'css': 'wym_tools_image'}",
"{'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'}",
#"{'name': 'Preview', 'title': 'Preview', 'css': 'wym_tools_preview'}",
])



WYM_CONTAINERS = ",\n".join([
"{'name': 'P', 'title': 'Paragraph', 'css': 'wym_containers_p'}",
"{'name': 'H1', 'title': 'Heading_1', 'css': 'wym_containers_h1'}",
"{'name': 'H2', 'title': 'Heading_2', 'css': 'wym_containers_h2'}",
"{'name': 'H3', 'title': 'Heading_3', 'css': 'wym_containers_h3'}",
"{'name': 'H4', 'title': 'Heading_4', 'css': 'wym_containers_h4'}",
"{'name': 'H5', 'title': 'Heading_5', 'css': 'wym_containers_h5'}",
"{'name': 'H6', 'title': 'Heading_6', 'css': 'wym_containers_h6'}",
"{'name': 'PRE', 'title': 'Preformatted', 'css': 'wym_containers_pre'}",
"{'name': 'BLOCKQUOTE', 'title': 'Blockquote', 'css': 'wym_containers_blockquote'}",
"{'name': 'TH', 'title': 'Table_Header', 'css': 'wym_containers_th'}",
])



WYM_CLASSES = ",\n".join([
"{'name': 'date', 'title': 'PARA: Date', 'expr': 'p'}",
"{'name': 'hidden-note', 'title': 'PARA: Hidden note', 'expr': 'p[@class!=\"important\"]'}",

"{'name': 'center', 'title': 'PARA: Center', 'expr': 'p'}",
"{'name': 'contentheading', 'title': 'PARA: Center', 'expr': 'p, h1'}",


])

WYM_STYLES = ",\n".join([
"{'name': '.hidden-note', 'css': 'color: #999; border: 2px solid #ccc;'}",
"{'name': '.date', 'css': 'background-color: #ff9; border: 2px solid #ee9;'}",

"{'name': '.center', 'css': 'border: 20px solid #9acd32; text-align:center;'}",
"{'name': '.contentheading', 'css': 'border: 5px solid #9acd32;'}",


])

Многие спросят чего так много?! Это скопированно из стандартных настроек редактора
/usr/local/lib/python2.6/dist-packages/django_cms-2.2-py2.6.egg/cms/plugins/text/settings.py
Там читаем в начале коммент, для тех кто хочет подключить другой редактор, я не стал

и дальше из того что скопировал в свой файл настроек django, поудалял строки такого вида:
WYM_TOOLS = getattr(settings, "WYM_TOOLS", WYM_TOOLS)
этой строкой он лезет в наш settings.py проекта и достаёт то что мы кастомизируем. Можно кастомизировать не всё,
а только то, что нужно.

Теперь по делу
1. WYM_TOOLS - это то что мы хотим видеть из кнопок настройки, или утилит, к примеру я для себя раскоментировал "{'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'}",
Чтобы появилась возможность добавлять таблицы
2. WYM_CONTAINERS это, как следует из названия контейнеры. :)
Как получилось у меня: для того чтобы применить свойство контейнера для этого нужно было изначально заключить кусок текста в контейнер. Не понятно?

При добавлении контента может случиться так, что вы добавите контент без тега, в смысле, что он не будет заключён в тег параграфа. Тогда вы не сможете применить свойство контейнера.
Так что перед добавлением сначала нажмите пару раз Enter для появления в визуальном просмотре пары контейнеров <p>

2.1 Для того чтобы применить контейнер, к примеру {Heading_1}
Следует текст, который будет выделен этим тегом заключить в отдельный <p>
И тогда уже выделять этот отдельный <p> и выбирать контейнер, они могут переключаться. Т.е, {Heading_1} можно поменять на {Heading_2} не переключаясь сначала в параграф.

Итог: текст для применения свойства контейнер должен находиться в теге <p>

WYM_CLASSES

WYM_CLASSES пример:
"{'name': 'contentheading', 'title': 'PARA: Center', 'expr': 'p, h1'}",
Тут мы приступаем к самому вкусному и не понятному.
Данная строчка позволяет добавлять класс (contentheading) из нашей таблицы стилей сайта к заданным тегам:
'expr': 'p, h1', и отображаться это будет под названием 'title': 'PARA: Center'. Что такое пара, не интересовался. Center можно заменить на своё. Но вообще и работает просто

любой title, например Таблица, такой который будет вам понятен.

Другими словами: Добавили эту строчку, и к тегам p, h1 можем нажатием на PARA: Center задавать класс contentheading заданному тегу.


WYM_STYLES 
Вот эта строчка показывает нам что, если у нас в html коде встречается тег с классом .contentheading, то мы его обводим каёмочкой в 5 пикселей, и красим в цвет.
"{'name': '.contentheading', 'css': 'border: 5px solid #9acd32;'}",

Вроде всё понятно.

Особенность
Заметил такую штуку, что когда мы применили {Classes} к параграфу, а потом решили сделать его всё-таки{Heading_1}, то нужно будет повторно применить класс, иначе он сбросится.











воскресенье, 6 ноября 2011 г.

Добавление robots.txt и favicon.ico в Django 1.3

Добавляем следующее в urls.py и радуемся. Файл robots.txt кладём в шаблоны
примерное его содержание
#
# robots.txt http://www.???.ru/
#

User-agent: *
Disallow: /admin

User-agent: Yandex
Disallow: /admin
Host: www.???.ru
Crawl-delay: 10

Sitemap: http://www.???.ru/sitemap.xml
##################

А иконку кладём в папку со статическими файлами сайта.


urls.py:

from django.conf.urls.defaults import patterns, include, url
from django.views.generic.base import TemplateView, RedirectView

class TextPlainView(TemplateView):
def render_to_response(self, context, **kwargs):
return super(TextPlainView, self).render_to_response(
context, content_type='text/plain', **kwargs)

urlpatterns = patterns('',
url(r'^robots\.txt$', TextPlainView.as_view(template_name='robots.txt')),
url(r'^favicon\.ico$', RedirectView.as_view(url='/media/img/favicon.ico')),
)


Зачем нужен robots.txt?
Для того чтобы поисковому боту сказать, куда заглядывать не нужно, наверняка ещё для чего-то, гуглить лень, можете добавить комменты зачем, перенесу в пост.


Зачем нужен favicon.ico?
Это иконка которая будет показываться в левом углу вкладки в браузере, и будет отображаться при добавлении в избранное, она в общем так и расшифровывается favicon (favorite  icon) типа любимая иконка.


PS: Не забываем, что это не полный urls.py, а только те строчки, которые добавляют robots.txt и favicon.ico.

Я в первый раз попробовал это на woman-clinics.ru, сайт "Женской консультации 2х2"  про акушерство, гинекологию и др.




четверг, 3 ноября 2011 г.

django-cms filer plugin

Если вы решили использовать это django-cms filer plugin, то не забудьте сначала поставить filer, потом easy_thumbnails

А если вы используете yandex maps plugin, то почему-то пришлось делать правильный шаблон, и в контекст передавать нормально свой ключ, а то не работает. Потом нужно подробно, это просто чтобы не забыть.

вторник, 1 ноября 2011 г.

Меняем время на убунте на правильное

#!/bin/sh

# Disallow winter time for Moscow

echo "Disable winter time for MoscoW"

sleep 3

mkdir ./temp1

cd ./temp1

#wget ftp://elsie.nci.nih.gov/pub/tzdata2011k.tar.gz  уже не работает
wget http://people.freebsd.org/~edwin/tzdata2011k.tar.gz

tar xzf tzdata2011k.tar.gz

cp /etc/localtime /tmp/localtime.old

zic europe

ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

cd ..
rm -rf ./temp1

вторник, 9 августа 2011 г.

Интерпретатор для Питонофилов

Раньше я использовал iPython, но хозяйки посоветовали мне DreamPie
Установил под WindowsXP при первом запуске пришлось фиксить
выдало, что не может:

File "C:\Program Files\DreamPie\share\dreampie\subp_main.py", line 30, in <module>
sys.setdefaultencoding('utf-8')
AttributeError: 'module' object has no attribute 'setdefaultencoding' 


"c:\Program Files\DreamPie\share\dreampie\subp_main.py"

import platform
if not "3.2" in platform.python_version():
    sys.setdefaultencoding('utf-8')


Альтернативные решения данной баги
https://bugs.launchpad.net/dreampie/+bug/716377

среда, 3 августа 2011 г.

ipython for python3.2 WindowsXP

Вот, задался целью всё-таки забороть ipython для Python 3.2, и получилось :)

Делал примерно так
1.1. Поставил Python3.2: python-3.2.1.msi
1.2. Пропишите пути к новому питону

2. distribute_setup.py : http://python-distribute.org/distribute_setup.py
это для того чтобы заработал easy_install

3. Дальше
>easy_install http://archive.ipython.org/release/0.11/py3/ipython-0.11-py3.2.egg
ставится ipython к папке c:/python32/Scripts тоже хорошо бы переменную path виндовса поправить

4. Запускаем ipython3.exe в папке Scripts и ловим эксепшн, у меня во всяком случае было так:

c:\Python32\Scripts>ipython3.exe
Error in sys.excepthook:
TypeError: _isdir() takes exactly 1 argument (0 given)

Original exception was:
Traceback (most recent call last):
File "c:\Python32\Scripts\ipython3-script.py", line 9, in
load_entry_point('ipython==0.11', 'console_scripts', 'ipython3')()
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\frontend\te
rminal\ipapp.py", line 369, in launch_new_instance
app.initialize()
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\frontend\te
rminal\ipapp.py", line 283, in initialize
self.init_shell()
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\frontend\te
rminal\ipapp.py", line 303, in init_shell
ipython_dir=self.ipython_dir)
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\config\conf
igurable.py", line 295, in instance
inst = cls(*args, **kwargs)
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\frontend\te
rminal\interactiveshell.py", line 112, in __init__
user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\core\intera
ctiveshell.py", line 384, in __init__
self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
File "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\utils\pickl
eshare.py", line 52, in __init__
if not self.root.isdir():
TypeError: _isdir() takes exactly 1 argument (0 given)

c:\Python32\Scripts>


Решил я это так
В файле    "c:\Python32\lib\site-packages\ipython-0.11-py3.2.egg\IPython\utils\pickleshare.py"
В 52 строке закомментировал
#if not self.root.isdir():
И 53-ей строкой написал следующее
if not os.path.isdir(self.root):





Заработало, что не может не радовать
Единственное pyreadline ещё похоже нужно замучить



вторник, 31 мая 2011 г.

Как правильно делать треды в PyQT4

http://www.linux.org.ru/forum/development/1529306
#!/usr/bin/env python

# Вот примерно так оно делается.

import sys
from PyQt4.QtCore import QEvent, QThread
from PyQt4.QtGui import QApplication, QTextEdit

class MyEvent(QEvent):
def __init__(self, data):
QEvent.__init__(self, QEvent.User)
self.data = data

class Timer(QThread):
def __init__(self, event_receiver):
QThread.__init__(self)
self.event_receiver = event_receiver
self.time = 0
def run(self):
while True:
self.time += 1
QApplication.postEvent(self.event_receiver, MyEvent(self.time))
self.sleep(1)

class Display(QTextEdit):
def customEvent(self, event):
if isinstance (event, MyEvent):
self.append('time = %i' % event.data)

a = QApplication(sys.argv)
display = Display()
display.show()

timer = Timer(display)
timer.start()

sys.exit(a.exec_())

суббота, 14 мая 2011 г.

Нарезка mp3 файлов Linux Ubuntu





Я пользовался в windows mp3cut, а перейдя на ubuntu пришлось искать альтернативу.

При использовании mp3cut написал для себя скриптик, который открывает файл, и нарезает его.

 В ubuntu всё проще mp3splt

mp3splt -t 5.0 -o @n_@f -d ump_270 ump_podcast270.mp3


Комментарий:
-t продолжительность кусочка
-o название выходного файла, в данном случае @счётчик_@название файла
-d название выходной директории

и файл входной.