Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #62


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No62 (2008-11-21).

Здравствуйте, уважаемые читатели!

Сегодня в нашем выпуске:



Скоро на нашем сайте в разделе Баз данных будут опубликованы статьи «SQL. Иерархические (рекурсивные) запросы.» и «MySQL. Иерархические запросы.». В разделе «Языки С & C++» появится статья «Опасный код на Си.». О публикациях вы узнаете из нашей рассылки.



Автор: Краснюк Петр.

Под редакцией Клуба программистов «Весельчак У» (переработанная версия).

Содержание.


Введение.

Многие разработчики с немалым опытом разработки на любых императивных языках свято верят в то, что SQL - это то же самое. Только синтаксис другой. После написания нескольких запросов для вытаскивания данных в свой сервер приложений начинают рождаться мифы о БД.

Мои примеры написаны и проверены для Оракла, просто он мне ближе. Но то же самое действительно для любой СУБД.


1. Магический параметр «fast = true» где-нибудь глубоко в конфигах сервера.

2. Скорость работы запроса оценивается по тому, как быстро вывелись первые 20 строк.

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

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

5. Во временных таблицах не надо делать ни primary key, ни индексов.

6. Внешний ключ — индекс по полю в дочерней таблице.

7. Запрос с меньшей стоимостью обязан работать быстрее.

8. Абсолютная идентичность следующих вариантов кода:

Код: (sql)
DECLARE
    summ NUMBER(10);
    i NUMBER(10);
    CURSOR c IS
        SELECT a FROM test_pk;
BEGIN
    summ := 0;
    OPEN c;
    LOOP
        FETCH c INTO i;
        EXIT WHEN c%NOTFOUND;
        summ := summ + i;
    END LOOP;
    CLOSE c;
    dbms_output.put_line(summ);
END;

и

Код: (sql)
SELECT SUM(a) FROM table1

Основное объяснение: ведь и там, и там просто суммируем — какая разница, как именно это делается.

9. Любое обращение по индексу лучше, чем без него.

9а. И связанное с этим: запрос работает медленно — надо добавить индекс. В запросе имеется «full table scan» по 100 записям, из которых надо 95, и «full index scan» по миллиону записей, из которых надо тоже 95. Все будут «оптимизировать» «full table scan».

10. Скорость соединения таблиц сильно зависит от типов и количества полей, по которым мы их соединяем.

10а. Скорость напрямую зависит от количества таблиц, участвующих в запросе.

11. В запросах вида:

Код: (sql)
SELECT *
FROM table t
WHERE t.a = 123
    AND t.b = 321

Всегда будут работать два отдельных индекса по полям «а» и «b».

...

