пятница, 21 февраля 2014 г.

Установка Oracle x32 на Windows x64

Дистрибутив (файл OracleXE112_Win32.zip) можно взять на официальном сайте корпорации Oracle (требуется регистрация): http://www.oracle.com/technetwork/products/express-edition/downloads/index.html

1. Распаковываем архив и запускаем установщик Oracle XE (DISK1/setup.exe)
2. В ходе установки выбираем директорию для установки Oracle



Внимание!
Под сиcтемой windows с разрядностью 64 бита установщик завершается с ошибкой вида:
«The installer is unable to instantiate the file C:\Users \soarin\AppData\Local\Temp\{E6AD5C75-4961-4B43-870F-1270FB3D4E02}\KEY_XE.reg. The file does not appear to exist.»
Чтоб этого избежать, проделайте следующие шаги (если ОС 32 битная, то выполнять эти шаги под буквами не нужно):

a) Не нажимаем кнопку Next установщика. Отодвинем установщик пока в сторону и откроем в файловом менеджере (например, можно использовать проводник) папку вида

C:\Users\soarin\AppData\Local\Temp\{E6AD5C75-4961-4B43-870F-1270FB3D4E02}\, которая содержит файл OracleMTSRecoveryService.reg. Soarin – в данном случае это имя пользователя в ОС windows, а код в фигурных скобках будет другой.

Можно и с помощью поиска файлов найти эту директорию, указав имя «OracleMTSRecoveryService.reg» и не забыв разрешить поиск в скрытых папках.



б) Сделаем копию файла OracleMTSRecoveryService.reg и переименуем её в «KEY_REG.reg», и вторую копию файла в «KEY_XE.reg»



в) Возвращаемся к установщику Oracle Server и продолжаем процесс инсталляции.

3. Задаём пароль для СУБД (проверяем, что стоит английская языковая раскладка и caps lock отключён!)

4. Жмём кнопку Next и дожидаемся завершения установки.

среда, 19 февраля 2014 г.

Удаление Oracle вручную

Удаление предыдущей установки Oracle.
1. Останавливаем все службы (сервисы), которые начинаются на Oracle
2. Останавливаем службу Distributed Transaction Coordinator (Координатор рапределённых транзакций).
3. Удаляем C:\Program Files\Oracle
4. Удаляем C:\Orant (или др.каталог, куда был установлен оракл ранее)
5. Удаляем в реестре HKCU/Software/Oracle, HKLM/Software/Oracle
6. Удаляем в реестре HKLM/System/ControlSet001/Services/Oracle.......
7. Удаляем в реестре HKLM/System/ControlSet002/Services/Oracle........
8. Удаляем в реестре HKLM/System/CurrentControlSet/Services/Oracle......
9. Перезагружаем компьютер.

C# RichTextBox color text

RichTextBox rtbLog = new RichTextBox();

public void AppendText(string text, Color color)
{
    rtbLog.SelectionStart = rtbLog.TextLength;
    rtbLog.SelectionLength = 0;
    rtbLog.SelectionColor = color;
    rtbLog.AppendText(text);
    rtbLog.SelectionColor = rtbLog.ForeColor;
}
...

AppendText("[" + DateTime.Now.ToShortTimeString() + "]", Color.Red);
AppendText(" ");
AppendText(userid, Color.Green);
AppendText(": ");
AppendText(message, Color.Blue);
AppendText(Environment.NewLine);

пятница, 27 декабря 2013 г.

C# PropsAppReader - чтение файла формата "tag1...\tag1"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

namespace Solution.Framework
{
    class PropsAppReader
    {
        string fileName;
        string[] fileText;
        
        
        public PropsAppReader(string f_fileName)
        {
            this.fileName = f_fileName;
            fileText= File.ReadAllLines(f_fileName);
        }

        public string GetValueByParamName(string paramName)      
        {
            string sPattern = "(?<=<" + paramName + ">)(.*)(?=</" + paramName + ">)";
            string OneString = "";

            foreach (string s in fileText)
                OneString += s;


            return Regex.Match(OneString, sPattern).Value.ToString().Trim();
        }


        public string[] GetAllText()
        {
            return fileText;
        }
    }
}


Использование класса Solution:

...

PropsAppReader scriptManager = new PropsAppReader(file_path);


string val1 = PropsAppReader.GetValueByParamName("tag1-name")

string val2 = PropsAppReader.GetValueByParamName("tag2-name")
...
string valN = PropsAppReader.GetValueByParamName("tagN-name")
...


Структура файла:

<tag1-name>Tag1_value</tag1-name>
<tag2-name>Tag2_value</tag2-name>
...
<tagN-name>TagN_value</tagN-name>

вторник, 10 декабря 2013 г.

Автоматический backup базы данных (*.bak) MS SQL Server 2008


sqlcmd -S DECLSERVER\SQLGTD -E -Q "declare @s varchar(255) set @s='E:\backup\GTD_' + convert(varchar(1), datepart(dw, getdate())) + '.bak' backup database GTD to disk = @s with init, noformat, skip, nounload"

