1 февраля 2015 г.

Добавление подсветки синтаксиса highlightjs.org

Добавление подсветки синтаксиса highlightjs.org в blogger.com.

Подготовка

using Мозг;
using Интернет;
public class Blog : Blogger
{
var help1 = Интернет.Загрузить(
    @"https://highlightjs.org/");
var help2 = Интернет.Загрузить(
    @"http://stackoverflow.com/questions/10936854/highlight-syntax-in-pre-tags-with-highlight-js");

var jsLibrary = Интернет.Загрузить(
    @"//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/highlight.min.js");
var cssFile = Интернет.Загрузить(
    @"https://highlightjs.org/static/demo/styles/github.css");
}
Прочитал на сайте проекта, что js-библиотеку можно грузить с cloudflare.

Выбор стиля подсветки на https://highlightjs.org/static/demo/

Также выбрал в качестве стиля стиль github. Ссылку на github.css свзял также с сайта проекта.

Правка шаблона

В начало шаблона добавить ссылки на библиотеку и стиль

После секции с базовыми стилями шаблона:

<b:template-skin>
    ...
</b:template-skin>
добавил ссылки на highlight.min.js и github.css.
<link href='https://highlightjs.org/static/demo/styles/github.css' rel='stylesheet'/>
<script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/highlight.min.js'/>
Добавление ссылок в шаблон после секции template-skin

Сохранил шаблон.

Код запуска подсветки

Добавил в шаблон виджет "HTML/JavaScript". Открыл форму редактирования виджета, и написал код запуска подсветки синтаксиса:
<script type='text/javascript'>
//<![CDATA[
    var aCodes = document.getElementsByTagName('pre');
    for (var i=0; i < aCodes.length; i++) {
        hljs.highlightBlock(aCodes[i]);
    }
//]]>
</script>

Виджет "HTML/JavaScript", разместил внизу страницы.

Размещение виджета "HTML/JavaScript" внизу макета

14 января 2015 г.

Списки слов для генерации тестовых данных

Списки слов из ru.wikipedia.org, открытые в Sublime Text 2
Списки слов из ru.wikipedia.org, открытые в Sublime Text 2

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

Когда-то брал такие данные из других информационных систем (грабил караваны). Создание своих наборов тестовых данных, более надёжное и более весёлое занятие.

Надёжность использования в полном контроле над данными, удобстве отладки и предсказуемости. Что важно при проектировании тестов.

Весело же бывает, когда пользователь или заказчик, решит поработать в системе, находящейся под нагрузкой. И получит входящее сообщение от Барабашкиной Ираиды Анатольевны, сотрудницы компании ООО "Большие погремушки". А содержимое текста сообщения, при использовании рандомизации и не использовании lorem ipsum (рыбы) может быть шедевральным.
В словаре OpenOffice есть много литературных слов, комбинация которых повеселит заказчика


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

Словари:
  1. Существительные среднего рода.10854.
  2. Мужские фамилии.13529.
  3. Мужские имена. 312.
  4. Мужские отчества.140.
  5. Женские имена. 439.
  6. Прилагательные.1002.

Допустим, создаётся 10 000 организаций. Для этого генерируется 10 000 уникальных наименований организаций. Пригодится список существительных среднего рода.

Существительные:
  • наполнение;
  • напоминание;
  • направление;
  • ...

Соответствующие названия организаций, которые можно создать из списка слов:

  • ООО "Наполнение";
  • ООО "Напоминание";
  • ООО "Направление";
  • ...
Если предприятия делятся на классы (малое, среднее, большое), то название класса также можно отразить в наименовании:
  • ООО "Малое напряжение";
  • ООО "Среднее напудривание";
  • ООО "Большое напускание";
  • ...
Использование списков фамилий, имён и отчеств очевидно для формирования ФИО тестовых пользователей. Наличие тринадцати тысяч мужских фамилий позволяет создать столько групп пользователей-однофамильцев, которые будут работать в одинаковых организациях (более десяти тысяч).


Источники данных:

Windows Command Line Cheat Sheet

3 января 2015 г.

Xfce4, решение проблемы с восстановлением сеанса

Использую xfce4 как окружение по умолчанию. В xfce4 есть возможность сохранения сеанса при выходе. Сохранение сеанса — аналог настройки автозагрузки в Windows.
С сохранением сеанса всё хорошо. А вот с восстановлением могут быть проблемы.
xfse4 session save
Сохранение сеанса при выходе


