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

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


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

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

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



Ожидаются статьи «Опасный код на Си» и продолжение «MySQL. Иерархические запросы».



Содержание.


Введение.


Чтобы понять рекурсию, сначала надо понять рекурсию. Возможно, поэтому рекурсивные запросы применяют так редко. Наверняка вы представляете что такое SQL-запрос, я расскажу, чем рекурсивные запросы отличаются от обычных. Тема получилась объемная, приготовьтесь к долгому чтению. В основном речь пойдет об Oracle, но упоминаются и другие СУБД.


Суть проблемы.

Большинство современных СУБД (Система Управления Базами Данных) — реляционные, т.е. представляют данные в виде двумерной таблицы, в которой есть строки (записи) и столбцы (поля записей). Но на практике мы часто сталкиваемся с иной организацией данных, а именно иерархической.

Взгляните на список файлов на вашем компьютере: все они организованы в виде дерева. Аналогично можно представить книги в библиотеке: Библиотека>Зал>Шкаф>Полка>Книга. То же самое и статьи на сайте: Сайт>Раздел>Подраздел>Статья. Примеры можно приводить долго. Впрочем, тут еще можно разделить все на отдельные таблицы: таблица для хранения списка библиотек, другая таблица для списка залов, третья для шкафов и т.д. Но если заранее не известна глубина вложенности или эта вложенность может меняться, тут уж от иерархии никак не отмашешься.

Проблема в том, что данные, имеющие иерархическую структуру, очень плохо представляются в реляционной модели. В стандарте SQL-92 нет средств для их обработки.

Зато такие средства появились в стандарте SQL-1999. Правда к тому времени в Oracle уже был собственный оператор CONNECT BY. Несмотря на это, в SQL-1999 синтаксис рекурсивных запросов совершенно не похож на синтаксис CONNECT BY в Oracle и использует ключевое слово WITH. Реализация же рекурсивных запросов в других СУБД несколько запоздала, так в MS SQL Server она появилась лишь в версии 2005.

Так же как и в синтаксисе, есть отличия и в терминологии. В Oracle обычно обсуждаемые запросы называются «иерархические», у всех остальных «рекурсивные». Суть от этого не меняется, я буду использовать и то и другое.


Целиком статью можно прочесть на нашем сайте в разделе «Базы данных::Общее».


Содержание.


Введение.

Недавно прочел статью «SQL. Иерархические (рекурсивные) запросы.» [1]. Интересная статья, но в ней утверждается, что MySQL не поддерживает иерархических запросов. Совершенно согласен с автором — напрямую не поддерживаются. Но реализовать подобие можно!

Традиционно, для MySQL применяют программный метод, когда клиент считывает из базы узлы по номеру предка, затем считывает их потомков и так до тех пор, пока все потомки не будут прочитаны. Реализация возможна как рекурсивная, так и итеративная, как это было давно еще объяснено Alf-ом в серии статей [2]. Главный недостаток — множественные пересылки запросов и данных между клиентом и сервером.

Не редко, для упрощения программы и минимизации количества запросов к базе, применяют простейший метод — считывают из базы все узлы, что может быть накладно по объему пересылаемых (и хранимых в памяти) ненужных данных.

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


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


Есть такая утилита - screen.

Полноэкранный и достаточно мощный консольный оконный менеджер. Поддерживает прокрутку, поиск в окне, обладает функцией копирования и вставки между окнами, позволяет в одном терминале запускать несколько интерактивных shell-процессов и переключаться между ними. Запустив screen, можно покинуть активную ssh-сессию. Как для меня, так это очень удобно. На работе запустил, дома посмотрел (хотя дома отдыхать нужно) или наоборот. Кроме того, при разрыве связи рабочей станции с сервером screen-сессия не прерывается.


Устанавливаем?


# cd /usr/ports/sysutils/screen
# less pkg-descr

Screen is a full-screen window manager that multiplexes a physical terminal
between several processes (typically interactive shells).
Each virtual terminal provides the functions of a DEC VT100 terminal and, in
addition, several control functions from the ANSI X3.64 (ISO 6429) and ISO
2022 standards (e.g. insert/delete line and support for multiple character
sets). There is a scrollback history buffer for each virtual terminal and a
copy-and-paste mechanism that allows moving text regions between windows.

WWW: http://www.gnu.org/software/screen/

#make
#make install
#make clean
#rehash

