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

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


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 104.  17 ноября 2010 г.

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


Приятного чтения!




Требуется помощь!

Serg79 просит помощи: какую CMS выбрать для быстрого создания сайта малого предприятия?


lapulya просит помощи: как в Windows реализовать «ленивое подключение» (lazy binding) по аналогии с возможностями функции dlopen() в POSIX системах?.


Админстрация форума просит помощи: в HTML-коде нашей рассылки есть изъяны, связанные с расползанием блоков с исходными кодами программ в некоторых почтовых программах и браузерах. Посмотрите, пожалуйста, эту тему — может быть вы сможете помочь исправить эти недостатки.

Предисловие

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

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


Коллективное использование ресурса

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

Некоторыми ресурсами мы владеем монопольно: например, к ним относятся наши личные вещи, которыми мы распоряжаемся по своему усмотрению. Другие ресурсы находятся в общем (коллективном) пользовании: телефонные станции, банковские терминалы, места в пассажирских вагонах; для того, чтобы корректно ими воспользоваться, необходимо соблюдать некоторые процедуры, не имеющие смысла при монопольном использовании. Так, например, звоня по телефону, мы должны быть готовы к тому, что линия окажется занята другим абонентом, который позвонил раньше нас; к банкомату может быть очередь, и мы должны встать в ее конец и дожидаться, когда нас обслужат; перед тем, как угнездиться на полке в купе, мы должны пройти процедуру приобретения билета, в результате которой за нами будет зарезервировано определенное место на некоторый срок. При несоблюдении этих процедур мы не только не достигаем желаемого, по и порой нам гарантирован конфликт с другими претендентами на тот же ресурс в тот же момент времени.

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

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

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

Итак, семья в составе: Папа (П), Мама (М) и Сын (С) выезжает на дачу на выходные. После приезда они делятся планами на ближайшее будущее. Оказывается, что П собирается посадить картошку на огороде, М решила разбить клумбу перед домом, а С намерен найти на участке клад. К сожалению, лопата (Л) в сарае оказалась лишь одна, а нужна она всем троим. Тем самым Л становится дефицитным ресурсом, на который претендуют сразу трое: П, М и С. После недолгих препирательств всем становится очевидно, что необходимо разработать (и впоследствии соблюдать) подходящую стратегию его использования.

...