12 сентября 2014 г.

Онтологии. OWL 2.0

Рассказывал про применение онтологий, OWL 2.0 и сравнение возможностей OWL с KG (Knowledge Guide, разработка ИжГТУ). Дело было в 2012 году. Составил схему лекции.

Схема лекции по OWL 2.0 (узлы с примерами свёрнуты)


7 сентября 2014 г.

Поделить текстовый файл на части

Поделить текстовый файл на части

Назначение

Если нужно открыть большой Log-файл в Windows, но ни один из установленных инструментов не позволяет открыть файл такого объёма (100-2000 МБайт). То можно поделить файл на меньшие части, используя командный сценарий (bat-ник). Возможность выполнить bat-файл всегда есть в Windows. Расход оперативной памяти при выполнении разделения будет приемлемым - двойной размер файла (600 МБайт ОЗУ для файла в 300 МБайт).

Текст сценария SplitBigTextFile.bat

echo off
setlocal enabledelayedexpansion

set fileName=%1
set partSize=%2
set partExt=%3

set index=0
set partNumber=0

for /F "tokens=*" %%i in (!fileName!) do (
set /a index+=1
if !index! GTR !partSize! (
set /a partNumber+=1
set index=0
)
@echo %%i >> !fileName!.!partNumber!.!partExt!
)

Параметры

Параметры выполнения скрипта, должны быть переданы при вызове:
  1. Путь к текстовому файлу, на основе которого надо создать несколько маленьких файлов.
  2. Максимальное количество строк, в маленьком файле.
  3. Расширение для создаваемых маленьких файлов.

Пример

Пример вызова:
SplitBigTextFile.bat D:\BigLog.log 10000 log

В результате работы сценария рядом с файлом D:\BigLog.log будут созданы файлы:
  1. D:\BigLog.log.1.log
  2. D:\BigLog.log.2.log
  3. D:\BigLog.log.3.log
  4. ...
В каждом из которых будет только по 10000 строк текста. В последнем файле, может быть менее 10000 строк.

А такие небольшие файлы, уже можно будет просмотреть в имеющемся в данный момент текстовом редакторе.

update 11 марта 2015. При работе потребуется ОЗУ в два раза больше размера файла. Для начала работы объём свободной оперативной памяти должен быть больше объёма файла. Так если файл размером 2 ГБайт, то при свободных 2,3 ГБайт процесс запустится и будет работать. Файлы более 2 ГБайт не разделял таким способом — памяти не хватает. Обработка некоторых текстовых файлов с кодировкой UCS-2 Little Endian не работает изначально (так выгружаютя файлы реестра *.reg). Чтобы заработала можно с помощью команды type перенести содержимое сбойного файла в новый файл командой:

type сбойныйФайл.txt > новыйФайл.txt
теоретически, могут потеряться данные, так как кодировка файла сменится на ANSI, но на практике данные не теряются — большая часть символов латинские.

Выбрать случайную запись из таблицы

Выбрать случайную запись из таблицы

Назначение

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

Теория

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

Для получения случайного значения подойдут функции:
  • RAND();
  • NEWID().

Выбор первой записи задаётся инструкцией TOP(1).

Примеры

Пример результирующего SQL-запроса:
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
ORDER BY NEWID()

Боле быстрый код:
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
ORDER BY RAND()

Если нужно наложить фильтр на данные из таблицы, используется инструкция WHERE.
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
WHERE "ID" >= 100 AND "ID" <= 1000
ORDER BY RAND()

Примечание

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

Например, в таблице "Links" в поле "FolderID" нужно вставить случайное значение из поля "ID" таблицы "Folders", где "ID" - целочисленный счётчик.
Заранее создаётся необходимое тестовое количество записей в "Folders" с подряд идущими значениями 5678...105678.
И при вставке не сканируем таблицу "Folders", а сразу вычисляем случайное значение "ID" из интервала 5678...105678, с помощью RAND() и ROUND().

SELECT @ID = @НачалоИнтервала + ROUND(RAND() * (@КонецИнтервала - @НачалоИнтервала), 0)

Пример с интервалом 5678...105678:
SELECT @ID = 5678 + ROUND(RAND() * (105678 - 5678), 0)