Категория ‘ручками’

siszyd32.exe или как Svchost.exe грузит процессор

При загрузке системы один из процессов svchost.exe грузит процессор на 99%. Причем, в данном конкретном случае от сети загрузка не зависела. Сам файл SVCHOST.exe вирусом не являлся, однако загрузка процессора зашкаливала.

Подробнее об удалении вируса Siszyd32.exe

Опубликовано Декабрь 16, 2009 | автор: levik  |  Комментарии (42) »

Импорт csv в virtuemart - Simple CSV (часть 2)

Не так давно публиковал заметку о реализации импорта csv в virtuemart

Когда потребовалось повторить установку “мода” Simple CSV - пока читал форум, забыл зачем пошел. :) На десяти страницах форума слишком много “воды” и повторяющихся вопросов. Решил собрать краткий ман-faq по мод-хаку  в одном месте. Может кому-нибудь окажется полезным.

Хак для версии virtuemart 1.0.*
Для более новых версий - см. CSVImproved http://joomlaforum.ru/index.php/topic,42648.msg407103.html#msg407103

http://joomlaforum.ru/index.php/topic,8340.msg87750.html#msg87750 - тут последняя (на дату написания поста) версия Simple CSV. Попутно стоит скачать примеры (на первой странице ветки), и учесть, что в файле параметров параметры надо называть не “Иглы;Размер иглы в СИ”, а просто “Размер иглы в СИ” - возможна ошибка при импорте. В секции товаров (!) в первой строке (заголовок) параметр должен называться  “Иглы;Размер иглы в СИ”.

В файле ps_simple_csv_aliases.php соответствия между заголовками импортируемого файла и полями в базе. Дополнительные поля могут не загружаться, так как в базу пишет функция Virtuemart’a - подправлять следует её.

Модифицировал галочку “проверять товары” (при включенной галочке - все товары, отсутствующие в загрузке “распубликовываются”) - сделал распубликование всех товаров перед загрузкой - запрос из нескольких тысяч in (,,,) почему-то не срабатывал..

Импорт атрибутов
В ps_simple_csv_aliases.php строчки
‘Атрибут’ => ‘attribute’,
‘Атрибут определенный нами’ => custom_attribute’,
на самом деле должны быть
‘Атрибут’ => ‘product_advanced_attribute’,
‘Атрибут определенный нами’ => ‘product_custom_attribute’,
Теперь буду мучать картинки =)

А как залить товар в несколько категорий?
Указать путь к категориям через запятую, или точку с запятой или палку. Смотря какой у вас разделитель данных. Стоит быть внимательным - добавляйте категории без пробелов - возможно “дублирование”/создание “лишних” категорий.

