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 приложении

 javaс

Возникла проблема. Есть *.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 в разных потоках

 , py3

В общем стоит задача встроить 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
()

Релиз Wine 1.1.11

 

Группа Open Source

Вышел новый релиз Wine 1.1.11.

Из нововведений:

  • множество исправлений для поддержки IE7,
  • поддержка 64-битной кросс-компиляции в Mingw64,
  • поддержка пользовательского интерфейса для цифровых подписей,
  • улучшенная поддержка для патчей MSI-инсталляции,
  • различные оптимизации Direct3D,
  • фиксы различных багов.

>>> Подробности (winehq.org)

ApostolPetr
()

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