Метка: linux

  • Про настройку шрифтов в 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.
    Итак чуть более подробный пересказ, что нужно делать.
    (далее…)

  • Apache HTTPD, mod_jk, Apache Tomcat, Linux

    1. Начало.

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

      
      
    

    Здесь и далее: Томкат => 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) указываем какие запросы куда перенаправлять и кто должен делать обработку таких запросов.
    Например:

     
    ... 
        JkAutoAlias /usr/share/tomcat6-examples/
        JkMount /examples/* ajp13_worker
    
    

    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″):

    
     
       
    
    

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

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

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

  • Звездочка (*) в шестёрке и хитрые 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