Категории, содержащие запятую (точку с запятой или вертикальную черту) могут грузиться как несколько категорий. Для того, чтобы избежать подобного “разделения одной категории”, в строке ~805 файла ps_simple_csv.php следует убрать или закомментировать ненужный разделитель..
if( !is_array($paths) ) $paths = explode(’,', $paths);

  Разделяем превьюшки и основные изображения по разным папкам: создаем нужный каталог (например resized) для и в csv пишем “resized/image1.jpg” и т.д.

Разные цены, в зависимости от количества товара:
А можно ли сделать чтобы отображалось 3 цены товара? При этом магазин у меня работает как каталог, т.е указать например, что при покупке 100 игл цена 600р, а при покупке 500 игл цена 580р, а при покупке 1000 игл цена 550р. Как это мне можно сделать думаю, что это можэно сделать через “Параметры товара”, я прав???
В версии 4 и ниже - если нужны именно цены, то сделать это можно через цены, а если просто для информаци, то через параметры можно. Через цены пока можно лишь разом загружать цены для разных групп, для возможности загружать цены и для разного количества товара - проверить в файле ps_simple_csv_aliases.php строку №123 заменить на:

'/Цена для группы "(.+?)"(?:(?:.*?)(\d+)(?:.*?)(\d+))?/' =>
'product_prices|shopper_group_name|price_quantity_start|price_quantity_end',

Для версии бета-5 добавлена возможность добавлять “сложные цены” в следующем формате

Цена для группы “<название группы покупателей, сначала это обычно -default->”[[что угодно]<число от>[что угодно]<число до>]

Правильно: Цена для группы “-default-” количество от 3 до 7
Неправильно: Цена для группы “-default-” количество от 3
Правильно: Цена для группы “-default-” 3 - 7
Правильно: Цена для группы “-default-”, 3 7
Правильно: Цена для группы “-default-
Если до много - пишем что-то вроде 3-99999 - http://joomlaforum.ru/index.php/topic,8340.msg89584.html#msg89584 - тут с примером разбора.

При загрузке двух колонок  (артикул, цена) - т.е. выгрузка используется только для обновления цен на сайте, следует подправить 883 строку файла на

if( $csv_data['manufacturer_id'] ) {

Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes) in - ошибка возникает при нехватке памяти скрипту. Следует уменьшать либо количество товаров в файле, либо по возможности убрать “лишнее” - описания, которые не меняются и подобное.

При длительной загрузке прайса, возможно, поможет

define( 'RG_EMULATION', 0 ); в файле globals.php

Несколько изображений в virtuemart - http://forum.virtuemart.net/index.php?topic=18473

Настройка разделителей по умолчанию - в product.simple_csv_upload.php
<input type="radio" name="csv_delimiter" checked="checked" value=";" />

Замеченные глюки с ценой:
- указание цены с пробелами;
- в меню “Информация о магазине” не выставлена валюта “валюта = рубль” - может повлиять на импорт цен;
- добавить в файл импорта поле product_currency с содержимым руб. (видимо, альтернатива предыдущему решению)

Сохраняем связанные товары  http://joomlaforum.ru/index.php/topic,8340.msg170587.html#msg170587

        // Присваиваем значения выборке из базы
        foreach( $csv_data as $key => $value ) {
          //if($db_data[$key]) $db_data[$key] = $value;
          $db_data[$key] = $value;
        }
		/*##my Додаю для того, аби супутні товари не затирались. Старт ##200802281852*/
		$q  = "SELECT related_products FROM #__{vm}_product_relations ";
		$q .= " WHERE product_id='".$db_data['product_id']."'";
		$db->query($q);
		if( $db->num_rows() ) {$db_data_related_products[] = $db->loadResult();}
		$db_data["related_products"]=$db_data_related_products;
		/* Кінець ##200802281852 */

Если у Вас возникли проблемы с установкой Simple CSV и вы их решили (или не решили) - отписывайтесь в комментариях или на форуме. При появлении новой информации пост по возможности (и желанию) буду обновлять.

Опубликовано Сентябрь 25, 2009 | автор: levik  |  Нет комментариев »

Импорт csv в virtuemart для больших файлов

Virtuemart + joomla - неплохой и “бесплатный” инструмент для организации интернет-магазина. Для синхронизации, например с 1с (что требуется довольно часто), в virtuemart используется инструмент импорт-экспорт через CSV. Все бы ничего - после определенной настройки данные импортируются, но при солидных объемах магазина - несколько тысяч товаров в csv-файле, даже без описаний, скрипт импорта выполняется несколько минут. Площадки виртуального хостинга же, частенько, имеют ограничение на это самое время выполнения скрипта. Вот и получаем

Попытки прописать в .htaccess  php_value max_execution_time 600 (увеличить максимально разрешенное время скрипта до 600 секунд) не всегда приводят к желаемому результату, потому как довольно часто такая возможность блокируется хостером. Доступ к php.ini предоставляется далеко не всеми хостерами. Вопросы о возможности увеличения этого времени “в частном” или “в общем” порядке, в лучшем случае обычно заканчиваются предложением приобрести VPS..

Как вариант решения проблемы импорта больших файлов - разбиение CSV-файла на части, и загрузка каждой части в отдельности. Естественно, не забываем про служебную информацию (обычно - первая строка csv-файла)Размер частей подбирается опытным путем :) Однако, мягко говоря, вариант далеко не идеальный.

Поиски, как ни странно, показали, что такого рода проблемы не у меня одного, причем возникают они снова и снова. :) И, как ни странно, на многих форумах этот вопрос оставлен без ответа. При том, что решение, довольно изящное, разработано несколько лет назад пользователем tug на joomlaforum.ru

Модификация для нормальной загрузки через CSV - Simple CSV Import

Нормальная заливка это …:

* возможность заливать любые данные через CSV, т.е. товары, типы, параметры, категории, производителей, налоги, хуёги и пр.
* возможность прямо в csv указывать поля, которые нужно обрабатывать.
* когда в админке Вам нужно только указать файл и нажать “Upload”.
* возможность кастомизировать заливку и добавлять новые модули и не только для VirtueMart.

Особое внимание обратил на “только указать файл и нажать…”
Тех, кто торопится “в бой” - “поставить и забыть” - хочу предупредить, что на третьей странице лежит пятая бета-версия. Ставить лучше её. И, несмотря, на многостраничность темы, все же рекомендую ознакомиться.
Расписывать все прелести CSV-импорта от tug-а не буду. Стоит отметить, однако, что от старого доброго экспорта-импорта через csv отказываться не обязательно, они вполне могут существовать параллельно - своеобразный путь к отступлению…

upd.  Полезная информация по Simple CSV - краткая “выжимка” из 10 страниц топика на форуме. Если что упустил - поправляйте.

Опубликовано Май 13, 2009 | автор: levik  |  Комментарии (2) »

Управляем кэшированием файлов

Кэширование

Кэширование - (в общем случае и упрощенно) временное сохранение информации для быстрого повторного доступа.

С точки зрения пользователя интернет, кэширование - это сохранение временных файлов на своем компьютере. Разные браузеры (internet explorer, mozilla firefox, google chrome, opera..) используют различные места для хранения временных файлов (Temporary Internet Files). Пользователь может и не подозревать о том, что часть файлов из интернета сохранена у него на компьютере.

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

Для придирчивых поясню, что не рассматриваем кэширование, не имеющее отношение к интернет-серфингу (брожение по интернету) (кэш в жестких дисках, cd,dvd,bd и других дисководах, программное кэширование при записи на диск, кэширование скомпилированных шаблонов и т.д. …)

В большинстве случаев кэширование позволяет сохранить массу ресурсов - за информацией не приходится обращаться повторно, что экономит как ресурсы сервера, компьютера пользователя, так и трафик. Большинство изображений (например, из “шапки” сайта) не изменяются, а используются на многих страницах сайта.

Но иногда кэширование может “мешать” - если документы на сервере изменяются довольно часто, либо вообще формируются динамически. Как объяснить браузеру, какие документы нужно кэшировать, а какие - нельзя. И с какой периодичностью эти документы должны обновляться? :)

Управление кэшированием документов HTTP-заголовками

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

Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache

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

Более подробно о допустимых значениях параметров можно прочитать в спецификации протокола HTTP.

header("HTTP/1.0 404 Not Found");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

header(”Expires: Mon, 3 Apr 2000 07:00:00 GMT”);
header(”Last-Modified: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”);
header(”Cache-Control: max-age=0″, false);

Как передать HTTP-заголовок браузеру

Опубликовано Апрель 21, 2009 | автор: levik  |  Комментарий (1) »

И снова бланки - работа с word средствами javascript и php

В очередной раз стала актуальной задача с подготовкой бланков. Однако, способ с бланком в формате rtf не подходит - файл .doc весит ~2 Мб, файл же rtf ~ 34 Мб. Видимо, зависит от хранения рисунков…

Работать с COM-объектом Word можно непосредственно из PHP:

// Код PHP
$word=new COM("Word.application") or die("Couldn't start Word!");
//после создания объект невидимый
//сделаем его видимым и активизируем (разумеется, для работы на сервере это необязательно)
$word->visible =1;
$word->Activate();
//Создать документ по шаблону:
$word->Documents->Add("c:\\template.dot");
// действия - найти-заменить и т.д. Описаны в документации по VisualBasic for Application - в справке MS Word (по умолчанию не устанавливается)
$word->ActiveDocument->SaveAs("C:\\".$fname);
$word->Quit();

Однако, подобный способ подходит только для Windows-серверов.

Еще один вариант - работа с COM-объектом на стороне клиента через Active-X при помощи JavaScript:


><script language="javascript">
// Создание объекта MS Word:
word = new ActiveXObject ("Word.Application");
// Создание документа и установка параметров страницы:
with (word) {
Documents.Open('c:\\0.doc');
ActiveDocument.Label1.Caption = < ?=$sum?>;
ActiveDocument.SaveAs ('c:\\1.doc');
Quit (); // завершает работу MS Word
}
</script>

