Рубрики
3. Инструментарий Java

Про настройку шрифтов в IDE (Netbeans) под Linux.

Какой самый лучший шрифт для программиста?
Каждому своё.
Одним нравятся округлые очертания, другому наоборот тонкие и острые. Поэтому выбор шрифта — дело вкуса, хотя конечно есть базовые требования.
Самое главное и очевидное — шрифт должен быть моноширинным, т.е. все символы должны быть одной ширины. Это очень важно для того, чтобы сохранить структуру кода, т.к. иначе будут плыть все отступы и исходный код будет плохо читаться.
Если человек пришел в программирование с дизайнерским/типографским прошлым, такой шрифт его может раздражать. Моноширинные шрифты не самые приятные для чтения, хотя их используют не только программисты-техногики, но и люди искусства.
Например, если верить википедии, в западной театральной и кинематографической традиции сценаристы используют шрифт Courier-12. Одна страница такого сценария длится примерно одну минуту. Вроде это какой-то даже у них стандарт де-факто в отрасли.

Кроме моноширинности, при выборе следует обратить внимание на следующее:
- Цифра 0 (ноль) должна отличаться от буквы O.
- Цифра 1 (один) должна отличаться от буквы l (маленькая L).

Что касается меня, то сейчас я использую шрифт Consolas.

Специфика Linux.

На момент написания этой статьи у некоторых пользователей Linux (Ubuntu) есть определенное недовольство качеством отображения шрифтов в IDE.
Итак, что можно попробовать сделать.

Во-первых, я ставлю набор микрософтовских шрифтов:

$sudo apt-get install ttf-mscorefonts-installer

Во-вторых, особо чувствительные к шрифтам могут поставить Infinality.

В-третьих и самое главное. Это не сильно помогает, т.к. на момент написания этой статьи в Java (точнее в её графической подсистеме AWT/Swing) есть какие-то проблемы с красивым отображением шрифтом в Ubuntu. Другими словами проблема актуальна для Netbeans и Android Studio.

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

Рубрики
3. Инструментарий Java

Apache HTTPD, mod_jk, Apache Tomcat, Linux

1. Начало.

Если Вы ставите Tomcat как-то так: (от рута) aptitude install tomcat6 tomcat6-admin tomcat6-examples,
то прежде чем двигаться дальше, вам возможно стоит обратить внимание на настройки URIEncoding в server.xml.

  <!-- Прописать URIEncoding  -->
  <connector port="8080" URIEncoding="UTF-8"></connector>

Здесь и далее: Томкат => Apache Tomcat, Апач => Apache HTTPD.

2. Вяжем.

Классическая схема работы Томката (Apache Tomcat) в продакшене, это связка его с Apache (Apache HTTP Server) через mod_jk. Так делают уже много-много лет и это проверенное на практики и рекомендованное многими решение.
Связка делается через протокол AJP (Apache JServ Protocol). Это специальный бинарный протокол для прокидки запросов от web-сервера в глубину к другим серверам (например Tomcat-у).

Зачем такое нужно?
1. Снижаем нагрузку с томката. Статику (картинки, html-ки и т.д.) пусть лучше отдает апач, а запросы к сервлетами и jsp-кам прокидываются томкату.

2. Возможна балансировка нагрузки. Например один апач - несколько томкатов.

Кстати, можно связывать апач не только с томкатом, а например с Jetty (через mod_proxy), и наоборот томкат прикручивать например к nginix. Мы здесь такие варианты не будем рассматривать.

Итак, допустим у вас убунта с апачем и томкатом. На других линуксовых дистрибутивах аналогично.
Ставим mod_jk: (от рута) aptitude install libapache2-mod-jk или скачаем и ставим отсюда : http://tomcat.apache.org/download-connectors.cgi

Из общего правила структуры линуксовой файловой структуры мы знаем, что настройки должны находиться в папке /etc/.
Легко видеть, что:
- настройки томката будут в папке /etc/tomcat6
- настройки mod_jk в /etc/libapache2-mod-jk
- настройки апача в /etc/apache2

