понедельник, 18 июля 2011 г.

текстовые редакторы

Текстовые редакторы




NetBeans

список функций, code browser, function list → см. Navigator (ctrl+7)

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

ctrl+e/ ctrl+x
удалить строку
ctrl+k
вставить последнее слово (перед курсором)
Alt+Shift + вверх/внизпереместить строку
Shift+Deleteкопирование строки в буфер + удаление
ctrl + Home/End
переместиться в начало/конец документа
ctrl + PageUp/PageDown
перемещение по вкладкам
Ctrl+Shift + C
закомментировать выделенное

NetBeans подсвечивает в коде все вхождения выделенного слова.
При нажатии на ctrl+r, можно поправить все вхождения этого слова.

Настройки

хранятся в C:\Program Files\NetBeans 6.7\etc\netbeans.conf
выставить кодировку utf-8: добавить в netbeans_default_options параметр -J-Dfile.encoding=UTF-8

ассоциация расширений файлов
Tools → Options → Miscellaneous → File → File Associations

игнорировать типы файлов:
в Tools → Options → Miscellaneous → Files → Ignored Files Pattern дописать в конец:
|\.pyc$

Цвета

mark-occurrences/отметить совпадения
Tools → Options → Fonts & Color → Language → Python



Работа с БД

1. Надо установить плагин Database (если он ещё не установлен)
2. Открыть панель Services, на ней правой кнопкой мыши и создать коннекшн.
Для MySQL выбираем драйвер MySQL (Connector/J driver). Далее всё как обычно - логин, пароль. Но: на localhost коннектиться не захотел, указал ему 127.0.0.1.
3. наслаждаемся

Проблемы с alt+tab

После переключения по alt+tab фокус не попадает в окно с редактированием текста. Проблема с использованием стандартной библиотеки swing. Её можно заменить, добавив
--laf javax.swing.plaf.metal.MetalLookAndFeel в netbeans.conf

Обсуждение по теме: http://forums.netbeans.org/topic5465.html

Макросы

Например, можно назначить вставку шаблона по горячей клавише.

Eclipse/Aptana

plugin manager: help → Software updates → Find and install → действуем по обстоятельствам

Есть понятие перспективы/представления/view: в правом верхнем углу несколько иконок, в зависимости от перспективы
устанавливается расположение внутренних окон в редакторе (где код, где проводник, где консоль, есть ли консоль).
Горячие клавиши
ctrl+d
удалить строку
ctrl+/
закомментировать выделенный блок

Действия мышью

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


Emacs

Изменить кодировку открытого файла Ctrl+x, Enter, r → ввести название






MySQL DDL

Сущности (DDL - data definition language)

Базы данных

показать все

show databases;

создать
create database db_name;
create database db_name CHARACTER SET utf8 COLLATE utf8_general_ci;

убить

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

переименовать

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Пользователи

http://www.mysql.ru/docs/man/Adding_users.html
создать пользователя и выдать права:
GRANT ALL PRIVILEGES ON dbname.* TO compwiki@localhost IDENTIFIED BY 'my_password' WITH GRANT OPTION;

определить пароль для root-пользователя
(если пароль не был определён):
mysqladmin -u root password NEWPASSWORD
сменить пароль root:
mysqladmin -u root -p'oldpassword' password newpass
Пароли для внешки и для локалхоста могут отличаться. Чтобы сменить пароль для внешки:
UPDATE mysql.user SET Password=PASSWORD('newpasswd') WHERE User='root';
FLUSH PRIVILEGES;

Таблицы

показать список:
show tables
переименовать:
rename table name1 to name2
копировать таблицу
create table db1.table_nm select * from db2.table_nm;

Типы таблиц (engine)

Проверить доступные engine таблиц в СУБД из консоли:
show engine;

engine и внешние ключи
MyISAM не поддерживает
InnoDB поддерживает

Колонки/столбцы

изменить описание
alter table table_nm modify column column_nm int unsigned;
удалить колонку
alter table table_name drop column_name
переименовать
alter table table_nm change column old_name new_name int(11);
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

изменить порядок
ALTER TABLE TableName change ColumnNameToMove longtext AFTER ColumnNameToPutAfter
http://dev.mysql.com/doc/refman/5.0/en/change-column-order.html

Внешние ключи

Оказывается, что внешние ключи всё-таки нужны.
alter table table_nm
    add constraint fk_table_nm__column_nm foreign key (column_name)
        references table2_nm ( table2_id )
            on update [restrict|cascade|set null]
            on delete [restrict|cascade|set null];

restrict - запретить удаление строки из таблицы table2_nm, если на неё есть ссылка из текущей таблицы table_nm
cascade - соответственно изменить ссылающиеся значения (или удалить ссылающиеся строки)
set null - установить пустую ссылку

Стоит обратить внимание, что не все типы таблиц поддерживают внешние ключи.


Add constraint

alter table mw_class add constraint fk_mw_class__object_id foreign key (object_id)
      references mw_object (object_id) on delete restrict on update cascade;

Drop constraint

alter table mw_gui_object DROP foreign key fk_mw_gui_object__object_id;
Узнать, какие внешние ключи ссылаются на таблицу можно через: information_schema → KEY_COLUMN_USAGE → REFERECES_TABLE_NAME


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

1. Проверить, что у полей одинаковая пометка unsigned.

Уникальные ключи/индексы

