воскресенье, 10 июня 2018 г.

Разбиение файла импорта 1С на сайт на части

Вводная: Есть хостинг, есть сайт у сайта есть импорт товаров из 1С. Из 1С УТ файлы выгружаются, через стандартный механизм обмена с web-сайтом.
Но скрипту импорта периодически не хватает памяти, чтобы загрузить всё. И падает с ошибкой. Было решено "разбивать" файлы на части по 1000 товаров. И загружать последовательно.

Решение:
            Directory.EnumerateFiles(Environment.CurrentDirectory)
                     .Where(file => Path.GetFileName(file).StartsWith("output")).ToList()
                     .ForEach(File.Delete);
            
            XDocument source = XDocument.Load("import.xml");

            int iteration = 0;

            while (iteration * 1000 < source.Descendants("Товар").Count())
            {
                XDocument xdoc = new XDocument(source);

                var allElements = xdoc.Descendants("Товар").OrderBy(a => a.Element("Ид")?.Value);

                var whatToLeave = xdoc
                                    .Descendants("Товар")
                                    .OrderBy(w => w.Element("Ид")?.Value)
                                    .Skip(1000 * iteration).Take(1000);

                allElements.Except(whatToLeave).ToList().ForEach(e => e.Remove());

                iteration++;
                xdoc.Save($"output{iteration}.xml");
            }

среда, 17 января 2018 г.

Принтер HP P1102W не печатает через RDP

Вводная: Есть терминальный сервер - Windows 2008 R2 64 bit, стандартная редакция. И клиент - Windows 7 Pro, 32 бита. На клиенте установлен принтер HP P1102W. При подключении через RDP, принтер отказывается работать. Пробрасывается, но не печатает. На самом клиенте проблем с печатью нет.

Решение:

  1. Закрыть сеанс (именно выход из системы) и открыть заново - не помогло
  2. Перезагрузить клиент и сервер - не помогло
  3. Проверил корректность драйверов и ОДИНАКОВОСТЬ версии на клиенте и на сервере. Самое простое - и там, и там удаляем и ставим заново. Для сервера ставим и 32 битную версию, и 64 - не помогло
  4. Устанавливаем политику - запускаем gpedit.msc и по пути Computer Configuration -> Administrative templates -Windows Components -> Remote Desktop Services > Remote Desktop Session Host -> Printer Redirection отключаем опцию "Use Terminal Services Easy Print Driver First" - не помогло (но было странно, ОПЦИЯ НЕ ДЕЙСТВОВАЛА - в свойствах принтера всё равно оставался Easy Print Driver)
  5. Добавил ключ реестра UseUniversalPrinterDriverFirst по пути HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services тип REG_DWORD, создал его и установил в значение "4" ("3" - включен) - помогло и всё заработало.


PS: Ещё в интернетах встречал совет поменять драйвера на XPS, но на них очень сильно начинала тормозить клиентская 1С в RDP сеансе. Но вам может быть поможет.

PS2: После каждого шага перезагружался.

вторник, 16 января 2018 г.

Ежедневная смена пароля на роутере Mikrotik на пароль построенный по дате

Вводная: "Иван, у меня есть тривиальная задача для микротик. Мне нужно ежедневно в 12 часов ночи менять пароль на вай-фае на текущую дату без точек (16012017 например вот так). Я так думаю, что можно решить скриптом, но не знаю, честно говоря, с какой стороны к этой проблеме подойти"

Решение: Идею взял на http://kvas.livejournal.com/679174.html

:local wifiProfile wifiMyProfile

:local dateNow [/system clock get date];
:local dateNowDay [:pick $dateNow 4 6]
:local dateNowMonth [:pick $dateNow 0 3]
:local dateNowYear [:pick $dateNow 7 11]

:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)

:if ( $dateNowMonth < 10 ) do={
:set $dateNowMonth ("0"."$dateNowMonth");
};

:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"

:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");
:log info message="==== NEW PASSWORD: $newPassword"

