Ещё одно простое решение для простой задачи.
Немного предистории. Когда-то давно я задумался о том как хранить свои исходники в репозитории на своём vds. Тогда я пользовался Subversion и не считал ssh-туннели для доступа к репозиторию избыточной сложностью. Теперь я постарел, стал ленивым и полюбил git.
Что может быть проще, чем git init в корне проекта? И уже можно пользоваться всеми преимуществами контроля версий без всякого сервера.
Следующий шаг: проект уже вырос и паранойя выросла вместе с ним. Все разработчики делятся не два вида: одни ещё ни разу не теряли исходники а другие уже делают git push в конце каждого рабочего дня :)
Решения конкретных задач программирования. Java, Android, JavaScript, Flex и прочее... Настройка софта под Linux, методики разработки и просто размышления.
Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения
четверг, 18 июня 2015 г.
пятница, 15 ноября 2013 г.
Включаем multitouch и "natural scroll" для touchpad-а Dell Inspiron n5110
Сегодня переехал на "новый" Dell. Поставил свой любимый дистрибутив Elementary OS, с привычным удовольствием настроил софт, разложил всё по местам... И тут - разочарование: прокрутка двумя пальцами, к которой уже привык на предыдущем ноуте не работает. То, что система не предлагала эту опцию навело меня на мысль, что мой touchpad не определился как multitouch-устройство. А ведь это не так! Несколько минут поиска по форумам дали достаточно простое решение:
Скачиваем ALPS dlkm driver
Identifier “touchpad catchall”
Driver “synaptics”
MatchIsTouchpad “on”
Option “VertScrollDelta” “-111”
Option “HorizScrollDelta” “-111”
MatchDevicePath “/dev/input/event*”
EndSection
Скачиваем 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
sudo dkms autoinstall
sudo rmmod psmouse
sudo modprobe psmouse
После этого multitouch определяется корректно и мы можем включить нашу любимую опцию.
Если этого не случилось, попробуйте подменить /usr/src/psmouse-alps-1.3/src/alps.c исходниками взятыми отсюда и повторить процедуру.
Если этого не случилось, попробуйте подменить /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" Попутно нашёл ещё один полезный фокус для любителей этого няшного дистрибутива. Если вам нравится "natural scroll" в стиле Mac, в файле /usr/share/X11/xorg.conf.d/50-synaptics.conf добавляем строки:
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 и, наверное, в десятый раз вспоминал всё это. Теперь всё будет в одном месте.
sudo apt-get update
sudo apt-get install oracle-java6-installer
2. Tomcat
1. Java
sudo add-apt-repository ppa:webupd8team/javasudo 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
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/javasudo apt-get updatesudo 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-приложение:
Примерно так:
Проходит время, нагрузка растёт и узким местом становится база данных. Разработчики, стараясь снять с неё нагрузку, переходят к асинхронной схеме. Тут база данных не используется в каждом запросе. В основном используется только быстрое 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:
Как это выглядит?
Предельно просто. Пользователь загружает .sh файл и запускает его. Скрипт не просто создаёт все директории и т.п., а ещё и извлекает "из себя" файлы приложения и раскладывает их куда нужно.
Как это сделать?
Сначала создаём скрипт, а потом с помощью команды cat добавляем в него архив с файлами.
Например install.sh:
Тут делаем следующее:
- #!/bin/bash
- A_F=`readlink -e "$0"`
- DIR=`dirname "$A_F"`
- TMP_ARH="tmp.tar.gz"
- cd $DIR
- echo "Creating temporary arhive $TMP_ARH"
- tail -n +15 "$0" > $TMP_ARH
- echo "Unpacking temporary arhive $TMP_ARH"
- tar xzf $TMP_ARH
- echo "Removing temporary arhive $TMP_ARH"
- rm -f $TMP_ARH
- echo "Installation is complete!"
- exit 0
- ######
- В строках 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 есть конфиг виртуального хоста по умолчанию. Копируем его с новым именем (например именем домена) и правим, чтобы получилось что-то вроде этого:
Делаем
service apache2 restart
и получаем ошибку (например) из-за того, что в .htaccess наших сайтов используется mod_rewrite а соответствующий модуль не подключен. Для подключения модуля, как вы уже догадались, делаем ссылку в /etc/apache2/mods-enabled которая указывает на /etc/apache2/mods-available/rewrite.load
Когда стало ясно, что с моим 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>,
Итак 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
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 вашего девайса. (он должен быть, естественно, подключен).
Переподключаем устройство и наслаждаемся отладкой ;)
Во-первых: подключаем смартфон 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, то загрузка, хоть и с ошибками, проходит. Згрузившись, идём в интернет и читаем. В итоге, проблема решается одной командой в консоли:
После перезагрузки ядро 22 запускается как часы
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 совершенно спокойно и начал работать "как родной". Общий алгоритм установки:
Но это было только начало... Плагин этот не реализует подсветку кода 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, а чего нет, всегда можно добавить. Есть нормальная среда для тестирования и отладки. Осталось освоить эту технологию. Об этом - в следующих постах.
Условия из которых исходим: 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).
Но это было только начало... Плагин этот не реализует подсветку кода 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, а чего нет, всегда можно добавить. Есть нормальная среда для тестирования и отладки. Осталось освоить эту технологию. Об этом - в следующих постах.
Подписаться на:
Сообщения (Atom)







