пятница, декабря 09, 2011

Oracle, как выбрать подмножество строк


Выбрать строки 10..20 из HR.departments

select * 
  from (select d.*, rownum rnum
          from HR.departments d
         where rownum <= 20)
where rnum >= 10

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

select * 
  from (select d.*, rownum rnum
          from HR.departments d
         where rownum <= 20
         order by d.department_name)
where rnum >= 10


но работать будет не правильно - значения rownum определяются на этапе выборки данных и при выполнении order by порядок будет утерян. 

Поэтому в таком случае можно обернуть выборку и сортировку в ещё один select:

select * 
from (
  select data.*, rownum rnum 
  from ( 
    select d.*
    from HR.departments d
    order by d.department_name ) data
  where rownum <= 20 )
where rnum >= 10


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

Cursor и порядок

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

Пусть есть таблица:
CREATE TABLE A( F1 NUMBER(1), F2 FLOAT);

с такими данными:
INSERT INTO A VALUES(1, 11.1);  
INSERT INTO A VALUES(2, 22.22);
INSERT INTO A VALUES(3, 33.333);

И пусть мне захотелось сделать курсор, который бы содержал данные из этой таблицы:
DECLARE
  TYPE a_cursor_type IS REF CURSOR RETURN A%ROWTYPE;
  a_cursor a_cursor_type;
  
  a_record A%ROWTYPE;
BEGIN
  OPEN a_cursor FOR SELECT f1, f2 FROM A;
  
  LOOP
    FETCH a_cursor INTO a_record;
    EXIT WHEN a_cursor%NOTFOUND;
    
    dbms_output.put_line('F1: ' || a_record.f1 || ', F2: ' || a_record.f2);
  END LOOP;
END;

В выражении SELECT f1, f2 FROM A важно не перепутать порядок выбираемых полей таблицы - хотя в обычной жизни на такие вещи не обращаешь внимания. А вот с курсором обращать приходится, в противном случае вместо ожидаемого результата
F1: 1, F2: 11.1
F1: 2, F2: 22.22
F1: 3, F2: 33.333

легко получить
Error report:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 10
06502. 00000 -  "PL/SQL: numeric or value error%s"

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




понедельник, декабря 05, 2011

Как подключиться из ERwin к Oracle

Предположим, я хочу выполнить Reverse Engineer для какой-то схемы базы. Для этого я вызываю Tools -> Reverse Engineer... Появляется диалог, в котором я указываю тип СУБД - Oracle


Нажимаю Next.

Изменяю или оставляю заданные значения опций импорта на появившемся окне:


и снова нажимаю Next.

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

Здесь я указываю тип аутентификации - у меня используется Database Authentification.
Указываю значения username и пароля. 

После этого необходимо указать значение строки соединения (connection string). Значение этой строки можно добыть из tnsnames.ora.

В tnsnames.ora выбираю определение

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = desktop-1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Это выражение нужно привести к одной строке, убрав переводы строк, получив вот такое:

(DESCRIPTION =  (ADDRESS = (PROTOCOL = TCP)(HOST = desktop-1)(PORT = 1521)) (CONNECT_DATA =  (SERVER = DEDICATED) (SERVICE_NAME = XE)))

Копирую эту строку в поле ввода Connection String - и можно нажимать Connect. 



воскресенье, декабря 04, 2011

Поле для хранения GUID в Oracle, использование SYS_GUID

Тип данных для хранения значения - RAW(16).
Для автогенерации значения можно сделать триггер, использовать хранимую процедуру, а можно и вот так:

CREATE TABLE TEST(ID RAW(16) DEFAULT SYS_GUID(), ...);

С другой стороны, если хотим получить значение созданного идентификатора, как обычно и бывает, можно вот так

DECLARE guid RAW(16);
BEGIN
  guid := SYS_GUID();
  INSERT INTO TEST2(ID, NAME) VALUES(guid, 'ПЖиВ И медведи');
END;

среда, ноября 16, 2011

JMeter, MS SQL Server и JDBC-драйвер

Отчего-то не получилось сделать так, чтобы JMeter заработал бы с JDBC-драйвером от Microsoft. Пробовал с sqljdbc4.jar текущей версии (sqljdbc_3.0.1301.101_rus).

Вроде, на вид, всё хорошо - сделал совсем простой Thread Group, добавил JDBC Connection Configuration, указал нужные параметры... Добавил один JDBC Request с совсем простым запросом. Ну и, конечно, View Results Tree.

И что получилсь? Да ничего.

Нажимаю Run - Start, и сценарий сразу же молча завершается. В View Results Tree нет вообще ничего. В логе JMeter появляется только одна строка - "Running the test!". Пункт меню Run - Start снова горит как Enabled.

Для интереса пробую:

Изменяю значение jdbc connection. Было вот так: jdbc:sqlserver://localhost:1433;databaseName=MyDatabase

Добавляю в начале произвольный символ. Запускаю. В View Results Tree вижу корректное сообщение об ошибке, а в логе JMeter - соответствующий Exception.

Изменяю название базы данных на заведомо неправильное. И снова, ожидаемое сообщение об ошибке в View Results Tree, ожидаемое исключение в логе.


Изменяю название class name на заведомо неправильное, например, на такое com.microsoft.sqlserver.jdbc.SQLServerDriver123. Снова корректное сообщение об ошибке.


Указываю заведомо неправильное имя пользователя или неправильный пароль. Опять вижу ожидаемую ошибку.

Но стоит вернуть всё к правильным значениям - опять ничего не происходит.

Решил попробовать использовать другой драйвер. Скачал и поставил текущую сборку jTDS. Разумеется, что поменял название класса - стало net.sourceforge.jtds.jdbc.Driver и connection string - теперь она сделалось такой - jdbc:jtds:sqlserver://localhost:1433/MyDatabase.

И всё сразу получилось.

Если честно, так и не понял, чем драйвер от MS так не подошёл к JMeter.

понедельник, ноября 07, 2011

Ссылки на чтение про JMeter

Понадобилось поразбираться  в теме нагрузочного тестирования, поэтому решил пособирать ссылки на эту тему.

Простой нагрузочный тест с Apache JMeter
Описывается использование Access Log Sampler для создания сценария тестирования, средств отображения View Results in Table, Graph Results, Aggregate Report и подходы к интерпретации получаемых результатов.

Рецепт нагрузочного тестирования на JMeter
Так же на основе Access Log Sampler, но более уже более продвинутая логика тестирования.

Быстрое создание нагрузочных тестов на JMeter для web-сайтов
Описывается создание сценариев путём записи действий пользователя при помощи Recording Controller и HTTP Proxy Server. Так же показано использование CSV Data Set Config для получения логинов и паролей из CSV-файла для имитации авторизации разных пользователей.

Отладка тест-плана JMeter
Показывается отладка тестового плана, использование HTTP Request Defaults, Regular Expression Extractor, If Controller.

Apache JMeter
Ссылка на сайт проекта JMeter

SQL query performance test with JMeter
Конфигурация тестирования MS SQL Server

Regular Expressions in JMeter


Хорошая статья, очень хороша для начала работы. 


А вот тут, кстати, живёт набор плагинов для JMeter - jmeter-plugins

Easy scripting of JSON applications with Apache JMeter

четверг, октября 13, 2011

Как включить показ номеров строк в редакторе SQL Server Management Studio

Чтобы не отвечать на вопрос "А чем ты занимался вчера три часа" ответом "Искал строчку 983 в редакторе" удобно включить отображение номеров строк в редакторе.

Включить можно вот тут: выбрать Сервис - Параметры - Текстовый редактор - Все языки - Общее и поставить крыжик "Номера строк".

В англ. варианте путь этот - Tools - Options - TextEditor - All Languages - General.

среда, октября 12, 2011

Word 2010 - Макрос не найден. Возможно он отключен по соображениям безопасности

Запускаю свежеустановленный MS Office 2010 - и при запуске три раза появляется сообщение "Макрос не найден. Возможно он отключен по соображениям безопасности".



У меня Windows 7 64bit и такой же, 64-bit-ный, Office.

На компьютере установлен Lingvo X3, вот он-то и портит нам картину этим сообщением.
Что характерно, Office ставился уже после того, как был установлен Lingvo.

