LINUX.ORG.RU

Сообщения ApostolPetr

 

Создание экземпляров классов по ключу

Допустим у нас есть базовый класс Base, и наследники: A, B, C, D. С каждым из наследников связан свой String. Задача в том, чтобы создавать экземпляры наследников согласно String.

HashMap<String , Class<? extends Base>> hm = new HashMap<String , Class<? extends Base>>() ;
hm.put("one", A.class);
hm.put("two", B.class);
hm.put("three", C.class);
hm.put("four", D.class);

Class <? extends Base> val = hm.get("one");
Base a = val.newInstance();
val = hm.get("two");
Base b = val.newInstance();
...

В жабе слабоват и не знаю как правильно такую штуку реализовать.

 

ApostolPetr ()

lvm mirror - deadlock при потере диска

Пробовал на debian7, ubuntu12.04 server LTS, ubuntu13.04 server. В общем есть 2 lvm-раздела: /dev/sda2 и /dev/sdb2, на sda2 создан системный раздел logical volume ha2_2/root. Volume group ha2_2 расширена на /dev/sdb2 (vgextend ha2_2 /dev/sdb2). Далее мирорим (lvconvert -m1 --corelog ha2_2/root /dev/sdb2) и в результате имеем (для 12.04 lts):

root@ha2-node2:~# lvm version
  LVM version:     2.02.66(2) (2010-05-20)
  Library version: 1.02.48 (2010-05-20)
  Driver version:  4.23.1
-------------------
root@ha2-node2:~# pvs
  PV         VG    Fmt  Attr PSize   PFree  
  /dev/sda2  ha2_2 lvm2 a-   931.27g 921.96g
  /dev/sdb2  ha2_2 lvm2 a-   931.27g 921.96g
-------------------
root@ha2-node2:~# vgs
  VG    #PV #LV #SN Attr   VSize VFree
  ha2_2   2   1   0 wz--n- 1.82t 1.80t
---------------------
root@ha2-node2:~# lvs -a -o name,devices,size
  LV              Devices                           LSize
  root            root_mimage_0(0),root_mimage_1(0) 9.31g
  [root_mimage_0] /dev/sda2(0)                      9.31g
  [root_mimage_1] /dev/sdb2(0)                      9.31g
При попытке отключить один из sata-дисков (моделирование ситуации, что диск умер) доступ к оставшемуся диску лочится и теряется доступ к машине, помогает только жесткий ресет:
root@ha2-node2:~# echo "1" > /sys/bus/scsi/devices/target2\:0\:0/2\:0\:0\:0/delete
INFO: task jbd2/dm-2-8:347 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
INFO: task rs:main Q:Reg:893 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
...
Как-нибудь можно это побороть, чтобы mirror диск нормально деградировал до линейного? dmeventd в процессах есть.

 

ApostolPetr ()

Синхронизация потоков с помощью семафоров

В общем задача стоит в синхронизации 2х потоков: 1й поток ожидает данные из очереди (не занимая cpu), а 2ой их постоянно генерирует и пихает в очередь не дожидаясь, пока 1й их обработает. Решил использовать для этого семафоры. Можно ли функции семафоров sem_post и sem_wait использовать в разных потоках: sem_post вызвается только в 1ом треде, а sem_wait в 2м? Например (язык C):

//внутри 1ого потока
void *thread1_run(void* _a)
{
    ...
    for(;;) {
       //ждем события от другого треда
       sem_wait(&s);
       //дождались, выполняем код
       _data = popData();
       //тут данные обрабатываем, причем намного медленнее, чем они формируются
       ...
    }
    ...
}
//внутри 2ого потока
void *thread2_run(void *_b)
{
   ...
    for(;;) {
        //тут формируем данные
        ...
        pushData(data);
        sem_post(&s);
    }
    ...
}
Проверил этот вариант - работает, но пока нигде не встретил в интернете такое применение семафоров. Может вместо семафоров правильнее использовать что-то другое? Хочется это реализовать стандартными средствами pthreads без использования всяких poll и select.

 

ApostolPetr ()

gentoo портит ext-раздел при монтировании/размонтировании

