Статья написана автором Галиев Руслан

MS SQL 2000 Shrink/remove transaction log

На практике столкнулся с такой ситуацией в древнем Ms SQL Server 2000. Товарищ отказывался настойчиво обрезать транзакт лог до минимального размера 100mb. И занимал порядка 50Гб.

Решение:

1
2
3
4
5
6
7
8
9
10
USE master
GO
dump TRANSACTION <Имя_Базы_Данных> WITH no_log
GO
USE
GO
DBCC SHRINKFILE (<Имя_Базы_Данных>, 100)
GO
-- После того как лог обрезался, проверьте БД на ошибки
dbcc checkdb(<Имя_Базы_Данных>)
Статья написана автором Галиев Руслан

MS SQL 200 database backup на сетевой диск

В MS SQL 2000 чтобы произвести резервное копирование на сетевой диск до строки самого бэкапа нужно добавить две строки: первая удаляет сетевой диск, вторая заново его монтирует

1
2
3
exec master..xp_cmdshell 'net use z: /d /y'
exec master..xp_cmdshell 'net use z: \\192.168.0.5\Backup /user:USER PASSWORD'
BACKUP DATABASE [BASE] TO  DISK = N'Z:\BASE.BAK' WITH  INIT ,  NOUNLOAD ,  NAME = N'BASE backup',  NOSKIP ,  STATS = 10,  NOFORMAT

На работе частенько стали отключать электричество в ночное время, чтобы приехать с утра пораньше и включить сервера, нужно было придумать оповещение. На работе завалялся GSM модем Teltonika TMK-10x, поэтому решил что самый удобный способ оповещения это SMS сообщение.

1. Первое что нужно написать приложение которое будет отсылать AT команды на COM порт, к которому подключен модем. Приложение должно принимать два параметра первый номер телефона, второй сообщение.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string phoneNo = args[2];
string message = args[3];
int speed = int.Parse(args[1]);
string port_name = args[0];
SerialPort port = OpenPort(port_name, speed, 8, 1000, 3000);

try
{
ExecCommand(port, "AT", 300, "No phone connected");
ExecCommand(port, "AT+CMGF=1", 300, "Failed to set message format.");
string command = "AT+CMGS=\"" + phoneNo + "\"";
ExecCommand(port, command, 300, "Failed to accept phoneNo");
command = message + char.ConvertFromUtf32(26) + "\r";
ExecCommand(port, command, 3000, "Failed to send message");

}
catch (Exception ex)
{
throw ex;
}

ClosePort(port);
}

//Open Port
public static SerialPort OpenPort(string portName, int baudRate, int dataBits, int readTimeout, int writeTimeout)
{
ReceiveNow = new AutoResetEvent(false);
SerialPort port = new SerialPort();

try
{
port.PortName = portName; //COM1
port.BaudRate = baudRate; //9600
port.DataBits = dataBits; //8
port.StopBits = StopBits.One; //1
port.Parity = Parity.None; //None
port.ReadTimeout = readTimeout; //300
port.WriteTimeout = writeTimeout; //300
port.Encoding = Encoding.GetEncoding("iso-8859-1");
port.DataReceived += PortDataReceived;
port.Open();
port.DtrEnable = true;
port.RtsEnable = true;
}
catch (Exception ex)
{
throw ex;
}
return port;
}

//Close Port
public static void ClosePort(SerialPort port)
{
try
{
port.Close();
port.DataReceived -= PortDataReceived;
}
catch (Exception ex)
{
throw ex;
}
}

public static string ExecCommand(SerialPort port, string command, int responseTimeout, string errorMessage)
{
try
{
port.DiscardOutBuffer();
port.DiscardInBuffer();
ReceiveNow.Reset();
port.Write(command + "\r");

string input = ReadResponse(port, responseTimeout);
if ((input.Length == 0) || ((!input.EndsWith("\r\n&gt; ")) &amp;&amp; (!input.EndsWith("\r\nOK\r\n"))))
throw new ApplicationException("No success message was received.");
return input;
}
catch (Exception ex)
{
throw ex;
}
}

public static AutoResetEvent ReceiveNow;

//Receive data from port
public static void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (e.EventType == SerialData.Chars)
{
ReceiveNow.Set();
}
}
catch (Exception ex)
{
throw ex;
}
}

public static string ReadResponse(SerialPort port, int timeout)
{
int tryNo = 0;

string buffer = string.Empty;
do
{
tryNo++;

if (ReceiveNow.WaitOne(timeout, false))
{
string t = port.ReadExisting();
buffer += t;
}

}
while (!buffer.EndsWith("\r\nOK\r\n") &amp;&amp; !buffer.EndsWith("\r\n&gt; ") &amp;&amp; !buffer.EndsWith("\r\nERROR\r\n") &amp;&amp; tryNo &lt; 10);
return buffer;
}
}
}

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

1
2
3
4
5
:begin
ping -n 1 192.168.3.69 || Goto else
exit
:else
C:\SMS\SendSMS.exe COM1 9600 89********* "sveta_net"

Сохраняем код в файле с расширением bat.

3. Создаем назначенное задание, я сделал выполнение под отдельным пользователем, чтобы не было заметно. Периодичность 5 минут.

Статья написана автором Галиев Руслан

Webrisk error

В консоли при каждом запросе выдается предупреждение

1
WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true</span>

Ошибка связана с проблемой в сервере , решается исправлением файла lib/webrick/httpresponse.rb. 