sqlcmd позволяет вводить инструкции Transact-SQL, системные процедуры и файлы скриптов из командной строки в редактор запросов в режиме SQLCMD,

где:

  • -S — задает имя сервера, server[\instance_name]
  • DECLSERVER\SQLGTD — имя сервера/имя экземпляра, на котором крутится база;
  • -E — использует для соединения с SQL server вместо имени пользователя и пароля доверительное соединение;
  • -Q " cmdlinequery " — при запуске программы sqlcmd выполняет запрос, но выход из программы по завершении его выполнения не производится. Может быть выполнено несколько запросов, разделенных точкой с запятой. Заключайте запрос в кавычки, как показано выше;
  • declare — объявляем переменную s ,имя переменной всегда начинается с @, поэтому @s. В нашем случае @s — это папка (диск) хранения бэкапов;
  • varchar(n) — задает тип переменной @s как строковый с длинной строки n, в примере 255 символов;
  • set — задает значение переменной @s,в примере это папка backup на диске E (E:\backup\), далее задается имя бэкап файла, где набор функций convert(varchar(1), datepart(dw, getdate())) возвращает в текстовом формате с длиной в 1 символ текущий день недели (понедельник – 1, вторник – 2, и т.д.) и добавляется расширение bak. На выходе получим файл с именем GTD_номер дня недели.bak;
  • backup — создает бэкап;
  • database — указывает на создание бэкапа всей базы;
  • GTD — в нашем примере имя базы на SQLсервере;
  • to disk — указывает на тип устройства резервного хранения, файл жесткого диска, и указана переменная @s, которой присвоено путь и имя создаваемого файла;
  • with init, noformat, skip, nounload — указывает на то, что необходимо произвести перезапись данных по кругу с переопределением заголовков, что позволит нам иметь 7 файлов бэкапа на каждый день недели, перезаписываемые по кругу.

Именно для моего случая строка сценария будет иметь следующий вид:
sqlcmd -S SR-P2K-ORE -E -Q "declare @s varchar(255) set @s='D:\askue-backup\sr-p2k-ore\Piramida2000new_' + replace(replace(replace(CONVERT(VARCHAR(19), GETDATE(), 120), '-', '_'), ':', '_'), ' ', '__') + '.bak' backup database Piramida2000new to disk = @s with init, noformat, skip, nounload"

среда, 30 октября 2013 г.

C# DataGridView select row by right mouse button click



private void dgv_MouseDown(object sender, MouseEventArgs e)
{
    DataGridView.HitTestInfo Hti;

    if (e.Button == MouseButtons.Right)
    {
        Hti = dgv.HitTest(e.X, e.Y);

        if (Hti.Type == DataGridViewHitTestType.Cell)
        {
            if (!((DataGridViewRow)(dgv.Rows[Hti.RowIndex])).Selected)
            {
                dgv.ClearSelection();
                ((DataGridViewRow)dgv.Rows[Hti.RowIndex]).Selected = true;
            }
        }
    }
}

понедельник, 30 сентября 2013 г.

C# TreeView node populate from DataTable

private void Form19_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable("data");

    dt.Columns.Add("id",typeof(int));
    dt.Columns.Add("ParentId",typeof(int));
    dt.Columns.Add("description");
    dt.Columns.Add("link");
    dt.Rows.Add(1, null, "Root", "www.microsoft.com");
    dt.Rows.Add(2, 1, "Child1", "www.microsoft.com");
    dt.Rows.Add(3, 1, "Child2", "www.microsoft.com");
    dt.Rows.Add(4, 2, "GrandChild1", "www.microsoft.com");
    dt.Rows.Add(5, 2, "GrandChild2", "www.microsoft.com");
    dt.Rows.Add(6, 2, "GrandChild3", "www.microsoft.com");
    dt.Rows.Add(7, 3, "GrandChild4", "www.microsoft.com");
    dt.Rows.Add(8, 3, "GrandChild5", "www.microsoft.com");


    //Use a DataSet to manage the data
    DataSet ds = new DataSet();
    ds.Tables.Add(dt);

    //add a relationship
    ds.Relations.Add("rsParentChild",
                     ds.Tables["data"].Columns["id"],
                     ds.Tables["data"].Columns["ParentId"]);

    foreach (DataRow dr in ds.Tables["data"].Rows)

    {
        if (dr["ParentId"] == DBNull.Value)
        {
            TreeNode root = new TreeNode(dr["description"].ToString());
            root.Tag = dr["link"].ToString();
            treeView1.Nodes.Add(root);
            PopulateTree(dr, root);
        }
    }
    treeView1.ExpandAll();
}

public void PopulateTree(DataRow dr, TreeNode pNode)
{

    foreach (DataRow row in dr.GetChildRows("rsParentChild"))
    {
        TreeNode cChild = new TreeNode(row["description"].ToString());
        cChild.Tag = row["link"].ToString();
        pNode.Nodes.Add(cChild);

        //Recursively build the tree
        PopulateTree(row, cChild);
    }}

Nginx + Let's Crypt

Шаг 1. Установка Certbot # apt-get install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing...