четверг, декабря 30

Tomcat и JSESSIONID

Для того, чтобы изменить имя переменной сессии с "JSESSIONID" на, к примеру, "SID", достаточно в файле $CATALINA_HOME/bin/setenv.sh прописать следующую строчку:
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.SESSION_COOKIE_NAME=SID -Dorg.apache.catalina.SESSION_PARAMETER_NAME=sid"

ЗЫ: не забудьте перезапустить Tomcat
ЗЫЫ: в браузерах с залогиненными пользователями кука JSESSIONID не переименуется :) Просто добавится ещё одна с тем же значением

пятница, декабря 10

Tomcat и виртуальный хостинг. часть 2: добавление виртуального хоста

Ранее мы настроили связку Nginx+Tomcat для хостинга. Давайте теперь добавим виртуальный домен example.org

Шаг 1: настраиваем nginx

создаём файл /srv/nginx/vhost_01_example.org.conf:
server { listen 80; server_name example.org *.example.org location / { proxy_pass http://127.0.0.1:8080; include /srv/nginx/proxy.conf; } }

Теперь вы можете выполнить команду "service nginx reload" и, открыв в браузере адрес http://example.org, увидеть домашнюю Tomcat-страницу

Шаг2: настраиваем Tomcat

# cd /srv/tomcat
# mkdir webapps/example.org
# sed -e 's/localhost/example\.org/g' conf/server.d/vhost-localhost.xml > conf/server.d/vhost-example.org.xml

правим server.xml, добавляя новые строки:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE server-xml [ <!ENTITY vhost-localhost SYSTEM "server.d/vhost-localhost.xml"> <!ENTITY vhost-example.org SYSTEM "server.d/vhost-example.org.xml"> ]> ... &vhost-localhost; &vhost-example.org; </Engine> ...

Теперь нужно настроить пользователя для менеджера виртуального хоста.

Добавим нового пользователя manager-example.org с новой одноимённой ролью в /srv/tomcat/conf/tomcat-users.xml:
<role rolename="manager-example.org" />
<user username="manager-example.org" password="12345678" roles="manager-example.org" /&rt;
и внесём изменения в конфигурационный файл Manager-приложения:
# cp -R webapps/localhost/manager webapps/example.org/
# cd webapps/example.org/manager/WEB-INF
# sed -i.bak 's/<role-name>manager<\/role-name>/<role-name>manager-example.org<\/role-name>/g' web.xml

Перезапускаем томкат:
# chown -R tomcat:tomcat /srv/tomcat
# service tomcat6 stop
# tail -f /srv/tomcat/logs/catalina.out ;Ждём остановки Tomcat и жмём Ctrl+C
# service tomcat6 start

Открываем в браузере адрес http://example.org/manager/html и на запрос авторизации вводим логин/пароль для пользователя manager-example.org.

На этом базовая настройка виртуального хоста example.org завершена.


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

Tomcat и виртуальный хостинг. часть 1: связка Nginx + Tomcat

Рано или поздно приходишь к тому, что на сервере Tomcat хочется держать не только один сайт. можно конечно же разные сайты делить за тем же Nginx по запросам к подкаталогу "/domain-name", но правильнее будет сделать разнесение по виртуальным хостам. ещё правильнее - разнести "клиентов" ещё и по разным инстансам tomcat (чтобы они "соседей" не "завалили"), но это покажу как-нибудь в другой серии постов.
Итак, наша задача - настройка Tomcat на работу с виртуальными хостами

С чего мы начнём? с базового задела Tomcat под поставленную задачу - со связки Nginx+Tomcat (помимо плюсов самого Nginx, нам не придётся думать об уровне доступа Tomcat для прослушки 80-го порта)

Настройка производится на сервере CentOS 5.5 (но думаю, что и на других версиях не будет отличий ;) ). Так же на сервере должен быть открыт 80-й порт

Устанавливаем nginx "по умолчанию":
# yum install nginx

создаём каталог /srv/nginx и меняем ему владельца и группу на nginx (в этом каталоге мы будем хранить настройки виртуальных хостов для nginx):
# mkdir -p /srv/nginx
# chown nginx:nginx /srv/nginx


правим файл /etc/nginx/conf.d/virtual.conf
# mv /etc/nginx/conf.d/virtual.conf /etc/nginx/conf.d/virtual.conf.orign
# echo "include /srv/nginx/vhost_*.conf;" > /etc/nginx/conf.d/virtual.conf

создаём файл /srv/nginx/proxy.conf со следующим содержимым:
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

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

создаём хост "по-умолчанию", для этого создаём файл /srv/nginx/vhost_00_default.conf:
server { listen 80 default; location / { proxy_pass http://127.0.0.1:8080; include /srv/nginx/proxy.conf; } }

Теперь переходим к базовой установке и настройке Tomcat
Скачиваем и распаковываем дистрибутив Apache Tomcat (повествую на примере версии 6.x)
# cd /srv
# wget http://www.sai.msu.su/apache/tomcat/tomcat-6/v6.0.29/bin/apache-tomcat-6.0.29.tar.gz
# tar xvf apache-tomcat-6.0.29.tar.gz
# mv apache-tomcat-6.0.29 tomcat
# useradd -d /srv/tomcat -s "/sbin/nologin" tomcat

для запуска демона Tomcat от пользователя tomcat можно скомпилировать jsvc, но мне больше нравится нижеприведённый скрипт /etc/init.d/tomcat6:
#!/bin/sh # # /etc/init.d/tomcat6 # # This is the init script for starting up the # Jakarta Tomcat Server # # chkconfig: 234 20 80 # description: Starts and stops the Tomcat daemon # processname: tomcat # # source functions library for 'daemon' function . /etc/init.d/functions TOMCAT_HOME=/srv/tomcat TOMCAT_START=$TOMCAT_HOME/bin/startup.sh TOMCAT_STOP=$TOMCAT_HOME/bin/shutdown.sh TOMCAT_USER=tomcat start() { echo -n $"Starting Tomcat service: " daemon --user $TOMCAT_USER $TOMCAT_START RETURN_CODE=$? echo $? } stop() { echo -n $"Stopping Tomcat service: " daemon --user $TOMCAT_USER $TOMCAT_STOP RETURN_CODE=$? echo $? } status() { ps aux | grep tomcat | grep -v grep } # Handle the different input options case "$1" in start) start ;; stop) stop ;; status) status ;; *) echo $"Usage: $0 {start|stop|status}" exit 1 esac exit 0

Теперь переходим к небольшому "тюнингу" Tomcat, для дальнейшего удобства его администрирования

Для начала, поправим файл /srv/tomcat/conf/server.xml (далее просто server.xml) для работы с Nginx. Для этого найдём
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />
и заменим её на
<Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />
тем самым мы укажем Tomcat, чтобы он слушал порт 8080 только локально

Перейдём к настройке хостов.

удобнее всего править настройки хостов не выискивая их в "портянке" файла server.xml, а вынеся настройки каждого хоста в отдельный файл. Для этого произведём некоторые изменения в файле server.xml

изменяем "шапку" файла, дописав блок DOCTYPE:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE server-xml [ <!ENTITY vhost-localhost SYSTEM "server.d/vhost-localhost.xml"> ]>

создадим подкаталог server.d, в котором будут лежать конфигурационные файлы наших виртуальных хостов:
# cd /srv/tomcat/conf
# mkdir server.d

Вынесем в отдельный файл настройки для localhost... Для этого найдём в server.xml блок "<Host>...</Host>" и сохраним его в server.d/vhost-localhost.xml:
# cd /srv/tomcat/conf
# echo "<?xml version='1.0' encoding='utf-8'?>" > server.d/vhost-localhost.xml
# sed -n -e '/[[:space:]]*<Host.*/,/[[:space:]]<\/Host>/p' server.xml >> server.d/vhost-localhost.xml
# sed -i.bak -n '1h;1!H;${x;s/<Host.*<\/Host>/\&vhost-localhost;/;p}' server.xml

Для работы Tomcat требуется установленная на сервере Java-машина. Путь до неё прописывается в файле /srv/tomcat/bin/setenv.sh:
# echo "JAVA_HOME=/usr/java/default" > /srv/tomcat/bin/setenv.sh

Следующий наш шаг - настройка каталога webapps для будущих виртуальных каталогов
# cd /srv/tomcat
# sed -i 's/webapps/webapps\/localhost/' conf/server.d/vhost-localhost.xml
# mv webapps localhost
# mkdir webapps
# mv localhost webapps/

и заваршающее действие:
# chown -R tomcat:tomcat /srv/tomcat

Готово. теперь можно запускать созданный web-сервер:
# service tomcat6 start
# service nginx start

Зайдите в браузере по адресу http://ваш_сервер - вы должны увидеть Tomcat-страницу по-умолчанию.

Если всё правильно настроено и вы увидели страницу Tomcat, то можно установить автозапуск для демонов:
# chkconfig nginx on
# chkconfig --add tomcat6
# chkconfig tomcat6 on

ЗЫ: комментарии и замечания приветствуются :)

UPD: изменил немного скрипты - местами удалил "ручную" работу и описал для Tomcat 6 вместо Tomcat 7


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

суббота, ноября 13

Debian. mysql server

статья устарела. обновленная версия тут

Сразу после установки настраиваемся на utf8 и удаляем ошибку при запуске демона:

1) устанавливаем сервер MySQL
apt-get install mysql-server

2) удаляем ошибку "Access denied for user ‘debian-sys-maint’@'localhost" (решение найдено тут)
открываем файл /etc/mysql/debian.cnf и находим строчку password:
password = bla-bla-bla

в клиенте mysql выполняем команду
GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '%password%' WITH GRANT OPTION; # вставляем вместо %password% "подсмотренный" пароль.

3) устанавливаем кодировку utf8 по умолчанию
в файле /etc/mysql/my.cnf добавляем строки для каждого блока []:

[client]
default-character-set = utf8
[mysqld_safe]
default-character-set = utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = "set names utf8;"
[mysqldump]
default-character-set = utf8

4) перезапускаем сервер MySQL

5) заходим клиентом и на команду "mysql> show variables like "%character%";show variables like "%collation%";" видим нечто подобное:
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

четверг, ноября 11

Debian. timezone

Для настройки временной зоны и синхронизации,
  • "apt-get install ntp ntpdate" - ставим NTP демона для синхронизации
  • "ntpdate -bs ru.pool.ntp.org" - синхронизируем часы
  • "dpkg-reconfigure tzdata" - выставляем нужную нам временную зону, например Europe/Moscow

подсмотрено тут


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

с CentOS на Debian. iptables

Решил перебраться на сервере с CentOS на Debian

Первое "неудобство", с которым столкнулся, это отсутствие, ставших уже привычными, скриптов восстановления правил для iptables.
Поиск в инете можно сделать и найти вагон и маленькую тележку информации, что в Debian всё убрано и что нужно всё прописывать ручками в интерфейсах и прочее... а можно просто глянуть результат команды "apt-cache search iptables" и увидеть пакет iptables-persistent (как поставить из тестовой ветки)... вот он то нам и нужен

устанавливаем пакет командой "apt-get install iptables-persistent"
теперь у нас есть скрипт /etc/init.d/iptables-persistent, который и будет восстанавливать правила после запуска системы.
А сами правила теперь вместо /etc/sysconfig/iptables лежат в /etc/iptables/rules
соответственно, после тестирования правил, сохраняемся по команде "iptables-save > /etc/iptables/rules".

В остальном больше никаких изменений нет - у меня прекрасно заработал всё тот же мой скрипт iptables.sh


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

среда, сентября 8

а они всё прут и прут. о_О