/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword


Всё это добавляется в System-Script и вызывается в 0:05 через шедулер.

понедельник, 15 января 2018 г.

Удаление папок по времени

Вводная: Делаю для себя небольшую систему резервного копирования. Задача - удалять старые папки-даты при добавлении новых. По алгоритму - оставляем только 15 последних папок, остальные удаляем.

Решение: На вход подаётся List класса BackupDirectoryInfo. Просто DirectoryInfo не используется, так как в качестве хранилища бэкапа используются и файловые ресурсы, и облачные хранилища. Если требуется использовать только папки на физическом диске, то можно обойтись одним DirectoryInfo.

public abstract class BackupDirectoryInfo
{
     public string Name;
     public string Path;
     public DateTime CreatedTime;

     public abstract void Delete();
}
private void DeleteOldFolder(List<BackupDirectoryInfo> dirs )
{
    var orderedList = dirs.OrderByDescending(x => x.CreatedTime)
                      .Take(15);

    var dirToDelete = dirs.Except(orderedList).ToList();
            
    dirToDelete.ForEach(x => x.Delete() );
}

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

Заполнить базу в MS SQL тестовыми данными

Вводная: сабж.

Решение:
USE [testBackup]
GO

DECLARE @count INT 
SET @count = 1

WHILE @count <= 100000
BEGIN
INSERT INTO [dbo].[Table_1]
    SELECT 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [Test]
    SET @count += 1
END
GO

Ну и удаление
USE [testBackup];
GO
DELETE FROM [dbo].[Table_1];
GO

вторник, 19 декабря 2017 г.

C# - отправить монитор в сон

Вводная: Есть телевизор, он используется исключительно как монитор и подключен к компьютеру. Настроено автовыключение при пропадании сигнала и соответственно включение при его появлении. Но есть несколько моментов:
1) Если выключаешь не с пульта, а с кнопки на телевизоре, то при появлении сигнала сам не включается - надо обязательно опять её нажать вручную.
2) На компьютере настроен таймаут 15 минут - его менять не хотелось. А иногда ждать эти пятнадцать минут не хочется. А вставать за пультом, также не хочется. (к примеру когда вечером ложимся спать) - ну и пульт получается только для включения-выключения.
3) Компьютер не выключается никогда.

Решение: Была написана небольшая программа на C#, которая при запуске просто отправляет монитор в сон. Код -

    class Program
    {
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, 
                                         int msg, 
                                         IntPtr wParam, 
                                         IntPtr lParam);
 
        static void Main()
        {
            var hwndBroadcast  = (IntPtr)0xFFFF;
            var scMonitorpower = (IntPtr)0xF170;
            var wmSyscommand   = 0x0112;
 
            SendMessage(hwndBroadcast, wmSyscommand, scMonitorpower, (IntPtr)2);
        }
    }

Несколько примечаний -
1) Проект консольный, но "Output type" windows application - по этому никаких окон не появляется при запуске
2) Админских прав не требует
3) Никаких дополнительных библиотек не требует

понедельник, 19 июня 2017 г.

Настройки IPTV для роутеров Mikrotik в сети TTK

Как настроить IPTV в ТТК.

1. ОЧЕНЬ рекомендую в случае использования IPTV подключать его проводом. Иначе эфир у вас будет мягко говоря засран. Далее рассматривается схема с двумя бриджами - bridgeEthernet и bridgeWifi (конечно можно и не создавать бриджи, а оперировать сразу интерфейсами, к примеру ether2 (остальные будует подключены по master-slave) и просто wlan1), но лучше рассматривать бридж, так как есть и 2011, и мультидиапозонные роутеры (где WiFi 2.4+5). У нас будет bridgeEthernet, так как телевизор подключен проводом.

2. Устанавливаем пакет multicast.

3.
/routing igmp-proxy interface
add interface=bridgeEthernet
add alternative-subnets=0.0.0.0/0 interface=ether1 upstream=yes