Удивительная вещь происходит. Накатил генту на флешку, при загрузке ругнулась, что не может найти и смонтировать cdrom для дальнейшей загрузки, зашел по команде shell в оболочку и смонтировал раздел винта /dev/sda6 в /mnt (там лежал iso-образ gentoo). После размонтирования этот раздел умер и больше не монтируется нигде, даже на рабочей машине. Для чистоты эксперимента повторно форматнул раздел /dev/sda6, загрузился с флешки, в shell-е смонтировал и сразу размонтировал - все, раздел потерян. Причем опять повторно он уже не монтируется, выдает «mount ... failed: Invalid argument». Я сразу не обратил внимание на это и так потерял раздел /home, пока искал генту образ. Как его можно восстановить теперь? И такое поведение mount/umount явно не нормальное.
ПС. Краткая инфа:
1) флешка 4gb fat32 с install-minimal-gentoo-20130509.iso;
2) винт 160gb sata-1, разделы ext3;
3) мать UEFI на чипсете amd 970/950.

 

ApostolPetr ()

Много ли надо памяти для работы git-сервера?

В общем есть сервак с 512Мб оперативы, 410Мб из которых уже заняты. Удасться ли поднять на нем git-сервер (внутренние нужды, 4-5 людей кодеров, проекты небольшие) не улетев в своп?

 

ApostolPetr ()

java и amd процессор

В общем требуется собрать нищебродский сервачок для java (openjdk) приложений на gentoo. Стоит ли брать какой-нибудь FX-6100 3.3GHz (6ядер, L1=64 Кб, L2=6144 Кб, L3=8192 Кб) или лучше AMD A10-5700 3.4GHz (4ядра, L1=128 Кб, L2=4096 Кб)? Так ли кэш 3й и многоядерность для жабы необходимы?

 ,

ApostolPetr ()

Рекомпиляция класса в jar приложении

Возникла проблема. Есть *.jar файл с кучей классов вроде aaj.class, aba.class, do.class, if.class и тд. После декомпиляции (JAD) в зависимостях одного из *.java файлов оказались классы do.java и if.java. Вопрос: как этот файл скомпилировать? javac ругается там, где происходит их вызов, считая их кейвордами:

info = do(1,2);
      ^
result = if(7).aba(432); 
        ^ 
Переименовывание и добавление в jar классов-копий _do и _if ничего не дало, компиляцию проходит, но jar не запускается.

 

ApostolPetr ()

QTableWidget, сигналы при удержании кнопки мыши

Что-то порылся в инете, ответа на проблему сразу не нашел. Какой сигнал эмитится при удержании левой кнопки и перемещении мыши по таблице (setSelectionMode установлен в SingleSelection)? Поигрался со всеми сигналами (cellClicked, cellPressed, activated, itemClicked и тд), но ни один из них мне не ответил, при этом выделение ячейки в позиции курсора происходит. При щелчке левой клики мыши сигналы эмитятся без проблем.

ПС. Если таких сигналов нет, то как запретить скользящий выбор ячеек, чтобы работало только по клику мыши?

 ,

ApostolPetr ()

GIMP-2.8 пакетная конвертация xcf->jpg

Собственно проблема. Порылся в инете и нашел такой скрипт:

(define (script-fu-xcf2jpg-batch xcfDirectory)
  (let* ((xcfList (cadr (file-glob (string-append xcfDirectory "/*.xcf") 1))))
    (while (not (null? xcfList) )
      (let* ((xcfFilename (car xcfList))
        (jpgFilename (string-append (substring xcfFilename 0 (- (string-length xcfFilename) 4) ) ".jpg"))
        (xcfImage    (car (gimp-file-load RUN-NONINTERACTIVE xcfFilename xcfFilename)))
        (xcfDrawable (car (gimp-image-get-active-layer xcfImage))) )
 
        (file-jpeg-save RUN-NONINTERACTIVE xcfImage xcfDrawable jpgFilename jpgFilename
              0.90 0.0 0 0 "" 0 1 0 2)
        )
      (set! xcfList (cdr xcfList))
      )
    )
)
 
(script-fu-register
  "script-fu-xcf2jpg-batch"
  "Batch XCF 2 JPEG"
  "Converts all xcf files from a directory to JPEGS"
  "Dan Kendall"
  ""
  "Apr 22 2009"
  ""
  SF-DIRNAME   "Gimp Image Directory"  "/tmp"
)
(script-fu-menu-register "script-fu-xcf2jpg-batch"
    "<Toolbox>/Mine/Batch/2JPEG")
