среда, 25 декабря 2013 г.

SQLite Row Factory и Data Types

SQLite Row Factory и Data Types

Следующая таблица показывает связь между типами данных SQLite и типов данных Python:
  • None тип конвертируется в NULL
  • int  тип конвертируется в INTEGER
  • float  тип конвертируется в REAL
  • str  тип конвертируется в TEXT
  • bytes  тип конвертируется в BLOB
Класс row_factory sqlite3.Row используется для доступа к колонкам запроса по именам, а не по порядковому номеру:

db = sqlite3.connect('data/mydb')
db.row_factory = sqlite3.Row
cursor = db.cursor()
cursor.execute('''SELECT name, email, phone FROM users''')
for row in cursor:
    # row['name'] returns the name column in the query, row['email'] returns email column.
    print('{0} : {1}, {2}'.format(row['name'], row['email'], row['phone']))
db.close()
В cx_Oracle есть такой способ использовать row_factory. Пишется класс с начальным методом. Как входные параметры ему передаются поля из запроса. Присваивая их переменным класса с теми же именами, можно потом ссылаться к ним по этим именам:

import cx_Oracle
...
class Test(object):
    def __init__(self, codeface, dismiss, nameface, datebir, login, datecas):
        self.codeface = codeface
        self.dismiss = dismiss
        self.nameface = nameface
        if datebir is None:
            self.datebir = ''
        else:
            self.datebir = dtconv(datebir)
        self.login = login
        if datecas is None:
            self.datecas = ''
        else:
            self.datecas = dtconv(datecas)

... 
sql_users = """select a.codeface, a.dismiss, a.nameface, a.datebir, a.login_name_user, e.datecas
    from kadry.face a, kadry.execution e
    where a.codeface = e.codeface"""

cursor.execute(sql_users)
cursor.rowfactory = Test

...
for row in cursor:

    print(row.codeface, row.nameface)
...
 
 

Исключения базы данных SQLite

Исключения базы данных SQLite

На практике всегда окружайте операции с базой данных выражениями или a context manager:
В этом примере мы используем выражения try/except/finally для того, что бы поймать любые исключения в коде. Ключевое слово finally очень важно потому, что всегда закрывает коннект к базе корректно. О исключениях хорошо описано в PEP249. Итак посмотрим на этот код:
Это называется ловим все. Используем его здесь для примера, в реальном приложении вы должны поймать и обработать определенные исключения такие как IntegrityError или DatabaseError.
Мы можем использовать Connection объект как context manager для автоматического запоминания или отката транзакции:
В вышеприведенном примере если предложение insert вызывает исключение, транзакция будет откачена и выдано сообщение; в противном случае транзакция будет запомнена в базе. Пожалуйста обратите внимание на то, что мы вызываем метод execute объекта db а не объекта курсор.

понедельник, 9 декабря 2013 г.

Как завершить программу на Python

Завершение программы:

от пользователя grom http://webonrails.ru/post/401/

"""
Есть несколько способов.
Первый способ:
import sys
sys.exit([n])
Второй способ:
railse SystemExit([n])
Третий способ:
В отличие от предыдущих завершает работу немедленно, без выполнения необходимых завершающих операций
import os
os._exit([n])
Так теперь про параметр N - это код завершения программы. По умолчанию 0 - т.е. нормальное завершение программы. Если передан не нулевой код, то это признак завершения с ошибкой.
"""

Я попробовал первый способ - РАБОТАЕТ - спасибо!

вторник, 26 ноября 2013 г.

Как определить, что нужного значения нет в базе sqlite

Как определить, что нужного значения нет в базе sqlite?
Мы выполняем в курсоре SELECT с конструкцией WHERE поле = значение и затем
 загружаем из курсора одну запись. Если получили None, то записи в базе нет, иначе читаем то, что загрузили:

import sqlite3

db_filename = 'todo.db'
with sqlite3.connect(db_filename) as conn:
    cur = conn.cursor()
    cur.execute("""
        select name, description, deadline from project
        where name = 'pymotw'       
        """)
    aa = cur.fetchone()
    if aa == None:

        print("Мимо")
    else:
        print(aa)
   

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

Python - Как открыть файл или программу

Оригинал статьи по этой ссылке:
Python 101: How to Open a File or Program
Sat 4 Sep 2010
Мой перевод:
"
Когда я начинал изучать Python, первое, что я должен был узнать так это то, как открыть файл.  В зависимости от контекста термин "открыть файл" может иметь разный смысл. Иногда это значит действительно открыть файл программой на языке Python и читать его как текстовый файл. В другой раз это означает “отрыть файл при помощи программы, назначенной по умолчанию”; а иногда это означает “открыть файл программой, которую я задам”. Итак, когда вы начинаете искать ответы на два последних случая, то вы должны задать Google правильные вопросы иначе получите только ответ на вопрос как открыть и прочитать текстовый файл (случай номер один).

Как открыть текстовый файл

