VK app: проба пера с iframe

Очень давно хотелось попробовать написать iframe приложение для "ВКонтакте" - всё руки не доходили. А тут недавно добавили API для геолокации - теперь можно ставить в статус отметку о местоположении. Я просто не могу упустить шанса что-нибудь попробовать написать, тем более, что на момент написания таких приложений я не нашёл.

Read more

Linux: простой web сервер на asm

Спятил, да? А ещё если напишу, что планировал сделать многопоточность и нечто CGI-интерфейса? Вполне может быть, в рамках just for fun

Но остановился на том, чтоб отдавать статические страницы - время не дало допилить, да и энтузиазм уменьшился. Идея мне пришла из за курсовой работа по "Системному программированию" В СПбГУ ИТМО. Всех заставили писать резидент под DOS, на 8086 архитектуре. Не торт.

Основные фитчи, которые я успел реализовать:

  • Форк, при необходимости
  • Чтение конфига(ini-like)
  • Создание слушающего сокета, установка параметров
  • Парсер заголовков и запроса
  • Обработчик запросов статического контента(не в /cgi-bin/)
  • В некоторых местах совершенно корявую работу со стеком

Реализовано на NetwideASM, c частичным использованием функций glibc. Работать сервер будет только на 32-битном процессоре i686+, из за того, что дёргается прерывание ядра Linux - а номера функций отличаются в зависимости от процессора.

Read more

j2me: пример с падающим мячиком

Хочу поделиться одним своим примером приложения для мобильной java. Основная задача - понять как пишутся такие приложения под телефоны. Вроде задачу выполнил :). В программке можно передвигать мяч, падающий в "гравитационном" поле по законам физики(надеюсь), задавать его скорость и направление движения, как водя по сенсорному экрану телефона(если есть) так и кнопками

В эмуляторе выглядит всё не так красиво, как в живую, поэтому продемонстрирую на телефоне(SE P1i)




Понравилось? Для начала работы с j2me - самое то.
Используется MIDP-2.0, CLDC-1.1.

Read more

Kohana: AJAX контроллер с ловлей ошибок

Продолжая тему написания custom контроллеров не для html вывода предлагаю мой вариант обработчика AJAX-запросов. Напомню, в предыдущий раз я описывал контроллер для консольного демона

Помимо удобной для меня выдаче данных(я предпочитаю в 99% случаев выдвать JSON) есть ещё ряд фитч:

  • Код контроллера многократно используется наследниками класса, которые при необходимости могут перегрузить необходимые методы. В них написать простой ответ клиенту с помощью не сложных функций можно в пару строк - не нужно отвлекаться на создание json ответа, а писать логику.
  • Дефолтные ответы об успешном выполнении запроса, предупреждения или ошибки
  • Ловятся ошибки фреймворка и формируется адекватный отчёт об ошибке, а не километровый HTML от Kohana - просто идеально при использовании fireBug или аналогичных средств отладки.
  • Если вызываемый метод не реализован в наследнике, то будет выдан user-friendly ответ(опять же если использовать регламент возвращаемых структур json)

Read more

Linux: count of lines and symbols in file

Цель: подсчитать количество строк и/или символов в файле.

Для этого нужно воспользоваться утилитой wc. Для подсчёта количества строк нужно воспользоваться флажком -l (lines), для символов: -c (chars)

Read more

Java: создание Jar руками

Бывают и такие ситуации, когда требуется скомпилить небольшое количество файлов в jar, например после небольшой правки кода, в консоли, и без IDE.

Всё довольно просто, достаточно разбить по шагам.

  • Скормить javac все исходники, прямо одной командой кучу файлов
  • Необходимо создать текстовый файл manifest в корне проекта(на уровне с src), в котором указать класс, который будет загружен(такого вида строчка Main-Class: practice.Main). Если не указать этот класс, то появится ошибка, навроде Failed to load Main-Class manifest attribute from
  • Запаковать все с помощью jar
  • По необходимости запустить командой java -jar file.jar

Read more

Apache: быстрое добавление сайтов

Набросал простой скрипт, для удобного создания VirtualHost в debian.

Наверное тоже надоело лесть, создавать vhost по существующему, править пути, перезапускать сервер и так много раз и по кругу? А ещё не хватало опечататься?

Предлагаю такое решение: скрипт, делающий всю эту рутинную работу. Принимает только 1 аргумент - имя сайта и сам создаёт скелет и VirtualHost по шаблону.

В каталоге с сайтами создаётся папка с указанным именем. В ней - ещё 2 папки - log и www - для логов и сайта соответственно. А так же vhost - файл с описанием виртуального хоста по шаблону, лежащему в папке с сайтами. На этот файл создаётся симлинк в стандартное для дебиановского апача место - /etc/apache2/sites-avalable. После установки прав на созданные папки происходит вызов a2ensite и перезапуск апача. На скриншоте выше - кусочек такого скелета который получился после работы скрипта - из наутилуса

Read more

Debian: установка из asplinux

После долгих раздумий решил поменять древнющий ASPLinux 9, который честно отработал на протяжении почти пяти лет, на дебиан на домашнем сервере. На то было куча причин - бОльшая часть программ и библиотек собранны руками, софт морально устарел, многих новых фишек не хватает очень сильно, большие сомнения в безопасности - а сервер смотрит в интернет, дефолтная кодировка в то время для ASP была win-1251, да и вообще.. это моя первая нормальная установка линукса)..

0. Начало

Подключать монитор к нему - последнее дело, он находится в очень труднодоступном месте. Вся установка будет происходить через интернет - я физически не дома в момент написания поста и установки.

Из этого следует, что установка будет прямо из живой системы - с помощью утилиты, которая помогает создавать окружение установщика debian - debootstrap. Учтите, что должен быть установлен chroot.

Прежде всего, нужно её установить, для этого скачаем её и её библиотеки от которых она зависит и распакуем эти пакеты прямо в корень живой asplinux:

# cd /tmp
# wget http://mirrors.kernel.org/debian/pool/main/c/cdebootstrap/cdebootstrap_0.5.4_i386.deb
# wget http://ftp.cl.debian.org/debian/pool/main/libd/libdebian-installer/libdebian-installer-extra4_0.61_i386.deb
# wget http://ftp.egr.msu.edu/debian/pool/main/libd/libdebian-installer/libdebian-installer4_0.61_i386.deb
# wget http://ftp-mirror.internap.com/pub/debian/pool/main/d/debian-archive-keyring/debian-archive-keyring_2009.01.31_all.deb
# cd /
# ar p /tmp/cdebootstrap_0.5.4_i386.deb data.tar.gz | tar xz
# ar p /tmp/libdebian-installer-extra4_0.61_i386.deb | tar xz
# ar p /tmp/libdebian-installer4_0.61_i386.deb | tar xz
# ar p /tmp/debian-archive-keyring_2009.01.31_all.deb data.tar.gz | tar zx

1. Разбивка дисков

Установка будет происходить на тихий внешний жёсткий диск, в моём случае на раздел /dev/sda2, с файловой системой ext3, который я предварительно подмонтировал в /media/debian/. Места выделил аж 22Гб, зачем то много так..

Форматирование в ext3 (БУДЬТЕ ВНИМАТЕЛЬНЫ - смотрите что выполняете!):
/sbin/mkfs.ext3 -m 2 /dev/sda2

Ах да, сервер на столько старый, что его биос не умеет хочет загружаться с "большой флешки", поэтому в моём случае отсутствует /boot раздел, ну и соответственно настройка загрузчика. Файлы ядра новой системы лежат на /boot жёсткого диска системы(старой), при этом root в аргументах ядра указывает на раздел внешнего диска(по имени раздела). Это выглядит так:

title Debian on usb-hard drive, kernel on hd0
kernel /boot/vmlinuz-2.6.26-2-686 root=LABEL=boX
initrd /boot/initrd.img-2.6.26-2-686
boot

2. Бутстрепимся. Установка базовой системы

# cdebootstrap lenny /media/debian/ --allow-unauthenticated
P: Retrieving Release
P: Retrieving Release.gpg
P: Validating Release
W: Couldn't validate Release!
P: Parsing Release
P: Retrieving Packages.gz
. . . .

Пошло вообщем :) Можно идти долго чай пить

. . . .
P: Deconfiguring helper cdebootstrap-helper-makedev
P: Writing apt sources.list
P: Writing hosts
P: Writing resolv.conf

На этом установку базовой системы можно считать завершённой.

3. Chroot

Теперь в /media/debian есть система.. но этого мало, нам необходимо её настроить до перезагрузки в неё. Для этого воспользуемся chroot.

Перед тем, как чрутится нужно для дебиана подготовить окружение - подмонтировать в него файловую систему ядра и устройств:

# chroot /media/debian
boX:/#

Вот и промт виден, уже от дебиана.
Теперь важно не запутаться в системах. Лучше всего разнести консоли реальной системы и устанавливаемой в разные окна. Или разные скрины. Или сделать кастомные промты. Кому как нравиться. Я же для наглядности буду указывать в промте систему.

4. Настройка базовой системы

В установленной системе нет даже fstab. Создадим его, каждый по своему вкусу
debian# nano /etc/fstab
У меня вот так получилось, для начала:

/dev/sda2 / ext3 defaults 0 1
proc /proc proc defaults 0 0

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

5. Настройка сети

Тут всё стандартно для дебиана. Процетирую что у меня, как пример.

debian# cat /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.0.11
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.53

auto lo
iface lo inet loopback

DNS скопировал бутстрэп:

boX:/# cat /etc/resolv.conf
search boX
nameserver 127.0.0.1
nameserver 192.168.0.53
nameserver 212.44.94.254

(Для ясности - в том числе у меня и днс форвардер с локальной зоной)

Указываем репозитарии и обновляем их и сразу же то, что у нас уже есть:

debian# cat /etc/apt/sources.list
deb http://ftp.debian.org/debian lenny main contrib non-free

deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main
debian# apt-get update
debian# apt-get upgrade

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

debian# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

6. Установка софта

Тут сам каждый решает, что нужно. По мне вот так:

debian# apt-get install apache2 php5 php5-cli php5-gd php5-mysql \
php5-xmlrpc phpmyadmin mysql-server bind9 dhcp3-server watch \
sun-java6-jre openssh-server bridge-utils openvpn iodine eggdrop \
rtorrent ziproxy dvbtune dvbstream dvb-apps ppp subversion \
sunversion-tools psmisc ddns3-client links2 nmap mrtg hdparm \
screen

7. Грабли

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

Как я писал выше - мне требуется загрузить систему с внешнего жёстого диска. На то, чтоб отладить этот механизм пришлось несколько раз перезагрузится.

Автоматическое поднятие интерфейса lo помогло мне сохранить много времени - с этим я сталкивался ранее в другой системе, когда сложно понять почему демоны вроде и поднимаются а вроде и не работают, причём не всегда очевидно что не может прибинтится к хосту

8. Итого

Постарался описать многое, разумеется не всё охватил. Самые основные моменты только, идею.

UPD:
Всё нормально работет, внутренний(старый) принудительно ставлю в режим сна, т.к. он излишне шумит и не используется практически. В /etc/crontab добавить:

# remove hdd noise :)
0,30 23,0-8 * * * root /sbin/hdparm -S 2 /dev/hdc
0,30 9-22 * * * root /sbin/hdparm -S 10 /dev/hdc

КМУ в СПбГУ ИТМО


20-23 апреля 2010 года в Санкт-Петербургском Государственном Научно-Исследовательском Университете Инфорационных Технологий, Механники и Оптики состоялась седьмая ежегодная Конференция Молодых Учёных, приуроченная к 110летию университета.

Была поданна просто уйма заявок(700+ человек), в различные секции, например можно попробовать полистать программу конференции. Секции были не только технические, но и мелькали гуманитарные. В общем на любой вкус и цвет можно было выбирать куда идти.

Read more