Он вроде работает, но не так как хотелось бы: сохраняет не результирующую картинку, а только верхний layer, не обращая внимание на все предыдущие. Как это исправить или может у кого есть рабочий вариант такого скрипта? (ясно, что косяк в строке с gimp-image-get-active-layer, но разбираться со скриптингом совершенно нет времени)

 

ApostolPetr ()

Cython и одновременное выполнение PyEval_EvalCode в разных потоках

В общем стоит задача встроить Python 3.2 в легковесное многопотоковое C++ приложение (Boost::python сразу лесом, жирный он больно), используя Cython API. При попытке одновременного запуска 2х PyEval_EvalCode с жирными скриптами в разных потоках получаем «ceval: tstate mix-up», короче падаем тут:

//Python 3.2.2 source
//ceval.c, line 1321
#ifdef WITH_THREAD
            if (_Py_atomic_load_relaxed(&gil_drop_request)) {
                /* Give another thread a chance */
                if (PyThreadState_Swap(NULL) != tstate)
                    Py_FatalError("ceval: tstate mix-up");
                drop_gil(tstate);

                /* Other threads may run now */

                take_gil(tstate);
                if (PyThreadState_Swap(tstate) != NULL)
                    Py_FatalError("ceval: orphan tstate");
            }
#endif

Инициализация питона:


    // Init Python
    const char *version = Py_GetVersion();
    if (version)	{
        logMsg.msg("Python version %s\n", version);
    }
    else	{
        logMsg.error("Error get Python version!\n");
    }

    PyImport_ExtendInittab(ScriptModule::builtin_modules);

    Py_SetProgramName(L"Python");

    if (!Py_IsInitialized()) {
        Py_InitializeEx(0);
    }
    PyEval_InitThreads();

    m_mainThreadState = PyThreadState_Get();
    PyThreadState *tstate = PyEval_SaveThread();

    PyGILState_STATE gstate = PyGILState_Ensure();
    const wchar_t* arg0 = L"";
    PySys_SetArgv(0, const_cast<wchar_t**>(&arg0));
    PyGILState_Release(gstate);

    m_globaldict = gcreateGlobalDict();

Создание нового потока:

            if (pthread_create(&m_thread, 0, thread_run, this)) {
                ASSERT_T(!"Cannot create thread");
            }

Функция thread_run запускает в своем теле метод run():

    PyObject *py_res=NULL;
    PyGILState_STATE py_gilstate;

    ASSERT_T(m_text->compiled);
    ASSERT_T(m_globaldict);

    //При запуске второго потока падаем с
    //описанной выше ошибкой здесь:
    py_gilstate = PyGILState_Ensure();

    m_pyThreadState = PyThreadState_Get();

    logMsg.msg("start execute\n");

    py_res = PyEval_EvalCode( (PyObject*)m_text->compiled, m_globaldict, m_globaldict );

    if( !py_res ) {
        logMsg.error("Error run script!\n");
    }
    else {
        Py_DecRef(py_res);
        logMsg.msg("python code executed\n");
    }

    PyGILState_Release(py_gilstate);

    logMsg.msg("end execute\n");
PyEval_EvalCode имеют общий globaldict.
Пример питоноского скрипта-лупа (при запуске его и любого 2ого скрпита падаем):
while (1==1):
   //do somthing

Не совсем понятно, почему PyGILState_Ensure() в другом потоке вываливается с ошибкой указанной выше. Пока проблему решил, добавив мютекс в метод run(), но меня это не устраивает, поскольку нужна одновременная работа 2х скриптов в PyEval_EvalCode.

 ,

ApostolPetr ()

Кроссплатформенный qtcpsocket

Такая трабла. Разрабатываю кроссплатформенную софтину-туннель в linux на Qt4.6.0 с lpython для скриптовой обработки tcp пакетов, в linux все работает просто замечательно, но виндовая сборка MinGW во время работы безбожно жрет проц. Подозреваю qtcpsocket, тк такое наблюдается даже без включения питона в код. Кто игрался с кроссплатформенностью может подскажете куда копать?

ApostolPetr ()

RSS подписка на новые темы