Давайте начнем с открытия файла в языке Python. В таком случае мы имеем ввиду использовать для открытия файла программу Python а не какую-нибудь другую программу. Для этого случая мы имеем две возможности: использовать (in Python 2.x): open или file. Давайте посмотрим как это делается!

# the open keyword opens a file in read-only mode by default
f = open("path/to/file.txt")
 
# read all the lines in the file and return them in a list
lines = f.readlines()
 
f.close()
 
Как вы можете видеть, довольно просто открыть и затем прочитать текстовый файл. Вы
можете заменить ключевое слово "open" на ключевое слово "file" и будет работать. Если
вы педант, то эту же команду можно записать следующим образом:
 
f = open("path/to/file.txt", mode="r")

Буква “r” означает то, что мы будем только читать файл. Вы можете открыть файл в 
режимах: “rb”(чтение двоичное), “w” (запись), “a” (в режиме добавления
в конец файла) или “wb” (писать двоичную информацию). Обратите внимание что если вы используете “w” или “wb”, Python будет перезаписывать существующий файл или создавать новый, если файла не было.

Если вы хотите читать файл, вы можете использовать следующие методы:
  • read - прочитать весь файл сразу и вернуть его целиком как строку
  • readline - читать первую строку файла и вернуть ее как строку
  • readlines – читать файл и возвращать его как список строк
Вы можете читать файл в цикле, примерно так:

f = open("path/to/file.txt")
for line in f:
    print line
f.close()
 
Круто! Python рулит! Теперь самое время посмотреть на то, как открыть файл при помощи другой программы.

Открыть файл при помощи соответствующей ему программы


У Python есть простой метод для открытия файла с помощью программы, используемой в операционной системе по умолчанию. Это выглядит примерно так:

import os
os.startfile(path)

Да, это просто, если вы на Windows. Если вы на Unix или Mac, вам нужен будет модуль запускающий под-процесс или “os.system”. Конечно, если вы крутой компьютерщик (a real geek), и у вас есть несколько программ для одного типа файла. Например, если я хочу редактировать мой файл JPEG с помощью Picasa, Paint Shop Pro, Lightroom, Paint.NET или множеством других программ, и при этом не хочу менять редактор для JPEG, заданный по-умолчанию. Как мы будем решать эту задачу на Python? Мы используем модуль подпроцессы!

import subprocess
 
pdf = "path/to/pdf"
acrobatPath = r'C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe'
subprocess.Popen("%s %s" % (acrobatPath, pdf))
 
Вы можете написать последнюю строку как: subprocess.Popen([acrobatPath, pdf]). Существует много способов использовать модуль subprocess, но этот способ основной, для него и создавался модуль. Я обычно использую этот способ для открытия определенных файлов или таким образом открываю программу с нужными для меня параметрами. Кроме этого я использую метод вызова под процессов “call”, он заставляет скрипт на языке Python ждать окончания запущенного приложения. Вы также можете обмениваться информацией с запущенным вами под процессами, если, конечно, знаете как это делать.

Заключение

Как обычно, на Python все задачи решаются просто. Я нашел очень не много случаев, когда Python не мог реализовать задачу легко и выразительно. Я надеюсь, что вы найдете данный материал полезным, когда начнете писать на Python и вам понадобиться знать как открыть файл или программу.
 "

понедельник, 28 октября 2013 г.

Регулярные выражения в NotePad++

Допустим мы хотим из текста, оформленного как страница HTML, получить нормальный текст. Мы загружаем страницу в редактор NotePad++ и видим громадное количество операторов к примеру
(.*?)  а в поле замены вставляем \1

и тогда текст вида TЕКСТ превращается в ТЕКСТ.

Пояснения: в строке поиска все символы кроме .*? и (.*?) являются константами. Они должны просто совпасть. Символы .*? говорят о том, что имя класса может быть любым, знак вопроса говорит о том, кавычки справа надо брать ближайшие. Во втором случае надо не только взять текст между символами ><, но и поместить в буфер номер 1. Об этом говорят скобки. В поле замены мы ссылаемся на этот буфер при помощи слэша и номера буфера.  

четверг, 24 октября 2013 г.

Предложение with

Предложение with

Итак есть шанс, что вы уже знаете о предложении with, но возможно что некоторые этого еще не знают. Давайте осознаем реальность, предложение with сохраняет нам кучу времени и существенно уменьшает наш код. Толко представте себе - вы на python открываете файл и хотите в нем что-то сохранить. Обычно вы должны сделать так:
file = open('file.txt','w')
file.write("freepythontips.wordpress.com")
file.close()
А что если пока вы пишите в файл, случиться прерывание, тогда файл не будет правильно закрыт. Я знаю как много трудностей это принесет. Такое случилось однажды со мной; я выполнял программу сбора данных по Интернету. Программа работала около трех часов и неожиданно из-за сбоя прекратила работу. Файл с результатами был испорчен и мне пришлось все повторить. Обратите внимание на этот момент. Что вы должны сделать, что бы застраховаться от таких неожиданностей? Во-первых вы можете обернуть ваш код в выражение try-except, а еще лучше использовать предложение with. Давайте сначало поговорим о выражении try-except. Обычно вы делаете примерно так:
try:
    file = open('file.txt','w')
    file.write(data)
