суббота, 23 мая 2009 г.

вот так

Эх, тля... как же весело жисть крутиццо... На одной работе работаю, с трёх других тестовые задания делаю... жесть!
Одно хреново- команда без меня съездила на открытие в Кырск... Грустно конечно, что в город своего детства не попал.. но- бывает разное :)
Зато команда засветилась на общесибирских играх, получила высокую оценку не только оргов, но и однополчан ("с Огурцами в разведку мы б пошли..."). Вобщем- Агурцы - малацы!!!:)
Вобщем- все течет, все меняется... Так будем же соответствовать...

вторник, 24 марта 2009 г.

Selenium

(описание безопасного прохождения мимо грабель, на которые уже наступали)

Selenium IDE



  1. Скачать и установить дополнение к FF http://release.seleniumhq.org/selenium-ide/1.0-beta-2/selenium-ide-1.0-beta-2.xpi [в меню "Инструменты" FF появится пункт "Selenium IDE"]
  2. Запуск Selenium IDE осуществляется выбором вышеозначенного пункта меню. В результате получаем окно:
  3. Это у нас GUI интерфейс для записи "каркаса" тестов. (Посмотрел? Теперь можно закрыть- он нам пригодится позже.)

Далее:

Java


  • устанавливаем Java (http://java.com/ru/download/manual.jsp)

PHP (+PHPunit и пр...)

  • устанавливаем php (http://ru.php.net/distributions/php-5.2.9-1-win32-installer.msi)
  • Заходим в папку с установленным php и ищем файл go-pear.bat (php\go-pear.bat)
  • Запускаем go-pear.bat
  • Последовательно выполняем в этой папке (предварительно открыв командный интерпретатор) команды:
  • pear channel-discover pear.phpunit.de
  • pear install channel://pear.phpunit.de/PHPUnit
  • pear install channel://pear.php.net/Testing_Selenium-0.4.3

Selenium RC server

  • Скачиваем Selenium RC server (http://release.seleniumhq.org/selenium-remote-control/1.0-beta-2/selenium-remote-control-1.0-beta-2-dist.zip)
  • Распаковываем архив
  • Заходим в папку selenium-remote-control-1.0-beta-2\selenium-server-1.0-beta-2
  • Создаем в этой папке bat файл с следующим текстом :
java -jar C:\POLIGON\Selenium\RC\selenium-remote-control-1.0-beta-2\selenium-server-1.0-beta-2\selenium-server.jar -interactive
(путь к файлу указывать естественно свой)
прим. Этот шаг для тех кто не любит лишний раз вбивать команды ручками... Мазохистам- можно пропустить.
  • Сохраняем батник (к примеру как rcs-start.bat).

Подготовка завершена!

==================================================================================================

Ключ на старт!



Запускаем сервер (rcs-start.bat)
Видим окно cmd:

"Что бы это значило?" о_О ...
Для нас важны строки 8 и 10
8- сервер слушает порт 4444 на локальной машине (0.0.0.0)
10- сервер стартовал в интерактивном режиме ("Entering interactive mode...")


Для остановки сервера достаточно передать ему команду "exit"- в таком случае он сам остановит все сервисы, почистит временные файлы и аккуратно прикроет за собой окно.

===============================================================================================================

Проверка всех систем...


Теперь проверим работоспособность связки.

Для этого:
========
1) создадим простенький тест с помощью Selenium IDE состоящий из шести шагов:
    • открыть адрес http://baza-winner.ru
    • проверить корректность заголовка (Главная - База WinNER)
    • кликнуть на ссылку "Новичкам"
    • проверить соответствие заголовка (Новичкам - База WinNER)
    • проверить адрес страницы (http://baza-winner.ru/novice.sitedoc.html)
    • вернуться туда, откуда пришли (http://baza-winner.ru/)
  • Для создания этого теста
    • запускаем Selenium IDE
    • выбираем в меню File> New TestCase
    • первой строкой прописываем команду
      • command - open
      • target - http://baza-winner.ru
    • перходим в FF на нужный адрес http://baza-winner.ru
    • включаем запись в IDE
    • делаем активным окно браузера с тестируемым ресурсом
    • кликаем по странице ПКМ
    • Из меню ПКМ выбираем "VerifyTitle=..."
    • кликаем ЛКМ по ссылке "Новичкам"
    • На странице "Новичкам" из меню ПКМ выбираем "VerifyTitle=..."
    • Возвращаемся в IDE и останавливаем запись
    • Теперь вместо команд "click" прописываем "clickAndWait" (это "опционально"- на случай, если страница грузится медленно)
    • Далее последними командами прописываем:
        1. verifyLocation - http://baza-winner.ru/novice.sitedoc.html
        2. goBack
        3. verifyLocation - http://baza-winner.ru/
  • Далее выбираем в меню IDE пункт File>Export TestCase As> PHP Selenium RC
  • В диалоге сохранения файла указываем путь и имя с расширением (к примеру bw.php)

Вуаля! Пробный тест в php готов.
=======

А теперь попробуем на этой GUI-не взлететь...


2) выполним тест:
  • открыть окно командного интерпретатора (cmd)
  • перейти в директорию с нашим тестом
  • выполнить команду "phpunit bw.php"
должны запуститься два окна браузера: одно с Selenium RC, второе с тестируемым ресурсом:


А в это время в окне RC server-a и в окне теста отображается следующее:


На скриншоте видно сообщение о результате выполнения теста

"C:\POLIGON\Selenium\tests\bw\Ready>phpunit bw.php
PHPUnit 3.3.15 by Sebastian Bergmann.

.

Time: 33 seconds <время выполнения>

OK (1 test, 4 assertions) <1>"


В случае ошибки при выполнении теста сообщение будет подобно нижеследующему (для получения этого сообщения я немного подправил тест - указал заведомо некорректный адрес проверки verifyLocation):

"C:\POLIGON\Selenium\tests\bw\Ready>phpunit bw.php
PHPUnit 3.3.15 by Sebastian Bergmann.

F

Time: 25 seconds

There was 1 failure:

1) testMainPage
(bazaWinnerTest)
Failed asserting that is equal to .

FAILURES!
Tests: 1, Assertions: 4, Failures: 1.< тест- 1, проверки- 4, провалено проверок- 1>








Но в нашем случае все прошло удачно!
Вуаля! Тест выполнен, а значит связка - работает!

Можно приступать к созданию, корректировке и отладке тестов...
=======================================================================================================

"А что у него унутре?"


Вкратце разберем файл нашего теста (я, опять же, его слегка изменил для наглядности):

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
/*Это файл в котором содержатся необходимые нам функции*/

class bazaWinnerTest extends PHPUnit_Extensions_SeleniumTestCase

/*ну а это наш класс- обзываем как хотим (но- без фанатизма!)*/
{
function setUp()
/*эта функция для настройки тестирования. Выполняться в качестве теста она не будет*/
{
$this->setBrowser("*chrome");

/*тут указывается браузер, в котором мы будем тестировать наш ресурс. Возможные значения "*iexplore","*firefox","*opera","*chrome","*safari","*custom" и пр. (в документации на сайте разработчика должно быть...)*/

$this->setBrowserUrl("http://baza-winner.ru/");

/*тут указывается базовый URL тестируемого ресурса*/
}

function testMainPage()
/*все функции начинающиеся на "test..." будут выполняться в качестве тестов, причём для каждой будут запущены (и по завершении- закрыты) два окна браузера: одно с Selenium RC, второе с тестируемым ресурсом. Что увеличивает время тестирования, но упрощает чтение логов*/

{
$this->open("http://baza-winner.ru");
/*команда открытия начального URL */

try {
$this->assertEquals("Главная - База WinNER", $this->getTitle());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*команда проверки соответствия заголовка (Title) заключена в конструкцию "try... cath..." чтобы не вызывать прерывания выполнения теста в случае ошибки времени исполнения.
В селениуме это команда "Verify". В отличии от "Assert", которая в php выглядит как "$this->assertEquals("Главная - База WinNER", $this->getTitle());" и в случае ошибки - прерывает выполнение всего теста */

$this->click("link=Новичкам");

/*клик по ссылке*/

$this->waitForPageToLoad("30000");

/*ожидаем загрузки страницы 30 секунд (время задержки- в миллисекундах)*/

try {
$this->assertEquals("Новичкам - База WinNER", $this->getTitle());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*Теперь проверяем соответствие заголовка открывшейся страницы*/

try {
$this->assertEquals("http://baza-winner.ru/novice.sitedoc.html", $this->getLocation());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*Теперь проверяем URL открывшейся страницы*/

$this->goBack();

/*Возвращаемся на страницу, с которой сюда пришли*/

try {
$this->assertEquals("http://baza-winner.ru/", $this->getLocation());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*Снова проверяем URL- туда ли мы вернулись?*/
}
function testNovicePage()
{
/*Тут мы можем написать ещё одну функцию проверки (к примеру- проверка следующей страницы, либо просто - другой тест)
и она будет выполнена с перезапуском браузера*/
}
}
?>

Итого - пожелания:

1) использовать Assert только в том случае, если при отсутствии проверяемого элемента дальнейшее прохождение теста невозможно либо бессмысленно!
2) при переходах по ссылкам между страницами стоит ставить clickAndWait вместо click иначе есть шанс получить Failure при долгой загрузке страницы.
3) ориентироваться на элементы лучше по XPath локаторам (постараюсь описать чуть позже, но самая полная информация тут http://www.w3.org/TR/1999/PR-xpath-19991008.html ).
4) Не лепить тестирование всего веб-ресурса в одну функцию, а разбивать на логически связанные "паттерны".
5) Ну и "PHP- наше всё!" (
http://www.spravkaweb.ru/php/
http://www.php.net/manual/ru/
http://phpstudy.ru )

to be continued...
==========================================================================================================
:::::::::::::::::::::::::::::::::::::::::::::::::::::http://x-actly.blogspot.com/2009/03/selenium.html:::::::::::::::::::::::::::::::::::::::::::
==========================================================================================================
Все идеи/находки/результаты исследований - постить сюда (то бишь- ниже этого текста)! Потом по необходимости перенесем в основной текст.

вторник, 17 марта 2009 г.

Устав

УСТАВ КОМАНДЫ ОБР"ОГУРЧЕГИ"

(редакция I от 03 марта 2009 г.)

1. Общие положения.

1.1. Настоящим документом регламентируется деятельность Томской страйкбольной команды (AirSoft) ОБР«Огурчеги» (далее по тексту- Команда).

1.2. Команда не является коммерческой организацией.

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

1.4. Целью деятельности Команды является коллективный отдых, нейтрализация негативных эмоций и агрессивных устремлений, радость взаимного общения и повышение боевого мастерства как Команды в целом, так и каждого Действующего Члена или Кандидата в отдельности.

1.5. Устав Команды может изменяться или дополняться только при утверждении изменений или дополнений всеми Действующими Членами Команды.

1.6. Отличительной символикой Команды являются знамя, нашивки и мягкие кокарды.

2. Требования к Кандидатам.

2.1. Кандидатом на зачисление в Команду - Рекрутом, могут быть лица, достигшие 18 лет, ознакомленные с настоящим Уставом и Правилами Команды, прошедшие инструктаж по технике безопасности.
Зачисление в рекруты происходит по предложению одного или нескольких действующих членов Команды и зачисленным в рекруты считается лицо, за которое проголосовало простое большинство действующих членов команды.

2.2. Рекрут должен иметь личное оружие (предпочтительно AEG или же спринг) и экипировку ("горка-3" или же "береза"), использование разгрузочного жилета или разгрузочной системы производится по согласованию с командиром Команды.

2.3. Рекрут должен беспрекословно подчиняться командам действующего командира Команды или назначенного им командира боевого соединения, в случае отсутствия таковых, рекрут подчиняется действующему члену Команды как старшему по званию.

2.4. Рекрут имеет право не подчиняться любым неуставным или незаконным приказам.

2.5. Рекрут имеет право выносить на рассмотрение Команды любые предложения не административного характера.

2.6. Рекрут может быть зачислен в Действующие Члены Команды.

3. Порядок зачисления в Действующие Члены Команды.

3.1. Рекрут может быть зачислен в Действующие Члены Команды при выполнении следующих требований:

Рекрут по истечению 6 - ти месячного испытательного срока и при систематических участиях в тренировках, и играх команды может быть зачислен в члены команды, если за него проголосует простое большинство действующих членов команды.
6 - ти месячный испытательный срок может быть сокращен если за принятие рекрута проголосует 100% действующих членов команды.
Обязательными условиями принятия в члены команды являются:
  1. Наличие у рекрута экипировки "горка -3"с головным убором, в летнее время допускается использование камуфляжа "береза".
  2. Типы разгрузочных систем и бронежилетов не ограничены, однако их расцветка должна сочетаться с уставными формами команды.
  3. Вкачестве штурмовой винтовки разрешено использовать только оружие АК-серии (примечание: для девушек может быть сделано исключение). Это ограничение не распространяется на снайперское оружие, пулемёты и вторичное оружие.
использование оружия М-16 (М-4) серии полностью исключается.

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

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

4. Требования к Действующим Членам Команды.

4.1. Действующий Член Команды обязан быть вооружен и экипирован согласно Правилам Команды.

4.2. <удалён>

4.3. Действующий Член Команды обязан беспрекословно подчиняться командам действующего командира Команды или назначенного им командира боевого соединения.

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

4.5. Действующий Член Команды на любых боевых мероприятиях Команды обязан носить отличительные знаки Команды.

4.6. Действующий Член Команды обязан быть примером для Кандидатов как по боевым, так и по моральным качествам.

4.7. Действующему Члену Команды в условиях не боевых мероприятий, а также в условиях игр городского и выше уровня, не рекомендуется пользоваться ненормативной лексикой.

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

4.9. При желании покинуть Команду Действующий Член Команды обязан заранее сообщить о своем решении любому Действующему Члену Команды.

4.10. При выходе из состава Команды Действующий Член Команды обязан сдать общекомандный инвентарь.

4.11. Действующий Член Команды обязан знать:
  • инструкцию по технике безопасности
  • знаки невербального общения

5. Права Действующих Членов Команды.

5.1. Действующий Член Команды имеет право принимать участие в любых мероприятиях Команды.

5.2. Действующий Член Команды имеет право выносить на рассмотрение Команды любые предложения.

5.3. Действующий Член Команды имеет право не подчиниться любым неуставным или незаконным приказам.

5.4. Действующий Член Команды может пользоваться общекомандными инвентарем.

6. Порядок расходования общекомандных средств.

6.1. Членские взносы поступают в общекомандную кассу.

6.2. Ответственность и отчетность за общекомандную кассу возлагается на казначея Команды. Казначей команды избирается исключительно единогласным решением всех Действующих Членов Команды. При наличии разногласий Команда поступает по принципу Ватиканского форума (т.е. обсуждение кандидатуры казначея проходит до полного одобрения всех Действующих Членов Команды).

6.3. Общекомандная касса расходуется по направлениям, одобренным всеми Действующими Членами Команды.

6.4. Казначей подвержен материальной ответственности за находящиеся в его распоряжении командные средства. Данный пункт относится к любому Действующему Члену Команды, которому доверены общекомандные средства. При выходе из строя общекомандного инвентаря во время боевых действий Действующий Член Команды материальную ответственность за него не несет.

6.5. Предмет расходования средств общекомандной кассы может быть поручен на хранение любому Действующему Члену Команды.

6.6. При выходе Действующего Члена Команды из состава Команды ему не компенсируются сумма членских взносов, а также инвентарь общекомандного назначения, приобретенный на общекомандные средства и его стоимость.

7. Табель о рангах.

7.1. Внутри Команды существует разграничение Действующих Членов Команды по классам преимущественной деятельности, определенной во время испытательного срока Кандидата.

7.2. Классы деятельности:

  • штурмовик
  • сапер
  • разведчик
  • марксман (снайпер)
  • медик

7.3. Действующий Член Команды может совмещать несколько классов деятельности.

7.4. Внутри Команды существует разграничение Действующих Членов Команды по должностям.

7.5. Должности:

  • командир Команды
  • заместитель командира по политической части
  • заместитель командира по технической части
  • заместитель командира по вооружению
  • казначей

7.6. Действующий Член Команды не может совмещать две или более должностей.

7.7. Действующему Члену Команды присваивается класс и должность на общекомандном собрании.

7.8. Действующие Члены Команды, назначенные на ту или иную должность подвержены регулярной отчетности перед общим сбором Команды.

8. Порядок исключения из Команды.

8.1. Действующий Член Команды может быть исключен из Команды по собственному желанию или за несоблюдение данного Устава и Правил Команды.

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

8.3. Основание для исключения из Команды - общее голосование кворума Действующих Членов Команды.

8.4. Действующий Член Команды, пропустивший четыре или более игр без предупреждения любого из Действующих Членов Команды, исключается из состава Команды автоматически.

8.5. Исключенный игрок может быть повторно принят в Команду на общих основаниях (см. п. 3).

9. Положение о Вольных Игроках.

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

9.2. Участие Вольного Игрока в каждом мероприятии команды утверждается командиром Команды под ответственность приведшего или рекомендовавшего.

9.3. Вольный Игрок обладает всеми правами и обязанностями Действующего Члена Команды, оговоренными в п. 4.1., 4.2., 5.1., 5.2., 5.3.

10. Форс-мажор.

10.1. Любые форс-мажорные обстоятельства рассматриваются всеми Действующими Членами Команды

11. Положение об Обособленных Подразделениях.

11.1. Лицо или группа лиц, изъявивших желание вступить в Команду могут быть приняты с получением статуса обособленного подразделения (ОП). Прием в Команду осуществляется на основаниях предусмотренных Уставом.

Обособленным подразделением может являться только такое подразделение, которое территориально расположено не в г. Томск т.е. не по месту основного расположения Команды. Требования Устава на такое отделение (подразделение) распространяются полностью.

11.2. ОП подчинено командиру отделения, а он, в свою очередь, командиру Команды.

11.3. Состав отделения формируется местным командиром в порядке предусмотренном Уставом и по обязательному согласованию кандидатуры претендента с командиром команды. Командир Команды в праве отменить прием бойца в отделение, и в данном случае вопрос о принятии бойца может быть решен на общем собрании команды в порядке предусмотренном Уставом.

11.4. ОП носит знаки различия уставной формы с указанием города своего дислоцирования. Право на собственное боевое Знамя ОП получает по достижению 5 человек основного состава.

11.5. Каждое ОП специализируется по основному виду специализации Команды, но может иметь несколько дополнительных специализаций. По каждой заявленной специализации ОП обязано проводить регулярные тренировки.

11.6. ОП – является структурным подразделением команды и обязано проводить тренировки с основной частью Команды не реже 4 раз в год.

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

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

Приложение :
Взыскания.

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

среда, 11 марта 2009 г.

Просто разные мысли (не мои, но мне оказавшиеся полезными!)

"Sua quique fortuna in manua est... - своё счастье у каждого в руках (Лат.)"

------
Враги, стремящиеся мне вредить, я недосягаем, я неуязвим для ваших ударов! Вы бьете впустую! Я давно уже не здесь!

-----
Да не возвысит человек сам себя, да не унизит он себя сам. Ибо только он один себе друг. И нет большего ему врага, чем он сам себе!


-------
В движении- будь как вода!
Как зеркало- будь неподвижным.
Отвечай, отзываясь как эхо.
Будь тонким, как не существуя.


------
...и смерть меня раздела догола, и стали прахом брань и похвала...

------
кpисталл нeбeс мнe нe пpeгpада бoлe; pазpyшивши eгo пoдъeмлюсь в бeскoнeчнoсть...

------
Способ выхода из любой ситуации один - соберись и разбирайся!


------
Я уже отдан силе, что правит моей судьбой.
Я ни за что не держусь, поэтому мне нечего защищать.
У меня нет мыслей, поэтому я увижу.
Я ничего не боюсь, поэтому я буду помнить себя.
Отрешённый, с лёгкой душой,
Я мимо Орла проскочу, чтобы снова стать свободным.

------
Чтобы писать хорошо, нужно уметь писать своей кровью

------
Мой Дух- бушующее Пламя,
Невозмутимость- моя Крепость,
Чувство Долга- моё Движение,
Понимание Сути без размышлений- мой Меч,
Моя Сила- в моём Упорстве,
Моя Власть- это Я сам,
Моё Тело- Железо,
Моё Решение- Закон для меня.

------
"... Честь на поле боя - основа этики снайпера. Она проявляется в его дисциплинированности и соблюдении норм, в соответствии с которыми он живёт в условиях боевых действий; в порядочности; в тех правилах, которыми он руководствуется при встрече с противником..."

------
Дорогу осилит идущий

------
Кто хочет, тот ищет возможности, кто не хочет, тот ищет причины

------
Для того, кто никуда не плывет, никогда не бывает попутного ветра

------
И даже путь в тысячу шагов начинается с одного шага

------
Делай что должно, и будь что будет (с) Марк Аврелий

------

Ни раем ,ни адом
меня не смутить
в лунном сиянье стою
ни облачка на душе....
(Уэсуги Кенсин,16 век)

------ Кодекс воина клана Тогакурэ (XVII век)
***
Звезды - мои глаза,
Ветер - мои уши,
Ночь - моя одежда,
Холод - мой разум,
Тень - моя суть.
***
Моя сила - в моем упорстве,
Учтивость к командирам - единственное тепло во мне,
Моя власть - это я сам,
Железо - мое тело,
Мое решение - это мой закон!
***
Мой дух - мой единственный друг,
Брезгливость - мой враг,
Свобода брать и отдавать жизнь - моя стратегия,
Использование момента - мой главный шанс,
Закон Вселенной - единственное мое сокровище.
***
Приспосабливаться к обстоятельствам - мой принцип,
Неуловимость ветра - моя тактика,
Изворотливость ума - мое счастье,
Чувство долга - мой панцирь,
Невозмутимость - моя крепость.
***
Понимание сути без размышлений - мой меч!

------
"...Собака ведь не за миску служит, не за то, что ее хозяин любит.
Понятия у нее свои. Она - Дом охраняет.
И не предаст она никогда.
Потому, что нет у нее такого понятия - "предательство"...." ДОЛГ - Сталкер.

------
Errare humanum est... Homo sum: humani nihil a me alienum puto. Absit invidia verbo. (лат.)
Человеку свойственно ошибаться... Я- человек: ничто человеческое мне не чуждо. Да не осудят меня за эти слова.
------

Галиматья из под коня

1) Залить на Гдрайв утилитку и dll ку 2) Наполнить блог материалами 3) Почистить/пересоздать аккаунты Утилита Dll Про wiki сайт