Задать вопрос
  • Как можно сделать полный backup сервера с ESXi (VMWare vSphere)?

    shineblu
    @shineblu
    Добрый день,

    Подключитесь по SSH к хост-ноде (root), приостановите машины, скопируйте их файлы в другое хранилище (NFS/ISCSI), как пример:

    #!/usr/bin/sh
    echo Backup: europa
    /bin/vim-cmd vmsvc/power.suspend 48 && date && cp -R /vmfs/volumes/istorage0/europa/ /vmfs/volumes/NFS/europa/ && date && /bin/vim-cmd vmsvc/power.on 48

    Успехов!
    Ответ написан
    Комментировать
  • Какими условными операторами лучше воспользоваться если функция имеет 2 определенных сценария и третий сценарий по умолчанию?

    shineblu
    @shineblu
    Добрый день,

    +1 за switch-case, т.к. мало ли какие-новые параметры/типы книг Вы захотите добавить

    Успехов!
    Ответ написан
    Комментировать
  • Как выделить ключевое слово из новости?

    shineblu
    @shineblu
    Добрый день,

    В продолжение Вашей идеи, могу предложить следующее:

    1. Все новости после парсинга записываются в БД (номер новости, текст новости, чистый текст). Чистый текст - это текст новости без русских слов
    2. База новостей (id и чистый текст) индексируется каким-нибудь движком аля sphinx
    3. Проходите скриптом по всем моделям и выполняете запрос к sphinx, и выбираете самый релевантный результат и переносите такую новость в другую таблицу (или флаг ставите). Это будет очень быстро

    Успехов!
    Ответ написан
    Комментировать
  • Как запретить запуск определенных программ через bat?

    shineblu
    @shineblu
    Добрый день,

    Есть пара вариантов

    1. Вы можете настроить локальную безопасности и ограничить доступ на запуск конкретных приложений. Для этого откройте оснастку "Локальная политика безопасности" (secpol.msc, данный вариант можно использовать и в домене). В ней будет раздел "Политики ограниченного использования программ", нажмите на него правой кнопкой и создайте новую политику. Появятся подразделы, Вам нужен раздел "Дополнительные правила". В этом разделе нужно добавить правила с указанием пути к файлу или папке доступ к которым запрещен. При создании правила в поле Уровень безопасности выберите Не разрешено. Например если указать путь: "%userprofile%\Local Settings\Temp" (поддерживаются маски и переменные окружения) то пользователь не сможет запустить на выполнение ни одну программу из этой папки - получит предупреждение что запуск ограничен политикой безопасности. При этом, если файл переместить в другую папку, его можно будет запустить. Есть еще вариант добавления правила по хэшу. Это должно защитить Вас от запуска файла при перемещении. Замечу что данный механизм полностью игнорирует права пользователя и будет одинаково работать как для обычного пользователя так и для администратора.

    2. Вы можете граничить доступ на чтение/запуск на уровне NTFS для конкретного пользователя. Для этого зайдите в свойства нужного файла/папки и просто установите нужные разрешения.

    Успехов!
    Ответ написан
    1 комментарий
  • Почему CreateProcess не всегда правильно работает?

    shineblu
    @shineblu
    Добрый день,

    Так у Вас все останавливается на WaitforSingleObject(hProcess, INFINITE); после того как Вы вызвали функцию первый раз. Второе приложение не будет запущено пока не завершится первое.

    Как дополнение, попробуйте эту функцию:

    function ExecuteApplication(ACmd: string; AWaitForTerminate: boolean=false; AHideWindow: boolean = false): THandle;
    var
      si: STARTUPINFO;
      pi: PROCESS_INFORMATION;
    begin
      Result:=0;
      try
          ZeroMemory(@si,sizeof(si));
          si.cb:=SizeOf(si);
          si.dwFlags := STARTF_USESHOWWINDOW;
          if AHideWindow then si.wShowWindow := SW_HIDE else si.wShowWindow := SW_SHOW;
          if not CreateProcess(nil, PChar(ACmd), nil, nil, False, 0, nil, nil, si, pi)
          then begin
              Exit;
          end;
          Result:=pi.hProcess;
          if AWaitForTerminate
          then begin
              WaitForSingleObject(pi.hProcess, INFINITE );
              CloseHandle(pi.hProcess);
              CloseHandle(pi.hThread);
          end;
      except
      end;
    end;


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

    Успехов!
    Ответ написан
    Комментировать
  • MySQL возвращает один и тот же товар

    shineblu
    @shineblu
    Добрый день,

    Добавьте DISTINCT после SELECT (и если все поля которые возвращает запрос - одинаковые, будет отображена только 1 запись)

    Успехов!
    Ответ написан
    2 комментария
  • Как реализовать авторизацию выхода в интернет по http?

    shineblu
    @shineblu
    Добрый день,

    Для Windows подобных решений не знаю (но наверняка есть). Для Linux (Debian) рекоммендую CoovaChilli (стабильный форк Chillispot). Для его использования нужно будет поднять отдельную железку (шлюз/комп). И все будет так как Вы и описываете:

    1. При подключении к WiFi, CoovaChilli выдаст клиенту внутренний IP из своей подсети, при этом клиент будет изолирован от соседей
    2. В Windows появится окошко в трее, что требуется авторизация для доступа в интернет, а IOS устройства сразу попробуют открыть браузер (в момент подключения к точке доступа, покажут Login Page)
    3. После успешной авторизации шлюз начнет пропускать трафик с локального на WAN интерфейс (это или Ваша локалка или отдельный линк в интернет)

    Из плюсов - решение очень гибкое, аутентификацию клиента можно сделать через HTTP (не будет проблем с self-signed сертификатами), можно сделать ваучеры (почасовой доступ), можно прописать ресурсы доступные без авторизации (обычно это DNS сервера) и прочее.

    Другие решения Вы можете посмотреть здесь: en.wikipedia.org/wiki/Captive_portal

    Успехов!
    Ответ написан
    1 комментарий
  • Как реализовать вставку данных из другой таблицы вместе с переменными?

    shineblu
    @shineblu
    Добрый день,

    А почему не так?

    INSERT INTO company (name, fullname, city) SELECT 'test', 'test', users.id
        FROM users
        WHERE users.guid =  '5305cadc4456b'


    Успехов!
    Ответ написан
  • Как сделать репликацию MS SQL со 100+ хостами?

    shineblu
    @shineblu
    Добрый день,

    В зависимости от сложности и кол-ва таблиц в базах я бы заморочился написанием интерфейсов выгрузки/загрузки. Я полагаю что центральный офис раздает на удаленные точки какие-то мастер данные, а обратно получает движения/транзакции. Если так - то нужно написать интерфейс для центральной базы который будет создавать для 100 точек файлы с изменениями мастер данных, раздаст их по сети, а точки уже их загрузят. И в обратном порядке - точки формируют пачки с транзакциями (изменения) и отправляют серверу, а на нем батч уже пишет все в основную БД (DWH). Т.к. незнаю бэкграунда - не претендую на правильный ответ :)

    Успехов!
    Ответ написан
  • Как работать с https в delphi 7?

    shineblu
    @shineblu
    Добрый день,

    Используйте Indy. Там все просто, см. ниже. Ну и нужно будет с проектом таскать библиотеки ssleay32.dll и libeay32.dll

    uses
       {...}, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL;
    
    {...}
    var
        IdHTTP1: TIdHTTP;
        IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
        response: WideString;
    {...}
    
    begin
          {...}
         // create HTTP client with SSL support
        IdHTTP1:=TIdHTTP.Create(nil);
        IdSSLIOHandlerSocket1:=TIdSSLIOHandlerSocket.Create(IdHTTP1);
        IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv1;
        IdHTTP1.IOHandler:=IdSSLIOHandlerSocket1;
        
        response:=IdHTTP1.Post('https://...');
        {...}
    end;


    По этой ссылке сможете скачать нужные SSL библиотеки: rusfolder.com/39890237. Залил для Вас. Распакуйте и положите в папку с проектом

    Успехов!
    Ответ написан
  • Как выбрать последние записи из таблицы без сортировки?

    shineblu
    @shineblu
    Добрый день,

    Запрос:

    SELECT ID FROM `components` WHERE
    ID BETWEEN (SELECT MAX(ID) FROM components)-10 AND (SELECT MAX(ID) FROM components)

    Как минимум в MySQL сортировок не использует, м.б. и в MSSQL прокатит. ID - index, auto-increment. Но при удалении записей придется перенумеровывать записи которые больше удаляемой но там один простой запрос (set id=id-1)

    Успехов!
    Ответ написан
  • Самый приемлемый язык программирования для девушки

    shineblu
    @shineblu
    Добрый день,

    Начните с простого moytesty.testsbox.ru/article/4061, а там если попрет так и до ассемблера доберетесь

    Успехов!
    Ответ написан
  • Как правильно организовать хранение и чтение настроек сайта?

    shineblu
    @shineblu
    Добрый день,

    Предложу тогда и свой вариант. Храните настройки в сериализованом виде: как только сайт открывается, он проверяет наличие файла (например: settings.dat), если файл найден - читает его и делает unserialize - на выходе получается массив настроек. Если файла нет - делаете запрос в базу (как предлгал @VasiliyIsaichkin) и затем полученный массив настроек сохраняете в файл (например settings.dat) через serialize функцию + при каждом изменении настроек CMS - удаляйте файл settings.dat и он будет снова синхронизирован с БД.

    Успехов!
    Ответ написан
    3 комментария
  • Как реализовать интеграцию 1с Бухгалтерии и 1с Предприятия с интернет-магазином?

    shineblu
    @shineblu
    Добрый день,

    См. мой ответ по аналогичному вопросу Может ли сайт обращаться напрямую к БД 1С или лучше, чтобы сайт работал со своей базой и синхронизировал её с базой 1С?

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

    Успехов!
    Ответ написан
    Комментировать
  • Может ли сайт обращаться напрямую к БД 1С или лучше, чтобы сайт работал со своей базой и синхронизировал её с базой 1С?

    shineblu
    @shineblu
    Добрый день,

    Как вариант могу предложить следующую схему

    1. Поднимается промежуточный сервер с СУБД (например MySQL)
    2. Пишется обработка для 1С которая в определенные интервалы (раз в день или каждый час) будет выгружать в эту базу данные о клиентах, их статусы и пр. При этом после выгрузки в базу MySQL в 1С карточке клиента устанавливается флаг - выгружено. При любых движениях в 1С этот флаг должен сбрасываться (чтобы каждый раз не выгружать всю базу). Т.е. после полной выгрузки будут выгружаться только изменения. Также эта обработка делает SELECT из базы MySQL тех записей которые тоже имеют флаг "К выгрузке", чтобы изменить внутренние данные в 1С.
    3. Ваше приложение будет общаться только с базой MySQL - это будет на порядок быстрее и безопаснее + можно сделать кеширование + можно сделать что-то типа API (чтобы было еще безопаснее)

    Успехов!
    Ответ написан
    3 комментария
  • Почему внезапно перестал работать ноутбук?

    shineblu
    @shineblu
    Добрый день,

    Возможно, проблема с оперативной памятью

    См. аналогичный случай: h30434.www3.hp.com/t5/Notebook-Hardware/HP-Probook...

    P.S. Попробуйте оттуда вариант для запуска (отключить батарею, зажать power на 40 сек)..

    P.S. Есть конечно и такой вариант h30499.www3.hp.com/t5/Notebook-HP-ProBook-EliteBoo.... Тут закончилось заменой материнской платы.

    Думаю лучший вариант - отнести в магазин, пусть меняют

    Успехов!
    Ответ написан
    Комментировать
  • Как реализовать "обратный" порядок вызова методов класса PHP?

    shineblu
    @shineblu
    Добрый день,

    В дополнение к решению от @AMar4enko

    class Template {
    	private $callback = array();
    	private $name = 'dummy';
    	private $data = array();
    
    	private function doCallback() {
    		foreach (array_reverse($this->callback) as $func) {
    			call_user_func_array(array($this, $func[0]), $func[1]);
    		}
    		$this->callback = array();
    	}
    
    	// реализация вызываемых методов (вызываются только из doCallback)
    	private function _render($name) {
    		echo "Call Render<br>\r\n";	
    		$this->name = $name;
    	}
    
    	private function _withData($data) {
    		echo "Call WithData<br>\r\n";
    		$this->data = $data;
    	}
    
    	// эти функции записываются в стек и видны извне
    	public function render($name) {
    		$this->callback[]=array('_'.__FUNCTION__, func_get_args());
    		return $this;
    	}
    	
    	public function withData($data) {
    		$this->callback[]=array('_'.__FUNCTION__, func_get_args());
    		return $this;
    	}
    
    	// конечная функция которая вызовет функции из стека в обратном порядке
    	public function __toString() { 
    		$this->doCallback();
    		echo "Show output<br>\r\n";
    		return "";
    	}
    
    	// конечная функция которая вызовет функции из стека в обратном порядке
    	public function compile() { 
    		$this->doCallback();
    		echo "Show output<br>\r\n";
    	}
    }
    
    $tpl = new Template;
    $tpl->render('templateName')->withData(array('a','b','c'));
    echo $tpl->compile(); // или echo $tpl;


    Наслаждайтесь :)
    Ответ написан
    3 комментария
  • Widows Server 2008 R2: как создать соединение между двумя Exchange Server?

    shineblu
    @shineblu
    Добрый день,

    Есть варианты:
    1. Если на обоих серверах установлены роли DNS сервера, то на каждом из них можно создать запись о домене второго сервера. Т.е. например, есть домен test1.ru (на server1) и test2.ru (на server2). Вы на server1 для домена test2.ru создаете MX запись ссылающуюся на локальный IP server2. И наоборот. В итоге письма между серверами по этим доменам будут доставлятся локально

    2. Настроить на каждом из Exchange серверов отдельный Send connector в Hub transport для этих доменов. Т.е. новом Send connector'e на server1 на вкладке Address space вы указываете домен test2.ru, а на вкладке Network в пункте Route mail through прописываете IP server2. И наоборот.

    Смотрите что Вам проще :)

    Успехов!
    Ответ написан
    1 комментарий
  • Как узнать количество записей в MySQL таблице?

    shineblu
    @shineblu
    Добрый день,

    Вы можете использовать следующую конструкцию в COUNT:

    COUNT((CASE WHEN `count` > 59 THEN 1 ELSE NULL END)) as Count1,
    COUNT((CASE WHEN `count` > 39 and `count` < 60 THEN 1 ELSE NULL END)) as Count2,
    COUNT((CASE WHEN `count` < 40 THEN 1 ELSE NULL END)) as Count3

    Соответственно в WHERE данные условия нужно удалить

    Успехов!
    Ответ написан
    Комментировать