Народ, скажите, что за хрень такая? При том, что я НИЧЕГО с этими сайтами не делаю - ни оптимизации, ни каких-либо изменений в контенте! на том, который под 2 тыщи % посещений вообще всего 4 html странички статичного текста...



понедельник, сентября 6

Zend Studio и поддержка Ant-скриптов. Продолжение

Как выясняется, мало включить поддержку Ant, так надо ещё и JVM поменять для выполнения Ant-скриптов, чтобы не получать UnsupportedClassVersionError.

По-умолчанию Zend Studio (проверял на 7.2.1) использует JRE 1.5.0_08 и при при запуске Ant-скриптов на задачах, связанных с SSH, получаем UnsupportedClassVersionError
Решается очень просто:

1) Включается поддержка Java
1.1) Открываем диалог создания нового проекта "File > New > Other..."
1.2) В диалоге ставим галочку на "Show All Wizards", если она не стоит (у меня так её и вовсе уже почему-то нет) и жмём Next
1.3) в диалоге "Confirm Enablement" нажимаем "OK", чтобы включить поддержку Java
1.4) Закрываем диалог создания проекта
2) В настройках в разделе "Java > Installed JREs" добавляем путь до нужной нам версии JRE и ставим возле неё галочку

ЗЫ: перезагружать Zend Studio не обязательно
ЗЫЫ: пробовал поменять VM для Zend Studio на 1.6, но IDE начала зависать на некоторых диалогах, да и для ant-скриптов всё равно использовала свою JRE, а не указанную через ZendStudio.ini





Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

Zend Studio и поддержка Ant-скриптов

Собственно, в интернете достаточно (если покопаться) написано про то, как включить поддержку Ant в Zend Studio.

Мною найден ещё один способ - использование ant БЕЗ включения :) извращение, но имеет право на жизнь. подкатом описаны оба способа.

1-й способ: "без включения" поддержки Ant.
Особенность заключается в том, что ant-скрипты всё равно РАБОТАЮТ даже при выключенной поддержке :) и, если вам не понадобится расширять ant своими или сторонними библиотеками (такими например, как поддержка ssh), то этого вполне достаточно.

Открываем справку через "Help > Help contents" и открываем раздел "Ant view" как указано на картинке ниже. В открывшемся разделе кликаем по ссылке выделенной на картинке красной линией. вуаля - мы имеем представления, в которое можно добавлять ant-скрипты и выполнять их.
Да, чтобы представление полностью заработало (появились кнопки), потребуется перезапустить Zend Studio.



Способ рабочий, но из категории "так делать не надо" - правильнее будет включить полноценную поддержку ant-разработки, о чём я напишу во-втором способе:

2-й способ: с включением поддержки Ant (знания подчерпнуты на просторах интернета)
1) Меню "File > New > Other..."
2) Кликаем по "Show All Wizards", чтобы увидеть скрытые мастера, а в частности, раздел Java
3) Выбираем "Java Project from Existing Ant buildfile" и жмём "Next"
4) в диалоге "Confirm Enablement" нажимаем "OK", чтобы включить поддержку Ant
5) Закрываем диалог создания нового проекта
6) Перезапускаем Zend Studio







Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

понедельник, августа 30

Zend Framework XML-конфиг и константы

В предыдущем посту я написал про то, как легко перейти с INI-конфигурации на XML-конфигурацию. В использовании оной есть как плюсы, так и минусы.

из плюсов, как минимум то, что не приходится писать кучу повторяемых "веток" вида "resources.frontController" - мы пишем простое XML-дерево.
из минусов:
1) чтение XML-конфигурации несколько дольше (по тестам, что нашёл - ~0,15 сек). но есть подозрение, что ещё быстрее, чем ini-файл будет подсовывание напрямую массива как конфигурации
2) При автоматическом форматировании XML в редакторах, значения с zf-константами форматируются "криво" - переносятся на новые строки.

Решением проблемы (2) мы и займёмся.
Для начала скажу, что для разработки я использую Eclipse, а для загрузки файлов на сервер - ant-скрипт, который делает предварительную сборку файлов перед загрузкой на сервер. В нём же производятся некоторые действия над файлами, одно из которых я приведу ниже.

Определим правило, что константы вместо "<zf:const zf:name="константа">" в xml-конфиге будем описывать как "%ZF.константа%". для замены содержимого в файле, воспользуемся task-ом replaceregexp, выглядящий следущим образом:

<replaceregexp flags="g">
 <!-- заменяем "%ZF.константа%" на "<zf:const zf:name="константа" />" -->
 <regexp pattern="%ZF.(.*)%" />
 <substitution expression="&lt;zf:const zf:name=&quot;\1&quot; /&gt;" />
 <fileset dir="${target}/application/configs" includes="**/*.xml" />
</replaceregexp>

собственно на этом всё. :)
Итого: на этапе разработки мы получаем удобный XML, без "лишних" тегов, а на сервере правильный xml-конфиг с понятными для ZF константами

Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

Zend Framework и XML конфиг вместо INI

Делается всё просто как на 1-2-3:

1) открываем файл public/index.php
2) после строки "require_once 'Zend/Application.php';" дописываем строку "require_once 'Zend/Config/Xml.php';"
3) вместо
$application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
пишем строки:
$cfg = new Zend_Config_Xml(APPLICATION_PATH . '/configs/application.xml', APPLICATION_ENV);
$application = new Zend_Application(APPLICATION_ENV, $cfg->toArray());
4) сохраняем изменения

да, и не забываем создать xml-файл конфигурации вместо ini-файла ;)


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

суббота, августа 21

NAT & iptables в Linux (CentOS)

несколько часов убились мною и моим коллегой "по цеху" на поиск решения "да что за нафиг такой?" :)

преамбула:
на сервере используется скрипт iptables.sh, который описывает правила для iptables. дело нехитрое - поправил правила, запустил, проверил работу и, если всё тип-топ, то сохранил правила.
В скрипте описание довольно нехитрое: очистили все правила маршрутизации и воссоздали их по новой.
Всё казалось бы просто, до тех пор, пока не столкнулись с nat-маршрутизацией :)

правила сбрасывались следующими строчками в скрипте:
$IPTABLES -F
$IPTABLES -X
, где $IPTABLES - путь до приложения (IPTABLES="/sbin/iptables")

в том же скрипте когда-то была настройка на переброс порта с 80 на 8080, от которой по некоторым соображениям, было решено отказаться.
дело не хитрое - заремили нужную строку и выполнили скрипт.
и, как говорится, "скоро сказка сказывается, да не скоро дело делается" - НЕ ПАШЕТ.
снова смотрим скрипт - всё верно. сохраняем правила, перегружаем сервер на всякий, что должно как минимум сбросить нам все правила и реанимировать их из сохраняшки. ага, щаз...

в общем, пока суд да дело, было найдено решение - в блок сброса таблицы маршрутизации требуется дописать отдельное правило для сброса именно nat-маршрутов:
$IPTABLES -t nat -F

после чего, весь блок сброса приобретает вид:
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F

ЗЫ: подумалось, что это ведь довольно неплохая задачка для вопроса на собеседовании :)


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

суббота, августа 14

плюшки Windows 7: список "программы и компоненты"

В показываемом списке работает комбинация Ctrl+R, обновляющая список. удобно - не нужно закрывать и заново открывать, чтобы увидеть свежеустановленное ПО
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

среда, августа 11

Firefox (NoScript) и IBM PartnerWorld = XSS скриптинг

В какой-то момент, понадобилось добраться до ПО, доступного по партнёрской программе.
Захожу на сайт IBM, авторизуюсь, перехожу в раздел PartnerWorld. Иду в раздел "поиск и загрузка ПО" и... "а с платформы говорят"... в общем, получаю ошибку 503.

Первая мысль - что-то не то с учетной записью. Позвонил в IBM - выяснили, что всё нормально.
Начинаю изыскания на своей стороне.

После непродолжительного анализа, выясняется, что серверов-то у IBM многа и при сёрфинге по сайту, мы "скачем" с одного на другой и в итоге получаем подозрение на XSS-атаку, которую успешно блокирует плагин NoScript.

Чтобы этого не возникало, достаточно в настройки NoScript в разделе XSS (Дополнительно>XSS) добавить правило "^https?://.+\.ibm\.com/*" и, хвала!, всё заработало!


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

воскресенье, августа 1

декоратор Sitemesh и страница ошибок

в предыдущем посте я написал как сделать обработку ошибок через Springframework

В своих проектах я использую Sitemesh для задания шаблонов дизайна для различных страниц.
Для страницы с ошибкой порой требуется её обработка в стандартном шаблоне дизайна. Что делать? рисовать дизайн заново? или можно воспользоваться тем, что предоставляет нам Sitemesh?
Конечно же, предпочтительнее последний вариант.
на FAQ-странице есть указание, что это можно сделать, но там присутствует ошибка - указаны не все диспетчеры для обработки. В список диспетчеров требуется добавить ERROR:

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

показ страницы ошибки с использованием Spring MVC

При разработке под веб, на "боевых" серверах требуется прятать сообщения об ошибках (ну или хотя бы их как-то "облагораживать").
Стандартный путь - описание обрабатываемых ошибок в web.xml. например такой:
<error-page>
 <error-code>404</error-code>
 <location>/error.jsp</location>
</error-page>
<error-page>
 <exception-type>java.lang.Exception</exception-type>
 <location>/error.jsp</location>
</error-page>

А что делать, если в проекте используется Springframework и хотелось бы использовать его возможности?
Всё достаточно просто. Требуется написать контроллер, который будет обрабатывать урл например вида "/error.htm" и в web.xml вместо "/error.jsp" указать "/error.htm" - код и сообщение об ошибке по прежнему будут нам доступны в объекте request.

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

среда, июля 28

Релиз дистрибутива Clonezilla Live 1.2.5

Вышел стабильный релиз Linux дистрибутива Clonezilla Live 1.2.5-35, предназначенного для быстрого клонирования дисков (копируются только используемые блоки). Задачи выполняемые дистрибутивом сходны с проприетарным продуктом Norton Ghost. Дистрибутив основан на Debian GNU/Linux, в своей работе использует код проектов DRBL, Partition Image, ntfsclone, partclone, udpcast. Возможна загрузка с CD, USB Flash и по сети (PXE). Поддерживаются ФС: ext2, ext3, reiserfs, reiser4, xfs, jfs, FAT, NTFS, UFS, HFS+ (Mac OS X). Поддерживается режим массового клонирования в multicast режиме, например, при тестировании, за 10 минут удалось провести клонирование исходного 5.6 Гб диска на 41 клиентскую машину. Размер iso-образа дистрибутива - 118 Мб.

Из наиболее заметных улучшений релиза Clonezilla Live 1.2.5-35 можно отметить:

  • Дистрибутив переведен на пакетную базу Debian Sid, со всеми обновлениями по состоянию на 20 июля;
  • Linux-ядро обновлено до версии 2.6.32-17;
  • Для сборки Live-системы использованы пакеты live-helper 2.0~a19-1.1drbl и live-initramfs 1.236.2-1drbl-3;
  • Утилита Partclone обновлена до версии 0.2.11;
  • По умолчанию используется видеорежим VGA 800x600, что позволяет использовать дистрибутив на нетбуках с небольшими экранами;
  • В приложение prep-ocsroot добавлена поддержка sshfs/cifs путей с пробелами;
  • Программа ocs-iso теперь может создавать iso для восстановления системы, размером больше 4.5 Гб.




источник

Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

понедельник, июля 26

скорость загрузки сайта и Google ajaxlibs

Собственно, отказался от использования Google ajaxLibs, т.к. сайты его использующие, открывались достаточно долго. задержка загрузки порядка +3-4 секунды.
Перетащил всё на собственный CDN-сервер.
Думаю ещё попробовать CDN от Yandex - сравню скорость загрузки с ним.


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

воскресенье, июля 4

Maven2 и несколько серверов для WAR-архива. часть 1: работа с зависимостями

Предистория:
С недавних пор решил перебраться с Ant на Maven. Причины? они просты - в Maven неплохо реализована работа с зависимостями (которую я активно использую в Eclipse), но мне было неудобно каждый раз выискивать и копировать эти зависимости ручками на сервер (что тестовый, что "боевой"). В итоге было решено перебраться полностью. А там, где возможностей не хватает, то использовать Antrun плагин, позволяющий использовать ant-скрипты.

Итак, лирика закончилась. Приступим к реализации цели поста.

Имеется исходная задача:
1) набор зависимостей для проекта (здесь и далее подразумевается разработка WAR-архива)
2) "боевой" удалённый сервер
3) тестовый удалённый сервер (отличается от "боевого" настройками для отладки)
4) на серверах установлен Tomcat6 с настроенной поддержкой shared-lib


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

Для определения dependency-библиотек, которые будут копироваться в shared-каталог tomcat, будем использовать указание scope как provided (подробнее про scope читать на русском тут)

Несколько продолжительные изыскания привели к следующей схеме профилей:

  • профиль "development" - указываем свойства, специфичные для сервера разработки, такие как пути и логины/пароли
  • профиль "production" - указываем свойства, специфичные для "боевого" сервера (всё те же пути и логины/пароли)
  • профиль "dependency" - в этом профиле описываем плагины (и их работу), отвечающие за копирование зависимостей на выбранный сервер
пример профиля "development" (для профиля "production" подставляются другие значения свойств):
<profile>
 <id>development</id>
 <properties>
  <hostname>servername.dev</hostname>
  <ssh.host>${hostname}</ssh.host>
  <ssh.username>логин</ssh.username>
  <ssh.password>пароль</ssh.password>
  <ssh.tomcat.lib.shared>/srv/tomcat/shared/lib</ssh.tomcat.lib.shared>
 </properties>
</profile>

Теперь перейдём к самому "сложному" - копированию зависимостей на сервер.
для этого потребуется 2 шага - сбор зависимостей и, собственно, само их копирование.

Для сбора зависимостей, воспользуемся плагином maven-dependency-plugin, для которого укажем некоторые нюансы его работы:
<plugin>
 <artifactId>maven-dependency-plugin</artifactId>
 <version>2.1</version>
 <executions>
  <execution>
   <id>10-copy-dependencies</id>
   <phase>process-resources</phase>
   <goals><goal>copy-dependencies</goal></goals>
   <configuration>
    <IncludeScope>provided</IncludeScope>
    <outputDirectory>${project.build.directory}/dependency</outputDirectory>
    <overWriteReleases>false</overWriteReleases>
    <overWriteSnapshots>false</overWriteSnapshots>
    <overWriteIfNewer>true</overWriteIfNewer>
   </configuration>
  </execution>
 </executions>
</plugin>

Кратко поясню, что здесь написано.
1) указано выполнение плагина с моими настройками на этапе работы с ресурсами (process-resources) проекта. подробнее про Lifecicle проекта можно глянуть тут
2) указываем, какие (IncludeScope) и куда (outputDirectory), а так же режим копирования

Теперь перейдём к шагу копирования полученных зависимостей на удалённый сервер. Для этого воспользуемся ant задачей scp
<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-antrun-plugin</artifactId>
 <version>1.4</version>
 <executions>
  <execution>
   <id>90-antrun-copy-dependencies</id>
   <phase>process-resources</phase>
   <goals><goal>run</goal></goals>
   <configuration>
    <tasks>
     <scp todir="${ssh.username}@${ssh.host}:${ssh.tomcat.lib.shared}" 
      password="${ssh.password}">
      <fileset dir="target/dependency" />
     </scp>
    </tasks>
   </configuration>
  </execution>
 </executions>
 <dependencies>
  <dependency>
   <groupId>ant</groupId>
   <artifactId>ant-jsch</artifactId>
   <version>1.6.5</version>
  </dependency>
  <dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.42</version>
  </dependency>
 </dependencies>
</plugin>

Кратко поясню, что здесь написано:
1) Указано выполнение плагина maven-antrun-plugin с моими настройками на этапе работы с ресурсами (process-resources) проекта
2) Для выполнения плагина подключены необходимые зависиимости, доступные только на этапе работы плагина (требуются для scp-задачи)

Теперь описанные выше два плагина мы добавляем в профиль "dependency" следующим образом:
<profile>
 <id>copy-dependency</id>
 <build>
  <finalName>${hostname}</finalName>
  <plugins>
   <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    ...
   </plugin>
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-antrun-plugin</artifactId>
     ...
   </plugin>
  </plugins>
 </build>
</profile>

На этом конфигурирование Maven для проекта закончилось.

Следующий шаг - настройка запуска сборок в eclipse для проекта maven.
воспользуемся плагином m2eclipse и в диалоге Run>Run configurations... создадим 2 конфигурации:




В профиле мы указываем сразу 2 профиля - один (например "development") используется для предоставления свойств, а второй ("dependency") реализует процедуру копирования зависимостей на сервер согласно указанных свойств
Так же мы указываем 2 шага выполнения Maven - clean (очистка от предыдущей сборки) и работу с ресурсами (process-resources).

Итог:
создавая и комбинируя различные профили, можно добиться практически такой же гибкости как у Ant, при этом Maven "заставляет" нас придерживаться строгой структуры каталогов (что тоже можно немного изменить) и последовательностей сборки проекта.

Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

воскресенье, июня 13

Гимн России и гики

Забыли гимн России? Не беда!

Вариант для Windows CMD (в одну строку):
@echo off & (
for /l %z in (200,1,223) do
for /f "usebackq skip=3 tokens=2-10 delims=:." %a in (`nslookup 62.76.96.%z`) do echo %a %b %c %d %e %f %g %h %i|
findstr /RV "[0-9]") & echo on
Вариант для Unix/Linux:
dig -t ptr +short {200..225}.96.76.62.in-addr.arpa

