Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

четверг, 18 июня 2015 г.

Git: делаем удалённый репозиторий

Ещё одно простое решение для простой задачи.
Немного предистории. Когда-то давно я задумался о том как хранить свои исходники в репозитории на своём vds. Тогда я пользовался Subversion и не считал ssh-туннели для доступа к репозиторию избыточной сложностью. Теперь я постарел, стал ленивым и полюбил git.
Что может быть проще, чем git init в корне проекта? И уже можно пользоваться всеми преимуществами контроля версий без всякого сервера.
Следующий шаг: проект уже вырос и паранойя выросла вместе с ним. Все разработчики делятся не два вида: одни ещё ни разу не теряли исходники а другие уже делают git push в конце каждого рабочего дня :)

пятница, 15 ноября 2013 г.

Включаем multitouch и "natural scroll" для touchpad-а Dell Inspiron n5110

Сегодня переехал на "новый" Dell. Поставил свой любимый дистрибутив Elementary OS, с привычным удовольствием настроил софт, разложил всё по местам... И тут - разочарование: прокрутка двумя пальцами, к которой уже привык на предыдущем ноуте не работает. То, что система не предлагала эту опцию навело меня на мысль, что мой touchpad не определился как multitouch-устройство. А ведь это не так! Несколько минут поиска по форумам дали достаточно простое решение:
Скачиваем ALPS dlkm driver
Распаковываем его. Каталог psmouse-alps-1.3 с правами root копируем в /usr/src
Выполняем 
sudo dkms add /usr/src/psmouse-alps-1.3
sudo dkms autoinstall

sudo rmmod psmouse
sudo modprobe psmouse
После этого multitouch определяется корректно и мы можем включить нашу любимую опцию.
Если этого не случилось, попробуйте подменить 
/usr/src/psmouse-alps-1.3/src/alps.c исходниками взятыми отсюда и повторить процедуру. 
Собственно вся технология взята тут, судя по коментариям она отлично работает на большинстве linux-дистрибутивов.

Попутно нашёл ещё один полезный фокус для любителей этого няшного дистрибутива. Если вам нравится "natural scroll" в стиле Mac, в файле /usr/share/X11/xorg.conf.d/50-synaptics.conf добавляем строки:
Option "VertScrollDelta" "-111" 
Option "HorizScrollDelta" "-111"
так чтобы секция выглядела следующим образом:
Section “InputClass”
Identifier “touchpad catchall”
Driver “synaptics”
MatchIsTouchpad “on”
Option “VertScrollDelta” “-111”
Option “HorizScrollDelta” “-111”
MatchDevicePath “/dev/input/event*”
EndSection

вторник, 29 октября 2013 г.

Настраиваем связку Tomcat+Nginx

Это сугубо практичный пост: просто набор команд для настройки "маленького сервера с блекджеком и танцовщицами" для хостинга java-приложений. Настраивал сегодня wds на Ubuntu 12.04 и, наверное, в десятый раз вспоминал всё это. Теперь всё будет в одном месте.

1. Java
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer


в конец ~/.bashrc добавляем 
export JAVA_HOME=/usr/lib/jvm/java-6-oracle 

2. Tomcat
sudo apt-get install tomcat7

Tomcat будет стартовать при старте системы, приложения будут разворачиваться на порту 8080 (каждое в своём соответствующем контексте) если .war залить в  /var/lib/tomcat7/webapps/.
Так уже можно работать, но для клиентов нужно спрятать tomcat за прокси, чтобы иметь возможность фровардить порты и прятать контексты за доменными именами. 

3. Nginx
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

В конец файла /etc/apt/sources.list добавляем строки:
deb http://nginx.org/packages/ubuntu/ codename nginx 
deb-src http://nginx.org/packages/ubuntu/ codename nginx