except:
    # выполните что-то при прерывании программы
finally:
    # here comes the trick. Финальные предложения.
    # Они выполняются даже в случае если произошло прерывание
    # и выполнилась обработка этого прерывания. Сдесь мы можем закрыть файл    
    file.close()
Теперь давайте посмотрим на предложение with. При его использовании вы обычно делаете следующее:
with open('file.txt','w') as file:
    file.write(data)
Обратите внимание, при использовании предложения with вы не должны закрывать файл явно. Это произойдет автоматически при окончании записи в файл.

 

вторник, 22 октября 2013 г.

CSS: каскад, специфичность и наследование

Перевод статьи Николаса Галлахера «CSS: the cascade, specificity, and inheritance», переводчик — heljoshin

CSS: каскад, специфичность и наследование

Краткая статья, содержащая основные понятия о каскаде, специфичности и наследовании в CSS.

Что такое каскад?

Каскад — это механизм, определяющий какие стили должны быть применены к данному элементу, основываясь на правилах, полученных из различных источников.
Каскад учитывает такие правила как: значимость, происхождение, специфичность и очередность источников устанавливающих стиль. Данный механизм присваивает приоритет каждому правилу. Когда несколько правил применяются к данному элементу, то правило с наибольшей значимостью станет приоритетным. Результатом является четкое определение роли данного элемента или сочетания элементов.

Браузеры применяют следующую логику при сортировке:
  1. Найти все декларации, применяющиеся к данному элементу или группе элементов, и относящиеся к определенному типу.
  2. Сортировать декларации в соответствии с их приоритетом (обычный или важный) и происхождением (автор, пользователь или пользовательский агент). По нисходящей приоритетности:
    1. пользовательская декларации типа !important
    2. авторские декларация типа !important
    3. обычные авторские декларации
    4. обычные пользовательские декларации
    5. декларации пользовательского агента
  3. Если декларации обладают одинаковым приоритетом и источником, то следует сортировать их по специфичности селектора.
  4. Наконец, если декларации обладают одинаковым приоритетом, источником и специфичностью, то сортировать их следует по порядку положения в таблице стилей – последний элемент в списке имеет самый высокий приоритет.

Что такое специфичность?

Специфичность — это метод разрешения конфликтов в пределах каскада.
Специфичность рассчитывается своим собственным способом, базируясь на значимости 4 различных категорий. Например, в CCS2 для представления этих категорий использовались буквы a, b, c, и d, где каждая по умолчанию имела значимость равную 0.
  • a равняется 1, если декларация указана в атрибуте стиля HTML ("инлайн-стили"), а не в селекторе, при помощи CSS-правила.
  • b равен количеству атрибутов ID в селекторе
  • c равен количеству других атрибутов и псевдо-классов в селекторе
  • d равен количеству элементов и псевдо-элементов в селекторе
Специфичность высчитывается путем сложения результатов всех 4 данных. Селекторы с более высоким показателем имеют приоритет.
Например, селектор #id .class[href] element:hover содержит:
  • 1 ID (b равен 1)
  • 1 класс, 1 селектор атрибута, и 1 псевдо-класс (c равен 3)
  • 1 элемент (d равен 1)
Таким образом, элемент имеет специфичность равную 0,1,3,1. Следует отметить, что селектор, содержащий один лишь ID (0,1,0,0) будет иметь больший приоритет, чем любой другой, пусть даже последний имеет большее количество других атрибутов или элементов (например: 0,0,10,20). Это одна из причин, почему многие современные архитектурные шаблоны CSS не используют ID для стилизации.

Что такое наследование?

Наследование отличается от каскада и включает в себя дерево DOM.
Наследование — это процесс, при котором элементы наследуют значения свойств от своих предков в дереве DOM. Некоторые свойства, например, color, автоматически наследуется дочерним элементом. Каждое свойство определяет, будет ли оно автоматически унаследовано.
Значение inherit может быть задано для любого элемента, что заставит последний наследовать значение свойства родительского элемента, даже если свойство обычно не наследуется.

О значении !important

Написанное выше должно сделать очевидным тот факт, что «!important» отдельное понятие применительно к специфичности, которое никак не влияет на специфичность селектора правила.
Декларация !important имеет больший приоритет, чем обычные декларации (см. ранее описанную логику сортировки каскада), даже чем декларации, содержащиеся в атрибуте style.

Адрес оригинала http://css-live.ru/articles/css-kaskad-specifika-i-nasledovanie.html 


Вменяемый урок о специфике работы CSS

 Метки урока:css