Внимание! Дальше приводится упрощенная схема для работы в лабораторных условиях.
На реальных серверах ввод в эксплуатацию без тщательного изучения документации по mod_jk, веб-серверу и томкату крайне опасен!
Нужно обратить особое внимание на настройки безопасности.

Теперь приступим. Начнем от фронта.
В настройках сайта (например: /etc/apache2/sites-available/default) указываем какие запросы куда перенаправлять и кто должен делать обработку таких запросов.
Например:

 <virtualhost>
... 
    JkAutoAlias /usr/share/tomcat6-examples/
    JkMount /examples/* ajp13_worker
</virtualhost>

ajp13_worker - название "ажп-работника", он задается в файле workers.properties (в Убунте: /etc/libapache2-mod-jk/workers.properties):

  # список работников...
  worker.list=ajp13_worker

Также в этом же файле нужно проверить другие параметры (порты, директории и т.д.).
Если нужна балансировка загрузки, там уже есть заготовка для раунд-робина.

Где находится файл workers.properties прописано в настройках mod_jk (в /etc/apache2/mods-available файл jk.load)
Например, что-то типа этого:

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so

JkWorkersFile /etc/libapache2-mod-jk/workers.properties

JkLogFile     /var/log/apache2/mod_jk.log
JkLogLevel    info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat     "%w %V %T"

JkOptions +ForwardURICompatUnparsed

На что обратить внимание!
Параметр JkWorkersFile указывает именно на правильный workers.properties
Параметр JkOptions имеет значение "+ForwardURICompatUnparsed", это нужно для нормальной обработки кодировок.

Значение других параметров следует посмотреть в документации.

Далее в настройках томката (/etc/tomcat6/server.xml) нужно проверить,
что НЕ ЗАКОММЕНТИРОВАН AJP Connector (port 8009, URIEncoding="UTF-8"):

<server>
 <!-- Define an AJP 1.3 Connector on port 8009 -->
   <connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"></connector>
</server>

Общая схема конфигурационных файлов выглядит так:

Не смотря на то, что в документации все хорошо описано, и есть такие полезные параметры как "JkAutoAlias", которые сильно упрощают жизнь.
Рекомендую, после того как завершите настройку тщательно проверить надежность и безопасность вашей конфигурации.

По-крайне мере нужно проверить правильно ли будут работать ваши security-constraint и различные фильтры.
Также проверить ограничение доступа к служебным ресурсам, работу в разных режимах (отключен томкат, реальные запросы из внешней сети и т.д.).

Рубрики
3. Инструментарий 4. Полезняшки Java

Звездочка (*) в шестёрке и хитрые bat-файлы

Запуск java-программы из командной  строки.

Представим такую ситуацию...

В результате вашей работы в качестве java программиста у вас получился один JAR-файл (для простоты назовем его mytools-1.0-SNAPSHOT.jar). Кроме него вы планируете использовать более десятка других jar-файлов.

Ваша программа должна запускаться из командной строки, а не из супер-пупер IDE которую вы обычно используете в работе. Например Вашу программу нужно отправить другому человеку, у которого нет такой же как у вас среды разработки (Eclipse, NetBeans, IDEA и т.д.) или запустить на удаленном сервере доступ к которому осуществляется только через SSH. Таким образом, для запуска вашей программы вам нужно собрать все требуемые для работы jar-файлы, прописать их  в CLASSPATH и для удобства написать простой runme.bat файл или (runme.sh для линукса).

Рецепт 1.

Требуется: maven, maven-assymbly-plugin

Если вы используете maven, то возможно Вам будет удобно воспользоваться  maven-assymbly-plugin. Найти информацию по нему можно здесь: http://maven.apache.org/plugins/maven-assembly-plugin/

В результате вы можете собрать в один JAR-файл, который содержит всё необходимое для работы.

Для этого:
1. добавляем в pom.xml настройки для maven-assymbly-plugin.

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-5</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        [...]
</project>

2. Запускаем сборку

mvn assembly:assembly

3. Получаем jar файл со всеми зависимостями:

target/mytools-1.0-SNAPSHOT-jar-with-dependencies.jar

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

Дальше, я предпочитаю копировать jar-файл в отдельную папку lib. После этого остается только создать простой BAT-файл в котором будет содержаться строка:

java -cp mytools-1.0-SNAPSHOT-jar-with-dependencies.jar com.programmisty.Main %*

%* - означает что все аргументы командной строки будут переданы в main-класс.

Минусы: Если необходимо заменить только одну зависимость, приходится распаковывать и перепаковывать весь этот монолитный jar-файл.

Рецепт 2

Собираем все необходимые jar-файлы в одну директорию. Например с помощью maven это можно сделать командой

mvn dependency:copy-dependencies

Если вы не используете maven, можно просто скопировать руками все необходимые вам файлы.
Затем копируем наш mytools-1.0-SNAPSHOT-jar и все дополнительные jar-файлы в папку lib.

Если у нас windows, создаем BAT-файл runme.bat. В итоге у нас получается что-то вроде этого:

.
|_lib
| |_mytools-1.0-SNAPSHOT-jar
| |_commons-lang-2.4.jar
| |_commons-logging-1.1.1.jar
| |_commons-httpclient-3.1.jar
| |-...
|_runme.bat

Теперь, возможно старым java программистам будет интересно узнать, что в Java 6 наконец-то в classpath можно использовать звездочку (*).
Раньше многие делали так:

set CP=lib/mytools-1.0-SNAPSHOT-jar
set CP=%CP%;lib/commons-lang-2.4.jar
rem "и так до самого конца"
java -cp %CP% com.programmisty.Main %*

Те кто похитрее делал так:

setlocal ENABLEDELAYEDEXPANSION
set CP=
for %%i in (lib/*.jar) do set CP=!CP!lib/%%i;
java -cp %CP% com.programmisty.tools.Main %*

Если вы работаете в Linux, то для настоящего линуксоида получить список jar-файлов в директории и присвоить значение переменной -- задачка "школьного" уровня. По этой ссылке можно найти несколько способ ее решения http://www.sql.ru/Forum/actualthread.aspx?bid=38&tid=569498

Но теперь, если у вас java 6 это вообще не проблема, файл runme.bat может выглядеть следующим образом:

java -cp "lib/*" com.programmisty.tools.Main %*

Под линуксом wildcard (то есть звездочка) также успешно работает. Подробнее можно прочитать здесь: http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html в разделе "Understanding class path wildcards"

Рубрики
Без рубрики

opencms

Debian lenny+mysql+tomcat5.5+opencms
1. редактируем /etc/apt/sources.list - добавляем non-free
что-то вроде:
deb http://mirror.yandex.ru/debian lenny main non-free
deb-src http://mirror.yandex.ru/debian lenny main non-free

2. aptitude install sun-java6-jdk
3. aptitude install tomcat5.5
4. aptitude install mysql-server

5. открывем /etc/tomcat5.5/policy.d/50user.policy
грантим права

grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" {
permission java.io.FilePermission "${catalina.base}/webapps/opencms/WEB-INF/classes/logging.properties", "read";
};
grant codeBase "file:/var/lib/tomcat5.5/webapps/opencms/-" {
permission java.security.AllPermission;
};

Важно! не забыть добавть ';' в конце

Рубрики
Без рубрики

vsftpd

Если нужно быстро поднять ftp-сервер под debian
apt-get install vsftpd
конфиг файл как всегда в /etc/vsftpd.conf и включаем
anonymous_enable=YES
write_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
создаем в /home/ftp папку tmp, делаем ее доступной для записи,
например так chmod +w /home/ftp/tmp
все... и никогда не делаете это на доступных из вне серверах

Рубрики
Без рубрики

отключить бип в терминале по табу
открываем
/etc/inputrc

ставим

set bell-style none