Описание

среда, 3 июля 2013 г.

http прокси сервер для Android

По необходимости искал реализацию HTTP прокси сервера под лицензией BSD или MIT и написанный на C или C++. И наконец нашел! Это проект 3proxy. Он содержит в себе:
  • HTTP/HTTPS прокси с поддержкой FTP через HTTP
  • FTP прокси
  • SOCKS v4/4+/5 прокси
  • POP3 прокси
  • TCP port прокси
  • UDP port преобразователь
  • SMTP прокси
  • ICQ/AOL прокси
  • MSN прокси
Так как мне необходимо был только  HTTP прокси, то я взял исходники первого пункта этого списка, сделал проект для сборки при помощи Android NDK, и выложил на github http_proxy_for_Android..Так что если Вам вдруг для каких-то целей нужно запустить HTTP прокси на Android, буду рад помочь!

вторник, 11 июня 2013 г.

GCC статическая линковка

Недавно столкнулся с такой проблемой. Необходимо было слинковать приложение со статической библиотекой. Статические библиотеки лежат по пути library_folder, в которой лежат еще и динамические библиотеки с одинаковыми именами (например, libmy_lib.a и libmy_lib.so). И вот как я не пробовал линковаться используя -Bstatic всеравно линковалось с динамическими библиотеками... Строка линковки выглядела примерно так:
gcc -o ./my_app ./my_app.o -Bstatic -L./library_folder -lmy_lib

В man gcc написанно, что опция -Bstatic передается линковщику и все будет ок. Но не получалось, какие бы варианты не пробовал... В результате решение было следующим - использовать опцию -Wl, функия которой передать опцию линковщику. Что приводит к такому виду:
gcc -o ./my_app ./my_app.o -Wl,-Bstatic -L./library_folder -lmy_lib
Важно!!! В записи -Wl,-Bstatic после запятой не должно быть пробела.

Конечно еще всегда остается рабочим вариант указания полного пути к библиотеке. Например, так:
gcc -o ./my_app ./my_app.o ./library_folder/libmy_lib.a


Если вы знаете почему не работал первый вариант, то обязательно сообщите.

среда, 24 апреля 2013 г.

Locale hell

Если вы столкнулись с ошибкой:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
То вам сюда!

Я же столкнулся с этой проблемой, когда хотел сделать mongodump/mongorestore сразу после установки MongoDB на только что развернутом новом сервере. В результате мои попытки заканчивались ошибкой упомянутой выше.

Эта ошибка возникает, когда в системе нет скомпилированно локали, которая указана в системе.

Чтобы узнать какая локаль сейчас указана системе для использования:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Вот вывод для моей системы показывает, что указана локаль en_US.UTF-8. Чтобы посмотреть список уже скомпилированных локалей в системе:
$ locale -a
C
C.UTF-8
POSIX
Для того чтобы решить обозначенную верху ошибку, нужно либо указать системе в качестве локали для использования локаль из списка уже имеющихся на системе, либо сгенерировать недостающую локаль самостоятельно. В моем случае недостающая локаль и есть en_US.UTF-8. Генерируем локаль следующим образом:
$ sudo locale-gen en_US.UTF-8
[sudo] password: 
Generating locales...
  en_US.UTF-8... done
Generation complete.
Вот и все!

среда, 17 апреля 2013 г.

Стековое монтирование в Linux

Думаю, что большинство пользователей Linux знакомы с командой mount. В сборках ядра Linux до версии 2.4 точку монтирования возможно было использовать только один раз. Т.е. если вы сделали mount в определенное место, то повторно туда же ничего примонтировать не получится. Начиная с версии ядра 2.4, Linux позволяет осуществлять стековое монтирование — это означает, что можно выполнить монтирование одно поверх другого в одну точку монтирования. Каждое новое монтирование скрывает поддерево директорий, которое было видимым до этого. Когда выполняется размонтирование, то поддерево директорий скрытое  вершиной стека (последний успешно выполненный mount) становится снова видимым. Продемонстрируем это на примере:
$ su
Password:
Необходимы права суперпользователя для выполнения mount(8)
# mount /dev/sda12 /testfs
Выполняем первый mount в /testfs
# touch /testfs/myfile
Создаем файл в поддереве
# mount /dev/sda13 /testfs
Выполняем монтирование в  /testfs еще раз
# mount | grep testfs
/dev/sda12 on /testfs type ext3 (rw)
/dev/sda13 on /testfs type reiserfs (rw)
Проверяем, что действительно два устройства примонтированы в  /testfs
# touch /testfs/newfile
# ls /testfs
newfile
# umount /testfs
# mount | grep testfs
/dev/sda12 on /testfs type ext3 (rw)
# ls /testfs
myfile
Видим сначала утерянный и теперь снова видный наш myfile

Возникает вопрос "А зачем это нужно?". Использование стекового монтирования может пригодится в случае, когда запущенный процесс chroot-jailed, или когда запущенный процесс держит дескриптор на файл, который находится в старой точке монтирования. В этом случае стековое монтирование позволит работать этому уже запущенному процессу со своими файлами и директориями, а новым процессам позволит получить доступ к файлам на вершине стека монтирования.


четверг, 21 марта 2013 г.

Где мой сыр?

Многие, кто несколько раз слышал о функциональном программировании интерисуются "как это нельзя изменять переменные?" или "как это вообще нет переменных?" и вообще зачем это нужно. Данная запись является переводом записи из блога Джо Армстронга (разработчик Erlang), которая не отвечает на приведенные выше вопросы, но наталкивает на мысли почему так и почему это полезно.


Императивный подход программирования довольно сложная штука.

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

В императивных языках программирования переменные являются именами мест куда вы можете что-то положить.


Например:
int x;
x = 7;
В языке C это означает, что есть место x куда можем положить целое число. То есть я ложу мое число в место x и хочу, чтобы оно осталось навсегда, где я его оставил.

"Почему навсегда?"  - вы спросите. 

"Да потому что другие альтернативы хуже."
Если я могу позже изменить x, тогда мою программу будет тяжело понять, т.к. значение в x может меняться множество раз и приходится вникать во всю историю работы программы для того, чтобы понять какое сейчас значение в x.
Ситуация становится еще хуже в случае параллельных вычислений. Допустим несколько параллельных потоков могу изменить значения x в любой момент - с этих пор понять что происходит в программе становится на порядок сложнее.

Функциональные языки программирования не имеют этой проблемы. Если вы оставляете 7 в x, тогда 7 там останется навсегда. И это очень хорошо!

Источник: where's my heese

воскресенье, 10 июня 2012 г.

RDP сервер для удаленного доступа к Linux компьютеру

    В данной статье показан пример установки RDP сервера на компьютер с дистрибутивом Linux Fedora 16 KDE.
    RDP (Remote Desktop Protocol - Протокол удаленного доступа) - проприетарный протокол     прикладного уровня, использующийся для обеспечения удалённой работы пользователя с сервером.
    Установив RDP сервер на компьютере Вы будете иметь возможность подключится к нему и управлять удаленно через локальную сеть или интернет с другого компьютера или смартфона при необходимости.

    И так приступим. Необходимо установить пакет xrdp (это open source RDP сервер). Вбиваем в консоль:
 sudo yum install xrdp  

    Ждем пока установится. После установки запускаем сервер введением команды в консоль:
 sudo /etc/init.d/xrdp start  

    Теперь необхоимо сделать порт 3389 разрешенным в нашем фаерволе.  Так как речь идет о KDE то запускаем утилиту "Firewall configuration" через меню или поиском по Alt + F2. Или просто запускаем из консоли:
 system-config-firewall  

Выбираем пункт "Other Ports" (Другие порты). Нажимаем на кнопку "Add" (Добавить)


Видим следующее окно:
    Ставим галку на "User Defined" (Определено пользователем). В поле "Port / Port Range" вводим 3389 и "Protocol" выбираем tcp. Нажимаем "ОК". Нажимаем кнопку "Apply" (Применить). В результате видим:

   Теперь, например, можно подключится с другого Windows компьютера через программу "Удаленный рабочий стол" (ее также можно запустить через "Пуск" -> "Выполнить" -> ввести mstsc -> ОК). Нужно только ввести ip-адресс вашего компьютера и нажать "Подключить"


В результате получите такое:

Вводим свой "username" и "password" и наслаждаемся :)