Поговорим о специфике работы CSS

 Если вы часто используете CSS, то наверняка вам будет полезно знать о специфике его работы. Настоящий мастер в первую очередь должен знать именно это, а потом уже как позиционировать и оформлять элементы. Так же, если вы когда-то использовали ключевое слово important!, то эта статья так же для вас.

Как браузер читает CSS

В первую очередь вам необходимо знать, каким образом браузер читает CSS код. Делает он это сверху вниз, проходясь последовательно по каждой строчке:
/*Строка 10*/
ul li a {
 color: red;
}

/*Строка 90*/
ul li a {
 color: blue;
}


Правило написанное на строке 10, будет заменено на строке 90. В результате цвет ссылки будет синим. Правила с одинаковыми селекторами, которые находятся ближе к концу файла имеют больший приоритет.
Тот же самый принцип работает при последовальном подключении CSS файлов:


Специфика

Всё вышеперечисленное имеет место быть в том случае, если вес ваших селекторов одинаков. Если же вы приписываете ID, классы или вложенность элементов, то тут включается CSS специфика.
Существует 4 категории составляющих веса селектора: строчные стили, ID, классы и простые элементы. Как оценивать вес? Расклад такой:
  • ID-шки весят 100 очков
  • Классы весят 10 очков
  • Элементы весят по 1 очку
Зная это, рассчитаем приоритет селектора:
#content .sidebar .module li a

100 + 10 + 10 + 1 + 1 = 122 (ID, 2 класса, 2 элемента)
Запомните:
  • ID весит больше всего по сравнению с классами и элементами, поэтому вы должны ограничить использование ID в ваших стилях до минимума;
  • В случаях, когда селекторы весят одинаково, порядок их применения будет такой: последний селектор имеет больший приоритет;
  • Стили списанные в HTML самые козырные, так как они ближе всех к элементу;
  • Единственный способ переопределить встроенные стили, это использовать ключевое слово !important;
  • Псевдо-классы и атрибуты весят так же, как и обычные классы;
  • Псевдо-элементы весят, как обычные элементы;
  • Универсальный селектор (*) не весит ничего.

Примеры:

 ul li a {
 color: red;
}
Общий вес данного селектора 3 очка, так что добавив класс другой селектор будет иметь приоритет повыше.
.content #sidebar {
 width: 30%;
}
Данный селектор весит 110 очков из-за ID и класса.
.post p:first-letter {
 font-size: 16px;
}
Этот селектор весит 12 очков, так как псевдо-элемент :first-letter и тэг параграфа весят по одному баллу.
p {
font-family: Helvetica, arial, sans-serif;
}
Этот селектор весит всего 1 очко. Подобный тип селектора должен быть написан в верхней части страницы. При написании основных стилей, которые в дальнейшем могут быть переопределены для конкретных областей.
Запомните, что для переопределения ID-шки, вы должны написать 256 классов для одного элемента:
#title {
 font-weight: bold;
}

.home .page .content .main .posts .post .post-content .headline-area .wrapper /* ... etc. ... */ .title {
  font-weight: normal;
}
Только так второй селектор перебьёт первый.

Итог

Конечно теоретическая специфика CSS это далеко не самый важный аспект. Однако, зная эти правила можно ускорить работу над сайтом.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://www.webdesignerdepot.com/2013/04/how-to-use-css-specificity/
Перевел: Станислав Протасевич
Урок создан: 7 Мая 2013




 


среда, 16 октября 2013 г.

Backup MS SQL на сетевой диск

Имеем базу MS SQL, размер 150 Гбайт и растет дальше. Обязательно нужен бэкап. Пока делали на этой же машине. Но диски маленькие(300Гб) и некуда писать бэкап. Появилась идея писать его на сетевой расшаренный диск. Вот тут-то и началось. Шара находится в одной сетке, а сервер в другой, да еще и демозоне. Решение такое:
  1. В шаре(это Linux Samba) заводится учетка с паролем.
  2. Между шарой и сервером в файрволе пробивается канал по сети.
  3. На сервере создается такая же учетка с тем же паролем.  
  4. На сервере в службах открываем службы MSSQL и Client. В свойствах этих служб в папке Log On вводим запуск служб от имени нашей учетки и ее пароль.
  5. Запускаем службы.
  6. На сервере в SQL открываем учетку из windows. Ей даем права на создание бэкапа.
  7. Входим на сервер под созданной учеткой.
  8. Мэпируемся к шаре, если все срослось, то пароль не спросят, они совпали.  
  9. На сервере запускаем программу osql с именем учетки и паролем
  10. В ней выполняем две команды
    USE master
    EXEC sp_addumpdevice 'disk', 'Nw1', '\\London\Backup\Nw1.bak'

    Где:
    Nw1 - название удалённого устройства. М.б. названо любым именем
    London - имя компьютера
    Backup - имя расшаренной папки
  11. Создаем командами T-SQL новый device см. выше
  12. Входим в Studio и создаем бэкап на дисковое устройство Nw1 шару.
  13. При создании JOB для бэкапа входить в сервер нада под той самой учеткой!  
  14. Это не обязательно! Главное, что бы учетки на шаре и сервере имели одно и то же имя и пароль!

