четверг, 24 февраля 2022 г.

1C: И Драйвер Гексагон (печать на термо принтерах)

   Имеется у нас в наличии принтера Zebra. Принтера нормальные надежные но для быстрой печати из 1С нужен спец. драйвер. Такой в комплекте к используемой нами конфиругации был. Единсвенный момент он платный и нужно покупать лицензию. С покупкой лицензии проблемм небыло и первичная активация прошла успешно, и был это 2020 год...  Проблеммы начались активаций продленных лицезий. А имеено драйвер позволяет активировать лицензию онлайн и офлайн. И вот тут возникли трудности. 

Используется на машинах с Zebr'ой Windows 7 (ага).  Корневые сертификаты на ней больше не обновляются. Сервер активации использует сертификат от Let's Encrypt.    И вот из за того что Windows 7 не в курсе о том, что поменялся промежуточной удостоверяющий сертификат у Let's Encrypt и возникли проблеммы с активаций лицензий как онлан так и офлайн. 

После обновления корневых сертфикатов на Windows 7 переносом с Windows 10 проблемма была решена.

понедельник, 17 октября 2016 г.

Увеличительное стекло.

Ради спортивного интереса (и для того что бы было), сделал вот такое вот - https://play.google.com/store/apps/details?id=cav.magnifierlite 
приложение. Собственно это увеличительное стекло с подстветкой и возможностью съемки рассматриваемого объекта. Приложение для Андройда.

суббота, 5 марта 2016 г.

О базах и инструментах

Ковырясь с разными базами, внезапно начинаешь все больше ценить Firebird и особенно IBExpert. Firebird не дает тебе стрелять себе в ногу а IBExpert чертовски удобная среда.

вторник, 8 сентября 2015 г.

Ubuntu 12.04 и внезапно кончившеся место

В один прекрасный осенний день ничего не предвещало страшного, как вдруг зазвонил телефон. 
-"у нас чего то почта ошибку пишет при присоеденении файла". 
-"гм.... а файл нормальный ?"
-"да открывается нормально, но при попытке присоеденить пишет ошибку"

четверг, 21 мая 2015 г.

Проброс паралельного порта (lpt) в VirtualBox

VirtualBox достаточно хорошая система виртуализации и в последних версиях (4.3.28) позволяет пробросить разное из хост системы в гостеву. Много чего кроме паралельного порта. Вернее его можно пробросить через VBoxManager и если хост система Windows. 

Задача стояла пробросить паралельный прорт из Linux хост системы в Windows гостя (для заливки шрифтов на принтер Zebra). После непродолжительного гугления был найден следущий рецепт : http://blog.my1matrix.org/2013/04/parallel-port-on-virtualbox.html

Но так как там на иностранном языке :) вот вам вольный перевод на русский :

Откроем терминал и поглядим если у нас нужные нам устройства:

dmesg | grep parport

Если в выводе есть что то похожее то нам повезло :

[   10.303217] parport_pc 00:08: reported by Plug and Play ACPI
[   10.303261] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
[   10.422795] lp0: using parport0 (interrupt-driven).

 
Нам интересны строчки с parport0 а так же мы видим привязку к lp0

Устанавливаем паралельный порт в виртуальную машину. Виртуальная машина должна быть сосздана и установленна. Все операции выполняются на не запущенной машине.

VBoxManage modifyvm SM --lptmode1 /dev/parport0 
VBoxManage modifyvm SM --lpt1 0x378 7

 Здесь SM - это имя нашей машины а parport0 и 0x378 и 7 мы взяли из вывода выше.

Возможно придется добавить разрешения для на порт. 
Таже выполняем следующие команды :

VBoxManage setextradata SM "VBoxInternal/Devices/parallel/0/LUN#0/Config/DevicePath" /dev/parport0 
VBoxManage setextradata SM "VBoxInternal/Device/parralel/0/LUN#0" HostParallel
VBoxManage setextradata SM "VBoxInternal/Device/parralel/0/Config/IOBase" 0x378
VBoxManage setextradata SM "VBoxInternal/Device/parralel/0/Confgin/IRQ" 7
Последнее что возможну нужно сделать это выгрузить модуль устройства

rmmod lp 

Данное действие нужно что бы система отдала порт виртуалке. 






понедельник, 17 ноября 2014 г.

Первое впечатление о Oculus Rift

Опробовал в кототком тесте данное устройство. Впечатления противоречивые. На обычные очки не одеть. Можно конечно подогнать линзами на самом устройстве но это не всегда удобно. Использовать устройство стоя без страховки сложно. Организм начинает считать, что что то не то происходит и соотвественно реагировать. Возможно сидя было бы проще и удобнее. Без системы как в "Газонокосильщике" использовать сложно и чревато. 
Вот как то так.

