среда, 24 декабря 2014 г.

Как вставить одиночную кавычку в строку символов

Как вставить одиночную кавычку в строку символов

Если вам нужно вставить разделитель в строку, возникают муки с ужасными последствиями. До реализации Oracle Database 10g, вы должны были писать два символа кавычек подряд, для того чтобы в строку попал один. Вот примеры:

Literal (default delimiter)                                Actual value
------------------------------                            -------------------------------
'There''s no business like show business.'            There's no business like show business.
'"Hound of the Baskervilles"'                              "Hound of the Baskervilles"
''''                                                                      '
'''hello'''                                                              'hello'
''''''                                                                     ''
Из примеров видно что для того, что бы записать две кавычки рядом, надо написать шесть кавычек. Что бы упростить жизнь программисту, Oracle Database 10g ввела возможность пользователю ввести свои собственные разделители. Начните строку с символа "q", что бы указать свой разделитель, и окружите свое выражение в своих разделителях одинарными кавычками.

Вот примеры:

Literal (delimiters highlighted)                                        Actual value
--------------------------------------------                       -----------------------------------------
q' ( There's no business like show business.)                      ' There's no business like show business.
q' { "Hound of the Baskervilles" } '                                    "Hound of the Baskervilles"
q' [ ' ]'                                                                               '
q' !'hello' ! '                                                                       'hello'
q' |'' | '                                                                               ''

Вы можете использовать простые разделители такие как   ! или  |, или парные символа, такие как скобки, квадратные или фигурные скобки.

Одно финальное замечание: как вы и ожидаете, внутри строки символ двойной кавычки не имеет какого-то особого значения. Это символ такой же как и любой символ или цифра.

воскресенье, 7 декабря 2014 г.

Перемещение таблиц в новое табличное пространство


Итак, у нас сложилась не хорошая ситуация. В одном табличном пространстве "свалены" таблицы и их индексы от разных схем. Принимаем решение - для схемы SCHEMA10 создаем отдельное табличное пространство с именем TABLESPACE10. Для реальной схемы таблиц и индексов много. Тогда пропускаем в вашем любимом навигаторе, например SQLDeveloper вот этот оператор. И получаем для каждой таблицы и индекса строку с командами alter table move или alter index rebuild. Через copy/paste переносим их и выполняем. Готово.
Иногда полезно указать конкретное табличное пространство, из которого переносим таблицы.

select txt from (
select decode( segment_type, 'TABLE', segment_name, table_name ) order_col1,
       decode( segment_type, 'TABLE', 1, 2 ) order_col2,
      'alter '||lower(segment_type)||' '||lower(owner)||'.'||lower(segment_name)||
       decode(segment_type,'TABLE',' move ',' rebuild ')||
      ' tablespace TABLESPACE10;' txt
  from dba_segments d,
       (select table_name, index_name from dba_indexes) i
 where d.segment_type in ('TABLE', 'INDEX')
   and d.owner = 'SCHEMA10'
   and d.tablespace_name = 'TABLESPACE_OLD'
   and d.segment_name = i.index_name (+)
 order by 1, 2 )

среда, 29 октября 2014 г.

Установка PySide в Python 3.X для использования в Eclipse/PyDev

Установка PySide в Python 3.X для использования в Eclipse/PyDev

Для установки библиотеки PySide скачиваем файл дистрибутив и выполняем его. После этого входим в Eclipse-Pydev и настраиваем в Windows->Preferences настройки PyDev->Interpretes->Python Interpreter.
Проще всего удалить старое описание местонахождение Python и завести его по новой. Дальше в закладке Forced Builtins добавляем имя PySide.
Теперь в редакторе будет работать автозавершение.
PySide использует Qt4.8, только импортировать модули надо из PySide.
Компоновка немного другая, чем в PyQt, Но когда автозавершение заработает, вы легко поймете где что лежит.

воскресенье, 19 октября 2014 г.

Python3

В языке Python3+ пакет Tkinter перименован в tkinter, именно к нему надо ссылаться из программы. Вот таблица переименований:
  • Tkintertkinter
  • tkMessageBoxtkinter.messagebox
  • tkColorChoosertkinter.colorchooser
  • tkFileDialogtkinter.filedialog
  • tkCommonDialogtkinter.commondialog
  • tkSimpleDialogtkinter.simpledialog
  • tkFonttkinter.font
  • Tkdndtkinter.dnd
  • ScrolledTexttkinter.scrolledtext
  • Tixtkinter.tix
  • ttktkinter.ttk
Вы установили win32, но на оператор import win32api ругается попробуйте следующее:
1. Из папки C:\Python34\Lib\site-packages\pywin32_system32 скопируйте файлы
pythoncom34.dll
pywintypes34.dll
в папку C:\Python34\Lib\site-packages\win32;
2. Путь C:\Python34\Lib\site-packages\win32 должен быть в переменной окружения PATH.
3. Если не видите папку C:\Python34\Lib\site-packages\pywin32_system32, то в своем Навигаторе настройте видеть системные папки.

пятница, 3 октября 2014 г.

Программирование-читать

http://blog.fogus.me/2011/09/08/10-technical-papers-every-programmer-should-read-at-least-twice/

Белушкин С
http://rasfokus.ru/srg_52

Первый объект SEOvezetgazel
 

четверг, 14 августа 2014 г.

Молитва пожилого человека

Этот текст висит на стене в квартире Алексея Германа. Это молитва пожилого человека, которую читал его отец, известный писатель Юрий Герман.
Но чем раньше человек повесит его на свою, пусть даже виртуальную, стену, тем лучше.


Господи, ты знаешь лучше меня, что я скоро состарюсь. 

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

чтобы что-то улучшить. 
Пусть я буду размышляющим, но не занудой. Полезным, но не деспотом.
...Охрани меня от соблазна детально излагать бесконечные подробности. 

Дай мне крылья, чтобы я в немощи достигал цели. 
Опечатай мои уста, если я хочу повести речь о болезнях. 
Их становится все больше, а удовольствие без конца рассказывать о них - все слаще.
...Не осмеливаюсь просить тебя улучшить мою память, 

но приумножь мое человеколюбие, 
усмири мою самоуверенность, когда случится моей памятливости столкнуться с памятью других.
 

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


А. Ширвинт:

Старики должны быть беспомощны и трогательны, тогда их жалко, и они нужны для ландшафта и секундного осмысления молодежью бренности существования. 

Воинственно молодящихся стариков надо сбрасывать со скал. За неимением скал - сбрасывать со счетов. 
Я имею в виду банковские.

Список полезных упражнений https://sites.google.com/site/hozhak/upraznenia-dla-pozvonocnika

вторник, 12 августа 2014 г.

Apache Derby на Windows

Если вы решили заняться Apache Derby на Windows, то при использовании утилит вы будите получать абра-кадабру в сообщениях в консольном окне. Что бы это исправить, нужно в пакетных файлах вызова утилит установить переменную вот так -Dderby.ui.codeset=Cp866. Например:
:runNoClasspath
"%_JAVACMD%"  -Dderby.ui.codeset=Cp866 %DERBY_OPTS% -classpath "%LOCALCLASSPATH%" org.apache.derby.tools.sysinfo %DERBY_ARGS%

%DERBY_CMD_LINE_ARGS%
goto end

:runWithClasspath
"%_JAVACMD%"  -Dderby.ui.codeset=Cp866 %DERBY_OPTS% -classpath "%CLASSPATH%;%LOCALCLASSPATH%" org.apache.derby.tools.sysinfo %DERBY_ARGS%

%DERBY_CMD_LINE_ARGS%
goto end


Это фрагмент файла sysinfo.bat.

четверг, 17 июля 2014 г.

RMAN обновление физической копии файла, используя изменения

RMAN обновление физической копии файла, используя изменения


Начиная с версии oracle 10g, в RMAN появилась очень полезная возможность обновить физическую копию по инкрементальным изменениям в файле данных.

RUN
{
  RECOVER COPY OF DATABASE
    WITH TAG 'incr_img_update'
    UNTIL TIME 'SYSDATE - 7';
  BACKUP
    INCREMENTAL LEVEL 1
    FOR RECOVER OF COPY WITH TAG 'incr_img_update'
    DATABASE;
}

Эта команда состоит из двух команд RECOVER и BACKUP. Важно помнить о наличии опции  TAG в обеих командах.

В первый день запуска команды recover не делается ничего так как нечего восстанавливать. С другой стороны команда backup в первый день создает бэкап уровня 0 так как его не существовало. Этот бэкап послужит основой для будущих обновлений.

На второй день и на остальные дни вплоть до 7 го дня восстановления копии файла не происходит. С другой стороны команда backup выполняет инкрементальную копию уровня 1 все 7 дней. После того как прошло 7 дней, команда recovery находит бэкап уровня 1, созданный на второй день и выполняет обновление копии файла (продвигает его на один день вперед).

День             Бэкап                          Восстановление
  1                level 0  (Base)               No
  2                Level 1 (Incr.)               No
  3                Level 1 (Incr.)               No
  4                Level 1 (Incr.)               No
  5                Level 1 (Incr.)               No
  6                Level 1 (Incr.)               No
  7                Level 1 (Incr.)               No
  8                Level 1 (Incr.)               No
  9                Level 1 (incr.)               Day 1 копия файла обновляется с изменениями втого дня.

понедельник, 7 июля 2014 г.

Про SQLITE3

Выйти из sqlite3 можно с помощью команды  
.exit.
Сделать дамп базы данных :
sqlite3 catbase.db .dump
Дамп сохранить в файле:
sqlite3 catbase.db .dump > test.sql

Выбрать все записи для таблицы test можно так:
sqlite3 catbase.db "select * from test"
Создать новую базу данных test.db из дампа test.sql:
sqlite3 test.db < test.sql
Создать базу данных с опцией init:
sqlite3 -init test.sql test2.db
То же самое с выходом из оболочки:
sqlite3 -init test.sql test2.db .exit
Восстановить базу:
sqlite3 catbase.db < catbase.sql 
При восстановление базы файла catbase.db быть не должно.
Второй способ. В самой оболочке мы делаем перенаправление во внешний файл, а затем восстанавливаем вывод данных на экран.
sqlite> .output file.sql 
sqlite> .dump 
sqlite> .output stdout 
sqlite> .exit 
При сохранении базы данных в бинарном виде просто скопировать файл *.db недостаточно. Можно сократить размер базы, удалив неиспользуемые пробелы:
sqlite3 catbase.db vacuum 
copy catbase.db catbase.backup
Команда командной строки copy копирует файл и сохраняет его под другим именем.
Но в некоторых случаях бывает проще удалить старый файл и переименовать из бэкапа сохраненный файл, чем восстанавливать записи.

суббота, 5 июля 2014 г.

Понимание питоновского ‘super’

Понимание питоновского ‘super’
Consider the ‘super’ functionality in Python

Мне было это не интересно, пока я не начал работать в Django. Когда я изучил коды, генерируемые в этом фреймвоке, я осознал то, что можно делать с super.
Допустим у нас есть класс A, в котором определен некоторый метод routine, примерно так:


class A(object): 
# In Python 3, you can just do class A:
    def routine(self):
        print "A.routine()"
Теперь создадим класс B, который наследует от A, и он также содержит метод routine:

class B(A):
    def routine(self):
        print "B.routine()"
 
Мы создаем экземпляр:
>>> b = B()
Тепер, если вы создадите экземпляр B и вызовете его метод, вы будете вызывать метод из B - всегда.

Now consider if class B had the added a line to the end of it’s method:
class B(A):
    def routine(self):
        print "B.routine()"
        super(B, self).routine() 
# In Python 3, you can just do super().routine()
 
В этом случае In this case, ‘super’ will return the A object which is underneath B.  You give super() a handle to its own class, and then an actual instance of that same class.  Hence, we gave it “B”, and then “self”.  Super returns the literal parent of the active B object (which is the local variable ‘b’, because we passed it ‘self’).  It is not returning the simple generic class; instead, it is returning the actual A which was created when the local variable b was created.  This is called a “bound” class object, because it’s referring to an actual parent class object in memory, instead of just the class blueprint.
This is what happens when we create a new B object now:
>>> b = B() 
>>> b.routine() 
'B.routine()' 
'A.routine()' 
Simply put, this kind of usage of the super method is often used to “pass control up” to the parent class, after the subclass intercepts data.
В конце, если вам интересно, здесь более практический пример:

from some.package import
# We don't need to know anything about the base class "A", 
# but we do want to intercept one of its parameters, "foo", 
# and change it, sending it along as before. 
# This new class could be used in place of "A" without 
# other sections of code even knowing the difference. 
class MyClass(A): 
    def render(self, foo, *args, **kwargs): 
    ''' this receives a var named 'foo', 
        a tuple of unnamed 'args',and a dictionary of named 'kwargs' '''
        # Append a quick prefix to the variable 'foo' 
        foo = "intercepted by MyClass - " + foo  
        super(MyClass, self).render(foo, *args, **kwargs)

В этом примере, мы ничего не должны знать о классе A, за исключением того факта except for the fact that we want to alter the variable ‘foo’ when it comes into A‘s render method.
Note that ‘*args’ catches any unnamed arguments passed to MyClass, and that ‘**kwargs’ is the common abbreviation for ‘key-word arguments’.

Also note that the only reason why MyClass‘s render method ALSO takes bunches of arguments is because we model it to look exactly like A‘s render method.  We want MyClass to seamlessly integrate with some other code.  That other code should never have a reason know the difference between A and MyClass.

All this does is change ‘foo’, and then passes control back up to the parent class A, where the data was intended to go.  We cleanly call the super method, which returns A, with all of its unknown methods and fields.  We then call ‘render‘ on that returned object, in order to execute A‘s own render method (and not our overloaded one in MyClass).

By passing A its arguments with those prefixing * characters, we preserve how they were passed into myClass.  Keyword arguments get turned into a dictionary while in MyClass.render, but A.render wants them as keyword arguments still, not a dictionary.  So, we use the dereferencing * characters to turn it back into keyword arguments.

Clean, huh?  This is extremely common in Django code, because Django gives you base classes to model from.  You then have the power to easily overload those model methods, do some custom task, and then pass control back up to the model’s method for the intended behavior.

While super is nice, it only resolves into a single parent class, such that multiple inheritance (where multiple parent classes have the same method name) won’t know how to decide between which method to run.

Instead, you can directly invoke the parent class’s method in a more manual manner, such as “SecondParentClass.render(self, foo, *args, **kwargs)”.  Note that you pass a reference to ‘self’ in that method call, to properly put things into scope.

среда, 30 апреля 2014 г.

Перечень исключений и встроенных функций в Python


Встроенные функции

Как вызывать Описание
abs(x) Возвращает абсолютное значение числа.
all(iterable) Возвращает True, если булево выражение равно True для каждого элемента.
any(iterable) Возвращает True, если булево выражение равно True хотя бы для одного  элемента.
chr(integer) Возвращает одно символьную строку в Unicode по данном целому числу.
divmod(x, y) Возвращает (x // y, x % y) как кортеж, если x и y целые.
hash(obj) Возвращает целое хэш значение для заданного объекта.
id(obj) Возвращает уникальное целое, которое является идентификатором объекта.
input(prompt) Возвращает строку из обычного ввода; приглашение к вводу не обязательно.
isinstance(obj, cls) Определяет является ли obj экземпляром класса cls (или подкласса).
iter(iterable) Возвращает новый итерационный объект для параметра.
len(iterable) Возвращает число элементов в данном итерационном объекте.
map(f, iter1, iter2, ...) Return an iterator yielding the result of function calls f(e1, e2, ...) for respective elements e1 -iter1, e2 -iter2, ...
max(iterable) Возвращает the largest element of the given iteration.
max(a, b, c, ...) Возвращает the largest of the arguments.
min(iterable) Возвращает the smallest element of the given iteration.
min(a, b, c, ...) Возвращает the smallest of the arguments.
next(iterator) Возвращает the next element reported by the iterator (see Section 1.8).
open(filename, mode) Open a file with the given name and access mode.
ord(char) Возвращает the Unicode code point of the given character.
pow(x, y) Возвращает the value x в степени y (as an integer if x and y are integers); equivalent to x**y.
pow(x, y, z) Возвращает the value(x в степени y по mod z) as an integer.
print(obj1, obj2, ...) Print the arguments, with separating spaces and trailing newline.
range(stop) Construct an iteration of values 0,1, ... ,stop−1.
range(start, stop) Construct an iteration of valuesstart,start+1, ...,stop−1.
range(start, stop, step) Construct an iteration of valuesstart,start+step,start+2step, ...
reversed(sequence) Возвращает an iteration of the sequence in reverse.
round(x) Возвращает the nearest int value (a tie is broken toward the even value).
round(x, k) Возвращает the value rounded to the nearest 10 в степени −k (return-type matches x).
sorted(iterable) Возвращает a list containing elements of the iterable in sorted order.
sum(iterable) Возвращает the sum of the elements in the iterable (must be numeric).
type(obj) Возвращает the class to which the instance obj belongs.

 

Классы обычных исключений в Python

Класс Описание
Exception Базовый класс для большинства типов ошибок
AttributeError Возникает при использовании конструкции obj.foo,if в случае, если у obj нет компонента с именем foo
EOFError Возникает если достигается "конец файла" для консольного ввода или ввода из файла
IOError Возникает при аварийной операции ввода-вывода I/O(например, открытия файла)
IndexError Возникает в случае если индекс по последовательности выходит за границы последовательности
KeyError Возникает в случае если используется несуществующий ключ для множества или словаря(set или dictionary)
KeyboardInterrupt Возникает в случае если во время выполнения программы пользователь нажимает ctrl-C
NameError Возникает в случае если используется несуществующий идентификатор
StopIteration Возникает в случае если нет елементов при использовании next(iterator)
TypeError Возникает в случае если при вызове функции используется неверный тип параметра
ValueError Возникает в случае если параметр имеет неверное значение(например,sqrt(−5))
ZeroDivisionError Возникает в случае если возникает деление на ноль

понедельник, 28 апреля 2014 г.

Вызов функций

Основы соответствия аргументов при вызове функций

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

Коллекция Varargs: коллекция неопределенного числа позиционных или ключевых аргументов
Функции могут использовать специальные аргументы перед которыми ставят одну или две звездочки * для того, чтобы передать неопределенное число аргументов. Такая возможность часто обозначается как varargs, по аналогии с языком C; в Python, эти аргументы собираются в нормальный объект.

Неупакованные Varargs: передается неопределенно много позиционных и ключевых аргументов
При вызове функции можно использовать *синтаксис для того, что бы распаковать коллекцию аргументов в отдельные аргументы. Это обратная операция к *, указанной в описании функции - в описании функции это означает коллекцию неопределенно большого количества аргументов, а во время вызова функции это означает разбор коллекции и передачу функции членов коллекции как отдельные значения.

Только ключевые Аргументы: такие аргументы передаются по имени
В Python 3.X (но не в 2.X), в функциях могут быть заданы аргументы, которые передаются не по позиции, а по имени. Такие аргументы обычно используются для определения конфигурации дополнительно к реальным аргументам.

Формы соответствия аргументов
Синтаксис                            Описание

func(value)                     Обычный аргумент вызывающей функции: позиционное соответствие

func(name=value)         Ключевой аргумент вызывающей функции: соответствие по имени

func(*iterable)              Вызывающая функция передает все объекты как итерационный объект с
                                      количеством параметров равным количеству аргументов в описании
                                      функции
                                      пример:
                                      >>> def f1(a, b, c):
                                      ...         print(a,b,c)
                                     >>> f1(*(1,2,3))
                                      1,2,3
 
func(**dict)                   Вызывающая функция передает все пары ключ/значение из словаря как
                                     индивидуальные аргументы
                                      >>> def f2(a, c, d):
                                           ...    print(a,c,d)
                                     >>> s = {'d':'3','a':1,'c':2}
                                     >>> f2(**s)
                                     1 2 3

def func(name)              Нормальные аргументы функций: соответствие выполняется по позиции
                                      или по имени
def func(name=value)   Таким образом задается значение по умолчанию, если значение не
                                      указано при вызове
def func(*name)              Функция сопоставляет и собирает все оставшиеся аргументы в кортэж

def func(**name)          Функция сопоставляет и собирает все оставшиеся ключевые аргументы
                                       в словарь

def func(*other, name)  Аргументы функции, которые должны быть переданы по ключу только в
                                      момент вызова (3.X)
def func(*, name=value)Аргументы функции, которые должны быть переданы по ключу только в
                                      момент вызова (3.X)

Эти способы вызова функций применяются следующим образом:

• При вызове функции, значения сопоставляются аргументам по их позиции, но  использование формы имя=значение говорит Python использовать имя аргументов; это так называемые ключевые аргументы. Использование *iterable или **dict при вызове функции позволяет нам упаковывать произвольное количество позиционных или ключевых объектов в последовательности и словари, соответственно. При передаче в функцию они распаковываются и используются как отдельные параметры.

• При описании функции, a simple nameis matched by position or name depending on how the caller passes it, but the name=value form specifies a default value. The *nameform collects any extra unmatched positional arguments in a tuple, and the **nameform collects extra keyword arguments in a dictionary.
In Python 3.X, any normal or defaulted argument names following a  *nameor a bare *are keyword-only arguments and must be passed by keyword in calls. Of these, keyword arguments and defaults are probably the most commonly used in Python code. We’ve informally used both of these earlier in this book:

• We’ve already used keywords to specify options to the 3.X  print function, but they are more general - keywords allow us to label any argument with its name, to make calls more infomational.

• We met defaults earlier, too, as a way to pass in values from the enclosing function’s scope, but they are also more general—they allow us to make any argument optional, providing its default value in a function definition.

As we’ll see, the combination of defaults in a function header and keywords in a call further allows us to pick and choose which defaults to override.

In short, special argument-matching modes let you be fairly liberal about how many arguments must be passed to a function. If a function specifies defaults, they are used if you pass  too few arguments. If a function uses the *variable argument list forms, you can seemingly pass  too many arguments; the  *names collect the extra arguments in data structures for processing in the function.

The Gritty Details

If you choose to use and combine the special argument-matching modes, Python will ask you to follow these ordering rules among the modes’ optional components:

• При вызове функции, аргументы должны появляться в вызове в следующем порядке: сначала любые позиционные аргументы (их значения); за ними идут комбинации любых ключевых аргументов (типа имя=значение) и затем *итерационные объекты; затем **объекты типа словари.

• В заголовке описания функции, аргументы должны появляться в таком порядке: всякие обычные аргументы (имена); followed by any default arguments (name=value); followed by the *name(or *in 3.X) form; followed by any  nameor  name=valuekeyword-only arguments (in 3.X); followed by the **nameform.

Как при вызове функций, так и при ее описании, форма **args должна появляться последней, если она присутствует. Если вы смешаете аргументы в произвольном порядке, то получите сообщение о синтаксической ошибке. Python выполняет следующие шаги для поиска соответствия между аргументами перед вызовом функции:

1. Назначение неключевых аргументов по расположению.
2. Назначение ключевых аргументов по соответствию имен.
3. Назначение экстра неключевых аргументов к кортежу вида *name.
4. Назначение экстра ключевых аргументов к словарю вида **name.
5. Назначение значений, определенных как по умолчанию в описании функции и оставшихся не определенными.

After this, Python checks to make sure each argument is passed just one value; if not, an error is raised. When all matching is complete, Python assigns argument names to the objects passed to them.
The actual matching algorithm Python uses is a bit more complex (it must also account for keyword-only arguments in 3.X, for instance), so we’ll defer to Python’s standard language manual for a more exact description. It’s not required reading, but tracing Python’s matching algorithm may help you to understand some convoluted cases, es-pecially when modes are mixed.

Python 3.X Keyword-Only Arguments

Python 3.X generalizes the ordering rules in function headers to allow us to specify keyword-only arguments-arguments that must be passed by keyword only and will never be filled in by a positional argument. This is useful if we want a function to both process any number of arguments and accept possibly optional configuration options.

Syntactically, keyword-only arguments are coded as named arguments that may appear after  *argsin the arguments list. All such arguments must be passed using keyword syntax in the call. For example, in the following, amay be passed by name or position, bcollects any extra positional arguments, and  cmust be passed by keyword only. In 3.X:

>>> def kwonly(a, *b, c):
...  print(a, b, c)
>>> kwonly(1, 2, c=3)
1 (2,) 3
>>> kwonly(a=1, c=3)
1 () 3
>>> kwonly(1, 2, 3)
TypeError: kwonly() missing 1 required keyword-only argument: 'c' 

We can also use a *character by itself in the arguments list to indicate that a function does not accept a variable-length argument list but still expects all arguments following the  *to be passed as keywords. In the next function,  amay be passed by position or name again, but band cmust be keywords, and no extra positionals are allowed:

>>> def kwonly(a, *, b, c):
...    print(a, b, c)
>>> kwonly(1, c=3, b=2)
1 2 3
>>> kwonly(c=3, b=2, a=1)
1 2 3
>>> kwonly(1, 2, 3)
TypeError: kwonly() takes 1 positional argument but 3 were given
>>> kwonly(1)
TypeError: kwonly() missing 2 required keyword-only arguments: 'b' and 'c'

You can still use defaults for keyword-only arguments, even though they appear after the  *in the function header. In the following code,  amay be passed by name or position, and band care optional but must be passed by keyword if used:

>>> def kwonly(a, *, b='spam', c='ham'):
...print(a, b, c)
>>> kwonly(1)
1 spam ham
>>> kwonly(1, c=3)
1 spam 3
>>> kwonly(a=1)
1 spam ham
>>> kwonly(c=3, b=2, a=1)
1 2 3
>>> kwonly(1, 2)
TypeError: kwonly() takes 1 positional argument but 2 were given

In fact, keyword-only arguments with defaults are optional, but those without defaults effectively become required keywordsfor the function:

>>> def kwonly(a, *, b, c='spam'):
... print(a, b, c)
>>> kwonly(1, b='eggs')
1 eggs spam
>>> kwonly(1, c='eggs')
TypeError: kwonly() missing 1 required keyword-only argument: 'b'
>>> kwonly(1, 2)
TypeError: kwonly() takes 1 positional argument but 2 were given
>>> def kwonly(a, *, b=1, c, d=2):
print(a, b, c, d)
>>> kwonly(3, c=4)
3 1 4 2
>>> kwonly(3, c=4, b=5)
3 5 4 2
>>> kwonly(3)
TypeError: kwonly() missing 1 required keyword-only argument: 'c'
>>> kwonly(1, 2, 3)
TypeError: kwonly() takes 1 positional argument but 3 were given Ordering rules

четверг, 24 апреля 2014 г.

OpenVMS-Кто держит файл?

OpenVMS-Кто держит файл?

Нужно узнать кто держит файл.
Например:
Входим на Server под ora10g. Встаем на искомый диск: set def DISK$ORA1:
Для поиска файла freedoc_ind.dbf на диске DISK$ORA1: вводим команду:
ORA10G$pipe show device/files DISK$DBO_DATE:| SEARCH SYS$PIPE freedoc_ind.dbf
ORA_DBOC3A38 41763A38 [ORA10G.ORA]freedoc_ind.dbf;1
ORA_DBOC2590 417F2590 [ORA10G.ORA]freedoc_ind.dbf;1
Это уже для информации
VBCS_10G$SHOW SYSTEM/PROCESS=ORA_DBOC3A38
OpenVMS V8.4  on node VBCS   19-NOV-2013 10:23:48.42   Uptime  239 17:07:07
  Pid    Process Name    State  Pri      I/O       CPU       Page flts  Pages
41763A38 ORA_DBOC3A38    LEF      6   219304   0 00:00:30.85      9491   6054

Pid - 41763A38 - по его значению в EM находим процесс Oracle, который держит файл!

вторник, 8 апреля 2014 г.

Sigil-Как включить пользовательские фонты

Включение фонтов в вашу книгу при помощи программы Sigil

Здесь показано как использовать пользовательские фонты в вашем EPUB.
Чтобы использовать фонт в EPUB вам нужно загрузить фонт в EPUB, определить стиль для этого фонта, и затем применить этот стиль к вашему тексту.

Добавление фонтов к вашему EPUB

Что бы добавить фонты к вашей книге, используйте кнопку Add Existing Files document-add_22px. После нажатие кнопки, вы увидите диалог, который позволит вам выбрать один или более файлов с вашего компьютера. Выберите нужные вам файлы с фонтами.
Многие фонты не являются бесплатными. Убедитесь в том, что у вас есть лицензия или доступ к включаемым файлам. Существует множество свободных фонтов.
Файлы с фонтами должны быть или OpenType (.otf) либо TrueType (.ttf) форматами. Все читалки должны поддерживать файлы типа otf но большинство должно поддерживать оба формата.
Фонты будут добавлены в директорию Fonts вашей книги. Тем не менее, их еще нельзя использовать – они только готовы к использованию.

Опрелеление стиля для вашего фонта

Раз уж фонты в вашей книге EPUB, вы должны добавить стиль для их подключения.
Добавьте или откройте таблицу стилей подключенную к вашему файлу HTML .
Добавьте определение фонта например:
@font-face {
    font-family: 'Garamond';
    font-weight: normal;
    font-style: normal;
    src: url('../Fonts/Garamond.ttf');
}

@font-face {
    font-family: 'Garamond';
    font-weight: bold;
    font-style: normal;
    src: url('../Fonts/Garamond Bold.ttf');
}

@font-face {
    font-family: 'Garamond ;
    font-weight: normal;
    font-style: italic;
    src: url('../Fonts/Garamond Italic.ttf');
}
Имя фонта зависит от больших и маленьких букв!
Вы должны определить одно правило @font-face для каждого стиля фонта (normal, bold, italics и т.д.).
 
При использовании имени семейства шрифтов имя шрифта должно быть либо заключено в кавычки, либо не заключено в кавычки каждый раз, когда вы его используете — вы не можете смешивать имена в кавычках и без кавычек. Всегда использование кавычек вокруг имени шрифта делает вещи более последовательными и позволяет избежать проверки правильности имени без кавычек.

Шрифт еще не используется в книге, это следующий шаг.
 

Примените свой шрифт к тексту

 
Чтобы использовать шрифт, вам нужно создать другой стиль, который вы затем назначите разделам вашего текста.
Так, например, чтобы использовать новый шрифт для заголовков, определите стиль тега заголовка следующим образом:
h1 { 
    font-family: 'Garamond', serif;
}
Или для определенного параграфа:
p.longhand { 
    font-family: 'Garamond', serif;
    font-style: italic;
}
Или, если хотите, хотя это и не рекомендуется, вы можете применить шрифт ко всему тексту в книге:
body { 
    font-family: 'Garamond', serif;
    font-weight: bold;
}
Приведенные выше правила семейства шрифтов предписывают программе чтения использовать ваш шрифт, если это возможно, для текста, но если это невозможно, используйте общий шрифт с засечками.

Обфускация шрифта

Когда вы используете шрифт в EPUB, файл шрифта может быть извлечен кем-то и использован где-то еще. Если ваши шрифты лицензированы, вы можете предотвратить это.
Вы можете использовать меню запутывания шрифтов Sigil, чтобы зашифровать файл шрифта, используя один из двух стандартных методов, Adobe или IDPF — какой из них зависит от вас, но вам следует проверить на вашей целевой электронной читалке, чтобы убедиться, что шрифт все еще читаем. Обфускация — это не шифрование — она просто изменяет файл шрифта, что затрудняет его использование в другом месте, но при этом читатели могут использовать его для отображения шрифтов.
Чтобы использовать обфускацию шрифтов, щелкните правой кнопкой мыши шрифты в окне обозревателя книг, щелкните правой кнопкой мыши и выберите в меню «Обфускация шрифтов» и выберите метод, который следует использовать для обфускации.
tutorial-font-obfuscate

Проверка вашего шрифта

Не все устройства будут отображать встроенные шрифты. Даже Sigil может не отображать все ваши встроенные шрифты. Лучше всего проверить на целевом устройстве, чтобы убедиться, что ваши шрифты отображаются так, как вы ожидаете.

понедельник, 7 апреля 2014 г.

Перемещение большой таблицы в другую группу

Moving Large Table to Different File Group

By Raj Gujar, 2013/12/06 (first published: 2008/10/16)
Допустим, что мы имеем какую-нибудь базу данных, растущую в размере очень быстро. Находится она на диске E: размером 200 GB. Диск уже наполнен на 90 процентов и в перспективе база станет больше диска. На этом сервере есть другие и достаточно памяти, поэтому логично будет переместить несколько больших таблиц на другой диск.
Далее описано как это выполнить. Первое, мы определяем самую большую таблицу, используя sp_spaceused для того, что бы узнать место, занимаемое каждой таблицей.

Затем мы принимаем решение создать новую файлгруппу на языке T-SQL (можно использовать и SSMS).
ALTER DATABASE SALES ADD FILEGROUP [SECONDERYDATA]
Затем мы создаем файл на новом диске под созданной файлгруппой:
ALTER DATABASE SALES
ADD FILE
( NAME = XFILENAME,
FILENAME = 'new path\SALES.ndf',
SIZE = 1MB,
MAXSIZE = 10MB,
FILEGROWTH = 1MB)
TO FILEGROUP [SECONDERYDATA]
GO
Теперь, база данных знает, что существует и другая файл группа, которая может быть использована для хранения данных. Remember the Server \ Database will not start to create new files in the new file group, you will have to explicitly specify it.
Now let's see how you can move an existing table that has a Cluster Index to a different filegroup. First, let's drop the Primary Key constraint with an Move to Option ( We are assuming that there is a cluster index on the PK).
ALTER TABLE [INVOICE]
DROP CONSTRAINT [INVOICE_PK] WITH (MOVE TO SECONDERYDATA)
After the move, we now recreate the PK Constraint:
ALTER TABLE [INVOICE]
ADD CONSTRAINT [INVOICE_PK] PRIMARY KEY CLUSTERED 
( [column name] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [SECONDERYDATA]
Remember when you recreate the PK constraint on the Seconderydata filegroup, all the data in that table will automatically be moved to the Secondery data filegroup. This will only happen in the case of a table that has a primary key constraint and has a clustered index.
The transfer time may depend on the size of the table, so please do not do this during business hours. SQL Server will generally lock the entire table.
Now all you data for that table will be moved to the new file group. И пожалуйста, не забудьте shrink базу данных для того, чтобы освободить память.

суббота, 5 апреля 2014 г.

Подготовка файла для Sigil

Если у вас уже есть EPUB или HTML файл, вы можете дальше не читать.
Если вы создали документ в текстовом редакторе, то первое, что вам нужно сделать это конвертировать файл в формат HTML, это позволит вам импортировать этот файл в Sigil. Для правильного отображения текста используйте стили и старайтесь не использовать заумные форматы и представления.
Не надо ожидать, что формат EPUB будет выглядеть как печатная книга – EPUB разработан с целью дать возможность ридеру самому управлять видом страницы.

Документы Word

Используйте меню MS Word File→Save As Filtered HTML. Или макрос MS Word Macro @ MobileRead.
Обе эти возможности пытаются уменьшить количество кода генерируемого в файл HTML, это упростит редактирование файла в Sigil. Если вы этого не сделаете, то Word добавит громадное количество тэгов HTML и будет очень тяжело разобраться с ними.
При использовании графических редакторов используйте стили - это важная концепция форматирования формата EPUB.

Текстовые файлы

Можно и не преобразовывать текстовые файлы в HTML. Sigil может сам открыть файл типа .txt.
Текстовый файл должен содержать пустую строку между параграфами, тогда Sigil при открытии выделит текст в отдельный параграф.
Конечно, текстовые файлы это не идеальный источник, но иногда это лучше чем файлы с множеством не нужных тэгов HTML.

Другие форматы

Некоторые редакторы, такие как LibreOffice, имеют опции при сохранении как (save-as) или экспорт в HTML oили даже в EPUB. Кроме того вы можете выполнить конвертацию текстов в HTML или EPUB при помощи программы calibre.

понедельник, 31 марта 2014 г.

sqlite3 команды



Если вы только собираетесь стать специалистом в области СУБД, то вам можно начать с SQLITE. Вы можете сделать какое-нибудь приложение "для себя". Возьмите Python и Django и реализуйте ведение расписание уроков. После того, как все готово: в базе данных есть таблицы и там есть нужные данные, встает вопрос: как перенести эту базу на место эксплуатации, например в школу? Все профессионалы делают для этого скрипты, что бы потом пропустить их через специальную утилиту и создать нужную вам копию базы на месте использования. Такая утилита есть в Oracle - SQLPLUS, в MS SQL это sqlcmd. Есть такая утилита и в SQLITE - это sqlite3. Создайте для этой утилиты такие скрипты - создание вашей базы, дампирования ее, восстановление и вы лучше начнете понимать администратора Субд в крупной организации и то, что он ждет от вас как разработчика. Он ждет скриптов. Ниже приведен файл HELP для утилиты sqlite3. 
 
C:\Documents and Settings\user>sqlite3
SQLite version 3.8.1 2013-10-17 12:57:35
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .help

.backup ?DB? FILE
Выполнить Бэкап базы DB (поумолчанию с именем "main") в файл с именем FILE
.bail ON|OFF
Stop after hitting an error.  Default OFF
.databases
Распечатать имена и файлы подключенных баз данных
.dump ?TABLE? ...  
Dump the database in an SQL text format If TABLE specified, only dump tables matching  LIKE pattern TABLE.
.echo ON|OFF
Turn command echo on or off
.exit 
Exit this program
.explain ?ON|OFF?
Turn output mode suitable for EXPLAIN on or off.  With no args, it turns EXPLAIN on.
.header(s) ON|OFF
Turn display of headers on or off
.help
Show this message
.import FILE TABLE
Import data from FILE into TABLE
.indices ?TABLE?
Show names of all indices If TABLE specified, only show indices for tables matching LIKE pattern TABLE.
.load FILE ?ENTRY?
Load an extension library
.log FILE|off
Turn logging on or off.  FILE can be stderr/stdout
.mode MODE ?TABLE?    
Set output mode where MODE is one of:
 csv            Comma-separated values
 column      Left-aligned columns.  (See .width)
 html           HTML code
 insert         SQL insert statements for TABLE
 line            One value per line
 list             Values delimited by .separator string
 tabs          Tab-separated values
 tcl      TCL list elements
.nullvalue STRING
Use STRING in place of NULL values
.output FILENAME
Send output to FILENAME
.output stdout
Send output to the screen
.print STRING... 
Print literal STRING
.prompt MAIN CONTINUE
Replace the standard prompts
.quit
Exit this program
.read FILENAME
Execute SQL in FILENAME
.restore ?DB? FILE
Restore content of DB (default "main") from FILE
.schema ?TABLE?
Show the CREATE statements
If TABLE specified, only show tables matching
LIKE pattern TABLE.
.separator STRING
Change separator used by output mode and .import
.show
Show the current values for various settings
.stats ON|OFF
Turn stats on or off
.tables ?TABLE?
Распечатать список таблиц. Если задано значение TABLE, печатаются таблицы, удовлетворяющие оператору LIKE шаблон TABLE
.timeout MS
Try opening locked tables for MS milliseconds
.trace FILE|off
Output each SQL statement as it is run
.vfsname ?AUX?
Print the name of the VFS stack
.width NUM1 NUM2 ...  
Set column widths for "column" mode
.timer ON|OFF
Turn the CPU timer measurement on or off

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

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

Архив блога