И все.

среда, 4 сентября 2013 г.

ORACLE XE NLS

поддержка нескольких подключений с различной кодировкой

Есть у меня процесс на питоне, которому требуется подключаться к разным базам данных
на Оракле с различными значениями параметра NLS_CHARACTERSET values.

Я могу установить соответствующий набор символов, задавая переменную окружения
NLS_LANG или из командной строки операционной системы или из программы перед тем как 
поключаться к базе. Для баз данных с кодировкой utf-8, я устанавливаю 
"AMERICAN_AMERICA.UTF8", для Latin-1 (ISO-8859-1) я устанавливаю 
"AMERICAN_AMERICA.WE8ISO8859P1".

Дальше показан примерный код:

import os
import cx_Oracle

os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8'
utf8_conn = cx_Oracle.connect('dana', 'pw', 'utf8db')
print utf8_conn.encoding
 
s = utf8_conn.cursor().execute('SELECT :s AS str FROM dual',
      s=u'd\u00e4t\u00e4').fetchone()[0]
print s, type(s), len(s), len(s.encode('utf8'))

utf8_conn.close()

os.environ['NLS_LANG'] ='AMERICAN_AMERICA.WE8ISO8859P1'
latin1_conn = cx_Oracle.connect('dana', 'pw', 'latin1db')
print latin1_conn.encoding
s = latin1_conn.cursor().execute('SELECT :s AS str FROM dual',
      s='d\xe4t\xe4').fetchone()[0].decode('latin1')
print s, type(s), len(s), len(s.encode('latin1'))

среда, 21 августа 2013 г.

Новое в MS sql Express 2012

  • Новое в SQL Server Express 2012: SQL Server Express LocalDB

    SQL Server Express LocalDB
    • LocalDB это новое компактное средство для разработки на SQL Server Express Edition , которое очень легко устанавливается. Это делает использование идеальным для тех кто нуждается во встраиваемой базе данных типа SQL Server в дэсктопных приложениях или инструментах. LocalDB имеет все программные возможности как и SQL Server Express, но работает в том же процессе, что и приложение а не как сервис.
    Интегрировано
    • LocalDB разработано как локальная база данных, встроенная в десктопное приложение. This includes tools like SQL Server Data Tools, or custom developed desktop applications, or tools that need a lightweight single-user database runtime that supports full Transact-SQL functionality.
    Простота
    • Приложение, которое использует LocalDB просто открывает файл. После этого вы получаете функциональность SQL Server при работе с этим файлом, включая такие вещи как ACID поддержку транзакций. Приложение, открывшее файл, имеет эксклюзивные права на его использование. Никакого мульти-пользовательского доступа или использования его как сервер. (Если вам это надо используйте SQL Server Express.)
    Легкое Приобретение
    • LocalDB прост для скачки, установки и управления им. Он устанавливается как маленький разделяемый компонент, а не сервис.

четверг, 25 июля 2013 г.

Фарингейт и Цельсий

Формула вычисления Фаренгейта через Цельсий:
Фаренгейт = (Цельсий * 9 / 5) + 32;

Фар =     Цельсий =
    4            -20
  14            -10
  32               0
  50             10
  68             20
  86             30
104             40

пятница, 5 июля 2013 г.

Разводка холодной и горячей воды

Итак, прошло 15 лет и мне пришлось переделать разводку холодной и горячей воды в квартире. Так как все эти 15 лет стояли гибкие шланги, то и теперь я решил использовать гибкие шланги.
1. Всего использовал 10 шлангов - четыре для горячей воды(на кухню, душ, рукомойник в ванной и гигант от гребенки к входному крану); шесть для холодной воды - добавился шланг к унитазу и маленький шланг от стиральной машины(она у нас на кухне). Гибкий шланг гигант имеет увеличенный внутренний диаметр и резьбу на 3/4".
Внимание: при покупке шлангов обращайте внимание на целостность шланга. Если на шланг встать или поставить что-то очень тяжелое, то шланг перестанет быть круглым и упругим. Он станет сминаться. Такой шланг брать нельзя. Служить он долго не будет. Если вы в магазине самообслуживания, то не спеша по обжимайте выбранный шланг по всей длине.
Итак я взял шланги: 2 по 2м, 3 по 1.5м, 2 по 2м, 1 - 0.5 м и 2 гиганта по 1м.
2. Что бы выполнить разводку шлангов, я взял две гребенки 3/4 дюйма на 3 и 4 отвода. Отводы под 1/2 дюймовые соединения, с вентилями. У гребенок на соединение "папа" я купил заглушки на 3/4", а с другой стороны я вставил ниппель 3/4"на 3/4".
На резьбу проще всего наматывать лен плюс Унипак.
3. Гребенки при помощи специальных скоб прикрепил к задней стенке и прикрепил гибкую подводку. Результат на снимке:
J
    На каждой трубе(холодной и горячей воды) стоят по 2 шаровых крана. Первый от стояка кран(запорный) принадлежит к обще домовой структуре водоснабжения и находится в компетенции управляющей компании. Работает он на не фильтрованной воде и поэтому лучше его не дергать. После фильтра стоит другой кран, он уже работает на фильтрованной воде. Его мы и закрываем, надолго покидая квартиру.
   Фильтры стоят итальянские с манометром. Показали себя очень не плохо, но они имеют внизу сливной штуцер и кран для чистки фильтра через шланг. Поэтому при установке счетчика такой фильтр до счетчика не рассматривается. Используется закрытый фильтр с металлической пробкой и отверстием в ней для опечатывания. Следовательно чистить его может только тот, кто может потом опечатать.
  Вместо итальянского фильтра мастер поставил счетчики и фильтр. Результат на снимке:
Вот фото, на котором видна старая разводка горячей воды. Холодная уже переделана:
 

вторник, 28 мая 2013 г.

Что же блокируется

Что блокирует мое резервирование(lock)?

Submitted by Natalka Roshak on Sat, 2006-04-01 18:00

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

Создадим блокировку

Для начала, создадим ситуацию, когда один пользователь активно блокирует другого. Откроем две сессии. Введем следующие команды в Сессии 1 для создания тестовой таблице:

SQL> create table tstlock (foo varchar2(1), bar varchar2(1));

Table created.

SQL> insert into tstlock values (1,'a');

1 row created.

SQL> insert into tstlock values (2, 'b');

1 row created.

SQL> select * from tstlock ;
FOO BAR
-   -
1   a
2   b

2 rows selected.

SQL> commit ;

Commit complete.

Теперь установим блокировку на всю таблицу в Сессии 1:

SQL> select * from tstlock for update ;

А в Сессии 2, попытаемся обновить запись:

SQL> update tstlock set bar= 'a' where bar='a' ;

Это предложение будет висеть, из за блокировки, наложенной сессией 1 на нужную нам таблицу.

Определение блокирующей сессии

В Oracle есть представление DBA_BLOCKERS, которое выводит списки SID всех сессий с блокировками. Правда из своего опыта скажу вам, что быстрее использовать представление V$LOCK. Использование представления V$LOCK в запросе гораздо быстрее и упрощает определение блокирующей сессии. Это представление содержит много полезной информации.

SQL> select * from v$lock ;
ADDR     KADDR     SID TY    ID1     ID2  LMODE REQUEST      CTIME      BLOCK
-        -         -   -       -       -      -       -          -          -
AF9E2C4C AF9E2C60  479 TX 131078   16739      0       6        685          0
ADDF7EC8 ADDF7EE0  422 TM  88519       0      3       0        697          0
ADDF7F74 ADDF7F8C  479 TM  88519       0      3       0        685          0
ADEBEA20 ADEBEB3C  422 TX 131078   16739      6       0        697          1
....     ....      ... ...  ....    ....   ....    ....        ....      ....

Обратите внимание на колонку BLOCK. Если сессия выдала запрет на использование объекта, нужного другой сессии, то BLOCK=1. Кроме того, вы можете определить какая сессия блокируется, сравнивая значения в колонках ID1 и ID2. Заблокированная сессия будет иметь те же значения в ID1 and ID2 что и блокирующая сессия, но так как запрашиваемый объект заблокирован, то количество запросов будет больше 0 (REQUEST >0).

В приведенном запросе SID 422 блокирует SID 479. В нашем примере SID 422 связан с Сессией 1, а SID 479 это наша заблокированная Сессия 2.

Что бы избежать изучения таблицы и сравнения колонок ID1 и ID2, напишем запрос:

SQL> select l1.sid, ' IS BLOCKING ', l2.sid
2 from v$lock l1, v$lock l2
3 where l1.block =1 and l2.request > 0
4 and l1.id1=l2.id1
5 and l1.id2=l2.id2
SQL> /

SID 'ISBLOCKING' SID
 -    -           -
422  IS BLOCKING 479

1 row selected.

Еще лучше, если мы добавим представление v$session и результат будет легко понимаем:

SQL> select s1.username || '@' || s1.machine
2 || ' ( SID=' || s1.sid || ' ) is blocking '
3 || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
4 from v$lock l1, v$session s1, v$lock l2, v$session s2
5 where s1.sid=l1.sid and s2.sid=l2.sid
6 and l1.BLOCK=1 and l2.request > 0
7 and l1.id1 = l2.id1
8 and l2.id2 = l2.id2 ;

BLOCKING_STATUS
-
BULKLOAD@yttrium ( SID=422 )  is blocking BULKLOAD@yttrium ( SID=479 )

1 row selected.

В представлении v$lock информации гораздо больше, но для того чтобы читать эту информацию мы должны иметь представление о типах блокировки и о назначении колонок ID1 и ID2.