Чтобы убрать это надоедливое сообщение (пока в ABBYY не смогут пофиксить проблему, правда, зная сколько они делают Lingvo для Андроида, возможно этого не случится никогда), нужно:

зайти в %APPDATA%\Microsoft\Word\Startup и переименовать файл Lingvo14.dotm. Делать это нужно при не запущенном офисе.

понедельник, октября 10, 2011

ProgressDialog, Back и handler


У меня есть activity. На ней имеется кнопка, инициализирующая обращение к какому-то объекту, выполняющему длительную обработку запроса. Перед началом обработки activity показывает progressDialog.
В качестве одного из параметров метода вызываемого объекта передаётся handler. После окончания обработки запроса сервер отправит этому handler сообщение, уведомляя о завершении работы, и передавая, возможно, результат при помощи Bundle.

handler, получив сообщение, спрячет progressDialog и покажет alertDialog, который и сообщит о завершении обработки запроса.

Пусть логика взаимодействия подразумевает возможность не дожидаться завершения запроса. progressDialog в таком случае логично сделать сancelable.

Теперь нужно сделать так, чтобы при нажатии пользователем на Back во время отображения progressDialog, не только прятался бы сам progressDialog, но и завершалась бы текущая activity.  В противном случае получается так, что progressDialog больше не показывается, но по-прежнему продолжает показываться та же activity. Что смутительно.

Для этого нужно диалогу сказать, что делать в случае его отмены:


@Click
public void callServerButton() {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("Подождите");
dialog.setMessage("Запрос обрабатывается...");
dialog.setCancelable(true);
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {

@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
dialog.cancel();
finish();
return true;
}
return false;
}
});

activeDialog = dialog;
activeDialog.show();

Server server = new Server();
server.doIt(serverHandler);
}

Теперь во время отображения progressDialog в случае нажатия на Back закроется не только сам диалог, но и activity, чего и добивались.

Теперь возникает другой вопрос - пусть пользователь, не дождавшись завершения работы сервера, нажал Back, в результате activity скрылась. Пользователь продолжает работать с приложением. А в это время сервер закончил обработку запроса и отправил сообщение handler.

handler получает сообщение, пытается создать и отобразить alertDialog. Но диалог использует контекст той activity, которой уже нет - в результате получаем завершение работы приложения и stacktrace для дальнейшего изучения.

Чтобы избежать такой проблемы добавляем какой-нибудь признак в activity. Доопределяем onStop() так, чтобы при выполнении этого метода устанавливалось бы значение этого признака. После этого говорим handler - показывай AlertDialog только в том случае, если значение признака не установлено.

Разумеется, при таком решении пользователь лишается возможности узнать, чем же закончилось выполнение запроса. Для не критичных случаев - это нормально. Например, пользователь захотел посмотреть значения курсов валют, но, не дождавшись, передумал.

Если же происходит что-то, требующее уведомления пользователя, то в данном решении нужно посмотреть в сторону Toast или Notifications.

воскресенье, октября 09, 2011

Не удаётся установить MS SQL Server 2008R2

У меня стоял MS SQL Server 2008R2. Решил снести - снёс.
Решил поставить ещё раз. И вот тут возникла проблема - не встаёт.

Выглядит следующим образом:

я запускаю SQLEXPRWT_x64_RUS.exe, оно распаковывается.








Появляется окошко с доступными действиями.

Я из этого окошка выбираю "New Installation..."
Появляется вот такое окно:

























Прогресс-бар добирается почти до самого правого края - после чего это окошко пропадает и... и ничего больше не происходит. Совсем.

Пошёл читать логи установки (они находятся в C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log), пошёл в гугла.. Конкретно для этой ситуации решения не нашёл, но нашёл вот такую рекомендацию:

1. В реестре удалить ветки
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer


2. Отправиться в  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstal и там удалить все подпункты, в которых упоминается MS SQL Server


3. Пойти в (или на?!)  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, откуда удалить пункты, связанные с SQL Server.


4. Перезагрузиться и запустить инсталляцию ещё раз. 


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










вторник, сентября 20, 2011

Check Point SR_GUI - не показывается иконка в трее