переименовать уникальный ключ нельзя. надо сначала удалить ключ, а потом добавить его снова.
удаление
DROP INDEX index_name ON tbl_name;
либо
alter table table_nm drop index index_name;
если уникальный ключ используется внешиним ключом, то удалить такой уникальный ключ нельзя.
добавление
alter table mw_read_rule add index uk_mw_read_rule__class_id_rr_nm (class_id, rr_nm); # индекс
alter table mw_string_prop add unique key uk_mw_string_prop__str_id_prop_nm_lang_id (str_id, prop_nm, lang_id); # уникальный ключ

Процедуры

создать:
CREATE PROCEDURE proc_name (IN var1 VARCHAR(100), IN var2 VARCHAR(100)) # видимо, должны быть ещё OUT параметры
BEGIN
    .....;
    .....;
END
вызвать:
call proc_name( "vasia", "masia");

Функции

Функция имеет только входящие параметры. На выходе только одно значение - то, что возваращает сама функция.
drop function if exists newColumnPos;
delimiter ;;
create function newColumnPos( tableId int unsigned, pos int unsigned)
  returns int unsigned
  DETERMINISTIC # это слово указывает, что функция будет возвращать одно и то же значение каждый раз при одинаковых входных параметрах
                        # если это не так, то надо указывать reads sql data, ещё есть вариант NO SQL
begin
    return 0;
end;;
delimiter ;

Триггеры

Триггер - это обработчик события "изменение таблицы" (вставка/изменение/удаление строк)
drop trigger tau_mw_gui_string_1;
create trigger tau_mw_gui_string_1 after update
on mw_gui_string_var FOR EACH ROW update mw_gui_lang set ts ='1998.01.01' where lang_id=NEW.lang_id

Чтобы запретить вставку или обновление по триггеру, то надо в триггере вызвать exception.
Обработки пользовательских exception-ов в MySQL нет. Чтобы вызвать exception надо произвести действие, которое вызывает системный exception.
Например, вставка в несуществующую таблицу или вставка null в not null поле.

drop trigger if exists tbi_mw_enum_item;
delimiter ;;
create trigger tbi_mw_enum_item before insert
on mw_enum_item FOR EACH ROW
begin
    if ( exists( select * from mw_enum_item where
        enum_id = NEW.enum_id and enum_key=NEW.enum_key and p1=NEW.p1 and p2=NEW.p2 and p3=NEW.p3))
    then
        call raise_app_error('ERROR_CODE', 'table_nm', 'ERROR_DATA'); # самопальная функция, которая генерит исключение в триггерах
    end if;
end;;
delimiter ;

обозначения внутри триггера:

newвставленная/изменённая запись
old
удалённая запись/запись до изменения


Переменные

Пользовательские переменные (переменные сессии)

Эти переменные храняться до завершения соединения с сервером.
Установить значение переменной:
set @a = 1;
прочитать преременную (значение должно быть определено в рамках текущей сессии):
select @a;

Переменные хранимого кода

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

declare i int default 1;

raise_app_error

CREATE PROCEDURE raise_app_error(IN p_error_code VARCHAR(100), IN p_error_table VARCHAR(100), IN p_error_data VARCHAR(100))
BEGIN
    set @error_code = p_error_code; # эти параметры можно потом где-то просмотреть (наверное, в следующем селекте в том же коннекшене)
    set @error_table = p_error_table;
    set @error_data = p_error_data;
    insert into mysql_app_error values (null); # это поле у таблицы not null
END

Операторы

Перечисленные ниже операторы можно использовать только в хранимо коде (в коде процедур, функций, тирггеров).

if

if ( exists( select * from mw_enum_item where
        enum_id = NEW.enum_id and enum_key=NEW.enum_key and p1=NEW.p1 and p2=NEW.p2 and p3=NEW.p3))
    then
        enum_id = null;
    [elseif ...... then ..... ]
    [else ...... ]
end if;

for


while

WHILE i < char_lenght(str) DO
    insert into ttt(pole1) values (substring( str, i ));
end while;

repeat until


Полезные функции

nextHi

drop function if exists nextHi;
delimiter ;;
create function nextHi( hi varchar(100) )
  returns varchar(100) DETERMINISTIC
begin
  declare pos INT; # позиция последней точки в строке
  declare i INT; # номер текущего чайлда
  if hi is null then
      return '01';
  end if;
  if position( "." in hi ) then
    set pos = (select LENGTH(hi) - POSITION("." in REVERSE(hi))+1);
  else
    set pos = 0;
  end if;
  set i = (select CONVERT( SUBSTRING( hi, pos+2 ), UNSIGNED INTEGER)+1);
  return concat( "", SUBSTRING( hi, 1, pos ), concat("", length(i)-1, i ));
end;;
delimiter ;


// вроде бы более правильный вариант:
drop function if exists nextHi;
delimiter ;;
create function nextHi( hi varchar(100) )
  returns varchar(100) DETERMINISTIC
begin
 declare c varchar(100); # строковое представление текущего чайлда
 declare i INT; # номер текущего чайлда
  if hi is null then
      return '01';
  end if;
 set c = substring_index(hi,'.',-1);
 set i = substring(c,2)+1;
 return concat( "", left( hi, length(hi)-length(c) ), length(i)-1, i );
end;;
delimiter ;

select nextHi2('01.03.04.115'), nextHi2(''), nextHi2('01'), nextHi2('09');