где codename - имя дистрибутива (посмотрите его в строчках выше или получите из сat /etc/*-release) 

sudo apt-get update
sudo apt-get install nginx

Это почти всё. Осталось только настроить проксирование запросов. Допустим, мы пишем конфиг для нашего хоста newgoogle.com, приложение для которого мы в tomcat-e развернули на контексте /ng:
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/newgoogle.com.conf
sudo vim /etc/nginx/conf.d/newgoogle.com.conf
меняем server_name на newgoogle.com и меняем location-секцию на: 
    location / {
        proxy_pass        http://localhost:8080/ng/;
        proxy_set_header  X-Real-IP  $remote_addr;
    }

P.s.: Ничего сверхестественного тут нет, любой админ сделает вам это одним пальцем с закрытыми глазами после восьми банок пива. Но зачем его беспокоить? То, что описано тут - достаточно тривиально, и сделав это однажды просто повторяйте всегда при необходимости точно также. Пусть гуру-админы занимаются тюнингом наших серверов и тонкой настройкой сетевого трафика. Простые вещи делаем сами.

пятница, 26 апреля 2013 г.

Обучаем Tesseract

Tesseract - свободная платформа для оптического распознавания текста, исходники которой Google подарил сообществу в 2006 году. Если вы пишите софт для распознавания текста, то вам наверняка приходилось обращаться к услугам этой мощной библиотеки. И если она не справилась с вашим текстом, то выход у вас остаётся один - научить её. Процесс этот достаточно сложный и изобилует не очевидными а порой и прям-таки магическими действиями. Оригинальное описание есть тут. Мне понадобился почти целый день на постижение всей его глубины, поэтому тут я хочу сохранить, надеюсь, более понятный его вариант. Так чтобы помочь себе и другим пройти этот путь в следующий раз быстрее.

среда, 2 января 2013 г.

Устанавливаем sun java в Linux Mint 14

В большинстве Linux-дистрибутивов первое, что мне приходится делать после установки - заменять OpenJDK на "нормальную" java. Не то чтобы я был против лицензионно-чистого софта, просто большинство моих инструментов написаны так, что с OpenJDK ведут себя странно. Обычно процесс замены java на моей машине достаточно однообразен и нетехнологичен: скачать, распаковать, сделать update-alternatives. Но сегодня я таки решил сделать всё правильно:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer 

Инсталлятор сам обновляет alternatives, так что больше ни о чём заботиться не нужно. OpenJDK в системе остаётся, но по умолчанию используется теперь именно java от Oracle. Из этого же репозитория, само собой, можно поставить и 7 и 8 JDK, если они вам больше нравятся. 

понедельник, 14 ноября 2011 г.

Nginx+Redis: делаем асихронное web-приложение для больших нагрузок

Как работает обычное web-приложение?
Примерно так:
Проходит время, нагрузка растёт и узким местом становится база данных. Разработчики, стараясь снять с неё нагрузку, переходят к асинхронной схеме. Тут база данных не используется в каждом запросе. В основном используется только быстрое noSQL-хранилище или специализированный сервер очередей, для передачи заданий пулу обработчиков. Основную работу эти обработчики выполнят уже позже, когда довольный клиент получит быстрый ответ и пойдёт заниматься своими делами:


Но нагрузка может расти и дальше. Оставим в стороне "горизонтальное" масштабирование при котором мы строим кластера и плодим инстансы приложений - речь сейчас не об этом. Что в последней схеме становится узким местом? База данных уже не в счёт: спрятанная за слоем очередей и обработчиков, кэшей и буферов, она может чувствовать себя спокойно. Обработчики великолепно масштабируются, ведь они "висят" на безразмерной шине очереди. Nginx - один из самых высопроизводительных серверов, за него не беспокоимся. noSQL-хранилища тоже как правило замечтально держат нагрузку и масштабируются.
Что остаётся? К сожалению "крайним" остаётся наше web-приложение. Это оно разбирает запрос, авторизует его, создаёт обьекты, манипулирует с ними, сериализует в базу или в очередь. А потом ещё вычитать данные, сериализовать для ответа... Приложение может содержать неэффективный код, плохо масштабироваться... Кстати, а зачем нам оно вообще нужно? Давайте уберём его из схемы:


 Как же так? Очень просто. Задача получить данные из запроса и уложить в очередь вообще-то тривиальная. И обратная задача тоже. Зачем программировать тривиальные вещи? Всё уж сделано за нас :)
Nginx при помощи HttpRedis2Module может уложить в noSQL-хранилище Redis любые параметры из запроса в виде такого набора ключ-значение, который нам нужен. И вычитать нужный нам набор ключей для возврата клиенту. Вы не используете параметры запросов? У вас обмен с клиентской частью в формате JSON? Нет проблем! Используя set-misc-nginx-module мы можем прямо в конфиге nginx-а описать правила получения данных из запроса: UrlDecode, JSONDecode, Base64Decode и т.п.

Теперь посмотрим, как настроить такое "сверхтонкое" web-приложение:

вторник, 18 октября 2011 г.

Простой инсталлятор для Linux средствами bash

Если вам приходилось ставить JDK на вашу Linux-машину, то вы знакомы с этим способом развёртывания приложения. И, если теперь ваша замечательная новая программа должна отправиться к благодарным пользователям, то почему бы не облегчить им жизнь с помощью простого "инсталлятора"? Вот увидите, клиенты это оценят.

Как это выглядит?
Предельно просто. Пользователь загружает .sh файл и запускает его. Скрипт не просто создаёт все директории и т.п., а ещё и извлекает "из себя" файлы приложения и раскладывает их куда нужно.

Как это сделать?
Сначала создаём скрипт, а потом с помощью команды cat добавляем в него архив с файлами.
Например install.sh:
  1. #!/bin/bash
  2. A_F=`readlink -e "$0"`
  3. DIR=`dirname "$A_F"`
  4. TMP_ARH="tmp.tar.gz"
  5. cd $DIR
  6. echo "Creating temporary arhive $TMP_ARH"
  7. tail -n +15 "$0" > $TMP_ARH
  8. echo "Unpacking temporary arhive $TMP_ARH"
  9. tar xzf $TMP_ARH
  10. echo "Removing temporary arhive $TMP_ARH"
  11. rm -f $TMP_ARH
  12. echo "Installation is complete!"
  13. exit 0
  14. ######
Тут делаем следующее:

  • В строках 2-3 определяем директорию, в которой в данный момент находится скрипт, в строке 5 переходим туда. Все дальнейшие операции выполняем относительно этой директории. 
  • В строке 4 задаём имя временного архива.
  • В строке 7 "отрезаем" бинарную часть нашего скрипта (в данном случае она начинается со строки 15), которую добавим к скрипту позже. Бинарную часть сохраняем как временный архив. 
  • В строке 9 распаковываем архив в текущую директорию и удаляем его в строке 11
  • Завершаем выполнение скрипта в строке 13 (чтобы bash не решил выполнить и наши бинарные данные, расположенные ниже).
Как видно из скрипта в строке 15 начинается архив с нашим приложением. Добавим его:
cat my_app.tar.gz >> install.sh
После команды извлечения данных в вашем "инсталляторе" вы сможете сделать также все необходимые симлинки и выполнить другие операции по настройке системы. 

пятница, 24 июня 2011 г.

Зачем нам админы? Настраиваем Apache на VDS за 10 минут

Иметь "свой" VDS очень удобно. А порой и весьма полезно для повышения квалификации в смежных областях. Эта небольшая история началась с одной неудачной попытки поставить софт на VDS. Нужно было обновить пару библиотек, те потянули зависимости, а там уже нарисовалась перспектива замены ядра...
Когда стало ясно, что с моим Debian 5 проблем будет ещё много, я вспомнил, что мой VDS-провайдер предлагает ещё несколько образов диска на выбор, в том числе Ubuntu 10.4, версии библиотек у которой должны быть существенно новее. Но была одна проблема: в этом образе не предустановлена панель ISPManager. Эта панель замечательно помогала мне "рулить" моим сервером, не заглядывая в консоль. Было немного страшно отказываться от неё, ведь моя квалификация как сисадмина весьма невелика. Но что нам стоит попробовать? И, забэкапившись, начали...
Заливаем новый образ, входим root-ом, засекаем время :)
apt-get install apache2
Когда apache установлен, пробуем его запустить
service apache2 start
Если сервер поднялся без ошибок - значит вы не пожалели денег на конфигурацию виртуального сервера. Я пожалел... На 64 мб памяти apache смог только укоризненно написать в лог
Resource temporarily unavailable: apr_thread_create: unable to create worker thread
... и умереть.
Лог, кстати, по умолчанию лежит в /var/log/apache2/error.log
Прожорливость apache лечим редактированием лимитов в /etc/apache2/apache2.conf
Речь идёт о константах в блоках <IfModule mpm_prefork_module> <IfModule mpm_worker_module>, и <IfModule mpm_event_module>. Не долго думая ставим их вдвое меньше значений по умолчанию. Apache при старте может предложить поправить какие-либо константы. Послушаемся его (в меньшую сторону).
Итак apache запущен. При заходе на любой из своих сайтов, в DNS которых прописан ip моего сервера я вижу страницу apache по умолчанию с оптимистичной надписью.
Теперь настало время сконфигурировать виртуальные хосты для моих сайтов.
В большинстве мануалов это предлагается делать редактированием httpd.conf. Не верьте. В нашем случае httpd.conf пустой и оставлен только для совместимости. Вместо него стоит обратить внимание на два каталога /etc/apache2/sites-available и /etc/apache2/sites-enabled. Все файлы из последнего включаются в конфиг apache. И это не файлы на самом деле. Это ссылки на аналогичные файлы из первого каталога. Такая схема позволяет нам 1: не править основной конфиг при добавлении/изменении виртуальных хостов; 2: не править вообще ничего чтобы удалить/восстановить хост. Просто добавляем/удаляем соответствующую ссылку командой ln.
Кстати, та же схема работает и с включением/отключением модулей apache.
В /etc/apache2/sites-available есть конфиг виртуального хоста по умолчанию. Копируем его с новым именем (например именем домена) и правим, чтобы получилось что-то вроде этого:
<VirtualHost *:80>
    ServerAdmin webmaster@my1domain.com
    ServerName my1domain.com
    DocumentRoot /var/www/my1domain.com
    <Directory /var/www/my1domain.com>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
    ErrorLog /var/log/apache2/my1domain-com-error.log
    LogLevel warn
    CustomLog /var/log/apache2/my1domain-com-access.log combined
</VirtualHost>
Тут my1domain.com - имя нашего домена. Для второго и т.д. сайта повторяем процедуру, соответственно меняя домен. Создаём ссылки на полученные конфиги в каталог /etc/apache2/sites-enabled и соответствующие каталоги для DocumentRoot. В эти каталоги и загружаем содержимое сайтов.
Делаем
service apache2 restart
и получаем ошибку (например) из-за того, что в .htaccess наших сайтов используется mod_rewrite а соответствующий модуль не подключен. Для подключения модуля, как вы уже догадались, делаем ссылку в /etc/apache2/mods-enabled которая указывает на /etc/apache2/mods-available/rewrite.load
В общем, с установленными но не подключенными модулями поступаем так всегда. А если модуль не установлен? Установим его. Например php5 ставим командой
apt-get install libapache2-mod-php5
Это только модуль для apache, сам php подтянется по зависимостям. 
Снова перезагружаем сервер и наслаждаемся работой своих сайтов. Впрочем, мы ведь забыли mysql? Не проблема:
apt-get install mysql-server
Вообще, идея этого поста не в том, как уложиться в 10 минут. Она в том, что не нужно бояться заниматься администрированием  своих серверов самостоятельно. Не нужно доставать саппорт провайдера или платить больше за навороченные панели управления, если нам всего лишь нужно захостить 2-3 ненагруженных сайта для своих экспериментов. А вот если эксперимент удастся, и нагрузка начнёт расти, тогда другое дело... Тогда наши суперуспешные проекты окупят нам и сервера и команду администраторов к ним. И решения этих сисадминов будут куда серьёзнее тех, что изложены выше. Но за это уже заплатите не вы, а ваши многочисленные и счастливые клиенты :)

четверг, 16 июня 2011 г.

svn over ssh: безопасный репозиторий для своих проектов в облаке

Редко кто из программистов не работает дома. И мало у кого не возникало проблемы синхронизации исходников между домашней и рабочей машиной. Есть масса решений от самых простых и неудобных (носим всё на флешке), до сложных или параноидальных (шифрованный контейнер в DropBox-е). Хочу описать ещё один вариант, который лично мне пока нравится больше всего.

Во-первых, однозначно нужна система контроля версий. Те кто хоть раз терял исходники со мной согласятся. А если над проектом работают и другие люди, сомнения в необходимости использования svn или т.п. вообще отпадают. Я лучше знаком с subversion, поэтому его и поставим. 

Во-вторых: куда ставить? Нужен как минимум VDS чтобы иметь root-доступ на удалённую машину для установки нужных нам приложений. Я выбрал firstvds.ru. В основном потому что минимальная конфигурация сервера (более чем достаточная для наших целей и парочки "домашних страничек" в придачу) там стоит около $5 в месяц. Можно поставить образ debian, senos, fedora, ubuntu c вполне достаточным набором софта или без него, по желанию. Я выбрал debian, поэтому остальные инструкции считаем применительно к нему. 

А инструкций, собственно, совсем немного:
1. Ставим svn
apt-get install subversion
2. Добавляем группу и пользователя
groupadd svn
3. Добавляем пользователя 
useradd -g svn -d /home/svn -m svn
4. Из-под нового пользователя создаём репозиторий
su svn
cd ~
mkdir repos
svnadmin create /home/svn/repos/
5. Чтобы закрыть доступ для всех кроме авторизованного пользователя и задать ему (т.е. себе) пароль, в файле /home/svn/repos/conf/svnserve.conf добавляем строки:
anon-access = none
auth-access = write
password-db = passwd 
и в файле passwd в том же каталоге добавляем строку вида
username = password
6. Запускаем сервер
/usr/bin/svnserve -d --listen-port 3232 -r /home/svn/repos/

И последнее: как получить доступ к нашей новой игрушке. Как указано выше, svnserve слушает у нас порт 3232. Поэтому самый простой способ получить доступ к репозиторию: svn://<хост или ip вашего сервера>:3232 Отсюда делаем checkout в локальный каталог на домашней машине (он, естественно, пока будет пустым), складываем в локальный каталог наши проекты и делаем commit (рекурсивно). Потом делаем checkout на рабочей машине с этого же адреса и получаем всё что положили. Дальше работаем как обычно. 
Но так работать не стоит, если не хотите, чтобы ваши исходники получил кто-то "третий". Протокол svn не защищен шифрованием. Есть несколько методов решения этой проблемы, но все они связаны с использованием дополнительного софта. Мы же поступим проще.
Порт 3232 на удалённой машине свяжем с портом (например) 2323 на локальной машине с помощью ssh-туннеля:
ssh -2 -N -f -L 2323:localhost:3232 root@<хост или ip вашего сервера>
Теперь url репозитория с которым можно безопасно работать:
svn://localhost:3232
Скорость работы в таком случае будет ниже, но можно не опасаться перехвата трафика.

вторник, 29 марта 2011 г.

Отладка Android-приложения на устройстве

Если отладки на эмуляторе в данном случае недостаточно или просто надоели тормоза эмулятора - выход есть: отладка непосредственно на смартфоне. Организация такой работы достаточно подробно описана и хорошо поддерживается платформой. Напишу тут только несколько особенностей, чтобы не забыть.
Во-первых: подключаем смартфон usb-кабелем.
Во-вторых: включаем в настройках вашего девайса возможность отладки (Настройки->Приложения->Разработка->Разрешить отладку по usb).
В-третьих: выполняем lsusb чтобы получить idVendor и idProduct вашего девайса. (он должен быть, естественно, подключен). 
В-четвёртых:
$ sudo gedit /etc/udev/rules.d/51-android.rules
и пишем туда строку:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0c01", MODE="0666"
В idVendor и idProduct подставляем ваши значения. 
Сохраняем. Выполняем:
/etc/init.d/udev reload
Переподключаем устройство и наслаждаемся отладкой ;)
Кстати, не забываем указать в AndroidManifest.xml android:debuggable="true" в теге application.
Более подробная инструкция здесь.

суббота, 26 июня 2010 г.

Ubuntu 10.04 на ноутбуке Samsung R58plus

Сегодня решил обновить свою Ubuntu 9.4 до версии 10.04 и столкнулся с проблемой. Посте перезагрузки - чёрный экран. При этом, если выбрать при загрузке предыдущее ядро 2.6.31-21, то загрузка, хоть и с ошибками, проходит. Згрузившись, идём в интернет и читаем. В итоге, проблема решается одной командой в консоли:
echo "options radeon modeset=0" > /etc/modprobe.d/ati.conf
После перезагрузки ядро 22 запускается как часы :)

четверг, 10 июня 2010 г.

Flex-разработка: настройка инструментов под Linux

На днях возникло желание освоить Flex... До сих пор писал интерфейсы для web на HTML+JavaScript (c красивостями jQuery) и как-то справлялся. Но тут вдруг надоело... Да и задачи всё время какие-то "интерфейсные" попадаются. Короче - время пришло. И, поскольку мы стойкие сторонники Open Source, правильный выбор свободных инструментов - задача №1.
Условия из которых исходим: Ubuntu Linux 9.10 и стойкая привязанность к IDE для Java: NetBeans, Eclipse. Не люблю пересаживаться на новые окошки под новую задачу.
Ищем плагины под NetBeans. Первое, что обнадёживает, есть Flexbean. Описание установки и возможностей есть на Хабре. Там сразу напугало упоминание проблем с версиями NetBeans выше 6.5, но совершенно напрасно. Плагин стал на 6.9 совершенно спокойно и начал работать "как родной". Общий алгоритм установки:
  • Скачиваем SDK с сайта Adobe и распаковываем (например во ~/flex).
  • Скачиваем плагин и устанавливаем его в NetBeans.
  • Указываем Flexbean, где лежит Flex SDK (Tools -> Flex Platforms -> Add Platform… -> ~/flex).
Теперь можно создавать новые проекты типа Flex project и Flex application и запускать и компилировать их прямо из Netbeans.
Но это было только начало... Плагин этот не реализует подсветку кода mxml-файлов. Про автокомплит, понятно, речь вообще не идёт. И если в PHP я бы с этим смирился, то изучать новый язык постоянно глядя в справочник... нет уж, увольте. Ищем дальше.
Если не обращать внимание на Windows-решения, осталось не так много вариантов. Flash Builder от Adobe не свободный продукт, но альфа-версии под Linux можно использовать бесплатно. Он скачивается в виде бинарного инсталлятора, содержит в себе SDK и flash player, требует наличия Eclipse, т.к. является его плагином. Проблем в работе версии 3.5 не заметил, но есть особенность: плагин спокойно ставится на все версии Eclipse (заявлена поддержка начиная с 3.3), но работать удалось заставить только с версией 3.3.2. Пришлось откатиться на пару версий назад, что поделаешь...
На этом проблемы не закончилсь. Flash Builder устанавливает player 9 версии для Firefox, в котором есть крайне неприятный баг: кириллица при вводе в текстовые поля отображается в битой кодировке. Этому багу уже не один год, и написаны даже несколько ActionScript - заплаток для его исправления. Я решил проблему, заменив player на версию 10.1 (она пока ещё RC, но уже с бэты работает стабильно). Замена player-а описана тут. Обязательно перед установкой нужно снести старую версию.
Итак на выходе получили: можно удобно писать mxml - разметку и Action Script - классы (правда пока только 3 версии, но этого в принципе хватает для начала). Есть все фичи Eclipse, а чего нет, всегда можно добавить. Есть нормальная среда для тестирования и отладки. Осталось освоить эту технологию. Об этом - в следующих постах.