Пропала иконка CheckPoint VPN Client из трея. При ручном запуске SR_GUI.exe ничего не происходит.

Вылечилось остановкой и запуском сервисов

  • Check Point VPN Securemote service
  • Check Point VPN Securemote watchdog

пятница, сентября 16, 2011

Показать изображение в TextView при помощи Html.ImageGetter


У меня есть экземпляр TextView и я хочу в нём показать картинку, которая хранится в drawables.
Пусть картинка эта - upd_inactive.png.
Для этого мне понадобится Html.ImageGetter

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        ImageGetter imageGetter = new ImageGetter() {

@Override
public Drawable getDrawable(String source) {
Drawable drawable;

// можно вот так - через имя картинки
int path = TestAppActivity.this.getResources().getIdentifier(source, "drawable", "cv.testapp");
   drawable = TestAppActivity.this.getResources().getDrawable(path);
 
   // или вот так
   drawable = getResources().getDrawable(R.drawable.upd_inactive);
 
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
             
       return drawable;
   }
};

TextView imageView = (TextView) findViewById(R.id.imageView);
imageView.setText(Html.fromHtml("This is an image: <img src=\"upd_inactive\">", imageGetter, null));
    }

воскресенье, августа 28, 2011

Tomcat, Spring, Vaadin

Скопировал spring-instrument-tomcat-3.0.2.RELEASE.jar в server/lib (на самом деле конкретный релиз не важен, просто такой был у меня)

В META-INF/context.xml добавил

  <Context path="/my-context-path">
        <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
  </Context>

Вместо этого можно было бы в catalina.bat прописать так:
SET JAVA_OPTS=%JAVA_OPTS% -javaagent:"%CATALINA_HOME%\lib\spring-instrument-3.0.2.RELEASE.jar"

При этом в server/lib понадобился бы spring-instrument-tomcat-3.0.2.RELEASE.jar

В web.xml

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>


  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:app-config.xml</param-value>
  </context-param>


Конфигурируем класс vaadin-приложения

@Configurable(preConstruction = true)
public class MyApplication extends Application {

    @Autowired
    private MyService service;
 
    @Override
    public void init() {
Window mainWindow = new Window("MyApplication");                  
         ...   ...   ....
     
setMainWindow(mainWindow);              
    }
}

четверг, августа 11, 2011

Символ процента в строковых ресурсах Андроида

Как в строковый ресурс поместить символ процента так, чтобы при этом ничего бы не ругалось?

Например, хочу получить такую строку:
1% - один процент, 2% - два процента

Тогда в strings.xml у меня будет:

<string formatted="false" name="my_string">1% - один процент, 2% - два процента</string>


воскресенье, мая 15, 2011

Обработка нажатия Enter на виртуальной клавиатуре


View.OnKeyListener keyListener = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER
&& event.getAction() == KeyEvent.ACTION_DOWN) {
обрабатываем-факт-нажатия

return true;
}

return false;
}
};

myEditText.setOnKeyListener(keyListener);

суббота, мая 07, 2011

Локаль для запуска Netbeans 7.0 или Netbeans по-английски

По-умолчанию Netbeans 7 запускается с русским вариантом интерфейса. Зрелище - для любознательного исследователя, ведь понять что делает, например, пункт меню "Закрепить код" - дано не каждому (в нормальном варианте это пункт Fix Code).

Чтобы запустить NB с привычным английским вариантом нужно указать дополнительно параметр командной строки
your-path\netbeans.exe --locale en

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

вторник, марта 15, 2011

Android SDK не находит JDK на Windows 7 64-bit

При попытке установить при помощи exe-установщика Android SDK r10 получил такое вот ругательство:

Java SE  Development Kit (JDK) not found.

ОС у меня Windows 7 64-bit. Если JDK не был бы установлен, я бы и не удивился, но в данном конкретном случае он установлен совершенно однозначно. (Кстати, а JDK - оно какого рода?)

В интернете нашёл неожиданное, но работающее решение: на окошке с сообщением о невозможности найти вначале нажать на Back, а потом, с предыдущего окна, снова на Next. В этом случае на отсутствие JDK не ругается.