Решение

Статья написана автором Галиев Руслан

Проблема при запуске сервера Rails

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@zabbix:~/ruby/demo_app# rails s
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/execjs-1.4.0/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a Ja vaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavai lable)
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/execjs-1.4.0/lib/execjs.rb:5:in `
&lt;module:ExecJS&gt;'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/execjs-1.4.0/lib/execjs.rb:4:in `&lt;top (required)&gt;'

from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `require'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `
&lt;top (required) &gt;'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `require'

from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `&lt;top (required) &gt;'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/coffee-rails-3.2.2/lib/coffee-rails.rb:1:in `
require'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/coffee-rails-3.2.2/lib/coffee-rails.rb:1:in `&lt;top (required)&gt;'

from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler/runtime.rb:68:in `require'
from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler/runtime.rb:68:in `
block (2 le vels) in require'
from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler/runtime.rb:66:in `each'

from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler/runtime.rb:66:in `block in re quire'
from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler/runtime.rb:55:in `
each'
from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler/runtime.rb:55:in `require'

from /usr/local/rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.2.1/lib/bundler.rb:128:in `require'
from /root/ruby/demo_app/config/application.rb:7:in `
&lt;top (required)&gt;'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands.rb:53:in `require'

from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands.rb:53:in `block in &lt;top (req uired)&gt;'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands.rb:50:in `
tap'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands.rb:50:in `&lt;top (required)&gt;'

from script/rails:6:in `require'
from script/rails:6:in `
&lt;main&gt;'

Решена следующим набором команд, операционная система Debian

1
2
3
4
5
6
apt-get install python g++ make
mkdir ~/nodejs && cd $_
wget -N http://nodejs.org/dist/node-latest.tar.gz
tar xzvf node-latest.tar.gz && cd `ls -rd node-v*`
./configure
make install
Статья написана автором Галиев Руслан

Просматриваем историю сообщений ICQ

История сообщений ICQ 6.x и ICQ 7.x находится в файле Messages.mdb (C:\Documents and Settings\%username%\Application Data\ICQ\%uin%).

Окрываем файл программой ICQ History Converter

Выбираем контакты, переписку с которыми нужно сохранить, исходный формат и нажимаем Save.

Статья написана автором Галиев Руслан

Включаем ip routing в Windows XP/2003

В Windows XP и Windows Server 2003 по умолчанию выключена маршрутизация TCP/IP пакетов. Включается она следующим образом:

В разделе реестра

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

Параметру IPEnableRouter задаем значение 1

Перезагружаем компьютер.

Рассмотрим несколько вариантов восстановления БД, в зависимости от того, насколько повреждены файлы БД зависит успешность того или иного метода. Все описанные способы были лично мной проверены на практике и все случаи восстановления, за исключением одного, были успешны. Используйте данное руководство на свой страх и риск, за совершенные вами действия ответственность несете, вы сами.

Итак, во-первых останавливаем службу SQL Server и копируем файлы базы данных (*.mdf и *.ldf) в другую папку, чтобы можно было восстановить их в случае неудачи.

Если у вас есть свежий актуальный бэкап, то дальше можете не читать, а просто восстановите БД из него, тем самым сэкономите драгоценное время, далее я приведу алгоритмы восстановления для разных версий SQL Server. Надеюсь вам это поможет, как в свое время помогло и мне.

Для всех версий SQL Server подойдет следующий вариант: делаем Detach database(отсоединить базу данных), удаляем журнал транзакций(файл с расширением ldf) и делаем Attach database(присоединить базу данных). В мастере выбираем наш mdf файл и жмем ОК.

Далее »

Статья написана автором Галиев Руслан

1C 7.7 Runtime Error

Проблема следующего рода, при открытии 1С в любом режиме выходит ошибка:

Решается следующим образом:

1) В папке SYSLOG базы данных открываем текстовым редактором файл 1cv7.mlg (журнал регистраций) и ставим в конце пробел, или любой другой символ. Пытаемся запустить базу.

2) Если не помог первый способ, то удаляем файл 1cv7.mlg

Статья написана автором Галиев Руслан

Снимаем защиту с Word документа

Пакеты Microsoft Word 2002(XP)/2003 содержат ошибку позволяющую снять защиту с документа, защищенного паролем. Следующая последовательность действий демонстрирует ошибку:
1.) Откройте документ в Word’е.
2.) Сохраните документ как Web-страницу и закройте
3.) Откройте HTML документ в Notepad’е.
4.) Выполните “поиск по” тэга <w:UnprotectPassword> и найдите строку, которая должна выглядеть примерно так: <w:nprotectPassword>ABCDEF01</w:UnprotectPassword>.
Сохраните значение пароля.
5.) Откройте оригинальный документ в каком-нибудь шестнадцатеричном редакторе.
6.) Найдите значение пароля и перезапишите его четырьмя 0x00.
7.) Снова откройте документ в Word’е и снимите защиту использовав пустой пароль.

Вариант второй:

1. Сохраните документ с формой в новом формате .docx (родной формат 2007 офиса)
2. Смените расширение на .zip
3. залезьте в архив, извлеките файл settings.xml
4. С помощью текстового редактора найдите и удалите тег <w:documentProtection … />
5. Запакуйте settings.xml обратно в zip
6. Переименуйте .zip обратно в .docx
7. Откройте .docx в ворде. Защиты нет.