Функция вернутьPDF(знач DocumentRef) Экспорт СтрокаJSON = Новый ЗаписьJSON; СтрокаJSON.УстановитьСтроку(); СтруктураЗнч = новый Структура; СтруктураЗнч.Вставить("apiKey","апи код новой почты"); СтруктураЗнч.Вставить("modelName","InternetDocument"); СтруктураЗнч.Вставить("calledMethod","printMarkings"); Соот = Новый Соответствие; массивДокументов = новый Массив; массивДокументов.Добавить(DocumentRef); Соот.Вставить("DocumentRefs",массивДокументов); СтруктураЗнч.Вставить("methodProperties",Соот); Настройка = Новый НастройкиСериализацииJSON; ЗаписатьJSON(СтрокаJSON, СтруктураЗнч,); исхстрокаJSON = СтрокаJSON.Закрыть(); Защищенное = Новый ЗащищенноеСоединениеOpenSSL; СоединениеHTTP = Новый HTTPСоединение("api.novaposhta.ua",,,,,,Защищенное); ЗапросHTTP = Новый HTTPЗапрос("/v2.0/json/"); ЗапросHTTP.УстановитьТелоИзСтроки(исхстрокаJSON,КодировкаТекста.UTF8); ЗапросHTTP.Заголовки.Вставить("Host","api.novaposhta.ua"); ЗапросHTTP.Заголовки.Вставить("Content-Type","application/json"); Результат = СоединениеHTTP.ВызватьHTTPМетод("POST",ЗапросHTTP); //.Получить(ЗапросHTTP); ВремФайлPDF = ПолучитьИмяВременногоФайла("pdf"); ДВ = Результат.ПолучитьТелоКакДвоичныеДанные(); ДВ.Записать(ВремФайлPDF); Возврат ВремФайлPDF; КонецФункции
Thursday, December 24, 2015
Получение PDF файла ЕН Новой почты
Простая функция по получению pdf для печати от новой почты
Tuesday, December 15, 2015
Работа с byte[]
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CentralLib.ConnectionFP; using CentralLib.DefaultPortCom; namespace TestComm { class Program { static void Main(string[] args) { byte DLE = 0x10; byte STX = 0x02; byte ETX = 0x03; byte[] bBytes = new byte[] {DLE, STX }; byte[] eBytes = new byte[] {DLE, ETX }; byte[] test1 = new byte[] { 00, 00, 16, 2, 0, 27, 1, 1, 97, 130, 16, 16, 16, 16, 3, 16, 16, 16, 3, 28, 170 }; PrintByteArray(test1); int positionPacketBegin = ByteSearch(test1, new byte[] { DLE, STX }); Console.WriteLine(positionPacketBegin); int positionPacketEnd = 0; int tCurrentPos = positionPacketBegin; int tPostEnd = -1; do { tCurrentPos++; tPostEnd = ByteSearch(test1, new byte[] { 16, 3 }, tCurrentPos); if (tPostEnd != -1) { tCurrentPos = tPostEnd; if (test1[tPostEnd - 1] != DLE) { break; } else if ((test1[tPostEnd - 1] == DLE) && (test1[tPostEnd - 2] == DLE)) { positionPacketEnd = tPostEnd; // break; } } } while (tCurrentPos < test1.Length) ; Console.WriteLine(positionPacketEnd); var unsigned = new byte[positionPacketEnd- positionPacketBegin+4]; Buffer.BlockCopy(test1, positionPacketBegin, unsigned, 0, positionPacketEnd - positionPacketBegin+4); PrintByteArray(unsigned); Console.ReadKey(); //DefaultPortCom initialPort = new DefaultPortCom(4); //ConnectionFP connFP = new ConnectionFP(initialPort); //connFP.Open(); //Provision proConn = new Provision(connFP); //proConn.ExchangeData(new byte[] { 16, 2, 0, 27, 1, 1, 97, 130, 16, 3, 28, 170 }); //Console.ReadKey(); //proConn.Dispose(); //connFP.Close(); } static void PrintByteArray(byte[] bytes) { var sb = new StringBuilder("new byte[] { "); foreach (var b in bytes) { sb.Append(b + ", "); } sb.Append("}"); Console.WriteLine(sb.ToString()); } static int ByteSearch(byte[] searchIn, byte[] searchBytes, int start = 0) { int found = -1; bool matched = false; //only look at this if we have a populated search array and search bytes with a sensible start if (searchIn.Length > 0 && searchBytes.Length > 0 && start <= (searchIn.Length - searchBytes.Length) && searchIn.Length >= searchBytes.Length) { //iterate through the array to be searched for (int i = start; i <= searchIn.Length - searchBytes.Length; i++) { //if the start bytes match we will start comparing all other bytes if (searchIn[i] == searchBytes[0]) { if (searchIn.Length > 1) { //multiple bytes to be searched we have to compare byte by byte matched = true; for (int y = 1; y <= searchBytes.Length - 1; y++) { if (searchIn[i + y] != searchBytes[y]) { matched = false; break; } } //everything matched up if (matched) { found = i; break; } } else { //search byte is only one bit nothing else to do found = i; break; //stop the loop } } } } return found; } } }
Tuesday, December 8, 2015
Sunday, November 22, 2015
Как в C# сделать подсчет контрольной суммы CRC16 используя CCITT2 -полином
Что то везет в последнее время на "качество оформленную документацию". И вот новая "стезя", работа с ИКС-маркетом и драйвером под виндоуз (хотя сейчас стало интересно, исправили ли они глюки в своем, может я даром долбаюсь????)
Вот вырезке из их документации:
Решение было сделано так:
0. спасибо утилите serial port monitor, за то что удалось посмотреть, как обмениваться между собой аппарат и утилита ИКС
1.найден был сайт с online калькулятором расчета CRC.
2. Благодаря калькулятору удалось понять какой метод шифрования необходимо использовать - CRC-CCITT (Kermit), ИКС что так сложно описать???
3. Найдено решение спасибо гугл и stackoverflow
оставлю код для необходимости:
Вот вырезке из их документации:
Контрольная сумма CRC16 использует CCITT2Вопрос, что так тяжело описать что и зачем используете??? Какой полином??? В общем спасибо за сутки разбора...
-полином (х16 + х12 + х5
+ 1) и расчитывается по
полям Номер, Код, Параметры, CS и ETX без дублирующих и заключительного DLE. В ответном пакете
CRC16 подсчитывается аналогично.
ЭККР записывает полученный Номер и Код в ответное сообщение. Если ЭККР получает
сообщение, в котором совпадают значения полей Номер и Код со значениями предыдущего
сообщения, то он не выполняет команду, а повторяет передачу предыдущего сообщения.
Пример вычисления CRC16 на Си:
void CalcCRC16(BYTE *Buf, WORD Size, WORD *CRC16)
{char V;
while(Size--) {
V = *Buf++;
INT_HI(*CRC16) ^= V;
V = (INT_HI(*CRC16) << 4) ^ INT_HI(*CRC16); INT_HI(*CRC16) = (V >> 4) ^ (V << 3) ^ INT_LO(*CRC16); INT_LO(*CRC16) = (V >> 5) ^ V;
}
}
Пример вычисления CRC16 на Паскале:
function CalcCRC16(DataByte: Byte; CRC16: word): word;
var
a:word;
begin
CRC16 := CRC16 xor DataByte;
a:=(CRC16 xor (CRC16 shl 4)) and $00FF;
Result:=(CRC16 shr 8) xor (a shl 8) xor (a shl 3) xor (a shr 4);
end;
Решение было сделано так:
0. спасибо утилите serial port monitor, за то что удалось посмотреть, как обмениваться между собой аппарат и утилита ИКС
1.найден был сайт с online калькулятором расчета CRC.
2. Благодаря калькулятору удалось понять какой метод шифрования необходимо использовать - CRC-CCITT (Kermit), ИКС что так сложно описать???
3. Найдено решение спасибо гугл и stackoverflow
оставлю код для необходимости:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { byte ETX = 0x03; byte DLE = 0x10; byte STX = 0x02; byte ASK = 0x06; //Crc16Ccitt crc16 = new Crc16Ccitt(x); // 10 02 46 00 ba 10 03 a8 a8 ..F.є..ЁЁ // 10 02 56 00 aa 10 03 98 fe ..V.Є..ю // 10 02 60 00 a0 10 03 80 04..`. ..Ђ. // 10 02 6b 32 00 00 00 00 63 10 03 3a e8 ..k2....c..:и // 10 02 6a 00 96 10 03 5c 3a ..j.–..\: // 10 02 73 32 00 00 09 00 52 10 03 e7 c8 ..s2....R..зИ // 10 02 5f 32 00 00 09 00 66 10 03 b7 94 .._2....f..·” // 10 02 74 00 8c 10 03 5e 3f ..t.Њ..^? // 10 02 75 32 00 00 00 00 59 10 03 9d c8 ..u2....Y..ќИ // 10 02 76 32 00 00 01 00 57 10 03 e6 c4 ..v2....W..жД //Array<byte[]> myList = new Array<byte[]>(); //myList.Add({ 0x10, 0x02, 0x46, 0x00, 0xba, 0x10, 0x03, 0xa8, 0xa8 }); //byte[] temp = { 0x10, 0x02, 0x56, 0x00, 0xaa, 0x10, 0x03, 0x98, 0xfe }; ArrayList myList = new ArrayList(); byte[] arrayofbytes = { 0x10, 0x02, 0x46, 0x00, 0xba, 0x10, 0x03, 0xa8, 0xa8 }; myList.Add(arrayofbytes); arrayofbytes = new byte[] { 0x10, 0x02, 0x56, 0x00, 0xaa, 0x10, 0x03, 0x98, 0xfe }; myList.Add(arrayofbytes); arrayofbytes = new byte[] { 0x10, 0x02, 0x76, 0x32, 0x00, 0x00, 0x01, 0x00, 0x57, 0x10, 0x03, 0xe6, 0xc4 }; myList.Add(arrayofbytes); byte[] bytebegin = { DLE, STX}; byte[] byteend = {DLE, ETX}; Crc16 testCRC16 = new Crc16(Crc16Mode.CcittKermit); //ushort max = ushort.MaxValue; //for (ushort x = 0; x <= max - 1; x++) //{ //Console.WriteLine(x); foreach (byte[] tempa in myList) { //Console.WriteLine(PrintByteArray(tempa)); byte[] tempb = returnWithOutDublicateETX(tempa); var searchBegin = PatternAt(tempb, bytebegin); if (searchBegin == null) continue; var searchEnd = PatternAt(tempb, byteend); if (searchEnd == null) continue; var newArr = tempb.Skip((int)searchBegin+2).Take((int)searchEnd-2).ToArray(); byte[] a = new byte[newArr.Length+1]; newArr.CopyTo(a, 0); a[newArr.Length] = ETX; //Console.WriteLine(PrintByteArray(a)); var control = tempb.Skip((int)searchEnd+2).Take(2).ToArray(); //Console.WriteLine(PrintByteArray(control)); //byte[] crc = BitConverter.GetBytes(compute_fcs(a, x)); byte[] crc = testCRC16.ComputeChecksumBytes(a); if ((crc[0] == control[0]) && (crc[1] == control[1])) { Console.WriteLine(PrintByteArray(tempa)); Console.WriteLine(PrintByteArray(a)); Console.WriteLine(PrintByteArray(control)); // Console.WriteLine(x); Console.WriteLine(PrintByteArray(crc)); Console.ReadKey(); //break; } } //break; //} Console.WriteLine("The End!!!!"); Console.ReadKey(); } static byte[] returnWithOutDublicateETX(byte[] source) { return returnWithOutDublicate(source, new byte[] { 0x10, 0x10 }); } static byte[] returnWithOutDublicate(byte[] source, byte[] pattern) { List<byte> tReturn =new List<byte>(); int sLenght = source.Length; for (int i = 0; i < sLenght; i++) { if (source.Skip(i).Take(pattern.Length).SequenceEqual(pattern)) { tReturn.Add(source[i]); i++; } else { tReturn.Add(source[i]); } } return (byte[])tReturn.ToArray(); } static int? PatternAt(byte[] source, byte[] pattern) { for (int i = 0; i < source.Length; i++) { if (source.Skip(i).Take(pattern.Length).SequenceEqual(pattern)) { return i; } } return null; } static string PrintByteArray(byte[] bytes) { var sb = new StringBuilder("new byte[] { "); foreach (var b in bytes) { sb.AppendFormat("{0:x2}", b); sb.Append(" "); } sb.Append("}"); return sb.ToString(); } /// public enum Crc16Mode : ushort { Standard = 0xA001, CcittKermit = 0x8408 } public class Crc16 { static ushort[] table = new ushort[256]; public ushort ComputeChecksum(params byte[] bytes) { ushort crc = 0; for (int i = 0; i < bytes.Length; ++i) { byte index = (byte)(crc ^ bytes[i]); crc = (ushort)((crc >> 8) ^ table[index]); } return crc; } public byte[] ComputeChecksumBytes(params byte[] bytes) { ushort crc = ComputeChecksum(bytes); return BitConverter.GetBytes(crc); } public Crc16(Crc16Mode mode) { ushort polynomial = (ushort)mode; ushort value; ushort temp; for (ushort i = 0; i < table.Length; ++i) { value = 0; temp = i; for (byte j = 0; j < 8; ++j) { if (((value ^ temp) & 0x0001) != 0) { value = (ushort)((value >> 1) ^ polynomial); } else { value >>= 1; } temp >>= 1; } table[i] = value; } } } //// } }
Monday, October 19, 2015
Уведомления пользователей по мылу о смене пароля в домене
И опять я один....
Ситуация, есть домен, есть много пользователей которые забывают сменить пароль, не смотря на все упоминания системы, в связи с этим скрипт, напоминающий по почте
взято отсюда, в общем спасибо RobertPearman
Ситуация, есть домен, есть много пользователей которые забывают сменить пароль, не смотря на все упоминания системы, в связи с этим скрипт, напоминающий по почте
взято отсюда, в общем спасибо RobertPearman
################################################################################################################# # # Version 1.3 April 2015 # Robert Pearman (WSSMB MVP) # TitleRequired.com # Script to Automated Email Reminders when Users Passwords due to Expire. # # Requires: Windows PowerShell Module for Active Directory # # For assistance and ideas, visit the TechNet Gallery Q&A Page. http://gallery.technet.microsoft.com/Password-Expiry-Email-177c3e27/view/Discussions#content # ################################################################################################################## # Please Configure the following variables.... $smtpServer="rl-mx-1.rl.int" $expireindays = 10 $from = "Administrator <dyachok@rl.ua>" $logging = "Enabled" # Set to Disabled to Disable Logging or Enabled $logFile = "c:\log\mylog.csv" # ie. c:\mylog.csv $testing = "Disabled" # Set to Disabled to Email Users $testRecipient = "dyachok@rl.ua" $date = Get-Date -format ddMMyyyy # ################################################################################################################### # Check Logging Settings if (($logging) -eq "Enabled") { # Test Log File Path $logfilePath = (Test-Path $logFile) if (($logFilePath) -ne "True") { # Create CSV File and Headers New-Item $logfile -ItemType File Add-Content $logfile "Date,Name,EmailAddress,DaystoExpire,ExpiresOn" } } # End Logging Check # Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired Import-Module ActiveDirectory $users = get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false } $DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge # Process Each User for Password Expiry foreach ($user in $users) { $Name = $user.Name $emailaddress = $user.emailaddress $passwordSetDate = $user.PasswordLastSet $PasswordPol = (Get-AduserResultantPasswordPolicy $user) # Check for Fine Grained Password if (($PasswordPol) -ne $null) { $maxPasswordAge = ($PasswordPol).MaxPasswordAge } else { # No FGP set to Domain Default $maxPasswordAge = $DefaultmaxPasswordAge } $expireson = $passwordsetdate + $maxPasswordAge $today = (get-date) $daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days # Set Greeting based on Number of Days to Expiry. # Check Number of Days to Expiry $messageDays = $daystoexpire if (($messageDays) -ge "1") { $messageDays = "в течении " + "$daystoexpire" + " дней." } else { $messageDays = "сегодня." } # Email Subject Set Here $subject="Ваш пароль устареет $messageDays" $encoding = [System.Text.Encoding]::UTF8 # Email Body Set Here, Note You can use HTML, including Images. $body =" Уважаемый $name, <p> Рекомендуется изменить ваш пароль, пароль необходимо изменить $messageDays<br> Чтобы изменить пароль на доменном компьютере, нажмите клавиши Ctlr+ALt+Delete <br> (или же вы работаете на удаленно рабочем столе (терминале), нажимет клавиши Ctlr+ALt+End) <br> и выберите 'Сменить пароль...' <br> <p>С уважением, robot<br> </P>" # If Testing Is Enabled - Email Administrator if (($testing) -eq "Enabled") { $emailaddress = $testRecipient } # End Testing # If a user has no email address listed if (($emailaddress) -eq $null) { $emailaddress = $testRecipient }# End No Valid Email # Send Email Message if (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays)) { # If Logging is Enabled Log Details if (($logging) -eq "Enabled") { Add-Content $logfile "$date,$Name,$emailaddress,$daystoExpire,$expireson" } # Send Email Message Send-Mailmessage -smtpServer $smtpServer -from $from -to $emailaddress -subject $subject -body $body -bodyasHTML -priority High -Encoding $encoding } # End Send Message } # End User Processing # End
Saturday, October 17, 2015
Скрипт запуска необходимых Jobs из агента SQL
Возникла задача когда на MS SQL сервере необходимо перезапустить часть job, вручную делать эту работу не хотелось, вот реализовал скрипт по работе:
Основная схма работы скрипта, найти задачу которая начинается на 'Reset' и запустить ее.
DECLARE @SQL NVARCHAR(MAX) DECLARE @job SYSNAME DECLARE jobs_cursor CURSOR FOR SELECT 'EXEC msdb.dbo.sp_start_job ''' + s.NAME + '''' FROM msdb..sysjobs s WHERE s.NAME LIKE 'Reset%' OPEN jobs_cursor FETCH NEXT FROM jobs_cursor INTO @job WHILE @@Fetch_Status = 0 BEGIN PRINT @job EXEC sp_executesql @job_name = @job FETCH NEXT FROM jobs_cursor INTO @job END CLOSE jobs_cursor DEALLOCATE jobs_cursor
Основная схма работы скрипта, найти задачу которая начинается на 'Reset' и запустить ее.
Thursday, October 8, 2015
Проблемы в XCODE с GIT
Столкнулся с проблемой в работе с XCODE на Маке и GIT, после перегрузки слетали настройки
если в первый раз все отработало нормально, то на следующий раз при добавление в GIT возникала проблема и уже не решалась запуском команд.
Решение добавить в файл config который находить в директории .git следующие строки:
git config --global user.name "Mikola Dyachok"git config --global user.email "ndyachok@gmail.com"если в первый раз все отработало нормально, то на следующий раз при добавление в GIT возникала проблема и уже не решалась запуском команд.
Решение добавить в файл config который находить в директории .git следующие строки:
[user]
name = Nike Dyachok
email = ndyachok@gmail.com
Monday, October 5, 2015
Результат теста на СПАМ by mail-tester.com
Интересный механизм проверки писем на спам и совместимость.
Результат теста на СПАМ by mail-tester.com: "http://www.mail-tester.com/web-mbV3eD"
'via Blog this'
Результат теста на СПАМ by mail-tester.com: "http://www.mail-tester.com/web-mbV3eD"
'via Blog this'
Sunday, October 4, 2015
Thursday, October 1, 2015
1С статьи - 1CWorks.com
Как настроить HTTP сервер на 1С.
1С статьи - 1CWorks.com:
Одна из редких статей где написано как и что просто сделать.
Делаем JSON и новые обмены
'via Blog this'
1С статьи - 1CWorks.com:
Одна из редких статей где написано как и что просто сделать.
Делаем JSON и новые обмены
'via Blog this'
Subscribe to:
Posts (Atom)