пятница, июня 11

Светлое будущее копирайта

- То есть как это: скопировать?
- Ну я не знаю, какими это кнопками это теперь делается...
- Дед, да не в кнопках дело, я просто не могу - у меня лимит в этом месяце кончился.
- Какой лимит?
- Обычный лимит, на копирование собственных текстовых файлов. Картинку вот эту - хочешь, залью?
- Да не нужна мне она, ты мне расписание своё скопируй.
- Чудак-человек, да не могу же! В этом месяце на картинки ещё осталось, а на тексты - уже всё.
- То есть картинку ты можешь скопировать, а текст - нет?
- Ну да.
- А в чём разница?
- В том что это - картинка, а это - текст.
- Но ведь и то, и то - файл?
- Файл.
- Ну и скопируй мне его!
- Не могу!
- Да почему?!
- Да говорю же, лимит на текстовики кончился!
- То есть только картинка?
- Ну слава богу - дошло.
- Вот понавыдумывали всякого...
- Можно подумать, раньше по другому было.
- А вот и было.
- И как же "было"?
- Любой файл можно было копировать. Сколько хочешь раз. Бесплатно.
- Что, и не свои файлы - тоже?
- Да не было такого - "не свои файлы". Все файлы, которые у тебя есть - твои!
- Ну ты даёшь, дед! То, что ты расписываешь - это ж даже не расширенная, это ж промышленная лицензия! Промышленная, понимаешь? Знаешь, каких она денег стоит?! И чтоб такое любому разрешали? Хорошь заливать-то...
- ...Хрен с тобой, не веришь - не надо. Значит говоришь, только картинку можно? Ну, засунь свой текст в графику, и сохрани как картинку, мне расписание это нужно очень.
- Ишь ты! Должно сработать... Дед, а ты - хитрый дед, ты в курсе?
- Станешь тут с вами... хитрым...

* * *


- Мам, приколись, а дед говорит, что раньше можно было копировать что угодно и сколько угодно раз!
- Ты его слушай больше. Он тебе ещё не такое понараскажет. Лучше принеси мне карточку мою, она там, на трюмо лежит.
- Прикупить чего решила?
- Да нет, у меня лицензия на готовку закончилась и отчисления правооблодателям рецепта яичницы сделать - плита не включается, и холодильник яйца не отдаёт.
- Сейчас принесу.
- Здорово всё-таки, что заплатить можно быстро и удобно! Что значит - прогресс! И как раньше люди жили?

источник

четверг, мая 27

новинки/правки в Fedora 13

Перешёл с Russian Fedora 12 на Fedora 13.

Что из "плюшек", кроме уже широко озвученных заметил я:

1) Пропал баг с Madwimax для Yota при вытаскивании и повторной вставке модема. раньше приходилось ручками "прибивать" процесс и потом уже вставлять модем
2) После выключения и повторного включения Wi-Fi, NetworkManager нормально цепляется к Wi-Fi сети. раньше с этим у меня была проблема :(
3) наконец-то "из коробки" заработал Compiz на ATI карточке (ноут) и пока, тьфу-тьфу, без багов

и из минусов: как не умел ставить "из коробки" мой МФУ Samsung SCX-4300, так и не умеет. Не помогает даже заявленная фунциональность с "автоматический поиск драйверов для принтеров" (не_верю)


пока всё за 40 минут пользования новой ОС.


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

понедельник, мая 10

JSP и тег Script для JavaScript (решение)

Проблема: При использовании XML форматирования на JSP странице, тег Script "обрезается":

пишем:
< jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" >
...
< script src="script.js" type="text/javascript" >
< /script >
...
< /jsp:root >

получаем:
...
< script src="script.js" type="text/javascript" />
...
решение: добавить внутрь тега SCRIPT точку с запятой, чтобы тег был валидным и не пустым
< ?xml version="1.0" encoding="UTF-8"? >
< jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" >
...
< script type="text/javascript" src="script.js" >;< /script >
...


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

Spring Security + Sitemesh (решение)

Проблема: при совместном использовании Spring Security и Sitemesh, в файлах-декораторах не работают теги Security

Решение: в web.xml описание фильтра Sitemesh делать ПОСЛЕ описания фильтра Spring Security

источник помощи: http://black-rocky.blogspot.com/2008/07/spring-security-acegi-and-sitemesh.html


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

вторник, мая 4

авторизация в SSH без пароля (по ключу)

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

В качестве метода авторизации по SSH можно использовать пару RSA ключей (публичный и секретный). Сначала пара ключей создается на компьютере, который будет использоваться для входа по SSH, затем публичная часть ключа копируется на сервера, к которым нужен доступ. Ключ может быть без пароля, но это не очень безопасно, зато удобно. Можно же зашифровать секретный ключ паролем, при соединении к серверам будет запрошен пароль, и вы сможете использовать один пароль для доступа ко всем серверам.
Генерация SSH ключей

В первую очередь, нужно создать пару ключей, если их ещё нет. По умолчанию ключи хранятся в домашней директории пользователя, /home/имя пользователя/.ssh/id_rsa и id_rsa.pub. Итак:

ssh-keygen
Enter file in which to save the key (/home/igosha/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):<Пароль(или ничего), Enter>
Enter same passphrase again: <Тот же пароль, Enter>
Your identification has been saved in /home/igosha/.ssh/id_rsa.
Your public key has been saved in /home/igosha/.ssh/id_rsa.pub.
The key fingerprint is:
92:12:4c:сс:c8:36:ec:f6:60:50:c4:82:2a:01:39:20 igosha@igosha

Пара ключей готова.
Установка SSH ключей на сервера

