четвер, 10 листопада 2011 р.

Fedora и rpc.statd[1000]: STAT_FAIL

Нашел очень интересный баг в NFS. Ну может конечно и не баг, но раньше работало. При открытии файлов с nfs-папки для записи в лог вываливались оибки :
Nov 10 10:45:11 host.name rpc.statd[1000]: STAT_FAIL to host.name for SM_MON of 192.168.1.1
Nov 10 10:45:11 host.name kernel: lockd: cannot monitor 192.168.1.1

и файл открывался толкько для чтения.
Оказалось в логе чуть выше было все написано
    rpc.statd[1000]: No canonical hostname found for 19.168.1.1
Достаточно было только записать его в /etc/hosts  и сразу-же все заработало

середу, 14 вересня 2011 р.

Java, Blob и картинки

Стрельнула мне в голову идея попробвать хранить картинки в базе данных (в моем случае это был MySQL, но роли это не играет). Но не просто картинки, а  сканкопии докуменов размером порядка 100-200к. Как обычно в идее и теории все было прекрасно, пока не дошло дело до реализации.
 Ну сделал таблицу в базе, с которой поле mediumblob для самих картинок. И когда дошло до када началось самое интересное. Итак, сначала вставляем картинку:

//Читаем файл
FileInputStream input = new FileInputStream(picFile);
Statement st = new Statement() //Допустим подключение у нас есть
//Делаем запрос, выключив autocommit
String query = "insert into table (id,pic) values (?,?)";
st.getConnection().setAutoCommit(false);
PreparedStatement ps = (PreparedStatement)
st.getConnection().prepareStatement(query);
ps.setInt(1, id);
ps.setBinaryStream(2, input, pic.length());
//Вставляем
ps.executeUpdate();
st.getConnection().commit();
//Уходим
try {
    st.getConnection().setAutoCommit(true);
    st.getConnection().close();
} catch (SQLException ex) {
    Logger.getLogger(ActDB.class.getName()).log(Level.SEVERE, null, ex);
}

Получилось с первого раза. А теперь нужто єту картинку прочесть и вывести на экран. Для убыстрения решил ее вывести в JLabel. И тут я сделал роковую ошибку....Дело в том, что для выводаизображения я истользовал new ImageIcon(URL url), а url передавался через файл приблизительно так:

File f = new File("tmp.jpg")
Blob img = new  Blob() //представим, что он у нас есть
FileOutputStream out = new FileOutputStream(f);
out.write(b.getBytes(0, b.length()), 0, b.length());
return f;

потом соответственно new JLabel(new ImageIcon(f.toURI().toURL)). Первая картинка показывалсь отлично, в отличии от остальных. При следующих вызовах метода показывалась только первая картинка. Мои смутные сомнения по поводу шибко умной ява машины подтвердились когда я добавил рандом в имя файла:

Random r = new Random();
File f = new File("tmp"+r.nextInt()+".jpg");

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

Statement st = new Statement();
Blob imgData = null;
byte[] img = null;
if (st != null) {
   String query = "select * from table where id=" + id ";";
   ResultSet rs = null;
   try {
       rs = st.executeQuery(query);
       while (rs.next()) {
       actData = rs.getBlob("pic");
   }
     img = actData.getBytes(1, (int) imgData.length()).clone();
} catch (SQLException ex) {
   Logger.getLogger(ActDB.class.getName()).log(Level.SEVERE, null, ex);
}

try {
    st.getConnection().close();
    } catch (SQLException ex) {
      Logger.getLogger(ActDB.class.getName()).log(Level.SEVERE, null, ex);
    }
}

return img;


ну а потом получив байты делаем иконку: new ImageIcon(img);

суботу, 25 червня 2011 р.

RowFilter.regexFilter() и регистронезависимый поиск

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

RowFilter.regexFilter("(?i)" + line)

Но с кириллицей такой фокус не проходит. Приходится изловчатся так:

StringBuilder newPattern=new StringBuilder();
char c = pattern.charAt(i);
newPattern.append('[');
newPattern.append(Character.toLowerCase(c));
newPattern.append(Character.toUpperCase(c));
newPattern.append(']');


и так для каждой буквы

середу, 18 травня 2011 р.

udevadm в скриптах

Оказывается (!!!)  вот так не работает
          DEVNODE=$(udevadm info -q path -n /dev/$NAME)
     DEVNAME=$(udevadm info -a -p $DEVNODE)
даже с участием xargs $DEVNODE | udevadm info -a -p  не работает
А вот так :

     DEVNODE=$(udevadm info -q path -n /dev/$NAME)
     DEVNAME=$(exec udevadm info -a -p $DEVNODE)

замечательно работает

вівторок, 17 травня 2011 р.

Установка Fedora при помощи VNC

Намедни обнаружил здесь очень интересный метод установки при помощи vnс, который будет очень полезен когда видео не определяется, а в текстовом режиме ставить не по приколу, т.к. функциональность у него урезанная или нет KVM - свича.

Включается эта фича так: при выборе вариантов установки жмем Tab и дописываем

linux ip=X.X.X.X netmask=X.X.X.X gateway=X.X.X.X dns=X.X.X.X vnc vncpassword=passwd

где в место X.X.X.X - адреса.
После чего получаем следующее:

 Очень удобная функция.

четвер, 28 квітня 2011 р.

Тяжкое наследие FoxPro

Кто же знал при экспорте из dbf, что часть полей в которых !!ВНИМАНИЕ!! только числовые значения будут текстового типа. И тут, внезапно, запросы со значениями меньше 10 (через where x=)  возвращают пустые значения.

UPDATE table SET field=trim(field);
PROFIT!!!

Вот такие пироги.

неділю, 20 лютого 2011 р.

Поиск Swing-компонентов на форме по имени

У JComponent есть отличный метод setName("NAME"), который позволяет найти компонент. Загвоздка вся в том, что метод должен быть рекурсивным. И после продолжительных мучений получилось:

private JComponent findComponent(JComponent parent, String name) {

        for (int i = 0; i < parent.getComponentCount(); i++) {
            if (parent.getComponent(i) instanceof JComponent) {
                JComponent component = (JComponent) parent.getComponent(i);
                if (component.getName() != null && component.getName().equals(name)) {
                    return component;
                }
                if (component.getComponentCount() > 0) {
                    JComponent child = findComponent(component, name);
                    if (child != null && child.getName() != null && child.getName().equals(name)) {
                        return child;
                    }
                }
            }
        }
        return null;


Код, конечно, получился немного козий, но зато работает )))))