Тип блокировки и колонки ID1 / ID2

В нашем случае мы знаем точно, что блокировка вызвана предложением DML, так как сами её и вызвали. Но в большинстве случаев нам не будет так вести. К счастью вы можете легко прочитать эту информацию из таблицы v$lock.

Сначала вы должны изучить колонку TYPE. Существуют десятки типов блокировок, но подавляющее большинство из них системные. Обычно системные блокировки держатся очень короткое время и не самая лучшая идея настраивать ваши системные настройки на основании v$lock! (Смотрите часть V$LOCK в Oracle Database Reference.)

Существует только 3 типа пользовательских блокировок, TX, TM и UL.

UL (user-defined lock) - блокировка, определяемая с помощью пакета DBMS_LOCK.

TX блокировка это блокировка строки транзакцией; она выполняется один раз для каждой транзакции, изменяющей данные, не имеет значения как много объектов вы изменяете в этой транзакции. Колонки ID1 и ID2 указывают на сегмент отката и на элементы таблицы транзакций.

TM блокировка это блокировка предложением DML. Она выполняется один раз для каждого изменяемого объекта. Колонка ID1 показывает изменяемый объект.

Режимы блокировок

Вы можете о блокировках типа TM и TX изучив режимы блокировок. Колонки LMODE и REQUEST обе используют один и тот же метод числовой оценки режима блокировки: чем больше число, тем больше блокировка: от 0 для отсутствия блокировки до 6 для исключительной блокировки. Если сессия должна получить исключительную блокировку TX в случае изменения данных; LMODE будет равно 6. Если эта сессия не может получить исключительную блокировку так как некоторые строки хочет изменить другая сессия и она уже выставила свою блокировку, тогда наша сессия будет периодически запрашивать блокировку TX в исключительном режиме; LMODE будет равно 0 пока не получит блокировку, а REQUEST  будет равно 6. Вы можете это видеть в этом выводе из v$lock:
ADDR     KADDR     SID TY    ID1     ID2    LMODE    REQUEST  CTIME      BLOCK
-        -         -   -      -      -      -        -        -          -
AF9E2C4C AF9E2C60  479 TX    131078  16739  0        6        685        0
ADEBEA20 ADEBEB3C  422 TX    131078  16739  6        0        697        1

Обратите внимание на то, что колонки ID1 and ID2 в Сессии 2, которая запрашивает TX блокировку (LMODE=0, REQUEST=6), указывают на точки отката и транзакции из Сессии 1. Эта информация помогает нам определить блокирующую сессию для Сессии 2.

Иногда вы можете увидеть блокировку TX в режиме 4, режим разделения. Если в блоке, содержащем изменяемые строки нет свободного места в списке объектов транзакции (interested transaction list - ITL), тогда сессия выдает блокировку типа TX режим 4 до тех пор, пока не освободится место в ITL. Если вы видите блокировку TX-4 для какого-нибудь объекта, то возможно нужно увеличить параметр INITRANS для этого объекта.

Блокировки TM, как правило запрашиваются и получаются в режиме 3, что-то похожее эксклюзивную блокировку для разделяемых строк. DDL требует эксклюзивной блокировки для блокировки типа TM. (Заметьте, что предложение CREATE TABLE не требует TM блокировки - не надо блокировать ни каких объектов, ведь их еще нет!) DML требует эксклюзивную блокировку разделяемых записей. Итак, в селекте мы видели, что для резервирования DML были выданы блокировки типа TM с LMODE=3:

ADDR     KADDR    SID TY   ID1     ID2   LMODE    REQUEST    CTIME      BLOCK
-        -        -  -     -       -     -          -        -          -
ADDF7EC8 ADDF7EE0 422 TM   88519   0     3          0        697        0
ADDF7F74 ADDF7F8C 479 TM   88519   0     3          0        685        0

Определение заблокированного объекта

Теперь, когда мы знаем, что каждая строка типа TM указывает на заблокированный объект, мы можем использовать значение в колонке  ID1 для определения самого объекта.

SQL> select object_name from dba_objects where object_id=88519 ;
OBJECT_NAME
-
TSTLOCK

Иногда знание объекта достаточно, но мы пойдем дальше. Мы можем определить не только блок, но строку в нем, которую ждет Сессия 2.

Определение заблокированной записи

Мы можем получить эту информацию из представления v$session для заблокированной сессии:

SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row# from v$session where sid=479 ;
ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
        -                  -               -             -
        88519             16          171309             0

Это дает нам ID объекта, относительный номер файла, номер блока в этом файле и строку, которую ждет наша сессии. Если перечень этих параметров звучит для вас знакомо, это потому, что эти четыре компонента и составляют расширенный ROWID. Мы можем построить реальный расширенный ROWID из этих компонент при помощи пакета DBMS_ROWID. Функция ROWID_CREATE принимает эти аргументы и возвращает ROWID:

SQL> select do.object_name,
2 row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,
3 dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )
4 from v$session s, dba_objects do
5 where sid=543
6 and s.ROW_WAIT_OBJ# = do.OBJECT_ID ;


OBJECT_NAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C
-                      -              -               -             -                  -
TSTLOCK             88519             16          171309             0 AAAVnHAAQAAAp0tAAA

И конечно, это позволяет посмотреть эту запись напрямую.

SQL> select * from tstlock where rowid='AAAVnHAAQAAAp0tAAA' ;
FOO BAR
-   -
1   a

Заключение


Мы увидели, как определить блокирующую сессию, и как посмотреть на записи, которые ждет сессияWe've seen how to identify a blocking session, and how to inspect the very row that the waiting session is waiting for. And, I hope, learned a bit about v$lock in the process.

понедельник, 20 мая 2013 г.

Как узнать IP Вашего друга

Метод 1

  1. Закройте все вкладки в браузере и все активные подключения, за исключением служб вашего чата; удалите все куки из браузера.
  2. Пока Вы в чате откройте командную строку и введите команду netstat -an
  3. Вы увидите все IP адреса всех связей.
  4. Найдите адрес и протестируйте его. 

Метод 2


  1. Так же как и в методе 1 закройте все вкладки и сделайте чат активным.
  2. Пока чат активен, пошлите какой-нибудь файл и убедитесь, что он принимает его.
  3. Во время приема файла в отдельном окне, в командной строке введите команду netstat -n  
  4. Внешний адрес это то, что нам нужно.
  5. Теперь тестируйте его.
Примечание:
  • Локальный адрес это наш Ip.
  • номер порта и основное назначение
             80,81-------->Используется для передачи данных
             5050 -------->Личные сообщения
             5100 -------->Вэб камера
      5000,5001--------> Голосовые чаты
Другие полезные параметры команды netstat   
  -a Изображает все подключения и слушаемые порты.
  -e Изображает статистику Ethernet. Этот параметр можно употреблять с параметром -s. 
  -n Выводит адреса и порты в цифровой форме.
  -p proto Выводит подключения для указанного протокола proto; proto может быть TCP или UDP.
  -s выводит статистику по протоколу, proto может быть TCP, UDP или IP.
  -r Выводит таблицу соответствия адресов.
netstat -an -p tcp : эта команда расширяет netstat -an при помощи фильтра  -p tcp, она выводит подключения для tcp




четверг, 11 апреля 2013 г.

В ДНД за полотгула

Я закончил институт в феврале 1973 года. В НИИ я работал с июля 1972 года старшим лаборантом. Теперь меня перевели на инженерную должность. Сразу пошел трехлетний срок моего обязательного пребывания в НИИ. Я не мог уволится, но и уволить меня тоже не могли. Началось время "дедовщины". Я как самый молодой ходил в наряды. Вот примерный перечень(из записной книжки):
Дата               Отгулы
19.09.73  ДНД    0.5
23.09.73  база     2
28.03.74  ДНД    0.5
30.03.74  ДНД   1
25.05.74  ДНД   1
с 17 июля колхоз 8
25.09-07.10.74 колхоз 8
03.12.74 ДНД 1
Выборы           10
работа в избирательной комиссии


вторник, 26 февраля 2013 г.

Oracle 11g XE - подключение в Windows

Фирма Oracle выпускает вариант своей СУБД 11g в ограниченной версии: Express Edition(XE).
Для ее использования не нужна Лицензия. Конечно начинать изучение Oracle лучше с этой версии.

Для работы с Oracle фирма делает и выкладывает для использования два продукта: SQLDeveloper и DataModeler. Эти программы имеют большие возможности и очень полезны.
Но: они реализованы на языке Java и используют для доступа к базам как клиента так и jdbc с прямым доступом. При загрузке этих программ стартует java машина, которая читает с вашего компьютера локаль и передает программе. Та в свою очередь определяет сеансовые настройки NLS и пытаются установить их на сервере XE. А там их нет! Во всяком случае для России.
Коннект не проходит хоть плачь.

Выход прост: в файле sqldeveloper\sqldeveloper\bin\sqldeveloper.conf вставляем принудительную локаль для java машины:

AddVMOption -Duser.language=en
AddVMOption -Duser.region=us

Для datamodeler берем соответственно файл  C:\datamodeler\datamodeler\bin\datamodeler.conf.
Вставляем те же строчки.

 Если вы используете Python  с Oracle, то возможно и используете модуль cx_Oracle. Будьте готовы, что при попытки подключения выскочит ошибка по поводу того, что клиент просит установить такой  NLS_LANG, которого в XE нет! os.environ["NLS_LANG"]="AMERICAN_AMERICA.AL32UTF8"Ошибка ORA-12705.

Проблема решается аналогично.
в модуль Python вставляете строки:

import os
os.environ["NLS_LANG"]="AMERICAN_AMERICA.AL32UTF8"

и далее база XE ваша!






X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога