воскресенье, 27 февраля 2011 г.

Автоматическое резервное копирование баз данных MySql на сервере с CPanel и отправка их на емаил

Создаем скрипт

sqldbbackup.sh
set -e
MYSQL_USER="user"
MYSQL_PASS="pass"
MAIL_TO="my@email.com"

cd /tmp

(mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases | gzip -9 - > dump.sql.gz) && \
(echo | mutt -a dump.sql.gz -s "[DB BACKUP]" $MAIL_TO)
rm -f dump.sql.gz

Данный скрипт делает бэккап всех баз данных в один файл и отправляет этот файл на указанный почтовый ящик.

После копирования этого скрипта на сервер, нужно не забыть установить права на выполнения его командой chmod +x sqldbbackup.sh.

Далее добавляем этот скрипт на автовыполнение в cron и радуемся жизни :)

суббота, 26 февраля 2011 г.

установка Redmine на сайт с cPanel и MySql базой данных

Для начала подключаемся к серверу по ssh (например с помощью putty). При подключении указываем имя сервера через который идет вход на CPanel и логин и пароль от CPanel.
Выполняем команды указанныездесь (далее "инструкция") до п. 1, а именно
gem install rails -v=2.3.5
gem install rack -v=1.0.1
gem install mysql
На команде gem install rack -v=1.0.1 может быть выдано сообщение " ERROR: could not find gem rack locally or in a repository ". Если это случилось - не отчаиваемся, есть как минимум 2 варианта решения проблемы.
1. Изменить источник, с которого загружаются gems.
Чтобы посмотреть этот источник выполняем команду
gem source

У меня выдало сообщение следующего содержания:
*** CURRENT SOURCES ***


http://gems.rubyforge.org/

Далее добавляем сайт http://rubygems.org/ в источники.
gem sources -a http://rubygems.org/
Если сайт успешно добавлен - пробуем установить rack ещё раз
gem install rack -v=1.0.1

2. Второй способ - это загрузить gem вручную с сайта rack.rubyforge.org
Далее выполняем:
wget http://rubyforge.org/frs/download.php/71197/rack-1.0.1.tar.gz
tar zxf rack-1.0.1.tar.gz
gem install rack



Создаем базу данных. Для этого заходим в раздел CPanel "базы данных", и создаем там бд и пользователя, которого redmine будет использовать для доступа к этой бд. Пользователя связываем с бд, привилегии ставим - разрешить все.
Далее загружаем редмайн к себе на хостинг.
Через файловый менеджер CPanel или ftp выполняем действия п. 3 инструкции.
3. Copy config/database.yml.example to config/database.yml and edit this file in order to configure your database settings for "production" environment.

Example for a MySQL database:
production:
adapter: mysql
database: redmine
host: localhost
username: redmine
password: my_password

Далее по ssh открываем папку с редмайном (команда cd) и в ней выполняем п.4 - п.6.
Могут быть выданы сообщения о необходимости установки некоторых гемов. Смело устанавливаем их. Если же и после установки все равно выдается сообщение о необходимости их установки, то скорее всего задан неверный путь к директориям GEM_PATH и GEM_HOME. В этом случае в файл .bash_profile (находится в корневой директории сайта) добавляем следующие строки
export GEM_HOME="/home/username/ruby/gems"
export GEM_PATH="/home/username/ruby/gems/gems"
где вместо username вписываем ваше имя пользователя для входа в CPanel.

Устанавливаем Mongrel
gem install mongrel --include-dependencies
Проверяем mongrel
mongrel_rails start -c /path/to/redmine/folder -e production -p 5555

Если все работает, то есть при открытии в браузере сайта по 5555 порту - открывается redmine, то все отлично. Нажимаем в консоли ctrl + c - останавливаем mongrel. Далее запускаем его ещё раз, но уже в фоновом режиме
mongrel_rails start -c /path/to/redmine/folder -e production -p 5555 -d
Должно запуститься без ошибок.

Теперь нужно позаботиться о том, чтобы mongrel запускался после перезагрузке сервера (как можно предположить в любом случае сервер иногда перезагружается, и тогда наше приложение перестанет работать).
Сделать это не так просто как может показаться на первый взгляд, однако все же возможно. Для этого воспользуемся планировщиком cron. Итак, идем в секцию advanced -> cron jobs

Далее вписываем в строку Command строку запуска нашего приложения (mongrel_rails start -c /path/to/redmine/folder -e production -p 5555 -d), в строку minute - @reboot

Как мы видим - CPanel поле minute подсвечивает как ошибочное. Но мы то знаем, что оно введено верно. Убедить CPanel, что ввели мы все верно, можно следующим образом (далее инструкция для пользователей браузера Opera 11, возможно что-то похожее можно сделать и в других браузерах).
Заходим в редактор исходного кода страницы (правая клавиша мыши -> исходный код). Там поиском находим функцию var validate_minute_field, заменяем возвращаемое ей значение на true (см. рисунок).

Далее аналогичным образом изменяем функции validate_hour_field, validate_day_field, validate_month_field, validate_weekday_field. Получилось вот так

Жмем применить изменения. Переходим на вкладку самой страницы добавления задания и жмем добавить задание. Задание добавлено.

пятница, 4 февраля 2011 г.

Как настроить WakeOnLan через ADSL модем ZTE ZXV10 W300 (ПРОМСВЯЗЬ M 200A)

На своём модеме при настройке WakeOnLan через интернет столкнулся со следующей проблемой - при попытке сохранения правила проброса портов на широковещательный (broadcast) айпишник 192.168.1.255, выскакивало сообщение следующего содержания "Invalid IP address: 192.168.1.255".
Немного покопавшись в исходном коде страницы, обнаружил заветные строчки, отвечающие за блокировку ввода этого айпи. К счастью оказалось, что на аппаратном уровне никакого контроля не осуществляется, поэтому после исправления их в редакторе оперы, айпишник успешно добавился.

Итак, последовательность действий по шагам.

1. В Opera, вводим адрес http://192.168.1.1/advanced/adv_nat_virsvr.htm. (вместо 192.168.1.1 должен быть айпи вашего модема). Открывается окно следующего вида.



2. Открываем эту страницу во встроеном редакторе исходного кода

3. Находим строку
if(!isValidIpAddr(digits[0],digits[1],digits[2],digits[3],false)) {
alert("Invalid IP address: " + Address);return true;
}
и удаляем её. Жмем кнопку применить.


4. Возвращамся к вкладке с настройками модема (к той что с первого скрина) и добавляем злополучный айпи адрес. На этот раз никаких сообщений не появляется и всё проходит на ура.

Как в Java удалить папку вместе с подпапками

В java удалить папку вместе с находящимися в ней файлами и папками можно с помощью следующей рекурсивной функции

/**
     * Deletes directory with subdirs and subfolders
     * @author Cloud
     * @param dir Directory to delete
     */
    public static void deleteDirectory(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            for (int i=0; i<children.length; i++) {
                File f = new File(dir, children[i]);
                deleteDirectory(f);
            }
            dir.delete();
        } else dir.delete();
    }

Как закрыть окно JDialog в Java

Если требуется чтобы при нажатии некоторой кнопки (например "Отмена"), происходило закрытие диалогового окна, можно воспользоваться следующим кодом:

setVisible(false); 
dispose();

Для завершения всего приложения удобна в использовани команда

exit(0);

Однако разработчики java не рекомендуют использовать её.

Как настроить Удаленный рабочий стол (Remote Desktop) для работы нескольких пользователей одновременно

1) скачиваем пропатченный файл termsrv.dll (или патчим вручную, см. примечание внизу статьи), для Windows XP SP3 - файл версии 5.1.2600.5512 можно скачать здесь termsrv.dll.

2) копируем оригинальный файл termsrv.dll из директории C:\Windows\System32\ куда нибудь на всякий случай.
3) закидываем termsrv.dll в следующие директории, заменяя оригинальный файл.
C:\Windows\System32\
C:\Windows\ServicePackFiles\i386\ (если директория существует)
C:\Windows\System32\dllcache\ (если директория существует)

4) пропатчиваем ключи реестра, запустив файл ts_multiple_sessions.reg. Можно сделать то же самое вручную с помощью regedit.exe:

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Licensing Core]
“EnableConcurrentSessions”=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
“EnableConcurrentSessions”=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
“AllowMultipleTSSessions”=dword:00000001

6) Start -> Run -> gpedit.msc -> Computer Configuration -> Administrative Templates -> Windows Components -> Terminal Services -> Limit Number of Connections ,
изменяем значение Limit Number of Connections на необходимое количество одновременных подключений.

7) проверяем, что в свойствах системы (System Properties -> вкладка Remote) поставлена галочка Allow users to connect remotely to this computer (Разрешить пользователям удаленно подключаться к этому компьютеру)

8) проверяем, что включена опция Fast User Switching (Control Panel -> User Accounts -> Change the way users log on or off)

9) перезагружаем компьютер

Если все было выполнено правильно, то теперь у удаленный рабочий стол должен работать одновременно для нескольких пользователей.

Данный метод не будет работает, если компьютер зарегистрирован в домене.

P.S.
Оригинальный файл termsrv.dll - можно изменить (пропатчить) вручную с помощью hex-редактора
termsrv.dll (Windows SP2 5.1.2600.2180) 295,424 bytes
Offsets: hexadec.

128BB: 75 -> 74
217D3: 8B -> 33
217D4: C7 -> C0
2192D: 8B -> 33
2192E: C7 -> C0
225B7: 54 -> 20



termsrv.dll (Windows SP3 5.1.2600.5512) 295,936  bytes
Offsets: hexadec.

22A17: 74 -> 75
22A69: 7F -> 90
22A6A: 16 -> 90

Как в java проверить, что строка содержит только английские буквы и цифры

 Для этого удобно использовать регулярные выражения.

private static Pattern pattern0_9__a_z__A_Z =
            Pattern.compile("[\\w\\u005F\\u002E]+", Pattern.UNICODE_CASE);  //“\u002E” и “\u005F” - это символы
    // точки и подчеркивания соответсвенно
public static boolean haveOnly0_9__a_z__A_Z(String str) {
        Matcher m = pattern0_9__a_z__A_Z.matcher(str);
        if (m.matches()) {
            return true;
        } else {
            return false;
        }
    }

Как создать папку на java

Для создания папки проще всего воспользоваться командами mkdir или mkdirs
File myPath = new File("/tmp/a/b");
myPath.mkdir();  
myPath.mkdirs();

mkdir() выбросит исключение, если каталога /tmp/a нет в файловой системе, а mkdirs() создаст и /tmp/, и /tmp/a если их нет.

Несложный класс для шифрования и дешифрования строки на Java c сохраняемым в программе ключом

С помощью нижеприведенного класса можно легко зашифровать некоторую строку (например пароль) с использование алгоритма DES, и затем при желании расшифровать её. При этом секретный ключ сохранен в теле класса, так что строку можно будет расшифровать даже после перезапуска программы.

// Файл SecuritySettings.java

package security;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

/**
 *
 * @author Cloud
 */


public final class SecuritySettings {

    private final static class MySecretKey implements SecretKey {

        private byte[] key = new byte[]{1, 2, 3, 4, 5, 6, 7, 8}; // ключ
      // не должен иметь длину более 8 байт, для безопасного шифрования его
      // необходимо изменить 

        public String getAlgorithm() {
            return "DES";
        }

        public String getFormat() {
            return "RAW";
        }

        public byte[] getEncoded() {
            return key;
        }
    }

    private static SecretKey key;

    private static Cipher ecipher;
    private static Cipher dcipher;

    static {
        try {
            key = new MySecretKey();
            ecipher = Cipher.getInstance("DES");
            dcipher = Cipher.getInstance("DES");
            ecipher.init(Cipher.ENCRYPT_MODE, key);
            dcipher.init(Cipher.DECRYPT_MODE, key);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchPaddingException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


    /**
     * Функция шифрования
     * @param str строка открытого текста
     * @return зашифрованная строка в формате Base64
     */
    public static String encrypt(String str) {
        try {
            byte[] utf8 = str.getBytes("UTF8");
            byte[] enc = ecipher.doFinal(utf8);
            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (IllegalBlockSizeException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadPaddingException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Функция расшифрования
     * @param str зашифрованная строка в формате Base64
     * @return расшифрованная строка
     */
    public static String decrypt(String str)  {
        try {
            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
            byte[] utf8 = dcipher.doFinal(dec);
            return new String(utf8, "UTF8");
        } catch (IllegalBlockSizeException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadPaddingException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(SecuritySettings.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}


UPD 06.02.13
Выкладываю обновленную версию класса. В новой версии используется сторонняя билиотека Apache Codec http://commons.apache.org/codec/, также методы класса сделаны нестатическими, благодаря чему стало возможным с данным классом создавать несколько шифрователей с разными ключами или алгоритмами в одном приложении и динамически менять ключ шифрования. Минимальная версия jdk - 1.7, однако после внесения небольших изменений может использоваться и на более ранних версиях java.

// Файл StringCrypter.java
package rva.common.util;

import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

/**
 * Класс для шифрования и дешифрования строк
 * Использует библиотеку Apache Codec http://commons.apache.org/codec/
 * @author Рудницкий Валентин
 */
public class StringCrypter {

    /**
     * Упрощенный конструктор. Создает StringCrypter с ключом DESSecretKey со значением по умолчанию (не рекомендуется)
     */
    public StringCrypter() {
        this(new byte[]{1, 2, 3, 4, 5, 6, 7, 8});
    }
    
    /**
     * Упрощенный конструктор. Создает StringCrypter с ключом 
     * DESSecretKey (алгоритм шифрования DES) со значением key. 
     * Ключ key должен иметь длину 8 байт
     */
    public StringCrypter(byte[] key) {
        try {
            updateSecretKey(new DESSecretKey(key));
        } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException ex) {
            throw new IllegalArgumentException(ex.getMessage());
        }
    }

    public StringCrypter(SecretKey key) throws NoSuchPaddingException,
            NoSuchAlgorithmException,
            InvalidKeyException {
        updateSecretKey(key);
    }

    private void updateSecretKey(SecretKey key) throws NoSuchPaddingException,
            NoSuchAlgorithmException,
            InvalidKeyException {
        ecipher = Cipher.getInstance(key.getAlgorithm());
        dcipher = Cipher.getInstance(key.getAlgorithm());
        ecipher.init(Cipher.ENCRYPT_MODE, key);
        dcipher.init(Cipher.DECRYPT_MODE, key);
    }

    public static class DESSecretKey implements SecretKey {

        private final byte[] key;

        /**
         * ключ должен иметь длину 8 байт
         */
        public DESSecretKey(byte[] key) {
            this.key = key;
        }

        @Override
        public String getAlgorithm() {
            return "DES";
        }

        @Override
        public String getFormat() {
            return "RAW";
        }

        @Override
        public byte[] getEncoded() {
            return key;
        }
    }

    private Cipher ecipher;
    private Cipher dcipher;

    /**
     * Функция шифрования
     *
     * @param str строка открытого текста
     * @return зашифрованная строка в формате Base64
     */
    public String encrypt(String str) {
        try {
            byte[] utf8 = str.getBytes("UTF8");
            byte[] enc = ecipher.doFinal(utf8);
            return Base64.encodeBase64String(enc);
        } catch (IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException ex) {
            Logger.getLogger(StringCrypter.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Функция дешифрования
     *
     * @param str зашифрованная строка в формате Base64
     * @return расшифрованная строка
     */
    public String decrypt(String str) {
        try {
            byte[] dec = Base64.decodeBase64(str);
            byte[] utf8 = dcipher.doFinal(dec);
            return new String(utf8, "UTF8");
        } catch (IllegalBlockSizeException | BadPaddingException | IOException ex) {
            Logger.getLogger(StringCrypter.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}


Пример использования нового класса

// создаем экземпляр класса StringCrypter с ключем шифрования
  StringCrypter crypter=new StringCrypter(new byte[]{1,4,5,6,8,9,7,8});
  String testStr = "forCryptString";
// шифрование
  String encBase64Str = crypter.encrypt(testStr);

// дешифрование
  String decryptedStr = crypter.decrypt(encBase64Str);
        

Сериализация в Java

Несколько основных моментов насчет сериализации.
Простейший пример сериализации и десериализации объекта класса в файл:
import java.io.Serializable; 
class TestSerial implements Serializable {
private static final long serialVersionUID = 565645645688l;
private byte field1 = 100;
private String field2 = "field2";
public byte getField1() {
return field1;
}

public String getField2() {
return field2;
}
//Реализация алгоритма сериализации
public static void serialize() throws IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
TestSerial ts = new TestSerial();
oos.writeObject(ts);
oos.flush();
oos.close();
}

//Код, приведённый в методе serialize сериализует состояние экземпляра класса TestSerial 
//в файл temp.out. Для воссоздания объекта, нужно произвести 
//десериализацию, как показано в методе deserialize.

//Воссоздание сериализованного объекта
public static void deserialize() throws IOException {
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream oin = new ObjectInputStream(fis);


TestSerial ts = (TestSerial) oin.readObject();
System.out.println("field1="+ts.getField1());
System.out.println("field2="+ts.getField2());
}
}

Модификаторы полей
 Существует такой модификатор поля как transient. Он означает, что это поле не должно быть сериализовано. При десериализации объекта класса такому полю присваивается значение null.
  При сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет.
 Поля с модификатором final сериализуются как и обычные.

SerialVersionUID
 Еще один очень важный момент. При стандартной сериализации учитывается порядок объявления полей в классе. Потому, при изменении порядка десериализация пройдет не так как положено. Чтобы этого избежать, добавлен следующий механизм. В каждый класс, реализующий интерфейс Serializable, на стадии компиляции добавляется еще одно поле – private static final long serialVersionUID. Это поле содержит уникальный идентификатор версии сериализованного класса. Оно вычисляется по содержимому класса – полям, их порядку объявления, методам, их порядку объявления. Соответственно, при любом изменении в классе это поле поменяет свое значение, и при загрузке, если значение поля изменилось в текущем классе - будет выдана ошибка.
Есть, однако, способ эту проверку если обойти. Это может оказаться полезным, если набор полей класса и их порядок уже определен, а методы класса могут меняться. В этом случае сериализации ничего не угрожает, однако стандартный механизм не даст десериализовать данные с использованием байткода измененого класса. Но, как я уже сказал, его можно обмануть. А именно – вручную в классе определить поле private static final long serialVersionUID. Значение его для этого класса можно получить, использовав утилиту serialver, входящую в поставку SDK. После такого определения значение поля будет фиксировано, следовательно, десериализация всегда будет разрешена.
Более того, в версии 5.0 в документации появилось приблизительно следующее: крайне рекомендуется всем сериализуемым классам декларировать это поле в явном виде, ибо вычисление по умолчанию очень чувствительно к деталям структуры класса, которые могут различаться в зависимости от реализации компилятора, и вызывать таким образом неожиданные InvalidClassException при десериализации. Объявлять это поле лучше как private, т.к. оно относится исключительно к классу, в котором объявляется. Хотя в спецификации модификатор не оговорен.

Кроме сериализации путем имплементирования класса Serializable, существует ещё один более "продвинутый" способ сериализации - путем имплелементирования класса Externalizable.

Подсветка синтаксиса в блоге на Blogger.com

Здесь описан способ, по которому вы можете добавить подсветку кода в Blogger (сайт автора).


Для этого надо:
Залогиниться в аккаунт вашего блога, выбрать вкладку "Дизайн" ("Layout"), а затем вкладку "Изменить HTML" ("Edit HTML").
Кликнуть по ссылке "Загрузить весь шаблон" ("Download Full Template"), чтобы сохранить резервную копию шаблона (файл xml).
Открыть файл в редакторе и найти закрывающий тег </head>. После тега добавьте следующее:
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<!-- add brushes here -->
<script type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
После комментария "add brushes here" добавьте языки, которые вы планируете использовать. Для примера я использую подстветку для Javascript, Bash, Java, XML/HTML,:

<!-- add brushes here -->
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
Полный список поддерживаемых подсветок синтаксиса можно посмотреть здесь.

Сохраните ваш измененный шаблон, и загрузите его в Blogger (опять "Дизайн" ("Layout") -> "Изменить HTML" ("Edit HTML")).
Теперь вы можете добавить подсветку синтаксиса в ваш блог. Обрамите свой код тегом <pre> и определите стиль. Для примера вот так указываем подсветку блока с кодом Java:
<pre class="brush:java">
public class SomeClass {
  public final static String str = "someString";
}
</pre>

Cтоит отметить, что "Просмотр" Blogger'a не показывает форматирование. Вам нужно опубликовать сообщение, чтобы увидеть результат.

четверг, 3 февраля 2011 г.

Онлайн редактор регулярных выражений для java

 Наткнулся в интернете на очень удобную програмку для отладки регулярных выражений

Сайт - http://myregexp.com/

Заправка картриджа Xerox 3140

Инструкция по заправке картриджа картриджа Xerox 108R00908 (1500 копий), картриджа Xerox 108R00909 (2500 копий).

Картридж Xerox 108R00908 (1500 копий), картридж Xerox 108R00909 подходят к принтерам Xerox Phaser 3140, Xerox Phaser 3155, Xerox Phaser 3160. Возможность заправлять данный картридж появляется после перепрошивки принтера или замены или перепрошивки чипа на картридже.

 Стандартная заправка на 2500 листов - примерно 90-110 грамм тонера.

Для заправки картриджа понадобится несколько вещей, а именно:

1) Нож (лучше строительный, или скальпель) для срезания пластиковых заклепок.

2) Крестовая отвертка.

3) Плоская отвертка.

4) Пару тряпок, или безворсовые салфетки.

5) Тонер для Samsung 1210/1710 или Xerox P8E (идеально подходит Fuji или ATM).

Начали!


1. Кладем картридж одним торцом вниз, другим вверх, как показано на рисунке 1, и срезаем заклепки ножом, их там три.

2. Тоже самое проделываем с другой стороны, там четыре заклепки.
3. После того как срезали заклепки с боковых крышек картриджа, кладем его на стол, и плоской отверткой поддеваем две верхние защелки.
4. Снимаем боковые крышки.



 

5. Вытаскиваем шток фотовала.

6. Вытаскиваем верхнюю шторку, которая расположена над фотовалом.
 7. Разъединяем картридж на две половинки.


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



9. Снимам ракель, для того, что бы вычистить бункер отработки тонера.

10. Тщательно вычищаем бункер от отработанного тонера (лучше это сделать при помощи пылесоса).

 11.После того, как поставили ракель на место, вставляем бушинги ролика заряда (коротрона) на место, они держатся на маленьких защелках.
 12. Вставляем ролик на свое место в пазы бушингов, до щелчков.
Одна половина картриджа готова.
13. Далее берем вторую половину корпуса картриджа и очень аккуратно снимаем металлическое дозирующее лезвие, для того, что бы почистить запекшийся тонер на его кромке. В картриджах Samsung и Xerox это самый важный момент в заправке и чистке, так как от этого зависит качество печати.
14. Чистим запекшийся тонер. Иногда, если тонер очень сильно запекся, то просто протереть тряпкой или безворсовой салфеткой не достаточно, в этом случае хорошо поможет какая нибудь металлическая деталь, например обычный щуп. Очищать нужно легкими движениями вдоль всей кромки под разными углами, главное, не погнуть и не повредить лезвие!
 15. После того, как почистили и поставили на место дозирующее лезвие, Откупориваем засыпную горловину (она находится сбоку). Вычищаем при помощи пылесоса старый тонер из бункера, если Ваш картридж Не разу не вскрывался до Вас, и Вы используете выше указанные тонеры, то можно обойтись и без тщательной чистки, так как данные тонеры очень хорошо ложатся на оригинальный тонер, в том случае, если Ваш картридж не "первопроходец" и Вы не знаете, кто и что туда до Вас сыпал, то все таки будет не лишним хорошо почистить бункер.





16. Засыпаем тонер.




17. После того, как засыпали тонер, закупорили пробкой бункер, вставляем шток фотовала со стороны пробки бункера, а не со стороны шестеренок, так как контакты внутри фотовала загнуты в сторону шестеренок, и есливставлять шток со стороны шестеренок, то можно их погнуть.

18. Одеваем боковины и верхнюю шторку. Картридж готов. При желании можно нарезать резьбу вместе где стояли клепки и завернуть шурупы.


Обращаем Ваше внимание, что данная инструкция является открытой информацией, а не руководством к действию (заправке картриджа).
Автор снимает с себя всю ответственность за любую порчу или ущерб как материальный, так и моральный, возникший вследствие самостоятельной заправки картриджа. Если Вы согласны с данным заявлением, можете приступать к самостоятельной заправке картриджа. Удачи! И помните вдыхание тонера вредно для здоровья.
 

Как сбросить счетчик отпечатаных страниц в Xerox Phaser 3140/Samsung ML-1910/1915

Если версия прошивки менее 73, это сделать совсем просто. Достаточно лишь заклеить крайний контакт чипа картриджа маркированный VCC. Но следует заметить, что этот фокус работает с версией 73 50/50. Это связано с тем, что существует две версии чипов. Если при прошивке 73 заклейка не помогла, то смело удаляйте с чипа элементы С4, С5 и R3. Именно из-за наличия этих элементов, чип упрямится блокироваться. Ну и раз уж вы вынули чип, то можно аккуратно перерезать дорожку на контакт VCC.
При этом в тестовой распечатке будет отсутствовать информация о картридже. А сам он нормально работать, не напоминая об отсутствии тонера вообще.

Однако в 77 версии эта возможность была исправлена. Заклейка контактов в этом случае уже не даст возможности заправлять картридж без всяких хлопот. Для Самсунга в этом случае есть только один шанс - это перепрошивка фиксеной прошивкой. Для Xerox есть еще и возможность покупать чипы. Это связано с тем, что на программном уровне эти аппараты имеют некоторое различие. Во-первых прошивки несмотря на одинаковые версии, отличие в прошивках все-таки есть. На первый взгляд они отличаются идентификаторами модели. Именно по этому подключенный к компьютеру Xerox 3140 распознается именно как 3140, а Samsung 1910 как Samsung соответственно. Но это не единственное отличие. Аппараты различаются чипами. Это делает возможным производство чипов для Xerox но не позволяет использовать например картридж Samsung в Xerox и на оборот. Конечно это при условии наличия в них чипов. А об этом ниже.

На сегодняшний день есть решение вопроса 77 версии прошивки. Это пофиксеная 77 прошивка. искать её на данный момент вам придется самим. Действа и особенности прошивки в принципе идентичны действиям при прошивке Samsung ML-1640. Из всего описанного выше не трудно сделать вывод: и Samsun и Xerox можно прошить прошивками или от одного или от другого аппарата. Если быть точнее, то Xerox приходится перепрошивать в Samsung. Хотя вероятно уже где-то существует и прошивка Xerox.

Внимание: вход в принудительный режим загрузки не обязателен, просто запускайте процесс прошивки и всё. Если прошивка не происходит, попробуйте с принудительным режимом. Весь процесс аналогичен ML-1640.

После перепрошивки, если вы перепрошивали Xerox 3140, при подключении к компьютеру система возвестит о появлении Samsung ML-1910... Здесь есть два решения данной проблемы. Делаем следующее. Первый вариант, подсунуть старый драйвер от Xerox. В открывшемся окне мастера отказываетесь от поиска драйвера в интернете, далее откажитесь от автоматического поиска драйвера, кликните "Я сам выберу нужный драйвер". Выбираете "Xerox" а потом и 3140. Драйвер установится и в системе появится ваш новый принтер под видом всё того же Xerox. Но есть способ и проще. скачивайте драйвер от Samsung ML-1910 и установите. Принтер заработает под видом Samsung.

Следует напомнить о том, что вся эта процедура крайне опасна, при неправильных действиях или отключении питания принтер выйдет из строя, и вероятно навсегда.

Ярлыки

java (31) оптимизация (7) CPanel (5) svn (5) windows xp (5) ошибка (5) свой сервер (5) файлы и папки (5) gui (4) регулярные выражения (4) jacoco (3) redmine (3) windows (3) автоматизация (3) защита данных (3) резервное копирование (3) сервер (3) JavaScript (2) Oracle SQL (2) adsl модем (2) apache maven (2) apache tomcat (2) coverage (2) dropbox (2) excel (2) firewall (2) netbeans (2) office 2007 (2) samsung (2) system tray (системный трей) (2) xerox (2) вирусы (2) принтер (2) сериализация (2) удаленный рабочий стол (2) HTML (1) JFileChooser (1) MySQL (1) Nokia (1) Ovi (1) P660R-T1 (1) WakeOnLan (1) blogger.com (1) ctfmon.exe (1) email (1) flash память (1) ftp (1) integration testing (1) ip (1) jQuery (1) jvisualWm (1) log4j (1) look and feel (1) myBatis (1) php (1) serialVersionUID (1) skype (1) smtp (1) ssh (1) swing (1) torrents (1) unit-testing (1) unix (1) vpn (1) windows 7 (1) xStarter (1) zip (1) безопасность (1) вход в систему (1) дизайн (1) документация (1) заправка (1) интернет (1) логирование (1) мышь (1) патч (1) перенос (1) печать (1) плагины (1) почтовые сообщения (1) программирование (1) процессы (1) прошивка (1) сеть (1) сеть. ошибка (1) скрытые файлы (1) списки (1) фильтрация (1) фокус (1) часовые пояса (1) шифрование (1) экран (1)