Целиком статью можно прочесть на нашем сайте в разделе «Администрирование ОС::Unix».


  • Программирование
      • Такая вот задача:
        Есть массив чисел (предположим "1,2,3,4,5") и несколько целевых параметров (предположим "3 и 9").
        Суть задачи: необходим алгоритм, который бы перебирал массив таким образом, чтобы
        1. сумма отобранных элементов массива был равен целевому параметру, т.е. 1 + 2 = 3.
        2. отобранные элементы исключаются из массива (чтоб одни и те же элементы не учитывались при расчете для более одного целевого параметра), а для оставшихся (3,4,5) снова проводился отбор, чтобы получить число 9: 4+5=9.

        Прошу подсказать в направлении анализа, может формула уже есть, а напишу я сам. 
        • Из какой области задачка затрудняюсь определить, нус начнем:

          на шахматной доске размера 100000 на 100000 клеток, стоит n шашек ( 2<=n<=50), которые могут стоять на одной и той же клетке, их можно двигать вверх вниз вправо влево, что считается за 1 ход
          найти: минимальное количество ходов за которое можно согнать от 2х до n шашек в 1 клетку:

          примеры:
          шашек 4
          xpos: 1,1,2,3
          ypos: 1,1,1,1

          ответ 0,1,2 (первые 2 и так стоят на одной клетке, потом туда проще загнать 3ю, а последней 4ю)

          шашек 5:
          xpos: 1,7,3,11,12
          ypos: 2,5,10,12,10

          ответ 3,11,20,34 ( ближе всех стоят 4 и 5, далее к ним можно подогнать 2ю, потом 3ю, потом 1ю)

        • Уважаемые специалисты, подскажите где можно найти простое описание алгоритма AES(Rijndael). Описание с http://en.wikipedia.org/wiki/Advanced_Encryption_Standard не подходит, я просто не могу в нем досконально разобраться((

          P.S. Если кто то реализовывал алгоритм или знает где скачать(оффициалка не подходит из-за большого нагромождения кода - сложно разобраться) подскажите, буду премного благодарен.
        • Здрасте, уважаемые члены форума.
          подкиньте хотя-бы идейку в правильном направлении, а то запарился.
          Проблема такая:

          дан массив, например такой:

          0000111100111100000
          0000100100100100000
          1111100100100100000
          1000000101100110000
          1110000101000010000
          0010000111000010000
          0011000000000010000
          0001000011111110000
          0001111110000000000
          уф, устал  :insane: ну теперь видно красный контур

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

          0000111100111100000
          0000122100122100000
          1111122100122100000
          1222222101122110000
          1112222101222210000
          0012222111222210000
          0011222222222210000
          0001222211111110000
          0001111110000000000

          вот и все, что надо, только проблема в том, что массив - это одна строка.   :shuffle:
          Помогите пожалуйста, за любую инфу спасибо заранее!
        • Вот для практики решил написать, примитывный zip архиватор(для практики). А вот как реализовывается само сжатие я не знаю. Подскажите плзз, где можно посмотреть, или примеры.
      • допустим s это объект какого нить класса контейнера
        если контейнер строка и имеется в программе утверждение типа:
        Код:
        while( s[i]=='x' && i<s.size() ) {
        i++;
        // дальше всякая мура

        почему мне не удается завалить программу подав на вход строку заканчивающуюся "xxxx" ?
        в этом случае гарантировано происходит дереференс s.end(), результат которого неопределен

        для каких контейнеров произойдет гарантировано завал программы если она не перехватывает исключения?

        от чего зависит вероятность завала для контейнера строки и возможен ли он вообще?
        • пусть некий модальный диалог CDialog D1 является членом класса X (некое окно) .  Соответственно, передать параметры в конструктор диалога вот так сразу нельзя

          class X : ...
          {
             CDialog D1;
          };

          Если X - это не главное окно, то при открытии диалога
          D1.DoModal();

          родителем считается главное окно, что не есть хорошо... Как переопределить родителя в модальном диалоге ?

          это не катит
          D1.SetParent(...) ,
          поскольку хендл диалога не создан ещё.

          Или единственное решение - членом класса X сделать указатель на диалог, а объект класса диалога создать в конструкторе X через new ?
        • Подскажите, пожалуйста, как для главного и для дочерних окон MDI загрузить свои иконки. Пробовал CWinApp::LoadIcon из InitInstance() - не получается.
        • кто-нибудь знает как cppunit установить?

          я устанавливаю по правилам установки, написанной в реадми:

          - Open examples/examples.dsw in VC++ (contains all the samples).
            VC7 will ask you if you want to convert, anwser 'yes to all'.
          - Make HostApp the Active project
          - Compile

          компилятор выдает ошибку
          Error   1   fatal error C1083: Cannot open include file: 'windows.h': No such file or directory   e:\Documents and Settings\otaku1\Рабочий стол\cppunit-1.12.1\cppunit-1.12.1\src\cppunit\DllMain.cpp   8
        • Сделал драг из вне в ListView используя DragAcceptFiles(hList, true) и обробатывая WM_DROPFILES.

          А как сделать наоборот перетаскивание из ListView например в тот же Explorer?
        • данная процедура выводит картинку из файла в CBitmap. Проблема странная - почему то не рисуется самая верхняя строчка пикселов, а справа наоборот пририсовывается лишняя колонка (и туда копируется последняя правая колонка)

          (VC++6 , MFC)

          Код:
          #include <atlconv.h>

          ...
          ...

          //вывести пикселы формата файла бмп на бмп
          //pFurtherDC - DC, на который предполагается вывод бмп
          bool DrawBitmapPixelsFromFileToBMP(CDC* pFurtherDC,CBitmap* pBMP,const char* pchFullFilePath,int *pW,int *pH)
          {
          bool result=false;
          CDC tempDC;
          CBitmap *oldbmp=0;

          if(!pW || !pH)return false;

          *pW=0;
          *pH=0;

          IPicture* pPic=0;

          result=false;
          for(;;)
          {
          IPicture* ptmpPic=0;
          USES_CONVERSION;//#include <atlconv.h>
          HRESULT hr;

          hr= ::OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(pchFullFilePath)),0,0,0,IID_IPicture,reinterpret_cast<void **>(&ptmpPic));

          if(hr==S_OK && ptmpPic)
          {
          pPic=ptmpPic;
          }
          else
          {
          break;
          }

          OLE_XPOS_HIMETRIC cxSrc;
          OLE_YPOS_HIMETRIC cySrc;

          if(S_OK!=pPic->get_Width(&cxSrc))break;
          if(S_OK!=pPic->get_Height(&cySrc))break;

          *pW=cxSrc/26;
          *pH=cySrc/26;

          if(!tempDC.CreateCompatibleDC(pFurtherDC))break;
          pBMP->DeleteObject();
          if(!pBMP->CreateCompatibleBitmap(pFurtherDC,*pW,*pH))break;
          oldbmp=tempDC.SelectObject(pBMP);

          //рисуем

          //ПОЧЕМУ ТО НЕ РИСУЕТСЯ САМАЯ ВЕРХНЯЯ СТРОЧКА ПИКСЕЛОВ
          //А СПРАВА НАОБОРОТ ПРИРИСОВЫВАЕТСЯ ЛИШНЯЯ (И ТУДА КОПИРУЕТСЯ ПОСЛЕДНЯЯ ПРАВАЯ)
          if(S_OK !=pPic->Render(
          tempDC.GetSafeHdc(),
          0,
          0+*pH,
          *pW,
          -*pH,//переворачиваем по вертикали
          0,0,cxSrc,cySrc,0))break;

          result=true;

          ///
          break;
          }

          if(pPic)
          {
          pPic->Release();
          pPic=0;
          }

          if(oldbmp)
          {
          tempDC.SelectObject(oldbmp);
          }

          return result;
          }

          а в чём проблема то ? Не могу понять
        • Контекст обсуждения: WinAPI.

          Вопрос первый. Можно ли как-нибудь прочитать содержимое окна чужого приложения как графическую картинку? Крайне желательно без эмуляции Alt+PrtSc и буфера обмена.

          Вопрос второй. Если ответ на первый вопрос положительный, то как бы наладить процесс такого чтения в момент, когда чужому окну достаётся событие WM_PAINT, и оно завершает его обработку? С завершением обработки можно упростить, организовав чтение спустя, допустим, 100 мс после события - время, за которое наблюдаемое окно гарантированно успеет себя перерисовать. Так что остаётся ловля события, адресованного чужому окну.
        • Получил задачу, на чтение с файлов. Все понятно, но препод включил вот такое требование:

          "Позаботьтесь о том, чтобы при проведении эксперимента данные файлов реально считывались с указанного диска, а не из буфера ввода-вывода или из дискового кэша!"

          Я так понимаю, что надо просто использовать функции прямого чтения из файла, а не те, которые работают с буфером. Отсюда вопрос:
          1. Является ли функция string::getline подходящей при условии открытия файла через поток ifstream
          2. Если нет, то какую лучше использовать для работы именно со строками
        • Есть обыкновенное приложени просто для эксперимента

          Код:
          void __fastcall TForm1::Button1Click(TObject *Sender)
          {
          SendMessage(Application->Handle,WM_MOVE,NULL,100);
          }

          void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
                bool &Handled)
          {
          if (Msg.message==WM_MOVE)
           {
            ShowMessage("a");
            Label1->Caption="sadsadas";
           }
          }
          По логике при получениии сообшения WM_MOVE в обработчике должен поменятся Label но вот только этого не происходит почему я не могу понять
          Смотрел Spy++ TApplication получает это сообшения но вот почемуто не обрабатывает.
          Помогите разобраться.
        • Подскажите, пожалуйста, как доработать в BCB6.0 стандартный TDateTimePicker, для ввода и даты, и времени одновременно.
        • Такая проблема - Турбо С++ делаю приложение, имитирующее меню ресторана. Данные читаются из файла.
          Код:
          void __fastcall TForm1::Button1Click(TObject *Sender)
          {
              int i,j;
              n=StrToInt(Edit1->Text);//Считываем количество клиентов
              Randomize();
              f=0; j=1; i=1;
              ifstream input_file("Menu1.txt");
              char line[64];

              while (i<=n)
              {
                  if (input_file.eof()) {
                      input_file.close();
                      ifstream input_file("Menu1.txt");
                  };
                 
                  input_file.getline(line, sizeof(line));
                  StringGrid1->Cells[1][j]=line;//Название
                  input_file.getline(line, sizeof(line));
                  StringGrid1->Cells[2][j]=line;//Cостав

                  //Обслуживание клиента в ресторане
                  vibor=Random(1795)+5;//Выбор клиентом блюд 5 сек до 1800 сек
                  zayavka=Random(160)+20;//Официант относит заявку  от 20 сек до 2 минуты

                  input_file.getline(line, sizeof(line));
                  gotovka=StrToInt(line);//Готовка из БД (+5 мин)
                  polychenie=Random(300)+15;//Получить от 15 сек до 10 мин
                  dostavka=Random(40)+10;//Отнести от 10 сек до 50 сек
                  t=vibor+zayavka+gotovka+polychenie+dostavka;
                  f=f+t;
                  StringGrid1->Cells[3][j]=IntToStr(gotovka)+" мин";
                  StringGrid1->Cells[4][j]=FloatToStr(t/60)+" мин";
                  StringGrid1->Cells[0][j]=IntToStr(i);
                  j++;
                 
                  if ((Random(3)%2)==0) {
                      i++;
                  };
              };
          }
          содержимое файла:
          Код:
          Ассорти сырное
          гауда, чечел, дор блю, виноград, грец.орехи
          15
          Милано Кап
          мороженное шоколадное, фундук, сироп шоколадный, сливки взбитые
          13
          Ассорти овощное
          помидоры св., огурцы св., перец болгарский, зелень
          6
          Персиковая Мельба
          мороженное ванильное, персики консер., взбитые сливки
          10
          Рулетики из баклажанов
          баклажаны, грец.орехи, майонез, чеснок, зелень
          8
          Мне нужно, чтобы при дочтижении конца строки считывание опять возвращалось в начало файла..Но почему-то у меня считывается последнее значение (8), при следующем считывании значение становится равным '' (не ' '), спокойно проходит проверку,что это не конец файла и дальше прога вылетает, ибо " ''' is not a valid integer value"..Я так поняла, что во этот символ последний ('') и есть признак конца файла, так почему он проверку тогда проходит? Может,я неправильно её вызываю, или в чем тогда дело?
        • Есть класс, который нужно описать в заголовочном файле и cpp-шнике описать его функции, в другом сpp-шнике реализовать функцию main, показывающую возможности класса. Класс должен осуществлять сложение, деление, умножение и вычитание двух комплексных дробей. Но у меня дело застопорилось, когда я ещё только начала создавать объекты класса - программа доходит до них и напрочь отказывается их создавать..Очень прошу помочь, не могу понять в чем дело..
          Работаю в С++ Builder X, пыталась скомпилировать CodeBlocks'ом, но там тоже самое..
          Код:
          //---------------------------------------------------------------------------
          // Unit1.cpp
          //---------------------------------------------------------------------------
          #include "Unit1.h"

          #include<iostream.h>//library for input-output
          #include<math.h>//mathematical functions
          #include <iomanip.h>//formatted output
          #include<conio.h>//for screen delay 
          //Реализация

          cRational::cRational(int a1,int b1,int c1, int d1)
          {SetValue(a1,b1,c1,d1); };

          void cRational::SetValue(int a1,int b1,int c1, int d1)
          {//Сокращенные значения
            int i;

            for (i=10; i>1; i++)
          //Находим общие делители
            {if ((((a1%i)==0)&&(b1%i==0))&&((c1%i==0)&&(d1%i==0)))
             {a1=a1/i; b1=b1/i; c1=c1/i; d1=d1/i;};
               };
            a=a1; //присв.зн-ний данным элементам класса
            b=b1;
            c=c1;
            d=d1;

          return;
          };

          void cRational::Addition(){

            return ;};

          void cRational::Multiplication(){

          return ;};

          void cRational::Division(){

          return ;};

          void cRational::Substraction(){

            return ;};

          void cRational::Print() {

          //Функции печати должны выглядеть следующим образом: на экран должны выводить
          //дробь в виде (ReA+i*ImA)/(ReB+i*ImB).

          cout<<"(Re"<<a<<"+i*Im"<<b<<")/(Re"<<c<<"+i*Im"<<d<<endl;

          return;
          };
          Код:
          #ifdef __BORLANDC__
            #pragma argsused
          #endif

          #include<iostream.h>//library for input-output
          #include<math.h>//mathematical functions
          #include <iomanip.h>//formatted output
          #include<conio.h>//for screen delay 
          #include "Unit1.h"
          #include "Unit1.cpp"

          //Программа-драйвер

          int a1,b1,d1,c1;

          int main( int argc, char * argv[] )
          {
          cout<<"Vvedite Re i Im 4islitelya 1-i drobi"<<endl;
          cin>>a1>>b1;
          cout<<"Vvedite Re i Im znamenatelya i-i drobi"<<endl;
          cin>>c1>>d1;

          cRational first;

          first.SetValue(a1,b1,c1,d1);
          first.Print();

          cout<<"Vvedite Re i Im 4islitelya 2-i drobi"<<endl;
          cin>>a1>>b1;
          cout<<"Vvedite Re i Im znamenatelya 2-i drobi"<<endl;
          cin>>c1>>d1;

          cRational second;
          second.SetValue(a1,b1,c1,d1);
          second.Print();

          getch();//screen delay
          return 0;
          }
          Код:
          //---------------------------------------------------------------------------
          // Unit1
          //---------------------------------------------------------------------------
          #if !defined(Unit1_H)
            #define Unit1_H
            //Заголовочнвй файл
            class cRational{
              public:
              cRational (int=1,int=1,int=1,int=1);
              void SetValue (int,int,int,int);
              void Print();
              void Addition();
              void Substraction();
              void Division();
              void Multiplication();

              private:
                 int a;
                 int b;
                 int c;
                 int d;

            };

          #endif   //Unit1_H
          //Заголовочный файл
        • Необходимо найти информацию, желательно подробную, про udp-сокеты в ядре, как они реализуются, нашла только
          h**p://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html, но там мало пояснений, и никак не разберусь, как отправлять сообщения от модуля ядра через udp-сокеты... долго копалась в исходниках, все красиво, но непонятно.
          может, кто еще ссылочек подбросит... :)
        • периодически забываю возвращать значения из функции, как в g++ включить ворнинг на этот случай?
        • Киньте пожалуйста ссылочку, в google воды налито, не могу по сути нигде найти.
          Мне надо послать сигнал от модуля ядра, который при обработке в пользовательской программе выполнит необходимое действие
      • У меня на форме располагаются 13 TEdit. Как запретить для них всех ввод с клавиатуры символов?
      • Вот я находила ноль функции  y=a0+a1*x+a2*x^2+a3*ln(a4*x)+a5*ln(a6*x^2) методом простых итераций. Когда строю график, то у меня он получается в виде прямой, хотя должен быть экстремум.
      • Как очистить содержимое TChart?
      • Есть StringGrisd из 500 строк, с метками на определенных строках.
        Как мне по метке вывести, соответствующую строку, первой в окне просмотра.
      • 1.В поле memo вводится текст. Мне нужно проверить слово и неправильные выделить. Какая нибудь функция лдя выделения слов есть???
        2.Я слова беру из memo и записываю в массив слов,слова разделяются пробелами, но как то надо определить конец строки.как это в делфи делается?
      • как удалить запись в гриде выбрав нужную с помощью "мыши" или "стрелок"? обычный ctrl-del чет не помогает. хотя реквист лайф трушный.
      • Помогите, пожалуйста, написать программу на VB,  которая позволит выяснить - выгодно ли работать объединено  трем музыкантам: гитаристу, скрипачу и певице. Заработок каждого по отдельности
        гитарист – 700,
        скрипач – 600,
        певица – 900.

        Выступая объединено заработок:
        скрипач и гитарист – 1500;
        скрипач и певица – 1800;
        гитарист и певица – 1900;
        скрипач + гитарист + певица – 3000.
      • Мне по архитектуре ЭВМ задали "реализовать функцию strndup в сишной библиотеке <string.h>" на ассемблере... Но нужно, чтобы на языке С она вызывалась... При компиляции должно быть что-то такое gcc mystr.c mystr.s -o mystr  Я честно не очень понимаю как всё это функционирует  :'(... Только учусь... И ещё это должно быть под Linux сделано (ну хотя бы под Windows, и то благодарен буду)
      • Написал небольшой скрипт, который сверяет реально поступившие данные с оборудования по netflow потоку и тех которые смогли обработаться. По поводу обработки и выборки из базы можете не обращать на это внимания, так как процесс узконаправленный. Меня интересует то, как можно увеличить скорость обработки файлов. При общем объеме файлов 19 гигов в формате raw, скрипт справляется примерно за 1,5 часа. Хотелось бы увеличить скорость обработки. Кто что может посоветовать?

        Код:
        #!/usr/bin/perl

        use File::stat;
        use DBI;

        $user = "логин";
        $password = "пароль";
        $source = "dbi:Oracle:host=хост;sid=экземпляр;port=1521";

        #-----------------------------------------------------------------------
        $pattern = "какойто IP адрес, по которому делаем выборку";
        $service = "какой то номер услуги для выборки из БД";
        #-----------------------------------------------------------------------

        $cat = "/usr/local/flow-tools/bin/flow-cat";
        $prt = "/usr/local/flow-tools/bin/flow-print";

        $dirname = $ARGV[0];

        opendir (DIR, $dirname) || die "Error in opening dir $dirname\n";
        @files=readdir(DIR);
        @sortfiles = sort(@files);

        $month = substr("$dirname/$_", -3,2);
        $year = substr("$dirname/$_", -7,4);

        print "##########################################\n";
        print "Pattern: $pattern\n";
        print "Service: $service\n";

        foreach (@sortfiles)
        {
            unless ($_ eq '..' || $_ eq '.')
            {
        if (-d "$dirname/$_")
        {
            break;
        }
        else
        {
            $buff = stat("$dirname/$_");

            $mfile = scalar localtime $buff->mtime;
            $modify = substr($mfile,-16,2);

        for($k=1; $k<31; $k++)
        {
            if($modify == $k)
            {
        $buff_sum[$k] += work();
            }
        }
        }
            }
        }

        sub work
        {
             my $total = `$cat $dirname/$_ | $prt | awk '{print "h:"\$6 "B:"\$2}' | grep -e '$pattern' | awk 'BEGIN {sum=0; cnt=0} {split(\$1,h,":"); sum += h[2];cnt++} END {print "Sum:" sum}'`;

            print ".";

            return($total);
        }

        print "\n";

        for($i=1; $i<31; $i++)
        {
            print "$i - day. Byte: $buff_sum[$i]\n";
            $sumall += $buff_sum[$i];
        }

        $dbh=DBI->connect($source, $user, $password,{PrintError=>0,AutoCommit=>0,RaiseError=>1}) or die "Couldnot connect to Oracle:$DBI::errstr\n";

        $sth = $dbh->prepare("SELECT SUM(traffic) FROM bm_report_traffic WHERE   
        service_id = $service
        AND year = $year
        AND mon = $month
        AND is_incoming = '1'
        GROUP BY DAY");

        $sth->execute();


        my @row = $sth->fetchrow_array;

        print "\n";
        print "Total sum byte from raw file: $sumall\n";
        print "Total sum byte from database: $row[0]\n";
        print "##########################################\n";

        $sth->finish();
        closedir(DIR);
        exit(0);
      • У меня проблема, пере-установил ХР. Установи 1С предприниматель, Скопировал базу 1С предприниматель указал путь как и было раньше, запустил программу а данных не видит кудато подевались :dontknow:. Может я что то не правильно делаю раз такое.
      • Начал изучать Directx 9 и решил создать простенькую игрушку.
        Наверное что-то в стиле crimsonland...

        Вообщем приглашаю всех, кто хочет изучить directx 9.  ;)
        Желательно:
        Небольшое знание dx9 (хотя бы знали как нарисовать кубик) :)
        Более-менее знали с++.
  • Операционные системы
      • Т.е. в расшаренном каталоге на одной из машин в локальной сети лежит исполняемый файл, необходимо запускать его на всех машинах каждый раз когда они входят в сеть.
        Сеть организована как рабочая группа.
        192.168.0.1/255.
        static IP.
        Да, забыл уточнить машины под WinXPpro SP2(ну и парочка SP3)...
      • На старом компе все было нормально, купила новый комп поначалу вроде нормально  видел его. возможно после переустановки винды перестал видет.. В общем когда его втыкаешь в порт - ноль эмоций, а когда вытаскиваешь - он загорается и пишет Starting....( он так включается).Дрова раньше никакие не требовались.Причем странно что с него вдруг как то исчезла вся музыка....хотя это может с этим и не связано...малоли кто случайно....в общем вот такая история.
      • вопрос такой: можно ли штатными средствами винды назначить некую папку диском, то есть, имеется папка

        D:\11\22\33\UUU\

        колдуем, в системе появляется диск, скажем, U:
        при этом любое обращение

        U:\файл

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

        D:\11\22\33\UUU\файл
      • Не могу писать на расшаренный диск правами админа, впрочем и правами юзера тоже не могу.
        Локально на диск пишу. По сети - не могу. В логах ничего нет (журнале), впрочем - где эти логи искать?

        Что делал до этого.
        Понадобилось отключить шару.
        Отключил.
        Включил. Видимо с этого все и началось
        Весь в думах... Как баба у разбитого корыта.
        С политиками не игрался.
  • Направления программирования
      • помогите, пожалуйста, новичку. Цель - драйвер виртуального USB-устройства - отображение в диспетчере устройств+ обработка неких прерываний.

        при помощи VS2005 + DDK 3790.1830 + Driver Studio (по прочитанным советам не юзал lib`ы от DriverWork)
        создал Рыбу (оказывается, так Вы это называете, забавно:) ) для USB дравера. Скомпилировалось без ошибок, на выходи .inf и .sys в папке .386 имеются.  потратил на всё это целую ночь.)

        Я так понимаю, уже саму рыбу можно добавить в диспетчер устройств?
        пытаюсь это сделать - через добавление оборудования - системное устройство из списка вручную - путь к .inf -
        собственно, имею - "отсутствуют сведения об оборудовании".
        пробовал по всякому, в общем, Не выходит. Подскажите, что я делаю не так?
      • необходимо написать управляемый фильтр-драйвер для дисков под Win XP, который разрешает запись на выбранных дисках
        возникло несколько вопросов связанных с управлением списком дисков:
        для каждого физического диска будет создан свой фильтрующий FDO, в этот момент мне надо как-то узнать блокировать запись на этот диск или нет (я предполагаю грузить драйвер до драйверов файловых систем, чтобы они ничего не успели изменить во время монтирования), поэтому вопрос:
        1) где лучше держать список разрешённых дисков(реестр или файл на диске) и соответственно когда загружать (лучше всего имхо в DriverEntry и там же создать управляющий FDO)? предполагается хранение в виде количество разрешённых и потом список их uid? запрещённые хранить не предполагается
        2) как его адекватно хранить в период выполнения(учитывая что количество дисков может меняться за счёт флэшек например), так чтобы он был доступен всем фильтрующим FDO(им только читать надо будет своё разрешение) и управляющему FDO(он может менять разрешения)? предполагаю хранить количество дисков в системе массив их uid и массив байтов с разрешениями, проблема в неизвестном размере и том что это фактически получаются глобальные переменные (которых насколько я понимаю нужно избегать)
        3) как определить что я загрузился с этого диска, соответственно запись запрещать нельзя (где-то подобное вроде видел, но так уж за компанию)?
        4) сохранять список надо только в DriverUnload и в Shutdown или ещё где-то?
        5) блокировать достаточно только IRP_MJ_WRITE? или есть ещё способы осуществить физическую запись на носитель?
        6) смена разрешения во время исполнения я так полагаю вполне может привести к бсоду, есть ли рекомендации как этого избежать? и вообще если я на любую попытку записи буду отвечать access denied виндовс это переживёт?
        7) работать собираюсь только с физическими дисками (партишены не интересуют), следовательно если я правильно понимаю цепляться мне нужно под или над disk.sys?

        зы: извиняюсь если похоже на поток сознания, просто постарался разделить интересующие вопросы на мелкие
        зыы: приложил файл с функцией которой собираюсь читать uid'ы, будет ли она работать так как предполагается?
      • у меня возник вопрос: второй параметр функцыи DeviceIoControl (dwIocontrolCode - это значение, котоpое указывает опеpацию, котоpую должен выполнить VxD. Вы должны каким-то обpазом достать список допустимых значений dwIoControlCode для данного VxD, пpежде, чем вы узнаете, какую опеpацию вам нужно совеpшить)

        каким образом мне достать этот список операцый ????

        Смотрите робота происходит так: приложение посылает текстовое сообщение драйверу (с указанием имени файла которго я выбрал) потом драйвер отсылает это сообщение назад приложению.....

        Как осуществить это...... допустим я использую каркас драйвера с WDK (kmdf\toaster\func\simple)... я так понял что это делается через CreateFile - получаю дескриптор и передаю его DeviceIoControl.....

        если можно киньте какоё нить примерчик пресылки простой фразы драйверу.....
      • Можно ли зарегистрировать в системе драйвер, есть информация что драйвер работает с графикой, возможно определяет параметры экрана, и написан на ассемблере. Пробовал запустить его так, сначала внес данные в реестр, поместил сам драйвер куда положено в drivers,
        Код:
        REGEDIT4

        [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\consoles]
        "Type"=dword:00000001
        "Start"=dword:00000002
        "ErrorControl"=dword:00000001
        перезагрузил, в командной строке ввожу "net start consoles", так называется драйвер, и мне сообщают что обнаружена системная ощибка 2001 и выбран неверный файл.
      • при просмотре или старании использование DDK - СИ стиля кусков -
        вся суть становится какбы смутной, словом - не Ассемблерская ясность :)
        Существует ли DDK из MASMa?
  • Практические разделы
      • Решил сделать банальную - наипростейшую вещь (как мне казалось) на MS Access.

        Был сильн удивлен, что при наличии документации и купленных 3 книжек сделать это было напрочь непросто =(

        Суть проста, есть основная таблица на которую залинковано несколько связанных таблиц-справочников.
        Создана форма занесения записей в основную таблицу.
        Есть так же запрос с параметрами который подключен к поисковой форме. То есть на форме ряд комбо-боксов, значение которых передается в запрос. Форма работает отлично. 

        Пытаюсь просто на основе этого запроса построить отчет. Который при попытке вызова постоянно просит меня ввести значения этих комбо-боксов, хоть убей немогу заставить передать параметры комбо-боксов с формы этому отчету.

        Я вообще удивлен что я ему (запросу) должен что-то передавать - он ведь работает с формы где эти параметры определены.

        Может кто подскжет что я делаю не так? Если нужно пример моей базёхи кину легко!

        Я даже поступил проще - создал новый отчет на основе таблицы а не запроса.
        На кнопке его формирования я поставил событие у которого попытался задать фильтр для отчета в зависимости от выбранного значения в комбобоксе:
        Private Sub Command99_Click()
        On Error GoTo Err_Command99_Click

            Dim stDocName As String

           
            stDocName = "Free_Prod_Space"
            Me.Filter = "area_id = Forms![Search].[area_combo]"
            Me.FilterOn = True
            DoCmd.OpenReport stDocName, acPreview, [area_id] = Forms![Search]![area_combo]

        Exit_Command99_Click:
            Exit Sub

        Err_Command99_Click:
            MsgBox Err.description
            Resume Exit_Command99_Click
           
        End Sub

        Почему-то не работает такая конструкция =(
      • SQL Server2005. Возникла у меня забавная задачка.. Хранимые процедуры пишут в лог файлы некоторую информацию.  Проблема в том, что разный люд не всегда отслеживал регистр символов записываемой строки. Это оказалось важно (очень  ::) Строки шифруются потом...) Теперь у меня есть 450 процедур, в некоторых из них  строки записаны как
        Код:
        exec sys_log  'CSC', 'adr_ins_City', 'Transaction',
        '', 'Begin', '', @id_proc
        , а в некоторых как
        Код:
        exec sys_log 'csc', 'adr_ins_City', 'Transaction', '', 'Begin', '', @id_proc
        . И нужно бы в них всех заменить строчные буквы 'csc 'на прописные...
        открыть, найти с учетом регистра и поменять ручками я, конечно, могу... а можно как-то автоматизировать процесс?
        Есть следующая утилитка, весьма удобная...
        Код:
        create PROCEDURE [Утилиты: поиск текста в хранимых процедурах]
        @SearchPattern nvarchar(128),
          @ExcludePattern nvarchar(128)
        AS
        BEGIN
        set nocount on
         
          select
            rtrim(o.name) as 'Имя объекта',
            o.type as 'Тип объекта'
          from
            sys.all_objects o inner join sys.schemas u on u.schema_id = o.schema_id
            inner join sys.all_sql_modules c on c.object_id = o.object_id
          where
            u.name = N'dbo'
            and c.definition like '%' + @SearchPattern + '%'
            and c.definition not like IsNull(@ExcludePattern, '')
          order by
          o.type,
          o.name
        END
        Но она ищет без учета регистра... как модернизировать, сообразить не могу :(
      • В акцессе столкнулся с такой вещью, по умолчанию не разрешает делать в таблице элемент, ссылающийся на эту же таблицу. Ограничение обошел скриптом, но вот остался осадок, потому спрошу тут, противоречат ли данные действия какой нибуть теории построения БД ? или какой нибуть форме нормализации ?

        Немного отступления, зачем так сделано: таблица отражает документ выход которого свидетельствует что у некого объекта появляется допустим наименование и адрес, проблема в том что через неделю может выйти новый документ в отношении того же объекта в котором могут полностью поменяться наименование и адрес (кто знаком с 1С некий аналог периодического реквизита с той разницой что тут все значения могут быть периодические) Вот и сделал флаг - недействительный документ и соответственно ссылку на новый действительный документ (ссылка на эту же таблицу) Можно ли так делать ? или это чем то грозит (незря же в акцессе стоит ограничение на создание таких связей)?

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


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


В избранное