Теперь, когда у нас есть ключ:
- нужно создать на серверах, к которым мы собираемся подключаться с использованием этого ключа, папку /home/имя пользователя/.ssh. И, конечно, на сервере должен существовать пользователь с тем же именем, что и на локальной машине, где мы делали ключ.
- копируем файл /home/имя пользователя/.ssh/id_rsa.pub на сервер, в файл /home/имя пользователя/.ssh/authorized_keys2:
scp ~/.ssh/id_rsa.pub hostname_of_server:.ssh/authorized_keys2

Важно: если файл authorized_keys2 уже существует, то его нужно просто дописать:
cat ~/.ssh/id_rsa.pub | ssh hostname_of_server "cat >> .ssh/authorized_keys2"

Это позволит использовать несколько ключей для авторизации под одним пользователем, например, если вы хотите авторизоваться с разных машин с разными же ключами.
Проверка авторизации по SSH ключу

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


Источник статьи: http://www.igosha.com/archives/41


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

воскресенье, мая 2

непонятка с logout в SpringFramework

Долго пытался понять, почему у меня не происходит c разлогиниванием - и так конфиги крутил и эдак... и форумы облазил... и куки сбрасывал в браузере и сервер приложений ребутал - а всё равно...
В итоге, простое закрытие браузера (точнее, его "падение") решило "проблему" избавив меня от оной напрочь - заработало ВСЁ, вплоть до редиректор при разлогинивании...

что это было?

версии:
Tomcat: 6.0.20
SpringFramework: 2.5.6
Spring-Security: 2.0.5
Firefox: 3.5.9
OS: Fedora 12


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

суббота, апреля 17

Skype и "плюшка" - редактирование последнего сообщения

Сегодня рассказ пойдёт про "плюшку" в скайпе под названием "редактирование последнего сообщения"

Часто бывает так, что писал-писал что-то, отправил и видишь, что опечатался. И так и "подмывает" исправить ошибку...
обычно для этого пишут новое коротенькое сообщение по образцу "* текст_поправки". А в скайпе можно просто исправить ошибку ;)

Как это делается?


допустим мы написали фразу "ну могет быть" и решили её исправить на "ну может быть"

нажимаем стрелку вверх и видим, что в редакторе сообщения появилось наше последнее сообщения, а фон редактора стал желтым:

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


Что нельзя сделать:
1) удалить сообщение (но можно написать точку и тогда в сообщении останется только точка ;) )
2) редактировать предпоследнее и более ранние сообщения

Что делать можно:
1) Редактировать своё последнее сообщение, даже если вам уже ответили :)
2) Прервать редактирование без внесения правок - достаточно нажать ESC в процессе редактирования (в Linux это работает точно. По слухам, в Windows вместо прерывания редактирования происходит закрытие чата)

ЗЫ: все скриншоты доступны в альбоме "Blogspot:003"



Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

четверг, апреля 15

логические ошибки

"Слепо" доверять интеллектуальным подсказчикам IDE - зло!

простой пример появления логической ошибки:


пишем код:
if (cookies.length != 0) {
    for (int i = 0; i < cookies.length; i++) {
     isAuth = isAuth || cookies[i].getName().equalsIgnoreCase(paramCooikeAuth);
     break;
    }
   }
логическая ошибка - наличие break без условия прерывания. IDE (в данном случае, Eclipse) предлагает удалить "i++", как не требующуюся в цикле (всё равно не будет использована). "Слепо" соглашаемся Чуть позже замечаем ошибку про break и добавляем условие:
if (cookies.length != 0) {
    for (int i = 0; i < cookies.length;) {
     isAuth = isAuth || cookies[i].getName().equalsIgnoreCase(paramCooikeAuth);
     if (isAuth) break;
    }
   }
Но следом получаем вечный цикл for, так как отсутствует счетчик, удалённый ранее! Следствие: прежде чем согласиться на то, что предлагает IDE - подумайте, ПОЧЕМУ он это предлагает, ведь может так оказаться, что ошибка-то совсем не в том месте, где её "видит" IDE! UPD: в конечном итоге код всё равно сократился до (см. ниже), но как говориться, "осадок остался" :)
if (cookies.length != 0) {
    for (int i = 0; i < cookies.length; i++) {
     if (isAuth = cookies[i].getName().equalsIgnoreCase(paramCooikeAuth)) break;
    }
   }

Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

понедельник, апреля 12

Cisco VPN Client в windows 7. решение

Попытка с "наскоку" поставить клиента увенчалась ошибкой и нежеланием оного клиента ставиться...
Краткий сёрф в гугле привёл меня к сией статье, часть которой и приведу сюда в переводе:

Для установки Cisco VPN Client требуется произвести следующий ряд манипуляций:
  • Удалить (если у вас таки установился) Cisco VPN Client
  • Перезагрузиться
  • Установить Citrix DNE Update
  • Перезагрузиться
  • Установить Cisco VPN Client
  • Перезагрузиться

Данное решение рабочее, ибо проверено на себе :)


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

воскресенье, апреля 11

Gnome. неправильная ассоциация для каталогов. решение

Так получилось, что решил сделать "как в Windows" - отправить каталог с видео через Nautilus в проигрыватель.
Отправить-то отправил, а вот после этого ВСЕ каталоги стали открываться в этом самом медиа-проигрывателе.

решение простое "до ужаса": в файле ~/.local/share/applications/mimeapps.list удалить строку, начинающуюся с inode/directory

описание файла можно найти на сайте "производителя": http://www.freedesktop.org/wiki/Specifications/mime-actions-spec


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

thunderbird 3 "ошибка при получении пароля". решение

При очередном запуске Thunderbird 3 в момент получения почты появляется сообщение "Ошибка при получении пароля"
Удаление в профиле файлов key3.db, signons.sqlite, signons.txt и signons3.txt не приводили к нужному результату - сбросу паролей.
В итоге, решение нашлось на Bugzilla.mozilla.org в виде переустановки Thunderbird.

Последовательность действий, которую делал я:
1) удалил Thunderbird 3
2) удалил вышеназванные файлы
3) установил заново Thunderbird 3