Предварительно следует сохранить документ-шаблон на диск C:\ с именем 0.doc.
В шаблоне - создать “Label”-ы и расположить их в соответствии с нужным расположением текста.
С учетом специфики задачи - получаем еще один небольшой выйгрыш - “основной” файл не качается с сервера.
Технология, думаю, понятна. Вариации - насколько фантазии хватит.

ps. Не забудьте поставить разрешения в свойствах обозревателя.

( Свойства обозревателя - безопасность - Выбираем “Надежные узлы”. После чего, нажимаем “Другой..” - и устанавливаем все переключатели, где упоминается ActiveX в “Разрешено”.)

А в Надежные узлы следует добавить “Наш” сайт - где формируются бланки.

Опубликовано Март 18, 2009 | автор: levik  |  Нет комментариев »

Устанавливаем модули Perl

При попытке запустить скрипт получил ошибку 500, а в логах:
Can't locate Archive/Zip
После пары минут поиска понимаем, что нужно установить модуль perl “Module Archive::Zip ”
Вариант первый - ручная установка модулей Perl
На сайте cpan.org находим (search.cpan.org) нужный модуль, сохраняем в каталоге (/tmp, например)# cd /tmp
# gzip -d Archive-Zip-1.26.tar.gz
# tar xvf Archive-Zip-1.26.tar
# cd Archive-Zip-1.26

Собираем: # perl Makefile.PL
...
# make
# make test
И установка модуля:
# make install
Вариант второй - Установка модуля Perl с использованием CPAN
Для установки модулей Perl при помощи CPAN следует убедиться, работает ли команда cpan:.# cpan
-bash: cpan: command not found

Если выдается сообщение “not found” - следует установить модуль CPAN. Для установки cpan с помощью yum следует набрать:
# yum install perl-CPAN
При первом запуске нужно будет “сконфигурировать” cpan в режиме вопрос-ответ. Большая часть ответов уже подставлена - достаточно нажатия ENTER. Некоторые вопросы требуют выбора из нескольких пунктов.
После настройки набираем:
# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install Archive::Zip
….
/usr/bin/make install — OK
cpan> quit

Итак, мы установили Модуль perl “Archive::Zip”.
По аналогии можно установить любой другой модуль. Однако при установке следует учитывать, что для некоторые модули зависят от других модулей. При использовании установки вторым методом cpan автоматически устанавливает необходимые для работы модули perl.

Опубликовано Март 4, 2009 | автор: levik  |  Комментарии (3) »

Массово переименовываем файлы скриптом vbs script

Порой приходится “однотипно” переименовывать несколько (иногда - много) файлов, с разницей лишь в номере. А бывает, под рукой нет ни утилит, ни интернета, откуда их можно скачать.. В общем, ничего, кроме Windows. :)

Конечно, же, средствами системы вполне успешно можно пользоваться и в этом случае.
Частично (или полностью) помочь в этом может простенький vbs-скрипт (редактируется в любом текстовом редакторе - вполне подойдет notepad.exe он же Блокнот). VBS - Visual Basic Script - язык программирования, который “распознает” Windows.
Под свои нужды не так уж сложно подогнать один из нижеприведенных скриптов массового копирования или переименования изображений.
Если желания разбираться в скриптах нет - для обработки нижеприведенными скриптами оригиналы изображений следует разместить в каталоге “C:\TMP\1\” и создать пустой каталог “C:\TMP\2\ для переименованных изображений.
Массовое переименование файлов - копируем в каталог \2\ “Изображение_1.jpg” и т.д.