Полностью статью можно прочесть на нашем сайте, в разделе «Начинающим::Теория».

  • Программирование :: .NET технология от и до
  • Ребята, подскажите, пожалуйста,
    можно ли чекбоксу при создании (динамически) как-то задать ширину и высоту самого квадратика?
    и как этот созданный чекбокс засунуть в гридвью?

    P.S. C# Web-приложение
  • Решил переписать .NET приложение как сервис (class myTestService : ServiceBase). Столкнулся с небольшой проблемой: после события onStop сервис может завершаться довольно долго (10 и даже 30 минут!), а SC после некоторго таймаута обижается и сообщает что "Error 1053: The service did not respond to the start or control request in a timely fashion." :(
    Долгое завершение рабочего процесса - это его особенность, связанная с непрерывностью и всякими долгими операциями..
    Пробовал в обработчике OnStop реализовывать ожидание и вызов RequestAdditionalTime(2000) в цикле, но это не помогает..
    Конечно, сервис не убивается, а корректно останавливается в положенное время, но хотелось бы подавить это сообщение менеджера..
    Как это сделать?
  • Программирование :: С/С++
  • Здравствуйте!

    Язык: С++
    Платформа: win
    Программа: "eraser"

    Вопрос такой: как создать файл, заполненный нулями, который бы создавался на свободном месте диска (для очистки свободного места и не затирал существующие). Главный интерес состоит в заполнении файла нулями, а также как создать файл который бы заполнял всё свободное место, то есть без определённого заданного ранее размера.

    Кому-нибудь известны какие-нибудь команды вин апи?
  • Суть проблемы такова:
    Есть несколько AnsiSting, типа
    Код:
    AnsiString f1="VK_F1";
    AnsiString a="VK_A";
    Как их преобразовать просто к int, чтобы затем можно было передовать в ф-ии типа GetAsyncKeyState.
    Долго мудрил я с разными типами, но
    Код:
    AnsiString key_name="VK_F1";
    int key;
    key=key_name.ToInt();
    вылетает естесвенно с ошибкой, что дескать "VK_F1" не является int.
  • Здравствуйте! Похожей темы в этом разделе не нашёл, так что решил спросить. Я начинающий С++ программист. Подскажите пожалуйста как добавить иконку в исполняемый файл.

    Язык: С++
    IDE: Code::Blocks
    Программа: простая консольная, например hello world

    В общем есть простая консольная программка из одного файла cpp на С++, допустим стандартная hello world, как добавить в неё иконку(значёк), чтобы после компиляции она отображалась в проводнике виндовс. Пытался найти ответ, вроде это нужно файл русурсов подключить, или я ошибаюсь? Заранее спасибо!
  • Программирование :: С/С++ :: ANSI С/С++
  • Мой код:
    Код:
    #include <windows.h>
    #include <iostream.h>
    #include <string.h>
    #include <conio.h>

    int main(void)
    {
    char *str = "Введите строку: ";
    // Указатель на исходную строку
    char *s = "\0";

      CharToOem(str, str);

      cout << str << endl;
      cin >> s;
      cout << strlen(s) << endl; // В место strlen может быть lstrlen
     
      getch();
      return 0;
    }

    Если я ввожу:
    23
    то всё нормально, длина равна 2
    Если я ввожу:
    2 3
    то длина обрезается и равна 1, а должна быть равна 3

    Какую же мне тогда использовать функцию для подсчёта количества символов в строке?
    А может виноват мой компилятор. У меня компилятор C++ Builder 5.5
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Хочу чтобы связывание происходило в момент загрузки dll, конкретно нужно вот, что:

    Есть dll, в ней объявлена и используется внешняя функция/переменная, которая определяется в exe, которое и грузит данную dll. Говорят в linux это делается на раз, как это сделать в windows? Если можно ссылку на описание + пример (exe с одной функцией и dll которая использует на MS VC), ну или описание того, что в windows этого механизма нет.
  • Прошу помощи.... есть созданный класс работы со строкой:
    "MyString.h"

    Код:
    class MyString
    {
     
    public:
        MyString(const char*);
        MyString(int);
        ~MyString();
     
    public:
        void Clear();
     
        char* MString;
        int length;
        char& operator[] (int i) {return MString[i];}
        friend MyString& operator + (MyString&, MyString&);
    };
     

    Хочу использовать объект этого класса в "ethernet.h", то есть:
    Код:
    class Ethernet
    {
    public:
        Ethernet();
        ~Ethernet();
     
        int Connect();
        int Disconnect();
     
        int SetIP(IP_st &newIP);
        int GetIP(IP_st &curIP);
        bool IsConnected()
           
    private:
        SOCKET eth_socket;
        IP_st ip;
        bool on_connected;
        sockaddr_in eth_addr;               
        int socket_error;                   
        int shift;
     
        MyString buffer(2000);
        MyString out_buffer(2000);
        MyString log_buffer(1000);
        MyString sendlog_buffer(1000);
       
        HANDLE socket_handle;               
     
    };

    Выдает ошибку: 'MyString' : 'class' type redefinition

    Если я понимаю правильно, то в заголовочный файл нужно вводить нечто подобное:
    #ifndef MYSTRING_H
    #define MYSTRING_H

    А вот как это правильно сделать? .....   :dontknow:
  • Программирование :: С/С++ :: Borland C/C++
  • Пишу в билдере шестом, возникла необходимость создания потоков, при том изначально количество потоков неизвестно.
    К сожалению поиск по просторам интернета дал весьма скудную информацию.

    Попытался сам что то сделать, но пока что работает криво:
    Код:
    static DWORD __stdcall ThreadFunc (LPVOID i )
    {
     AnsiString a;
     a=IntToStr(*(int*)i);
     a=a.ToInt();
     if(a==1)
     {while(1){Form1->CSpinEdit2->Value++;Sleep(100);}}
     if(a==2)
     {while(1){Form1->CSpinEdit3->Value++;Sleep(100);}}
     if(a==3)
     {while(1){Form1->CSpinEdit4->Value++;Sleep(100);}}
    }

    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
     int p=0;
     while(p!=4)
       {
        CreateThread ( NULL, 0, ThreadFunc, &p, NULL, 0 );
        Sleep(1000);
        p++;
       }
    }

    Все это очень не красиво и работает скажем так "не стабильно".Тоесть вылетают екцепшены и все такое, но думаю код сможет хотябы пояснить что мне в результате требуется. :dontknow:
  • Программирование :: Delphi
  • Хотел бы спросить совета вот в такой ситуации. Пишу утилиту для работы по протоколу Pop3. В одной процедуре утилита получает лист сообщений с сервера, который должен видеть пользователь. Внимание, вопрос: а как отобразить этот лист в dbGrid, если данные находятся в массиве (array)? И какие в такой ситуации могут быть альтернативы dbGrid'у или массиву?
  • Программирование :: VisualBasic
  • Делаю вот так
    Код:
    Dim i As Single
    Dim a, b, h, k As Variant

    Private Sub cmd1_Click()
    a = Val(txt1.Text)
    b = Val(txt2.Text)
    h = Val(txt3.Text)
    k = Val(txt4.Text)
    For i = a To b Step h
    Print i
    Next
    End Sub

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

    Код:
    /**
     * Класс, который задумывался для передачи изображения, но походу им можно
     * передавать любые файлы, желательно небольшие
     * @author Murashko Arthur
     */
    public class ImageFileTransfer {
        private static int bufferSize = 1024;

        /**
         * Данный метод передает файл клиенту, для того, чтобы принять этот файл
         * нужно вызвать метод ImageFileTransfer.read(...)
         * @param socket сокет клиента
         * @param imageFile файл, который нужно передать
         */
        public static void send(Socket socket, File imageFile) {
            FileInputStream inputFile = null;
            ObjectOutputStream out = null;
            ImagePackage imagePackage = null;
            byte [] bytes = new byte[bufferSize];
            int length = 0;

            try {
                try {
                    inputFile = new FileInputStream(imageFile);
                    out = new ObjectOutputStream(socket.getOutputStream());

                    while (true) {
                        length = inputFile.read(bytes, 0, bufferSize);
                        if (length == -1) {
                            imagePackage = new ImagePackage(bytes, 0, true);
                            out.writeObject(imagePackage);
                            break;
                        }
                        imagePackage = new ImagePackage(bytes, length, false);
                        out.writeObject(imagePackage);
                        out.flush();
                    }
                } finally {
                    inputFile.close();
                    System.out.println("Файл передан.");
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(ImageFileTransfer.class.getName()).log(
                        Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(ImageFileTransfer.class.getName()).log(
                        Level.SEVERE, null, ex);
            }
        }

        /**
         * Данный метод сохраняет файл, посланный сервером в нужном месте
         * @param socket сокет клиента
         * @param name полное имя, с которым хотим сохранить файл
         * @return объект класса File ассоциированный с переданным файлом
         */
        public static File read(Socket socket, String name) {
            File imageFile = null;
            FileOutputStream outImgFile = null;
            ObjectInputStream input = null;
            ImagePackage imagePackage = null;
            try {
                try {
                    imageFile = new File(name);
                    outImgFile = new FileOutputStream(imageFile);
                    input = new ObjectInputStream(socket.getInputStream());
                    imagePackage = (ImagePackage) input.readObject();

                    while (!imagePackage.isFinish()) {
                        outImgFile.write(imagePackage.getBytes(), 0,
                                imagePackage.getLength());
                        imagePackage = (ImagePackage) input.readObject();
                    }
                } finally {
                    outImgFile.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(ImageFileTransfer.class.getName()).log(
                        Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(ImageFileTransfer.class.getName()).log(
                        Level.SEVERE, null, ex);
            }
            return imageFile;
        }

        private static class ImagePackage implements Serializable {
            private boolean finish;
            private int length;
            private byte[] bytes;

            public ImagePackage(byte[] b, int length, boolean f) {
                this.length = length;
                bytes = b.clone();
                finish = f;
            }

            public boolean isFinish() {
                return finish;
            }

            public byte[] getBytes() {
                return bytes;
            }

            public int getLength() {
                return this.length;
            }
        }
    }

    Как видно из данного кода, у меня передаются объекты. Вот данный нюанс и мучает меня больше всего. Изначально я просто методами read и write соотвественно классов InputStream и OutputStream передавал байты моего файла, причем порциями по 1024 байта, но я не мог отследить на клиенте, когда приходит последняя порция данных - у меня просто метод read блокировал поток и ждал следующих данных.

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

  • Операционные системы :: Windows
  • Кто-нить удалял пароль админа под виндой? Есть опыт?
  • собственно, не могу понять, в чём разница. Всё едино - переключается раскладка и всё

    Добавлено через 19 секунд:
    (http://forum.shelek.ru/index.php?action=dlattach;topic=25943.0;attach=5362)
  • Операционные системы :: Unix и другие :: Linux
  • устанавливал ядро 2.6.13 (из родного диска Slackware, хотел bluetooth юзать ) в Slackware 10.2 взамен 2.4.х
    как описано в статье "Основы Slackware" :
    # cd /usr/src/linux
    # make mrproper
    # make menuconfig       ; -там убедился что все что связано с bluetooth включенно и сохранил конфиг

    # make bzImage
    # make modules
    # mv /boot/vmlinuz /boot/vmlinuz.old
    # cat arch/i386/boot/bzImage > /vmlinuz
    # mv /boot/System.map /boot/System.map.old
    # cp System.map /boot/System.map
    # make modules_install
    далее отредактировал lilo.conf  и выполнил lilo
    после перезагрузки получаю :
    kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block (22,71)

    загрузка со старым ядром сохранилась работает нормально
    подскажите пожалуста что тут можно сделать?
  • Операционные системы :: Embedded systems
  • Привет всем!
    Столкнулся с проблемой включения WiFi адаптера.
    Адаптер AR6K_SD1 в реестре:

    [HKEY_LOCAL_MACHINE\Comm\AR6K_SD1]
    Display Name=AR6000 WLAN Adapter SD
    Group=NDIS
    ImagePath=ar6k_ndis_sdio.dll
    Wireless=1

    [HKEY_LOCAL_MACHINE\Comm\AR6K_SD1\Parms]
    powerSaveMode=2
    currentPowerState=1
    BusType=0
    BusNumber=0
    BtCoexAntConfig=0
    eepromFile=NULL

    Пытался через SetDevicePower(szName, POWER_NAME, PwrDeviceUnspecified) - включение, и SetDevicePower(szName, POWER_NAME, D4) - выключение.
    Где szName={98C5250D-C29A-4985-AE5F-AFE5367E5006}\AR6K_SD1.

    Проблема в том, что при перезагрузке, когда адаптер выключен, функция включения не работает. Если включить через навигатор WiFi, то SetDevicePower начинает работать и на включение, и на выключение.

    Как я понял проблема в том, что адаптер необходимо сначала активировать.
    Проверил регистр до включения WiFi и после - разница в том, что появляется новый ключ
    [HKEY_LOCAL_MACHINE\Drivers\Active\103]
    Hnd=3582778688
    Name=DRG1:
    Key=\Drivers\SDCARD\ClientDrivers\Custom\MANF-0271-CARDID-0201-FUNC-1
    BusParent=3489963616
    InterfaceType=0
    BusName=SDBus_1_0_1
    ClientInfo=686337

    Сам ключ [HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Custom\MANF-0271-CARDID-0201-FUNC-1] выглядит так
    Dll=ar6k_ndis_sdio.dll
    Prefix=DRG

    В общем, тогда пробовал до вызова SetDevicePower на включение вызывать
    handle = ActivateDevice(L"\\Drivers\\SDCARD\\ClientDrivers\\Custom\\MANF-0271-CARDID-0201-FUNC-1",NULL);
    на что выдовало handle=NULL, а GetLastError()=110(ERROR_OPEN_FAILED
    )

    В общем, больше пока ничего в голову не пришло.

    Если есть идеи, пишите, буду благодарен.
  • Направления программирования :: Drivers
  • При запуске минифильтра вылетает перезагружается комп в чем проблема так и не понял.
    Если же убрать из структуры FLT_OPERATION_REGISTRATION имя процедуры фильтрации MyFiltr и поставить NULL, то все нормально, драйвер нормально загружается и выгружается, есть связь  с с ним из win app программ, но естественно нет фильтрации, пожалуйста помогите новичку.

    Код:
    //=============================================================================
    // укороченная версия
    //=============================================================================
    #include <fltKernel.h>
    #include <dontuse.h>
    #include <suppress.h>
    //#include "VERSION.h"
    #pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER,"Not valid for kernel mode drivers")
    //-----------------------------------------------------------------------------
    #define NT_FILTER_NAME      L"\\Device\\NTName"
    #define WIN32_FILTER_NAME   L"\\DosDevices\\MYDRIVER"
    #define VERSION             "1.0001"
    //-----------------------------------------------------------------------------
    DRIVER_UNLOAD UnloadDriver;   // п/п выгрузки драйвера
    DRIVER_INITIALIZE DriverEntry;// главная
    //-----------------------------------------------------------------------------
    VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject);// п/п выгрузки драйвера
    //-----------------------------------------------------------------------------
    typedef struct _DEVICE_EXTENSION { // структура расширения драйвера
                                       PDEVICE_OBJECT fdo;
                                   UNICODE_STRING Win32_Filter_Name;
                                     } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    //---------------------------
    typedef struct _NULL_FILTER_DATA{ // структура фильтра
                                      PDRIVER_OBJECT DriverObject;
                                      PFLT_FILTER FilterHandle;
                                    } NULL_FILTER_DATA, *PNULL_FILTER_DATA;
    //*************************************************************************
    NTSTATUS DriverEntry ( // главная
                           __in PDRIVER_OBJECT DriverObject,
                           __in PUNICODE_STRING RegistryPath
                         );
    NTSTATUS FilterUnload (// функция выгрузки фильтра
                           __in FLT_FILTER_UNLOAD_FLAGS Flags
                          ) ;
    NTSTATUS QueryTeardown( // функция отсоединения фильтра
                            __in PCFLT_RELATED_OBJECTS FltObjects,
                            __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
                          );
    NTSTATUS InstanceSetup ( // функция подключения локальных томов
                             __in PCFLT_RELATED_OBJECTS FltObjects,
                             __in FLT_INSTANCE_SETUP_FLAGS Flags,
                             __in DEVICE_TYPE VolumeDeviceType,
                             __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
                           );                           
    FLT_PREOP_CALLBACK_STATUS MyFiltr (// функция фильтрации
                                       __inout PFLT_CALLBACK_DATA Data,
                                       __in PCFLT_RELATED_OBJECTS FltObjects,
                                       __deref_out_opt PVOID *CompletionContext
                                      );
    //-----------------------------------------------------------------------------
    NULL_FILTER_DATA NullFilterData;
    //-----------------------------------------------------------------------------
    #ifdef ALLOC_PRAGMA
    #pragma alloc_text(INIT, DriverEntry)
    #pragma alloc_text(PAGE, FilterUnload)
    #pragma alloc_text(PAGE, QueryTeardown) 
    #pragma alloc_text(PAGE, InstanceSetup)
    #pragma alloc_text(PAGE, MyFiltr)
    #endif
    //-----------------------------------------------------------------------------
    const FLT_OPERATION_REGISTRATION FilterOperations[] =
        { 
           {IRP_MJ_CREATE,
            0,
            MyFiltr,// функция фильтрации
            NULL,
    NULL
           },
           { IRP_MJ_OPERATION_END}
        };
    typedef struct _SCANNER_STREAM_HANDLE_CONTEXT
                   { BOOLEAN RescanRequired;
                   } SCANNER_STREAM_HANDLE_CONTEXT, *PSCANNER_STREAM_HANDLE_CONTEXT;
    const FLT_CONTEXT_REGISTRATION ContextRegistration[] =
        {
          { FLT_STREAMHANDLE_CONTEXT,             // 1 ContextType
            0,                                    // 2 Flags
            NULL,                                 // 3 ContextCleanupCallback;
            sizeof(SCANNER_STREAM_HANDLE_CONTEXT),// 4 Size
            'chBS',                               // 5 PoolTag
            NULL,                                 // 6 ContextAllocateCallback
            NULL,                                 // 7 ContextFreeCallback
            NULL                                  // 8 Reserved1
          },
          { FLT_CONTEXT_END }
        };
    CONST FLT_REGISTRATION FilterRegistration =
        {
         sizeof( FLT_REGISTRATION ),         // 1 Size
         FLT_REGISTRATION_VERSION,           // 2 Version
         0,                                  // 3 Flags
         ContextRegistration,                // 4 ContextRegistration
         FilterOperations,                   // 5 OperationRegistration
         FilterUnload,                       // 6 FilterUnloadCallback
         InstanceSetup,                      // 7 InstanceSetupCallback 
         QueryTeardown,                      // 8 InstanceQueryTeardownCallback
         NULL,                               // 9 InstanceTeardownStartCallback
         NULL,                               // 10 InstanceTeardownCompleteCallback
         NULL,                               // 11 GenerateFileNameCallback
         NULL,                               // 12 NormalizeNameComponentCallback
         NULL                                // 13 NormalizeContextCleanupCallback
        };
    //=============================================================================
    NTSTATUS DriverEntry (__in PDRIVER_OBJECT DriverObject, // объект драйвера
                          __in PUNICODE_STRING RegistryPath // раздел реестра
                         )
    {
    PDEVICE_OBJECT pDeviceObject; // указатель на Functional Device Object (FDO)
    PDEVICE_EXTENSION dx;         // указатель на структуру расширения устройства
    NTSTATUS status;              // текущий статус выполненной операции
    UNICODE_STRING uniNtName;
    UNICODE_STRING uniWin32Name;
    UNREFERENCED_PARAMETER( RegistryPath );
    UNREFERENCED_PARAMETER( DriverObject );
    //-------------------------------
    RtlInitUnicodeString(&uniNtName,    NT_FILTER_NAME);
    RtlInitUnicodeString(&uniWin32Name, WIN32_FILTER_NAME);
    //--------------------- 
    DriverObject->DriverUnload = UnloadDriver;//п/п выгрузки драйвера
    //---------------------
    #if DBG
    DbgPrint("=FltF= ver. %s",VERSION );
    #endif
    //----------------------
    status=IoCreateDevice(DriverObject,
                          sizeof(DEVICE_EXTENSION),// size структуры расширения
                          &uniNtName,      // NT_FILTER_NAME
                          FILE_DEVICE_UNKNOWN,
                          0,
                          FALSE,           // без эксклюзивного доступа
                          &pDeviceObject   // cоздаем Functional Device Object (FDO)
                         );
    if(!NT_SUCCESS( status ))
      {
       #if DBG
       DbgPrint("=FltF= Error IoCreateDevice - DriverEntry");
       #endif   
       return(status);
      } 
    dx=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;//структура расширения
    dx->fdo = pDeviceObject;  // обратный указатель
    RtlInitUnicodeString(&dx->Win32_Filter_Name, WIN32_FILTER_NAME);
    #if DBG
    DbgPrint("=FltF= DriverEntry - FDO %X, DevExt=%X.",pDeviceObject,dx);
    #endif
    //-----------------------------------------------------------------------------
    status=IoCreateSymbolicLink(&uniWin32Name,// видимое пользователю название
                                &uniNtName);// имя драйвера, созданный объект устройства
    if(!NT_SUCCESS( status ))
      {IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
       #if DBG
       DbgPrint("=FltF= DriverEntry - Error IoCreateSymbolicLink");
       #endif
       return(status);
      }             
    //-------------------------- регистрация фильтра ------------------------------
    status = FltRegisterFilter( DriverObject,
                                &FilterRegistration,
                                &NullFilterData.FilterHandle
                              );
    if(!NT_SUCCESS( status ))
      {IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
       #if DBG
       DbgPrint("=FltF= DriverEntry - Error FltRegisterFilter");
       #endif
       return(status); 
      }     
    #if DBG
    DbgPrint("=FltF= DriverEntry - OK FltRegisterFilter");
    #endif 
    status = FltStartFiltering( NullFilterData.FilterHandle );// запуск фильтра
    if(!NT_SUCCESS( status ))
      {FltUnregisterFilter( NullFilterData.FilterHandle ); // разрегистрируем фильтр
       IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
       #if DBG
       DbgPrint("=FltF= DriverEntry - Error FltStartFiltering");
       #endif
       return(status);
      }
    #if DBG
    DbgPrint("=FltF= DriverEntry - Driver is successfully");
    #endif
    return(status);
    }// END DriverEntry(...)
    //-----------------------------------------------------------------------------
    NTSTATUS FilterUnload ( __in FLT_FILTER_UNLOAD_FLAGS Flags  )
    {
    UNREFERENCED_PARAMETER( Flags );
    PAGED_CODE();
    FltUnregisterFilter( NullFilterData.FilterHandle );
    #if DBG
    DbgPrint("=FltF= FilterUnload");       
    #endif
    return(STATUS_SUCCESS);
    }// END FilterUnload(...)
    //-----------------------------------------------------------------------------
    NTSTATUS QueryTeardown ( __in PCFLT_RELATED_OBJECTS FltObjects,
                             __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
                           )
    {
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( Flags );
    PAGED_CODE();
    #if DBG
    DbgPrint("=FltF= QueryTeardown");         
    #endif
    return(STATUS_SUCCESS);
    }// END QueryTeardown(...)
    //-----------------------------------------------------------------------------
    VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject)
    {
    PDEVICE_OBJECT  pdeviceObject = pDriverObject->DeviceObject;
    PDEVICE_EXTENSION dx;
    UNREFERENCED_PARAMETER(pDriverObject);
    dx = (PDEVICE_EXTENSION)pdeviceObject->DeviceExtension;
    IoDeleteSymbolicLink(&dx->Win32_Filter_Name);
    IoDeleteDevice( pdeviceObject );
    #if DBG
    DbgPrint("=FltF= UnloadDriver  ver. %s",VERSION );   
    #endif   
    return;
    }// END UnloadDriver(...)
    //-----------------------------------------------------------------------------
    FLT_PREOP_CALLBACK_STATUS MyFiltr (
        __inout PFLT_CALLBACK_DATA Data,        // данные о файловой операции
        __in PCFLT_RELATED_OBJECTS FltObjects,  // не используется
        __deref_out_opt PVOID *CompletionContext//
        )
    {
    UNREFERENCED_PARAMETER( Data );
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( CompletionContext );
    PAGED_CODE();
    #if DBG
    DbgPrint("=FltF= <<заглушка фильтрации>>");
    #endif     
    return FLT_PREOP_SUCCESS_WITH_CALLBACK; //  файл не блокируется
    }// END NullPreCreate(...)
    //-----------------------------------------------------------------------------
    NTSTATUS InstanceSetup ( __in PCFLT_RELATED_OBJECTS FltObjects,
                             __in FLT_INSTANCE_SETUP_FLAGS Flags,
                             __in DEVICE_TYPE VolumeDeviceType,
                             __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
                           )
    {
    UNREFERENCED_PARAMETER( FltObjects );
    UNREFERENCED_PARAMETER( Flags );
    UNREFERENCED_PARAMETER( VolumeDeviceType );
    UNREFERENCED_PARAMETER( VolumeFilesystemType );
    PAGED_CODE();
    ASSERT( FltObjects->Filter == NullFilterData.FilterHandle );
    if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM)
      {// не присоединять к сетевым томам
       DbgPrint("=FltF= == NullInstanceSetup ERR == 0x%08X",VolumeDeviceType);
       return(STATUS_FLT_DO_NOT_ATTACH);
      }
    DbgPrint("=FltF= == InstanceSetup OK  == 0x%08X",VolumeDeviceType); 
    return(STATUS_SUCCESS);
    }// END InstanceSetup(...)
    //-----------------------------------------------------------------------------

  • Всех приветствую.
    Возник вопрос с отладкой драйвера на виртуальной машине посредством windows debugging tools.
    Собственно вопрос такой. Дебагер к виртуалке подключился, но как сделать прерывание в нужный момент - не могу понять.
    Может нужно сам драйвер встраивать точку остановки (int 3)?
    Заранее спасибо за помощь.
  • Дали железку USB, дали два файла sys и inf и сказали: "ты программист - вот и пиши".
    И не описания, ни инструкции, ни контакта к разработчикам железки - секретность, типа (((

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

    Самое плохое, что бмп, какие там функции внутри - дизасмом смотрел, но мало что пока понял, думал там экспортные функции, как в dll лежат - ан нет.
    В общем, для начала, как его загрузить в win32 приложении и хоть что-то вызвать?

    Читал тут на форуме, что сначала надо

    CreateFile HANDLE hDevice = CreateFile ( szDeviceName ..... );
    а затем DeviceIoControl

    Так szDeviceName -  как его получить?

    Когда железку установил, то опытным путем выяснил, что HardwareID у нее  "usb\\vid_7777&pid_7777"
    Опять же, не знаю, как его получать - я в свойствах установленной железки подсмотрел )

    В общем, парни, направьте, пожалуйста, в верную сторону, а то начальство результатов требует.
  • Направления программирования :: Web
  • без SSL как-то можно?
    Расшевелил гугл - предлогали шифровать пароль на клиенте JS'ом и пересылать хэш на сервер. Да, пароль не перехватят в чистом виде. Но могут перехватить хэш... А ведь сервер работает с хэшом (сверяет в БД в данном случае, и если хэш пароля совпадает с логином то открывает доступ). Кто как поступает?
  • Вылазит такая ошибка
    Код:

    Warning: include() [function.include]: Unable to access ./inc/function.inc.php in /var/www/virtual_client/favourite-group/www/index.php on line 33

    Warning: include(./inc/function.inc.php) [function.include]: failed to open stream: No such file or directory in /var/www/virtual_client/favourite-group/www/index.php on line 33

    Warning: include() [function.include]: Failed opening './inc/function.inc.php' for inclusion (include_path='.:') in /var/www/virtual_client/favourite-group/www/index.php on line 33
    не могу загрузить файл с функциями [./inc/function.inc.php]

    не могу понять что такое. Работало и перестала.
    Файл лежит, нормально закаченный.
  • Направления программирования :: Web :: Базы данных и Web
  • Добрый вечер!  :oh:
    Я делаю электронный навигатор со ссылками в MS FrontPage 2003.
    Шаблон "Колонтитулы и оглавление" - "шапка сверху" (для написания темы), "шапка снизу" (для информации об авторе), колонка слева (для оглавления), колонка справа (для отображения информации). Оглавление представляет собой ссылки. Нажимаем на ссылку - в правой колонке по центру отображается объект, который мы выбрали (например логотип нашей клиники). Ну и чтобы было всё красиво необходимо конечно сделать фоновые рисунки везде. Проблема в том что когда страница только что открыта - фоновые рисунки на месте, но как только я нажимаю ссылку - объект отображается, но фон исчезает и рисунок получается на обычном белом фоне, да ещё и не в центре, а слева. Как справиться с этой проблемой? Каждую картинку засовывать в веб-страницу с форматированием? А если картинок 200? Должен же быть способ... Подскажите!  :mir:
  • Направления программирования :: Web :: Клиентские скрипты
  • Привет всем!
    Есть тест обрабатываемый через JavaScript. Результат теста нужно вывести в отдельную страницу html. То есть, передаваемые  переменные нужно обработать именно через html страницу. Нашел один выход с помощью javascript.
    Код:
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var p_url=location.search.substring(1);

    document.write("Результат сложения переменных <FONT size=+1 COLOR='#FF0000'>" + p_url + "</FONT><BR>")

    // -->
    </SCRIPT>
    .(это на странице обработчика - obrabotjik.html) То есть переменные передаются с помощью метода GET(test.html). По УРЛ передаются сразу несколько переменных(там и вопросы и результат теста), но как бы сделать так, чтобы  выводило одно значение, например только результат теста?

    вывод на странице вот такой q10=101 q11=111 display=0, а нужно только display=0. 
    Спасибо за внимание!
  • Практические разделы :: Базы данных
  • Всем привет! :tease2:
    Предметная область БД "Ресторан". Подскажите, соответствует ли она 3 НФ? Что нужно сделать чтобы БД соответствовала 3 НФ? :yes:
    З.Ы.: заранее большое спасибо за ответы "садиться за учебники", "погуглить" и т.п.))))
  • Ребята, помогите. Я знаю что это просто но я еще зеленый в этом деле :) Мне нада сделать веб морду, через которую можна конектится на удаленные sql servera и там выполнять кое какой запрос, запрос я уже написал, запрос нада чтоб выполнялся нажатием кнопочки и выдавал табличку и чтоб можно было это все сохранить в CSV. Пожалуйсто помогите, я же знаю что для вас это просто.
  • Практические разделы :: Железо
  • Приветствую обитателей форума!

    Нашел вот эту интересную темку и решил тоже написать.
    Имеется некий "черный ящик" - скоростная видеокамера, вроде как "Evercam". На ней имеются разъемы HD-SDI для связи с картой захвата установленной на компе и com (правда он круглый, я таких еще не видел), от которого через переходник попадает на вот этот(МОХА CP-132EL-I) девайс. К ней имеется софтина, которая соответственно нам не подходит. И соответственно же ТЗ разработать свою софтину, которая бы нам подходила в полной мере.
    Подходим ближе к сути, проснифил некоторую часть общения родной софтины с девайсом для начала, теперь вот пытаясь разобраться пришел к Вам. Собственно чего хотелось бы, в указанной мною выше теме, автор выкладывал лог снифа(что я повторил ниже), а уважаемый Sla пишет:
    Цитата: Sla link=topic=3367.msg227934#msg227934 date=1267041466
    опа!!!
    0D 0A

    Это напоминает модбасовский протокол
    точно!
    FF FF FF 2F
    2F - это адрес устройства

    чтобы проверить
    сделай сделай запрос

    2D 30 31 30 30 35 35 30 30 3A 3A 2E 0D 0A 

    Ничего в ответ не получишь

    Кроме того
    2F 30 31 30 30 35 35 30 30 3A 3A 2F 0D 0A
    то же ничего не должен получить, потому как Посылка закрывается контрольной суммой crc16

    ждемс...


    Вот собственно тоже хотелось бы определить формат общения, может кто найдет что знакомое или хотябы на какую мысль натолкнет. Работаю с Дельфями(правда владею не сильно, это не моя прямая обязанность).

    В родной софтине имеются такие управляющие элементы, обновление которых идет при подключении:
    выпадающий список разрешение картинки и частота кадров в секунду - 1280х720х60, 1280х720х120...1280х720х960
    выпадающий список частота срабатывания затвора - shutter 1, 1/2, 1/4...

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

    Пост еще редактируется...

    Добавлено через 18 минут и 25 секунд:
    ...ну вот... не нашел кнопки редактирования =(
    И где тут спойлеры?

    При изменении ЛистБокса с частотой срабатывания затвора и смены разрешения, тоже идет короткий обмен.

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

    Код:
    0 13:25:16 SRVision.exe IRP_MJ_WRITE MxserB00P000 SUCCESS Length 3: 20 00 20  
    1 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 10
    2 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 84
    3 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 94
    4 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    5 13:25:16 SRVision.exe IRP_MJ_WRITE MxserB00P000 SUCCESS Length 3: 20 82 A2
    6 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 10
    7 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 01
    8 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 11
    9 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    10 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    11 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    12 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    13 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    14 13:25:16 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    15 13:25:17 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    .
    .
    .
    79 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 10
    80 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 82
    81 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 92
    82 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    83 13:25:26 SRVision.exe IRP_MJ_WRITE MxserB00P000 SUCCESS Length 3: 20 00 20
    84 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 10
    85 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 01
    86 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 11
    87 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    88 13:25:26 SRVision.exe IRP_MJ_WRITE MxserB00P000 SUCCESS Length 3: 20 88 A8
    89 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 11
    90 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 88
    91 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 00
    92 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 99
    93 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    94 13:25:26 SRVision.exe IRP_MJ_WRITE MxserB00P000 SUCCESS Length 3: 20 00 20
    95 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 10
    96 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 01
    97 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 11
    98 13:25:26 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:
    99 13:25:27 SRVision.exe IRP_MJ_WRITE MxserB00P000 SUCCESS Length 3: 20 88 A8
    100 13:25:27 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 11
    101 13:25:27 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 88
    102 13:25:27 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 00
    103 13:25:27 SRVision.exe IRP_MJ_READ MxserB00P000 SUCCESS Length 1: 99
    104 13:25:27 SRVision.exe IRP_MJ_READ MxserB00P000 TIMEOUT Length 0:

    Кстати снифил ПортМоном.
    Я уже пробовал посылать соснифенные команды на устройство и они проходили нормально, т.е. запись шла, ответы давались и т.д. Но хотелось бы иметь полное понимание того, что с устройством происходит и что именно я отправляю.
  • :spy:
    ряд вопросов:
    1. есть ли смысл покупать эту карточку? которая втыкается в PCI.
    2. она показывает только результаты(ошибки) только с мамки или всё вплоть до привода и жестака может определить?
    3. сколько стоит и какую лучше купить?

    спс :thumbsup:
  • Всем доброго времени суток, ребят подскажите пожалуйста, вот такая проблемка.
    Принесли системник, в нем нужно было то провести и винду поменять, комп с утра включил скинул всю инфу начал перезагружать и вот проблема.
    Он показал сообшение сохранение параметров и дальше не в какую, ну думаю пофиг ща винду снесу, всё будет кулл.
    но не тут то было, после копирования файлов при установке винды он должен перезагрузиться, но этого не происходит, перезагружаю в ручную - установка виснет на 39 минутах, точнее вообще не устанавливается, может мне кто нибудь помоч?
    Всем кто отреагирует огромное спасибо =)
  • как сделать загрузочную флешку
  • Практические разделы :: Программы
  • Здравствуйте Товарищи!!!

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

    Собственно вопрос:
         Давным-давно видел программу которая позволяет нотный стан CakeWalk проигрывать средствами Reason.
         Я знаком с драйвером Yamaha-SXG, знающие люди "ворчат" что копать надо с этой стороны.
         Долго копал - ничего не нашел :(
         
    Буду рад любой информации на этот счет.
  • Заинтересовал меня вот такой аспект работы с репозиторием.

    Имеется некий текстовый проект. Конкретно — сайт на PHP. Для контроля изменений импортируем его в SVN. Для продакшн делаем svn export.
    Вносим изменения на ходу в продакшн (например, правка конфига, шаблона, языкого файла, оперативный патч на код и т.п.).
    Теперь все эти изменения надо сохранить в репозитории: делаем svn checkout во временную директорию, копируем туда измененные файлы, делаем набор add/delete/move и финальный commit.
    Муторно и коряво. Особенно неудобно при апгрейде сайта, когда обновления массово вносятся сторонним скриптом (например, скрипт апргрейда от поставщика движка) — при этом изменяется большое количество файлов в самых разных директориях.

    Как сделать иначе?

    Скажем, поднять тестовый сайт, создать тестовую базу, залить данные, выполнить в директорию этого сайта checkout, выполнить обновление, тестирование сайта, выполнить commit.
    С файлами все ок: после делаем svn export для продакшн и все ОК.
    Но... база то не та обновилась. Делать апгрейд на тесте с продакшн базой? Тогда сайт лочить надо, чтобы не работал с базой на время апгрейда. Тогда нет смысла делать тестовый сайт, а делать checkout сразу на продакшн, а после commit удалять все и делать туда export.
    Все равно как-то некрасиво выходит. Например, проблемой может быть то, что в директориях сайта есть пользовательские файлы, которые в репозитории хранить бессмысленно: занимают много места, часто обновляются и к коду, который и призван контролировать репозиторий, отношения не имеет.

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

    Может кто-нибудь знает лучший способ?
  • Учимся программировать :: Начинающим
  • Мобильный телефон имеет монохромный экран с 8 градациями серого и разрешением 96*96точек. Определить необходимый объем видеопамяти для такого экрана/

    96*96*1байт - правильно?
  • Клубное :: Общение
  • Суть в том, что мои хорошие (хорошие, значит отказать нельзя)))) знакомые просят меня создать сайт для маленькой конторки. Я никогда не делал сайты, т.е. для WEB программирую, но сайты для конторок никогда не делал.

    У меня вопрос, в первую очередь к Sla и Золотой Лани, на чем делают сейчас сайты? Необходим будет базовый набор для управления сайтом: добавить новость, удалить новость, выложить прайс, гостевая книга, ну и все такое. Я так понимаю, что сейчас для этих целей используют CMS. Может посоветуете какую нибудь, простенькую и самое главное не требовательную к ресурсам (это по возможности), т.к. конторка маленькая, будут выбирать хостинг один из самых дешевых.

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

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


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


В избранное