В качестве апстрима выбираем физический интерфес в который у нас приходит провод от провайдера -
есть два важных момента -
а) НИ В КОЕМ СЛУЧАЕ НЕ ПППОЕ! 
б) ДОЛЖЕН БЫТЬ ОБЯЗАТЕЛЬНО НАЗНАЧЕН ЛЮБОЙ СТАТИЧЕСКИЙ АЙПИШНИК!!!

В качестве локального интерфейса выбираем нужный нам интерфейс в локальной сети. Здесь также есть нюанс - ОБЯЗАТЕЛЬНО НА ЭТОМ ИНТЕРФЕЙСЕ ДОЛЖЕН БЫТЬ НАЗНАЧЕН АЙПИШНИК!!!

То есть на обоих интерфейсах должны быть айпишники из домашних диапазонов (Из разных).
/ip address
add address=192.168.123.1/24 interface=bridgeEthernet network=192.168.123.0
add address=192.168.10.10/24 interface=ether1 network=192.168.10.0

Если IPTV нужен через WiFi - ОБЯЗАТЕЛЬНО включите MulticastHelper. Но старайтесь чтобы не потребовалось.

Также надо настроить параметры IGMP Proxy

/routing igmp-proxy
set query-interval=1m5s query-response-interval=5s quick-leave=yes

Всё. Можете проверять работу IPTV.

суббота, 14 января 2017 г.

"Колхозное" крепление Mikrotik SXT

Иногда нужно срочно устанавливать точку доступа Mikrotik SXT, причём не на мачту, а на стену. Но нормального крепления ( https://routerboard.com/QM ) нет. Да и вообще никаких креплений, кроме стандартного, нет. А магазины где можно купить что-либо для микротика далеко.

В таком случае может помочь использование такой штуки как "ответная часть петли". Стоит рублей 50. Отверстия для крепления есть. Нагрузку в виде антенны точно выдержит :) Продаётся в разных хозяйственных и строительных магазинах.


четверг, 1 декабря 2016 г.

Тестовая задача C# - создание самораспаковывающегося архива

Реализовать программу, которая создаёт самораспаковывающийся архив.

  1. Тип результирующего файла - exe.
  2. Одного файла должно быть достаточно, чтобы передать его для извлечения в другом месте.
  3. При старте спрашивает папку в которую распаковать.
  4. Сжатие любое, но должно присутствовать.
  5. Программа должна уметь создавать архив из произвольного количества папок и файлов, произвольного типа.

Сторонние библиотеки использовать нелья, только Net.Framework (любая версия на ваш выбор).


пятница, 28 октября 2016 г.

Функционал tool snmp-[get|walk] в новых версиях Mikrotik

В последнем релиз кандидате 6.38rc19 появилась интересная функция -
snmp - added basic get and walk functionality "/tool snmp-[get|walk]";

Теперь можно получить информацию о другом устройстве через snmp. Что открывает некоторые интересные возможности (можно сделать небольшой мониторинг на основе микротика).

Для примера узнать занятую память на другом микротике (с адресом 192.168.0.1 и включенным SNMP без авторизации), можно простым запросом -
tool snmp-get address=192.168.0.1 oid=.1.3.6.1.2.1.25.2.3.1.6.65536

С помощью запроса
tool snmp-walk 192.168.0.1
Мы можем получить все значения всех OID которые есть в устройстве (лучше так не делать, а выводить только нужные ИМХО)

Какие плюсы -

  • мы не ограничены ПРОИЗВОДИТЕЛЕМ, можем получать информацию и от систем Windows, Linux, Cisco и всех прочих гд реализовано SNMP.


Какие минусы -

  • я пока не понял, как положить значение в какую-нибудь переменную. Операторы put, get, set, find и прочие не работают (или я не понял как из завести, если кто знает поправьте - добавлю в описание). Как костыль записывать вывод в файл и его парсить
  • Нет реализации snmp-set, как я надеюсь пока. Потому что лично у меня есть оборудование которое его использует.