num = 1
Set filesys = CreateObject("Scripting.FileSystemObject")
Set objFolder = filesys.GetFolder("C:\TMP\1\")
For Each File in objFolder.Files
If LCase(filesys.GetExtensionName(File)) = "jpg" Then
filesys.CopyFile File, "..\2\Изображение_"& num & '.jpg'
num = num+1
End If
Next

Массовое переименование файлов - Добавляем префикс к имени файлу

Set filesys = CreateObject("Scripting.FileSystemObject")
Set objFolder = filesys.GetFolder("C:\TMP\1\")
For Each File in objFolder.Files
If LCase(filesys.GetExtensionName(File)) = "jpg" Then
filesys.CopyFile File, "..\2\t_"&filesys.GetFileName(File)
End If
Next

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

Опубликовано Февраль 25, 2009 | автор: levik  |  Нет комментариев »

HTTP заголовок - как передать?

Вебмастеру частенько нужно передать служебную информацию при помощи HTTP-заголовка. Как это можно сделать?

Передаем Http заголовок средствами HTML

Если быть совсем точным, то формулировка не совсем верна, поскольку мы передаем не заголовок, а служебную информацию, аналогичную информации заголовка, однако содержится она непосредственно в сообщении. Однако, META-теги, например могут влиять на кэширование страниц в браузере по аналогии с HTTP-заголовками.
<meta http-equiv=”Expires” content=”Mon, 19 Jan 2009 20:37:25 GMT”>
<meta http-equiv=”Pragma” content=”no-cache”>

Передаем HTTP-заголовок средствами PHP

В PHP (да и в любом серверном языке программирования) для передачи заголовков существует специальная функция. В PHP она носит название header(). В качестве параметра указывается текст http-заголовка:
header('Content-Language: ru');
header("HTTP/1.0 404 Not Found");
// далее следует вывод страницы
?>

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

Передаем HTTP-заголовок средствами сервера

Часть заголовков формируется без явного указания в скрипте, непосредственно сервером или его модулями (например, php-интерпретатор сообщает заголовок “X-Powered-By”). Мы можем подсказать серверу, какие заголовки выдавать в том или ином случае.

В частности, Apache-сервер позволяет формировать HTTP-заголовки при помощи служебного файла .htaccess
Header set Cache-Control “no-cache, must-revalidate”
Header set Expires “Mon, 19 Jan 2009 20:41:25 GMT”
Header set Pragma “no-cache”

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

Возможно, рассмотрены далеко не все варианты, но их вполне достаточно, чтобы использовать на практике.

Опубликовано Январь 19, 2009 | автор: levik  |  Комментарий (1) »

анкор-лист? легко.

Делаем “человеческий” анкор-лист. Дешево и сердито.

Особенности:

  • уходим от «склейки» - для тех, кто в нее верит; 
  • даже для тех, кто не боится «тошноты» и «склейки» это пригодится, если нужно быстро создать большое количество различных анкоров для прогона по каталогам, сап-ксап и тд.
  • делаем анкор-лист больше похожим на естественный;
  • поднимаем по некоторым НЧ.

Технология:
1. Берем наш ключевик, к примеру, «проекты домов» и смотрим, в какие запросы он входит по статистике запросов. Лучше пользоваться статистикой Рамблера, так Яндекс выкидывает предлоги и найти по Яндексе такие запросы, как «из рук в руки», «муж на час» или «магазин на диване» вы не сможете. Найдутся только: «руки», «часы муж» и «магазины диванов».
Вместо окончаний ставим звездочки. Получится: «проект* дом*». Это еще не все. Чтобы уйти от ненужных нам запросов, типа: «проектирование домов», сделаем так:
проект* дом* !проектиров*
Запросы не совсем “по теме”  вроде «когда закроется проект дом 2» можно удалять вручную, но можно и оставлять – тоже разбавление анкор-листа, да и ключевик встречается.

2. Копируем странички получившегося списка в Excel, пока хватит терпения :).

3. Иногда Рамблер запрашивает авторизацию - не думаю, что велика проблема.

4. Подкорректируем списочек - удаляем “неугодные” и получаем результат..

Тоже самое можно проделать со статистикой от Яндекса.

Что с ним делать - на усмотрение.. :)

Опубликовано Декабрь 14, 2008 | автор: levik  |  Комментарий (1) »

Виртуальный выделенный сервер для начинающих

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

“Услышав невозможное, некоторые скажут “А почему? А зачем?”, а другие - “А почему НЕТ?”..

В общем, тестируем VDS-сервер от firstvds.ru - недорогой но полноценный. Естественно, по некоторым параметрам он уступает серверам от “монстров” хостинговой индустрии. Однако, в качестве ознакомительного - более чем достаточно.

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

Опубликовано Ноябрь 29, 2008 | автор: levik  |  Нет комментариев »