В итоге, после запуска программы, получаем "девственно чистый" менеджер паролей

ЗЫ: трабла была в Linux, но решение озвучивалось под Windows ;)


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

среда, марта 17

Pidgin и смайлы из QIP

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

ЗЫ: пашет одинаково хорошо как под Linux, так и под Windows. хотя, другого и не ожидалось :)


Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!

четверг, марта 4

Не запускается Lotus Designer 8.5 (Eclipse)

Выдаёт ошибку "platform command processor has encountered a problem".

Удалите файл com.ibm.designer.domino.personality.config.xml в каталоге "%NOTES_DATA%\workspace\.metadata\.plugins\com.ibm.rcp.personality.framework\personalityWindowState"

источник + проверено на себе :)

Мелочи про Eclipse

Разные приятные мелочи и полезности при работе с Eclipse

1) Проблема "Иконка в Linux не всегда показывается у приложения. Среда Gnome"
Просто скопировать файл ECLIPSE_HOME/icon.xpm в /usr/share/icons/eclipse.xpm

2) Изменение имени автора (@author) по-умолчанию.
При добавлении в JavaDoc описание ключа @author, автоматически подставляется имя текущего пользователя.
Добавьте в eclipse.ini после строки "-vmargs" строку "-Duser.name="Ваше_имя_автора"


воскресенье, февраля 21

сброс (flush) локального DNS кеша

в Windows в командной строке:
ipconfig /flushdns

в Linux в терминале:
sudo /sbin/service nscd restart
если sudo не настроен (всякое бывает :) ), то так:
su -c '/sbin/service nscd restart'

вторник, февраля 9

красивый Eclipse

Eclipse стал по-новогоднему красивый :)

Ant-скрипт для деплоинга приложений на сервер приложений

При разработке бывают моменты, когда требуется загрузить архив приложения на сервер. Одним из вариантов для этого является "забрасывание" архива приложения в каталог на сервере, где его автоматически "подхватит" например tomcat или jboss

первым и "простым" способом для этого является задача scp для ant-скрипта.

scp file="${dir.build}/${file.war}" trust="true" password="${ssh.pwd}" todir="${ssh.user}@${ssh.host}:${tomcat.deploy}" /

но... через какое-то
время сталкиваешься с "полтергейстом", когда приложение загрузилось, а деплоиться "не желает".
небольшой экспресс-анализ показал, что сервер подхватывает архив раньше, чем он полностью "залился" на сервер.
для решения данной проблемы можно пойти обходным путём - сперва скопировать архив во временный каталог, или с другим расширением, а после уже локально переместить его в нужное место

target name="scp-copy"
scp file="${dir.build}/${file.war}" trust="true" password="${ssh.pwd}" todir="${ssh.user}@${ssh.host}:${tomcat.tmp.dir}" /
sshexec host="${ssh.host}" username="${ssh.user}" password="${ssh.pwd}" trust="true" command="mv ${tomcat.base}/${file.war} ${tomcat.base}/${tomcat.root}/ROOT.war"
/target

Преимущество подхода с промежуточным копированием так же в том, что если в процессе загрузки произойдёт сбой связи с сервером, то вы не потеряете текущее приложение, т.к. ранее загруженный архив не будет перезаписан.

понедельник, февраля 8

Удалённая перезагрузка Windows-машины из Linux

Для удалённой перезагрузки Windows-машины из Linux, понадобится установленный пакет samba-common

команда для выполнения:
net rpc shutdown -r -C "комментарий" -f -I "netname" -U "username" -t "N"

где параметры обозначают следующее:

-r или -reboot - перезагрузка компьютера вместо выключения
-f или -force - принудительное выполнение
-I - сетевое имя машины, или её IP адрес
-U - имя пользователя, имеющего соответствующие права на данной машине
-t или -timeout="N" - задержка до начала выключения/перезагрузки (по умолчанию равна 20 секундам)
-C или -comment="комментарий" - комментарий, показываемый в информационном окне

при выполнении команды, появится запрос пароля для пользователя username. Можно пароль указать сразу, введя имя пользователя в формате "username%password"

четверг, февраля 4

NetBeans+Maven+библиотеки

Использование Maven позволяет делать многое при разработке проекта. Об этом писалось уже не раз на просторах интернета. Я же напишу небольшую толику, чего я не нашел на русскоязычных просторах - про добавление своих JAR-библиотек в среде NetBeans IDE в Maven-проект.

Пример демонстрирует использование внешней библиотеки NCSO.jar для подключения к Lotus Domino через DIIOP. Проект создаём в NetBeans 6.8

итак, поехали


Создаём простой Maven-проект (для примера его будет достаточно :) )



Теперь добавляем в проект завимость на внешнюю библиотеку NCSO.jar. Так как этой библиотеки нет в репозитариях, то просто указываем сами группу, артифакт и версию библиотеки. В данном случае, я использую библиотеку, взятую с сервера Lotus Domino версии 8.5.1


Теперь можно загрузить сам jar-файл в локальный репозитарий. Для этого в контексном меню у зависимости выберем пункт "Manually install artifact" и укажем путь до библиотеки. По завершению инсталяции, данная библиотека будет добавлена в локальный репозитарий и может быть использована в последующих проектах без дополнительной инсталяции.





ЗЫ: посмотреть все скриншоты можно в альбоме "Blogspot:002", а скачать архив проекта на iFolder

воскресенье, января 24

Работа с FLAC (Часть 2. Переименование файлов по тегам)

Для переименования файлов flac в текущем каталоге, можно воспользоваться скриптом ниже
#!/bin/bash

for a in *.flac; do
ARTIST=`metaflac "$a" --show-tag=ARTIST | sed s/.*=//g`
TITLE=`metaflac "$a" --show-tag=TITLE | sed s/.*=//g`
TRACKNUMBER=`metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g`
mv "$a" "`printf %02g $TRACKNUMBER` - $ARTIST - $TITLE.flac"
done


(с)тырил в инете