четверг, 27 марта 2014 г.

Себе на заметку: Определение номера колонки в JTable по которой произошол клик мышью.

В одном из проектов понадобилось переключать внутрению логику обработки редактирования данных в JTable в зависимости от клика на колонки.
В результате получилось следующее :

 JTable grid.getTableHeader().addMouseListener(new HeaderClick()); 

вешаем слушателя на заголовок таблицы.

класс HeaderClick выглядит следующим образом:

class HeaderClick implements MouseListener {

        @Override
        public void mouseClicked(MouseEvent me) {
            if (me.getSource() instanceof JTableHeader){
                TableColumnModel cl=((JTableHeader) me.getSource()).getColumnModel();
                if (cl.getColumn(cl.getColumnIndexAtX(me.getX())).getHeaderValue().toString().equals("Брутто")){
                    Glu.setCFG("CardSpecDirection", "brutto");
                    cl.getColumn(cl.getColumnIndexAtX(me.getX())).setHeaderRenderer(null);
                   
                }

            }

        }
 номер колонки по заголовку которой мы кликнули получаем с помошью -
cl.getColumnIndexAtX(me.getX())  т.е. me.getX() - это положение мыши и по положению мыши мы получаем номер колонки в заголовке.
 

вторник, 25 февраля 2014 г.

Себе на заметку: загрузка и выгрузка файлов с FTP

Загрузка файлов с FTP сервера

import os
import ftplib
# сохранем файлы по маске и ftp сервера
# из корня в папку expath
def copyData(expath,ftp_srv,user=None,passw=None,mask='.txt'):
    conn=ftplib.FTP(ftp_srv,user,passw)
    dir_res=[]
    conn.dir('.',dir_res.append)
    files=[f.split(None,8)[-1] for f in dir_res if f.startswith('-')]
    print files
    for f in files :
        if f.find(mask)!=-1:
            outf=open(expath+os.sep+f,'wb')
            try:
                conn.retrbinary('RETR %s' % f,outf.write)
            finally:
                outf.close()
    conn.quit()
Сохранение файлов на FTP сервере

import ftplib
import os

local_file=os.listdir('./exp')

ftp_srv='192.168.1.1'
user='ftp'
passw='1234'
# каталог на FTP сервере куда мы закидываем данныне remote_path='xt1'

conn=ftplib.FTP(ftp_srv,user,passw)

if len(remote_path)!=0:
    conn.cwd(remote_path)

for l in local_file:
    print l
    f=open('./exp/'+l,'rb')
# вот ради это все остальное и затевается     conn.storbinary('STOR '+l,f)
    f.close()
    pass

conn.quit()

пятница, 24 января 2014 г.

Рабочее место официанта..

Вот примерно такой дизайн у рабочего места официанта для кассовой системы Unicash. (Делается под Touch Screen)

вторник, 18 июня 2013 г.

Vala и конфиг в json

Как то в один прекрасный день потребоволось хранить дерево в одной программе на vala. И обуяла меня жажда велосипедостроения (ну за одно и потренироваться в работе с json оказалось неплохо).  В результате родился ниже приведенный класс. Класс умеет проверять наличие ключа (не значения) в json - структуре. Читать с диска и сохранять на диск результат а так же работать с строковыми значениями. Остальные значения допустимые в json  в данном примере не включены из за эконимии места, и строкового типа хватить для показа работоспособности.

Так как используется модуль Json то при сборке проэкта не забудьте указать пакет json-glib-1.0. К примеру строка сборки тестового примера у меня выглядит как vala --pkg json-glib-1.0 -o test_config_d -g
Для разделения веток конфига используется символ "/".
К примеру чтение значение cfg.get_string_value("Key 1/Key 2/Key 3") примененое к json файлу вида
 {
           "Key 1":{"Key 2":{"Key 3":"value 2"},
                          "Key 4":"value 1"
                        }
}
 вернет значение value 2

четверг, 14 марта 2013 г.

Zebra Ununtu и проблемма с "прыгающими" принтерами

При открытии нового объекта возникла забавная проблема. На операторской машине стоит Ubuntu 12.04 и подключены 2 принтера по usb. В Ubunt'е при подключении принтеров по usb создаются каналы вида /dev/usb/lpxx , где xx - номер от 0 и дальше. Данная особенность позволяет печатать из программ которые про cups ничего не знают. К примеру cat 1.txt > /dev/usb/lp0 выведет файл 1.txt на печать. Данная особенность использовалась для печати на принетера Zebra из под wine. Ясно что это костыль но вот если печатать через cups то растеризатор делает очень забавные весчи с тем что на него отправили. Правда делает он, что попало при 203 dpi, если поставить 300 dpi то все нормально, но только возникают проблемы с тем что картинка получается в 300 dpi а принтер умеет 203 dpi и не все что можно было вывести на печать входит. Это была только присказка. 

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

Добавлен собраный пакет MT Loadera (теперь клубничный !!!)

Добавлен новый пакет MT Loadera. В текущей версии сделана работа с загрузкой - выгрузкой программируемых товарных кнопок на весах.

Работать с нопками луште всего при заргуженом списке PLU (иначе не имеет смысла). При сохранении списка PLU сохраняются и назначенные конпки.

четверг, 22 ноября 2012 г.

Работа Gtk3 приложения в браузере

Заинтересовал меня собственно вопрос "а как же работает проброс приложения GTK 3 в браузер". Как оказалось в Ubuntu 12.04 в Gtk 3  Gio.Brodway не включен. Гугление дало следующий рецепт :
sudo apt-get-repository ppa:malizor/gtk-brodway
sudo apt-get update
sudo apt-get upgrade
Запуск из командной сроки: 
GDK_BACKEND=brodway UBUNTY_MENUPROXY=LIBOVERLAY_SCROLLBAR=0 gcalctool

После чего по порту 8080 в браузере становится доступно наше запущенной приложение.
Иструкция по включению взята здесь.
Проверялось кроме системных Gtk3 приложений, собственное написанное на Python. Из особенностей следует заметить следующее. Окошки не могут изменять свой размер. Из кнопок доступно только закрытие приложения, минимизация и максимизация не доступы.

четверг, 14 июня 2012 г.

Весы самооблуживания Metler Toledo

Получили весы Metler Toledo Tiger 3610S. Весы предназначены для систем самообслуживания.  Самое веселое было в них то, что клавиатура у них по умолчанию находится в режиме выбора PLU товара и в режим настройки просто так не войдешь.
После длительного рысканья в интернете был найден документ "особенности весов самообслуживания",  где было подтвержнение догадкам по поводу режимов и указана кнопка переключения режима. Кнопка переключения режима это START+MODE или START+CODE где START находится в верхнем левом углу клавиатуры. На 100 клавишной клавиатуре CODE 7 слева в первом верхнем ряду. Кнопка MODE 9 слева во втором верхнем ряду. 
Как всегда после того как было найдено решение проблемы, было найдено и подтверждение альтернативного способа попадания в меню настройки, а именно если при включении весов зажать кнопку CODE то так же попадаем в меню настройки.
Все веселье в ситуации в том что с весами руководство пользователя лежало. Но вот только оно на всю серию Tiger без указания особенностей той или иной модели.

воскресенье, 11 марта 2012 г.

Работа с весама Metler Toledo Tiger в Linux (продолжение)

Как уже было сказано ниже на http://code.google.com/p/metler-toledo-tiger-loader/ был начат проект по создания аналога SPCT2   (штатная система управления весами). В отличие от SPCT2 моя утилита имеет возможность не только загружать настройки и данные на весы но и читать из весов. 
При чтении списка товаров система сама определяет двух или однострочные весы (с записью пока только на 2 строчные). Настройки весов только для чтения. Остальные параметры можно читать и писать без проблем. 

воскресенье, 8 января 2012 г.

Получение первого и последнего дня месяца на основе последнего дня предидущего месяца

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

#!/usr/bin/python
#-*- coding:utf-8 -*-
import datetime,calendar

def changePeriod(enddate):
    rt=[]
    delta=datetime.timedelta(days=1)
    enddate=enddate+delta
    rt.append(enddate)
    year,month,day=enddate.timetuple()[:3]
    countday=calendar.monthrange(year,month)[1]
    delta=datetime.timedelta(days=countday-1)
    enddate=enddate+delta
    rt.append(enddate)
    return rt


se=datetime.date(2011,10,31)
print changePeriod(se)

В функцию changePeriod передает дату последнего дня в виде объекта datetime на выходе получаем кортеж из двух элементов типом datetime содержащих первый и последний день следующего месяца

Виджет выбора даты (GTK)

В стандартном наборе виджетов GTK+ 2.xx нет управляемого виджета для вызова даты. Виджет gtk.Calendar нуждается в контейне верхнего уровня. В процессе создания аналога TDateEdit из библиотеки RxLib был создан следующий класс реализующий часть нужного мне функционала :