Целиком статью Вы можете прочесть на нашем сайте в разделе «Oracle».



  • Программирование
      • Прочитав одну холиварную статейку с критикой ООП:

        http://www.melikyan.com/dalshe/articles/oop2.html

        Стал думать об удачных интерфейсах. Например, в том, что пишет автор про установление связей между объектами, правда заключается в неудачности для ряда случаев интерфейсов вида
        Только, на мой взгляд, это не фундаментальная ущербность ООП, а недостаточно универсальное проектирование интерфейсов объектов. Существуют задачи, где удобно использовать первый способ связи, существуют задачи, где удобно использовать второй способ связи, существуют задачи, где нужно использовать оба способа связи, существуют задачи, где нужно использовать подход автора - выбор обусловлен необходимостью хранить информацию о смежных объектах. Либо родитель знает о потомке, либо потомок знает о родителе, либо родитель и потомок знают друг о друге, либо кто-то третий знает о том, что эти два объекта являются родителем и потомком. Все четыре варианта можно реализовать в ООП и вне ООП. Вопрос лишь когда их нужно применять?

        Потому хотелось бы этот вопрос обсудить. А для затравки предлагаю построить общую модель для описания ситуаций:

        Ваня ударил по мячу.
        Мяч перелетел через забор.
        Мяч разбил окно.
        Таня уронила мяч в реку.
        Мяч не утонул в реке.

        Как разделить существенные свойства предметов и участников, какие между ними отношения, как это можно запрограммировать?
      • Пишу программу на Borland C++ Builder 6
        Создаю два потока, которые запускаются/останавливаются через CheckBox, написал, работает, пришел к другу, запустил у него на компе и появилось проблема:
        при запуске одного потока всё нормально, а вот когда запускаю одновременно с ним второй, - главное окно намертво виснет, причем на обоих его компах(Windows XP). У меня тоже XP и та же программа работает без проблем.Не пойму, в чем причина?
      • Такой вопрос, вроде бы простой, но запутался в нём.

        Имеем число: 6128329324.
        Задача: Преобразовать его к виду 6.128.329.324.


        1) Можно сделать какой-то сумасшедший цикл, в котором обход с конца до начала делать, и каждый 4й символ помечать ".", а цифру этого 4го символа тащить через весь цикл, попутно устраивая переприсваивание.

        2) Можно сделать несколько массивов, длинной в 3 символа, и пустить цикл на разбивку числа по 3 цифры в каждый массив, а затем через соединение строк преобразовать вновь к единому. Проблема в том, чтоб организовать 1 цикл на, допустим, все 5 массивов. Тогда придётся работать с динамически выделенной памятью, и переходить к следующему массиву через указатели, не используя имён.

        3) Что-то ещё можно придумать, более простое?
        • (система - XP )
          как создать и показать вот такое сообщение (не только в трее, а вообще) ?

          (http://forum.shelek.ru/index.php?action=dlattach;topic=12147.0;attach=1567)
          и, кстати, как оно называется по научному ? :)


        • Ситуация такая: С помощью WinINet функций загружаю с сервера файлы.
          Ну, типа HttpOpenRequest, HttpSendRequest, InternetReadFile итд. Всё работает.

          Проблема в следующем:
          Если есть ссылка типа h**p://www.codeproject.com/KB/dialog/CGlassDialog/cglassdialog_source.zip, то у меня в явном аиде имеется имя файла, с которым я могу сохранить полученное.
          Если есть ссылка, для которой в теге <А href="чегототам">Filename.ext</А> явным образом прописано имя файла - тоже всё понятно.

          Если же есть такая ссылка: h**p://www.gz-volga.ru/pls/kea/utl.download_attach?p_id=365926
          или такая: <А href="h**p://spl.gz-kuban.ru/spl.gz-kuban.ru/blob;jsessionid=8282F7DD226BBBC1F7CBB6B4EB7640FB?id=152710">Скачать</А>,

          то тогда у меня вообще нет имени файла. Однако, если делать через IE -> SaveTargetAs - он каким-то образом получает имя файла при закачке, то есть это как-то возможно.
          Просмотрел список фозможных флагов для HttpQueryInfo - ничего подходящего не нашлось.

          Подскажите, пожалуйста, каким образом можно всё-таки получить в процессе закачки файла его имя. Вообще не представляю себе с какого конца к этой проблеме подступиться.
        • В общем то суть вопроса проста - как организовано в VisualStudio2008  подключение источников БД, скажем к MSSQL?
          Иначе:
          Надо мне написать приложение win32. Выбрал я такой проект при старте....
          Дальше мне надо бы установить соединение с MSSQL и подключиться к нему источником данных, заслать туда запросец какой-нибудь... Как правильно это сделать?
          Компонент, отвечающих за соединение с серверами я в упор не нахожу  :dontknow:, куда его.. как его.. ?  Может надо импортировать COM библиотеки и уже при помощи их средств что-то делать?
          Все что я спмог сделать - это подключить БД (через ODBC) в обозреватель серверов, а что с этим потом делать?  :dontknow:
          В общем я заблудился в мыслях... ничего не понимаю.. :-( почти паника!  :spy: :insane:
          Подскажите пожалуйста.
        • Изучаю MSHTML. Помогите разобраться.

          Вопрос № 1:

          Вот что я делаю:
          a) С помощью IWebBrowser2 перехожу по нужному адрессу, получаю интерфейс IHTMLDocument2 странички:
          b) Получаю коллекцию всех эллементов:
          c) Дальше возникает вопрос: в мсдн вызывают IHTMLElementCollection::item, что бы найти интересующий объект, но что за параметры они передают в этот метод мне не понятно.
          Вот ссылка на страничку в мсдн:
          ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/ieext/workshop/browser/mshtml/tutorials/sink.htm
          их код:...

          Итак вопрос, что должно быть вместо "myID", а так же где смотреть список всех обьектов коллекции, как отыскать нужный объект?

          Вопрос № 2:

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

          Недопонимаю, что такое pUnk в этом примере. Впрочем я методом тыка сделал свой обработчик сообщений, и вместо pUnk ставлю экземпляр этого класса. Вопрос: это будет работать? Если нет, то что надо ставить вместо pUnk?
          Кстати вот мой класс - обработчик:...

          Вопрос № 3:

          Как взаимодействовать со страницей? Например, перейти по ссылке или заполнить форму.
        • MFC , VC++6 , имеется ресурс диалога, созданный в редакторе. В программе создаю диалог через Create  , а как программно узнать, каков размер ресурса - ширина и высота в пикселах ?
          GetWindowRect только что созданного диалога вертает нули... А может вообще до Create можно размеры узнать программно ?
      • Здравствуйте.
        Перелопатил форум, но похожего ответа не нашел.
        В Экселе создан ОДИН лист, содержащий 400 строк. Далее этот файл помещается
        в Olecontainer -
        / olecontainer1.Enabled:=True;
        oleContainer1.CreateObjectFromFile('E:\list1.xls' ,False); /.
        Но при просмотре содержимого контейнера, там находится ТОЛЬКО 61 строка.
        Я что-то не так делаю?
         
        Еще одно дополнение к моему вопросу.
        Текст из WordPad тоже вводится не весь (обрезается). При увеличении в экселе высоты строки в 2 раза, количество выводимых в olecontainer строк уменьшается тоже в 2 раза. Такое впечатление, что "зона видимости" (прошу пардону за термин) где-то ограничивается на определенном уровне.
         
      • Делаю прогу, которая при выборе папки с рискунками показывала бы
        их в виде миниатюр типа как "эскизы страниц" как в эксплорере.
        Не могу понять как это реализовать.
        Помогите.
      • Добрый день.
        Возникла, следующая проблема. Есть большая таблица, почти в каждой строке есть элемент управления (поле со списком). Так как заранее не известно сколько строк необходимо пользователю, я написал макрос который добавляет новую строку и добавляет в нее элемент управление (поле со списком). Проблема в том как удалить новые, а возможно и старые строки вместе с элементом управления (поле со списком). Т.е. если я например выделяю строку любую как мне найти в выделенной строке элемент управление (поле со списком) и удалить его с помощью VBA.
        • Как сделать, чтобы при вводе данных в поле на форме - находилась похожая строка в базе и выводилась на форму КАК В СТРОКЕ СОСТОЯНИЯ ФОРМЫ В ACCESS 2007?
        • Помогите сделать макрос легкий, пожалуйста.
          Допустим, есть книга с двумя листами. На одном листе есть список, например в столбце С, какое-то колличество строк. И на втором листе есть список - столбец В, тоже неизвестное число строк. Необходимо сравнить все строки из списка с первого листа на наличие совпадений во втором списке, и если совпадения есть, нужно в первом списке отметить совпавшую строку как угодно.
      • Есть такая строка
        Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
         СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;
         СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Дата,Элемент.Значение);//вызывается след. функция
        КонецПроцедуры

        написана в общем модуле РаботаСоСправочниками -
        Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
           Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);   
           ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
           Возврат ЗначенияРесурсов.Цена;  //выскакивает ошибка:
        {ОбщийМодуль.РаботаСоСправочниками(5)}: Значение не является значением объектного типа (Цена)
        Возврат ЗначенияРесурсов.Цена; 

        КонецФункции
         В чем ошибка?поясните
        • Необходимо, чтобы при подборе в справочнике номенклатура выделялась не одня ячейка, а вся строка полностью.Подскажите пожалуйста, как это можно сделать или где можно посмотреть, как это сделано...
        • Помогите пжлста совсем начинающему программисту...
          В форме отчета необходимо вывести список значений (номера квитанций из документов) для отбора...Значения присваивает, но в форму не выводит...Мучаюсь вторую неделю...Помогите...
          Вот код:
          Процедура ЗагрузитьДок()
          Если (ПустоеЗначение(НачДата2)=1) или (ПустоеЗначение(КонДата2)=1) тогда
          Предупреждение("Выберите период!");
          Возврат;
          КонецЕсли;

          СписокДок=СоздатьОбъект("СписокЗначений");
          Документы=СоздатьОбъект("СписокЗначений");

          Док = СоздатьОбъект("Документ.Заселение");

          Док.ВыбратьДокументы(НачДата2, КонДата2);
          Пока Док.ПолучитьДокумент()=1 цикл
          ТекДок=Док.ТекущийДокумент();
          ТекДок.ВыгрузитьТабличнуюЧасть(ТабДок);
          ТабДок.ВыбратьСтроки();
          Пока ТабДок.ПолучитьСтроку()=1 Цикл
          НКвит=ТабДок.НомерКвитанции;
          Документы.ДобавитьЗначение(НКвит);
          КонецЦикла;
          КонецЦикла;
          Для н=1 по Документы.РазмерСписка() цикл
          Значение=Документы.ПолучитьЗначение(н, НКвит);
          Сообщить(Значение);
          СписокДок.ДобавитьЗначение(Значение);
          КонецЦикла;

          СписокДок.Сортировать();

          КонецПроцедуры


          В форму вставлен список с идентификатором СписокДок.
          Закоментировала СоздатьОбъект("СписокЗначений"), идентификатор списка скопировала из формы м вставила в модуль, после запуска отчета выдает ошибку "{Отчет.ОтчетЗаселение.Форма.Модуль(198)}: Значение не представляет агрегатный объект (ДобавитьЗначение)"

      • ################### 16-11-2008 14:50 ########################

        Реализованы все падающие бонусы и переход между стадиями.

        Теперь все исходники размешены на SVN-сервере: http://svn.shelek.su/public/batty/

        Собраный бинарник batty.zip 25.1Кб содержит первые три стадии.

        P.S. Для запуска программы требуется DirectX 8.0 или выше.
        <ESC> - выход из программы
        <q> - перегрузить уровень
        <e> - пауза

        ################### 06-08-2008 11:11 ########################

        Изменил модуль draw.c, теперь все работает стабильно на разных видеокартачках (хочется в это верить :-) ).

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

        Еще большая тема, это озвучка и фоновая музыка, sound.c. Предстоит искать midi для фоновой музыки и wav для озвучки событий.

        Но самая большая проблема, которая очень тяжело решается, это отсутствие свободного времени. :-) Но я думаю этот проект довести до конца.

        Исходники и скомпилированная программа: batty.zip 62.2Кб

        P.S. Для запуска программы требуется DirectX 8.0 или выше.
        <ESC> - выход из программы.
        1, 2, 3 – разные ракетки.

        Пишите свои отзывы по программе, будет интересно их услышать. Ну и конечно об обнаруженных багах. :-)

        ################### 21-03-2008 11:03 ########################

        В старые добрые времена был такой компьютер ZX Spectrum и была на нем очень хорошая игра 'Batty'. И вот я решил ее переписать под ПК. :-)

        После того как большая часть движка была написана я обнаружил интересный глюк, игра на моем старенком Pentium 3 бегает только шум стоит. А на современном железе с современной видеокарточкой игра стала тормозить. Пришлось переделывать функции привязки к FPS и приводить весь код к разрешению 640х480.

        Я выложил архив (batty.zip 142.8Кб) содержаший несколько вариантов программы с разными способами обеспечения FPS.

        Архив содержит:
        Цитировать
        batty_sync.exe - построена на основе 'timeGetTime()'
        batty_alt.exe - альтернативное использование 'timeGetTime()'
        batty_NoSync.exe - построена без использования привязки FPS (т.е. мотает на всю катушку)
        ./src - содержит исходники данного проекта

        У меня такая просьба, запустити данные программы у себя и скажите у кого какой FPS показывает и на каком железе, должно быть 50 FPS. Значение FPS отображается в верхней части экрана.

        P.S. Для запуска программы требуется DirectX 8.0 или выше. И еще, для выхода из программы нажмите <ESC> :-) .
  • Операционные системы
      • вопрос такой: можно ли штатными средствами винды назначить некую папку диском, то есть, имеется папка

        D:\11\22\33\UUU\

        колдуем, в системе появляется диск , скажем, U:

        при этом любое обращение

        U:\файл

        абсолютно равноценно такоему :

        D:\11\22\33\UUU\файл

        ?
  • Направления программирования
      •   Написал драйвер, который должен считывать с USB устройства 8 байт данных. После подключения устройства драйвер создает символьную ссылку на устройство (usb_testdrv).
          Из пользовательского приложения функция QueryDosDevice(nil, P, BufSize) возвращает в буфер P список устройств, в котором присуствует и мое, однако при попытке открыть его:
        hDevice:= CreateFile('\\.\usb_testdrv',
                     GENERIC_READ or GENERIC_WRITE,
                     0,nil,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL,
                     0
                   );
        происходит ошибка, GetLastError возвращает, что не удается найти указанный файл.
          Я так полагаю какая-то ошибка в драйвере, регистрации символного имени или все же я не правильно обращаюсь к драйверу??
      • На базе PIC18F4550 реализовал виртуальный COM-порт. Работает хорошо, устойчиво, но есть одна хотелка скорость передачи достаточна низкая. Дело в том, что рекомендуемые для установки драйвера inf файлы не содержат настроек таймаутов опроса USB устройства класса CDC. По умолчанию получается, что компьютер опрашивает устройство примерно каждые 100 миллисекунд с максимальным размером запрашиваемого дампа 4096 байт(данный дамп читается всего за 8 миллисекунд, а дальше идет таймаут на 100 миллисекунд, что существенно увеличивает время передачи).

        Так вот вопрос в следующем, можно ли каким-то образом снизить таймауты опроса виртуального COM-порта хотя бы до 1 миллисекунды или увеличить размер минимального дампа посредством ввода в inf файл каких-то дополнительных настроек или данные настройки определяет Windows приложение для обслуживания COM-порта. В своих пробах использовал ComPortToolKits ...

      • Люди вы знаете как установить Affinity для текущей нити ?
  • Практические разделы
      •   Вопрос такой:"Есть многопользовательское приложение с сервером БД, как добиться того, что бы изменения в БД сделанные одним пользователем былы стразу(или почти сразу) видимы в клиентских приложениях другим пользователям?" Одним зи вариантов я как полагаю може быть промоежуточный програмный слой на сервере с БД, который и будет заниматься этим.

         А можно ли это сделать средствами самой БД, какие вообще есть приёмы? Есть ещё вариант не обращать на это внимания, обновлять данные на пример когда пользователь выбрал вкладку с таблицей в отдельом потоке(этот вариант уже испробован) и вслучае невозможности провесть транзакцию из-за устаревших данных, просто выводить сообщение об ошибке и предложить пользователю повторить попытку. Заранее благодарен.
      • В общем, ситуация следующая: есть прога, юзающая базу под sql server 2005. Сейчас делаю для нее инсталляшку в VS2008. Необходимо, чтобы эта инсталляшка умела самостоятельно разворачивать базу. Конечно, есть возможность написать свою прогу, находящую нужный экземпляр сервера, и запускать инсталляционный скрипт через SQLCMD. Потом можно добавить эту прогу в инсталляшку как Custom Action. Но ведь, задача-то у меня совсем не экзотическая, из чего предполагаю, что существуют какие-то специальные инструменты в студии для этого. Только вот какие?
      • Оракл ругается, что "identifier scheme2.UPDATE_DISC_DATE must be declared".

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

        Процедура в схеме scheme2.

        Триггер в схеме scheme1.
      • У нас на работе запрещена аська.
        Причем не просто запрещена - а режется всякими способами.
        Подключение к Инету - через прокси в локалке.
        Все пакеты до icq.com режутся. Обращение по IP не пропускается.
        Разрешены только некоторые порты (80, 81, 25, 110...).
        Сейчас пока используем jabber-плагин к миранде, который коннектится на 443 порт на icq.jabber.ru. Но и его скоро могут прикрыть.
        Посему вопрос - какие пути нормального общения по аське можете посоветовать?
        TCP-туннелинг просьба не предлагать - это небезопасно все ж.
        Какие другие клиенты есть для аськи, которые работают по 80 порту и коннектятся не к icq.com ?
  • Учимся программировать
      • Здравствуйте  товарищи программисты, если не затруднит помогите пожалуйста. Я работаю электронщикам, и учусь. На учёбе надо изучить самостоятельно i8080 и программировать, не знаю это так сложно кажется, и вообще не знаю с чего начать(может язык С проще изучить, чем ассемблер)
      • Помогите пожалуйста построить конечный автомат для перевода дробных двоичныхчисел в десятичные
      • Мне надо написать на VC++ клиетскую часть для MS SQL Server, но вот в чем дело я не представляю как ето сделать помогите плиз...

        Я хочу уметь ето делать сам мне нужно просто книгу, справочник, статьи или еще  что-нибудь в этом роде, у меня есть различные книги но в основном либо по MS SQL Server либо по VC++ или вообще книги-ведро воды, а чтоб именно для MS SQL Server и VC++  создание базы данных и клиентской части программы нету...

        Заранее благодарю!!!
      • Вот код программы которая ищет максимальный элемент массива
        с помощью метода тыканья проверил всё работает  вот тока не как не могу понять  каким образом это всё происходил ,а именно
        for (max=u=0; u<6; u++){
         if (a[u]>a[max])    так как max=u то получается  a[0]>a[0]    так что ли ?? и что это получается ??
      • Пожауйста, люди знающие Win API или люди имеющие опыт работы с Win API ....Очень прошу  поделиться информацией по этой теме...Мне скоро предстоит здавать курсовую работу по применению и вызову Win API в среде Visual Basic 6.0 Так как я живу в такой глухомани и учюсь в таком  идиотском (извиняюсь за выражение )университете что спрашивать у преподавателей толку нет, я сам больше них знаю, а книг нет по этой теме ..Да и интернет с такой скоростью что искать материал очень сложно....Прошу по возможности описывать функции более подробно и на более понятном языке.....Заранее благодарен.... :confused:
  • Клубное
        • Всем привет, вчера запустил мой фото блог, крутится на домашнем сервере, фоток пока что мало, со временем будут увеличиваться. Фотографии будут моей жены и мои, будет видно копирайт на фотках :)

          снимки сделаны на Canon 400D+kit (18-55)

          http://89.179.245.70/photo

          фотоблог переехал по адресу http://mczim.member.shelek.ru/
        • Погулял в Крыму
          Водопад Серебряные струи
          (http://forum.shelek.ru/index.php?action=dlattach;topic=14397.0;attach=1941)


А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное