Как стать автором
Поиск
Написать публикацию
Обновить

Микро проектирование или алгоритм работы на коленках

В своей работе иногда я сталкиваюсь с заведомо непонятными задачами.
Например, сейчас мне нужно внести изменения в самописный сайт. На сайте осуществляется регистрация бизнес-партнеров из разных стран. Попросили добавить еще одну страну (в выпадающий список). Казалось бы, добавляешь в select еще один option – и задача выполнена. При выборе списка меняется подчиненный div. Вроде тоже понятно. В общем, работы на полчаса, как показалось с первого взгляда. Оказалось всё не так просто. На серверной стороне пришлось переписывать много кода, связанного с этими изменениями.
Выходя из таких ситуаций, я понимаю, что должен быть алгоритм по разрешению такой и таких задач. Ведь заказчику не скажешь что работы на полчаса (добавить «пунктик»), а потом сидишь целый день и берешь денег соответственно больше.
И я понимаю, что говорить и обещать наперед – значит наступать на одни и те же грабли.
Вторая проблема в том, что кажущееся просто задание может закончиться внесением изменений в структуру БД, java-скрипты, в серверный скрипт. И от этого у самого и волосы поднимаются и руки опускаются по простой причине: работы видно сразу много, а вот что и куда делать – не всегда ясно. Столкнулся я например со случаем когда система перевода диалогов была основана на БД, где каждое переведенное слово находилось в колонке со своим языком. Что делать сначала – ясно: добавить колонку. А что еще дальше – вот это вызывало уйму вопросов…
Спустя время, алгоритм работы с изменениями оказывается классическим. В чем-то обидно, что долго придумывал велосипед. С другой стороны есть ощущение того, что нашел свою истину.

Процесс изменений я разбиваю на простые этапы.

1. Что хочет увидеть заказчик.
2. Анализ: как работает программа сейчас. Какие общие функции используются и на что повлияет их изменение – что придется переписывать дополнительно.
3. Какие изменения нужно сделать, сколько их. Именно на этом этапе можно называть цену.
4. Собственно сам процесс изменений

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

В бОльших проектах всё должно документироваться и описываться максимально подробно. Я бы сказал, что наиболее видным отличием будет наличие документов, зафиксированных критериев цели, и конкретности описанных изменений.

В общем, эта схемка мне в последнее время довольно неплохо помогает копаться в «грязном белье». Если она кому-то будет полезна или есть другие мнения: буду рад услышать.

Фиксированный фон под размер окна

Недавно у меня появился проект со специфичным дизайном. Вроде бы все как обычно, но пришлось удовлетворить потребности дизайнера, который захотел чтобы фоновая картинка при скроле всегда была на одном и том же месте и принимала тот размер, который ей позволяет окно браузера. Так что обойтись стандартным position: fixed, который работает в IE > 6 и остальных браузерах не получалось.
Мой вариант как это сделать с использование jQuery
/* Fixed BG, jQuery, FlipFlip.ru (c) 2009 */

/* Поддерживает ли браузер position: fix; */

function rbSupportsFixed() {
if ($.browser.msie && $.browser.version >= 6.0 && $.browser.version < 7.0) return false;
return true;
}

var rbCenter = false;
var rbLastScrollTop = null;
var rbSimulateTop = 0;

/* Инициализация фона */

function rbInit() {
if (rbSupportsFixed()) {
div = document.getElementById('rbBackgroundDiv');
div.style.position = 'fixed';
}
setTimeout("rbReposition()", 50);
rbResize();
}

/* действие при ресайзе окна */

function rbResize() {
var width;
var height;
var x, y, w, h;

if ($.browser.msie) {
width = parseInt(document.documentElement.clientWidth);
height = parseInt(document.documentElement.clientHeight);
} else if ($.browser.opera) {
width = parseInt(window.innerWidth) - 16;
height = parseInt(window.innerHeight);
} else {
testsize = $('#rbTestSizeDiv');
width = $(testsize).width();
height = $(testsize).height();
}

div = $('#rbBackgroundDiv');
img = $('#rbBackground');

if ($(img).width() == 0 || $(img).height() == 0) {
setTimeout("rbResize()", 100);
return;
}

/* Если надо зафиксировать изображение по центру */

if (rbCenter) {
w = width;
h = width * ($(img).height() / $(img).width());
x = 0;
y = (height - h) / 2;

if (y < 0) {
h = height;
w = height * ($(img).height() / $(img).width());
y = 0;
x = (width - w) / 2;
}
} else {
x = 0;
y = 0;
w = width;
h = height;
}

$(div).css('left', parseInt(x) + "px");

if (rbSupportsFixed()) $(div).css('top', parseInt(y) + "px");
else rbSimulateTop = parseInt(y);

/* Данные две сточки нужны, если надо чтобы изображение сохранило пропорции. 2ая строчка если нужно поднять картинку и низ картинки был внизу страницы */

$(img).css('width', parseInt(w) + "px");
$(div).css('top', parseInt(h) - $(img).height() + "px");

$(div).css('visibility', 'visible');
rbLastScrollTop = null;
rbReposition();
}

/* Если нет поддержки fixed делаем эмуляцию */

function rbReposition() {
if (rbSupportsFixed()) return;

setTimeout("rbReposition()", 100);

body = document.documentElement;
var scrollTop = body.scrollTop;
if (scrollTop == rbLastScrollTop) return;
rbLastScrollTop = scrollTop;

div = document.getElementById('rbBackgroundDiv');
var rbBodyDiv = document.getElementById('rbBodyDiv');

var pos = 0;
var max = rbBodyDiv.offsetHeight - rbBodyDiv.clientHeight;

if (max < 0) max = 0;

if (scrollTop <= max) pos = scrollTop;
else pos = max;

if (pos < 0) pos = 0;

height = $('body').height() - $(window).height();
if (pos <= height) div.style.top = pos + rbSimulateTop;
}

/* Открывает див */

function rbOpen(center) {
rbCenter = center;
document.write("\n");
}

/* Закрываем див и вставляем во второй див картинку */

function rbClose(image) {
$('body').append("\n");
str = "<div " +
"id='rbBackgroundDiv' " +
"style='position: absolute; " +
" visibility: hidden; " +
" top: 0px; " +
" left: 0px; " +
" z-index: 0'>" +
" " +
"
\n";

$('body').append(str);
$('body').append("<div " +
«id='rbTestSizeDiv' » +
«style='width: 100%; » +
" height: 100%; " +
" position: fixed; " +
" left: 0; " +
" top: 0; " +
" visibility: hidden; " +
" z-index: -1'>\n");
}


Как это все запустить:

rbOpen(false);
$(document).ready(function() {
rbClose('/images/background_body.jpg');

$(window).resize(function() { rbResize(); });
$(window).each(function() { rbInit(); });
}


Реализацию конечно не я придумал, но я ее немного видоизменил. А что именно:
1. Картинка сохраняет свои пропорции
2. Уменьшил частично код реализации использую jQuery

Думаю я увижу комментарии что не очень красиво реализовано и т.д. Обещаю переписать, и еще раз опубликовать.

Рабочий пример.

Бэкап на Asus Eee без подручных средств

Настраивая такой нестандартный ноутбук, как Asus Eee, есть смысл, достигнув очередного результата («ура, заработал WiFi!») сохранить текущую конфигурацию системы, чтобы в том случае, если дальнейшая настройка все поломает, можно было бы не начинать все с нуля, а спокойно «откатиться» к уже достигнутому результату.

Приведенное ниже описание процедуры бэкапа годится для любой операционной системы — будь то один из многочисленных линуксов, макось или MSWin'ское XP'ю.

Ниже описан бэкап ASUS Eee PC 701, но несложно повторить то же самое и на «двухдисковых» ноутах.

Для начала обзаведемся usb-флэшкой объемом не менее 4Гб. С нее мы будем загружаться перед бэкапом или восстановлением системы. По собственному опыту могу сказать, что нет ничего более легкомысленного, чем бэкап системного диска в то время, когда система загружена именно с него. Вероятность того, что в этом случае вместо точного слепка системы вы получите что-то маловразумительное — весьма велика. Вместо флэшки, конечно, можно использовать загрузку с LiveCD, вставленного во внешний DVD-ROM, но внешний привод требует особых условий, а загрузочная флэшка позволяет бекапить/ресторить систему где и когда угодно.

1. Изготовим загрузочную флэшку.


Заходим на сайт и, следуя инструкциям, создаем загрузочную флэшку с Fedora 9. НЕ ВОЛНУЙТЕСЬ! Я не призываю вас мигрировать на Линукс. Fedora 9 потребуется только для того, чтобы из-под нее бэкапиться.

2. Загружаемся с только что созданной загрузочной флэшки.


Для этого вставим флэшку в USB-гнездо выключенного ноута и включим ноутбук. Нажатием F2 переходим в настройки BIOSа. Boot -> Hard Disk Drives. Устанавливаем в качестве 1st Drive нашу загрузочную флэшку, нажимаем F10 (Ok, чтобы сохранить изменения). После загрузки Fedora 9 кликнем на кнопке Log in.

3.

Сохраняем образ


Даблкликнем лежащую на рабочем столе иконку Computer. В появившемся окошке (удерживая клавишу Shift) даблкликаем на иконке Filesystem, затем (продолжая удерживать Shift) — на иконке media. Теперь подключим вторую флэшку или USB-винт, куда будем сохранять образ SSD-«диска» — и внимательно следим, что за иконка появится после этого в открытом нами окошке. После подключения диска/флэшки автоматически откроется окошко с его содержимым — закроем это окошко, чтобы не мешалось. Итак, в нашем первом окне появилась новая иконка. Имя этой иконки и есть имя только что подключенного диска. К примеру, мой диск называется yana160.

4. Откроем консоль.


Для этого в верхней панели выбираем: Applications -> System Tools -> Terminal. Введем в командной строке терминала команду su (сокращение от Soviet Union) для перехода в администраторский режим (не забыв по окончании ввода нажать Enter):

$ su

Значок $доллара в окне терминала сменится значком #решетки. Не догадываетесь, в чем дело? А не надо было покупать компьютер с линуксом и ставить на него пиратскую Windows! Пока отряд УБЭП в дороге, у вас как раз есть время, чтобы сбэкапить или восстановить систему. Для этого наберите в терминале соответствующую команду.

Для сохранения образа системного диска:

dd if=/dev/sda of=/media/имя_диска/имя_файла_для_бэкапа

В моем случае команда будет такой:
dd if=/dev/sda of=/media/yana160/eeesda_2008-09-17

Для второго, 16- или 12-гигабайтного диска у Eee 900/901:

dd if=/dev/sdb of=/media/yana160/eeesdb_2008-09-17

Для восстановления системы из сохраненного образа:

dd if=/media/имя_диска/имя_файла_бэкапа of=/dev/sda

В моем случае:

dd if=/media/yana160/eeesda_2008-09-17 of=/dev/sda

5. Минут через 10-15, когда бэкап или восстановление завершится — выключаем систему (System -> Shut Down -> Shut Down) и забываем о Федоре до следующего бэкапа. Определить, что бэкап завершен, можно по появившемуся в окошке терминала приглашению со значком #.

Примонтировать сбэкапленный с помощью dd образ диска с именем, например, eee900sda можно (если верить словам [info]avmolchanov'а) с помощью следующих команд:

# kpartx -av `losetup -sf eee900sda`
add map loop0p1 (253:0): 0 192717 linear /dev/loop0 63
add map loop0p2 (253:1): 0 7679070 linear /dev/loop0 192780
# mount /dev/mapper/loop0p2 /mnt/backup/


Правда, этот способ еще нада проверить.

Вот и все. И ничего лишнего.

Эксперимент: Как это работает… maps.google.com+maps.live.com

Удивив вот эту ссылку на Хабре решил попробовать кое что сделать. Что такое java и FireBug до сего дня в глаза не видел. Тем интереснее…
Дело в том что живу я в Тамбове, а снимок столь маленького города со спутника от google очень слабой детализации. Совсем недавно я узнал о том, что на maps.live.com отличный спутниковый снимок родного города.

Что нам можно сделать из этого

Business management studio

Представляю на Ваш суд небольшой комплект программ для разработки своих приложений, с помощью которых можно создать свою собственную базу данных, нарисовать необходимые интерфейсы, ну и собственно использовать их для чего угодно. Будь это бухгалтерия или склад, поваренная книга или средство математических расчётов. В целом это система хранения и обработки данных. Можно даже рассмотреть как некую CRM или ERP систему, хотя для этого она ещё наверное слабовата. Но, как говорится, всё в наших руках.

Комплекс состоит из следующих файлов:

Config.exe — Позволит Вам создать начальную структуру БД, с которой будете работать далее.

Designer.exe — Это дизайнер интерфейсов, рисуйте свои формы, связывайте таблицы, выносите поля, в общем тут можно проявить фантазию.

Admin.exe — А с помощью этой утилиты созданные в дизайнере формы можно подключить каждому конкретному пользователю этой системы, т.е. построить меню для каждого отдельного пользователя, ну а так же создать/удалить пользователей, дать им какие-то права.

BMS.exe — Это соб-сно клиентская часть, загружает меню, которое определили программкой Admin.exe

spack.dat — Тут упакованные скрипты для работы системы

bms_db — Ну а это backup базы данных (Microsoft SQL Server 2005)

Для работы комплекса, как Вы уже поняли, нужен SQL-сервер 2005, вполне можно использовать SQL-Express, он бесплатен. У кого нет, скачать и установить можно отсюда:
www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=220549b5-0b07-4448-8848-dcc397514b41

Запускайте любой из исполняемых файлов, подключайтесь к БД и работайте с удовольствием.

После запуска любого файла на экране будет окно для подключения к серверу БД.
|==============================================
| Server: Имя_сервера\экземпляр_сервера (например: MyServer\SQLExpress)
|
| Database: Название базы данных (например: bmsdb)
|
| User: Admin
|
| Password:
|==============================================
Пароль админа по умолчанию отсутствует. Далее Вы можете задать его в программе Admin.exe

Не спорю, есть достаточно много аналогичных систем, но где-то, например, для 1С нужно знать встроенный скриптовый язык, Access — нужно знать SQL и т.д. Тут же я пытался отойти от всего этого. Это была идея написать нечто не требующее специальных знаний, а так же сделать его бесплатным.

Этот комплекс пишется сугубо в свободное время и не преследует цель как-то заработать на нём, так… безделья от… и не потерять квалификацию, а по сему, надеюсь Вы его оцените и поможете кто советом, а кто и делом сделать его лучше.

Скачать весь комплект(2 части архива) можно отсюда:
sites.google.com/site/bmscrm/Home/Inst.part1.rar?attredirects=0
sites.google.com/site/bmscrm/Home/Inst.part2.rar?attredirects=0

gprs-internet поключение в fedora 10 одним скриптом

плюсы gprs описывать не стоит, как и минусы они всем известны.
В моем случае связь между телом eeepc и телом телефона nokia осуществляется через bt.
«Немного дистро-зависимых» неудобств

Сразу стоит отметить уже решеную проблему «echo 1 > /sys/class/rfkill/rfkill1/» по крайней мере месяца 4 назад в rawhide злополучный eee-bluetooth killswitch умел изменять состоние

NetworkManager во многом удобен, но в последних редакциях его проще отключить т.к. пустой файл resolv.conf как результат работы не редкость. Для билайна DNS серверы следующие:

host -a beeline.ru |grep gprs
beeline.ru. 1852 IN NS ns1.beelinegprs.ru.
beeline.ru. 1852 IN NS ns2.beelinegprs.ru.
beeline.ru. 1852 IN NS ns1.beelinegprs.ru.
beeline.ru. 1852 IN NS ns2.beelinegprs.ru.
ns1.beelinegprs.ru. 85359 IN A 217.118.66.243
ns2.beelinegprs.ru. 78379 IN A 217.118.66.244


Приводим /etc/resolv.conf к виду
cat /etc/resolv.conf
nameserver 217.118.66.243
nameserver 217.118.66.244

Создаем/изменяем конфиги:

#cat /etc/bluetooth/hcid.conf
options {
autoinit yes;
security user;
pairing multi;
passkey «userpas»; #
}
device {
name «username»; #
class 0x3e0100;
pkt_type DH1,DM1,HV1;
iscan enable; pscan enable;
lm accept;
lp rswitch,hold,sniff,park;
}

#cat /etc/bluetooth/rfcomm.conf
rfcomm0 {
bind yes;
device 00:0E:6D:D8:7F:67; #hcitool scan
channel 1; #sdptool search DUN 00:0E:6D:D8:7F:67 | grep Channel
comment «comment»;
}

с сопряжением устройств проблем не возникает.

сам скрипт
#!/bin/bash
#===============================================================================
cols=`tput cols`
cols=`expr $cols - 6`
esc=`echo -en "\033"`
function start_msg () { echo -en " ${esc}[1;32m*${esc}[0m $*"; }
function substart_msg () { echo -en " ${esc}[1;32m>${esc}[0m $*"; }
function warnimg_msg () { echo -e " ${esc}[1;33m*${esc}[0m WARNING: $*"; }
function result_ok () { echo -en "${esc}[${cols}\` ${esc}[1;34m[${esc}[1;32m OK ${esc}[1;34m]${esc}[0m"; }
function result_fail () { echo -en "${esc}[${cols}\` ${esc}[1;34m[${esc}[1;31m !! ${esc}[1;34m]${esc}[0m"; }
function msg_ok () { start_msg $* && result_ok; }
function msg_fail () { echo -en " ${esc}[1;31m*${esc}[0m ERROR: $1" && result_fail; }
#===============================================================================

if [ "$UID" -ne "0" ]
then
msg_fail "Need root privilege use sudo or su -c "
exit $E_WRONG_USER
fi

INET_IFACE="ppp0"
IPTABLES="/sbin/iptables"
LO_IFACE="lo"
LO_IP="127.0.0.1"

#заменить на мак своего телефона
#hcitool scan
MAC_FON="00:0E:6D:D8:7F:67"

# определение ip адресов:
fnGetIPs(){
INET_IP=`ifconfig ppp0 | awk '/inet addr/ { gsub(".*:", "", $2) ; print $2}'`
INET_BROADCAST=`ifconfig ppp0 | awk '/inet addr/ { gsub(".*:", "", $3) ; print $3 }'`
if [ "$INET_IP" = '' ]; then

return 1
else return 0
fi
if [ "$INET_BROADCAST" = '' ]; then

return 2
else return 0
fi
}

fnConn(){
substart_msg "Остановка Network manager"
/etc/init.d/NetworkManager stop
case "$?" in
0) result_ok ;;
*) msg_fail "демон не остановлен" ;;
esac
if [ "`/etc/init.d/bluetooth status`" = "bluetoothd is stopped" ]; then
substart_msg "Запуск сервиса BT"
/etc/init.d/bluetooth start
case "$?" in
0) result_ok ;;
*) msg_fail "Сервис bluetoothd не был запущен" ;;
esac

fi
start_msg "Установка связи с BT устройством"
/usr/bin/rfcomm bind /dev/rfcomm0 $MAC_FON 1
case "$?" in
0) result_ok ;;
*) msg_fail ;;
esac
sleep 3
start_msg "Подключение к провайдеру \n"
/usr/sbin/pppd -d connect '/usr/sbin/chat -v -s TIMEOUT 5 ABORT "NO CARRIER" ABORT ERROR "" '''ATE1''' OK AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\" OK ATD*99***1# CONNECT' /dev/rfcomm0 115200 noauth defaultroute usepeerdns updetach persist novjccomp novj noipdefault nopcomp noaccomp nodeflate nobsdcomp
case "$?" in
0) result_ok ;;
*) msg_fail "подключение не выполнено";exit ;;
esac
substart_msg "Определение IP адресов"
fnGetIPs
case "$?" in
0) result_ok ;;
1) msg_fail " невозможно определить remote local IP address" ;;
2) msg_fail " невозможно определить remote IP address"
esac
substart_msg "Применение политик FireWall загрузка дополнительных модулей:"

#про фаервол отдельный разговор ;)
}

fnDisconnect(){
start_msg "отсоединение\n"
substart_msg "release rfcomm0"
/usr/bin/rfcomm release /dev/rfcomm0 $MAC_FON 1
case "$?" in
0) result_ok ;;
*) msg_fail "rfcomm release" ;;
esac
substart_msg "killing pppd: "
kill `ps -A |grep pppd|awk '{print $1}'`
case "$?" in
0) result_ok ;;
*) msg_fail "процесс не убит" ;;
esac

substart_msg "/etc/init.d/bluetooth stop \n "
/etc/init.d/bluetooth stop
case "$?" in
0) result_ok ;;
*) msg_fail "служба не остановлена" ;;
esac
}

case "$1" in
connect|c|-c|--connect)
fnConn
;;
disconnect|--disconnect|-d|d)
fnDisconnect
;;

*)
echo -e '
-c\t|\t--connect\t\tподключение к билайн
-d\t|\t--disconnect\t\tотключение
'

exit 1 ;;
esac
exit 0

Автоматизация должна быть. Но лишнего — не надо.

«Если в головах нет порядка, автоматизация не поможет» (с) кто-то мудрый и древний.

Цитата (http://aborche.habrahabr.ru/blog/53777):
— Разговор: «Мдаа чет наши автоматизаторы какую-то фигню написали, а давайте поищем может кто написал что-нить похожее ?»

История повторяется до бесконечности.
Деньги тратятся направо и налево, но не на дело.
Вот такая вот фигня!
— Цитата (http://habrahabr.ru/blogs/i_am_clever/55215, комменты):
— Только не забудьте научить при этом тех же самых бабушек пользоваться интернетом, терминалами.
— Цитата: (http://habrahabr.ru/blogs/pm/46202)
— «Мостики» и работа всех служб в одной среде — возможны. Но разделение «проекты — службы» должно быть четко видно хотя бы руководителям при решении о внедрении системы. И тогда можно ответить на вопрос, что же именно стоит автоматизировать в первую очередь. И как все связать в интегрированную среду.
— Информационные технологии являются частью нашей жизни. Но везде ли они помогают?

Самое первое поле обширного внедрения ИТ — финансы, учет, бухгалтерия. Будучи еще школьником-на-практике и помогая отформатировать зарплатные квиточки на «крутой» по тем временам 386-й, стал свидетелем как бухгалтер завода (одно из градообразующих предприятий, более 1000 человек) проверяла зарплату всего коллектива на счетах, потому что доверия машине не было.
Скажете, «старая гвардия, привыкнет — полюбит»? Да, возможно. Однако, в прошлом году моя родственница (далеко не старушка, не блондинка, хотя и не ИТ-шник) пожаловалась, что после внедрения новой системы пришлось нанимать еще 2х сотрудниц в бухгалтерию, потому что поток данных, который необходимо вбить вручную серьезно вырос.
Так зачем внедряли? Потому что «новая». А новое — оно должно быть лучше, удобнее, автоматизированнее… Это распространенный штамп, и, хотя компьютерщики ему уже не верят, он является одной ииз движущих сил рыночной экономики и кормит тысячи поставщииков софта, железа, консалтинга и иже с ними.

А теперь уже я задумался — автоматизация (а именно — автоматизация бизнес-процессов) подразумевает отлаженность этих самых бизнес-процессов, что зачастую невозможно, если предприятие существует хотя бы несколько лет без соблюдения оных.
Даже среди нашей братии (отношу себя к компьютерщикам) внедрение какого-нибудь средства issue-tracking или отчетности вызывает мощное отторжение, пока не докажешь, что без этой формализации отношений мы быстро утонем. И неважно — где именно утонем.
Так что же говорить об «обычных людях», на которых мы привыкли злиться за их неумение нажать нужную кнопку вовремя?! Именно об этом говорит принцип, вынесенный в эпиграф.

Соответственно, правильная, помогающая автоматизация должна начинаться только тогда, когда бизнес-процесс уже хотя бы описан, или (еще лучше) — отлажен в компании. Тогда все что осталось — внедрить нужную систему и обучить персонал тому, как в этой системе легко и просто делать их рутинную работу. Именно в этом случае люди будут рады происходящим переменам, ибо они делаются ради них (и, конечно, ради прибыли/сокращения издержек).

Здесь существует еще аспект противодействия, когда часть сотрудников саботирует нововведения. Причин может быть сколько угодно, но основная угроза исходит от тех, кто уже достиг своего высшего уровня иерархии (по принципу Питера) и боится «быть замененным машиной». С разными вариациями, эта причина существует со времен первой промышленной революции, но избежать ее никому не удаётся.

Хорошо, где же рецепт, что поможет руководителю не потерять при внедрении новой системы, а компании-разработчику/интегратору заработать? Хороший рецепт, как мы любим, универсальный, на все случаи жизни!
Он, как водится, дуалистичный: в компании-заказчике должен существовать бизнес-спонсор, влиятельный человек, серьезно заинтересованный в результатах этой автоматизации. Если его не будет — хоть что делай, система жить не будет. Если он будет — и не уйдет из компании за время реализации проекта — то вероятность успешной реализации весьма высока.
Дуализм рецепта в том, что любой длительный проект (более года) сталкивается с ситуацией отсутствия или смены бизнес-спонсора со стороны заказчика. Тут уже вступает в дело армейский принцип: «если дело действительно того стоит — оно будет сделано, если нет — то и делать не надо».

Кстати, в начале века (как звучит-то, а!) читал статью с названием вроде «Автоматизация без автоматизации», где автор описывал систему управления небольшим складом вообще без ИТ. В дело вступали цветные квиточки, каждый из которых обозначал единицу хранения/поставки какого-либо товара. Поставщик знал, что ему надо привезти ровно столько товара каждого вида, сколько квиточков он нашел в коробке. Соответственно, хозяин склада мог регулировать набор товара на складе убирая или добавляя нужные квиточки. Все просто!
Эта ситуация относилась к 90-м годам, когда компьютеры были дорогим удовольствием. Однако, элегантность решения от этого не уменьшается.

На этой оптимистической ноте, позвольте откланяться.

Питон для Домохозяек

Суть проблемы


В нашем вузе помимо основных экзаменов и зачетов принято сдавать так называемый трудзачет. Именно поэтому в конце семестра многие студенты бегают по двору университета с лопатами и вениками, активно используя запатентованную русскую технолоию ИБТД (Имитация Бурной Трудовой Деятельности). Некоторые отрабатывают трудзачет на кафедрах. Там им предлагается высокоинтеллектуальная работа по сортированию различных документов и занесению их имен в Excel. К числу последних отношусь и я...


В принципе, данная работа не является чем-то сложным до тех пор, пока тебе на хард не попадает 11GB информации, которую ты должен рассортировать и записать в Excel...


На помощь мне пришел Python.


Основные задачи


Скрипт, представленный ниже, должен решать две задачи:


  1. Искать все файлы, которые соответствуют заданному шаблону
  2. Заносить их имена в файл, формат которого поддерживает Excel (например Excel XML)

Решение


Решение состоит из 3 файлов: (main.py, config.py,template.xml)


  1. main.py — непосредственно сам скрипт
  2. config.py — файл настроек
  3. template.xml — файл шаблона (файл получается путем сохранения пустого файла Excel в формат Excel XML и выкидывания из него лишних строк)

Начнем с файла template.xml:


<?xml version="1.0" encoding="cp1251"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel">
Алексей
Алексей
2009-04-29T19:00:04Z
2009-04-29T19:00:18Z
11.5606

11250
18075
240
30
False
False

<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
<Interior/>
<NumberFormat/>
<Protection/>


<Worksheet ss:Name=«files»>

<PageMargins x:Bottom=«0.984251969» x:Left=«0.78740157499999996» x:Right=«0.78740157499999996» x:Top=«0.984251969»/>

<Selected/>
False
False






Далее файл настроек (config.py):
# -*- coding: cp1251 -*-s
import re
import os
#Определяем основные настройки скрипта с помощью словаря
class Config:
root_dir = os.path.curdir#Директория, где будет работать скрипт
reg1 = r"([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,]+) - ([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,]+).(zip|pdf|doc|djvu)$"# Регулярное выражение для поиска файлов по умолчанию ищет файл вида: "[Название книги] - [автор книги].[расширение файла]"
reg2 = r"([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,]+) - ([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,])$"# Регулярное выражение для поиска дирректорий содержащихся в корневой папке
template = "template.xml"
output = "output.xml"
def __init__(self):
self.r1 = re.compile(self.reg1)
self.r2 = re.compile(self.reg2)

conf = Config()#Создаем объект конфигурации

Файл main.py:
# -*- coding: cp1251 -*-s
# Импортируем необходимые модули
import sys, re, os, xml.dom.minidom, array
from xml.sax import *

#Подключаем файл настроек
from config import *

class App:
stat = 0
filedirs={"files": [],"dirs": []}
#Дирректорию на предмет файлов (сканирование производится также и во вложенных папках)
def search(self,config):
for root, dirs, files in os.walk(config):
for i in files: #Имена файлов заносим в переменную
self.filedirs["files"].append(i)

for i in dirs:
self.filedirs["dirs"].append(i)

self.filedirs["files"].sort() # Имена файлов сортируем по алфавиту
#Проверяем файлы на сответсвие шаблону
def query(self,reg,dom):
for i in self.filedirs["files"]:
if re.findall(reg,i):
tmp = re.findall(reg,i)
self.xml_operate(dom,tmp)
else:
self.stat = self.stat+1
# Анализируем xml документ
def parsexml(self,xmltoparse):
dom = xml.dom.minidom.parse(xmltoparse)
dom.normalize()
return dom
# Добавляем информацию в таблицу
def xml_operate (self,dom,i):
table = dom.getElementsByTagName("Table")
row = dom.createElement("Row")
table[0].appendChild(row)
for j in i[0]:
cell = dom.createElement("Cell")
data = dom.createElement("Data")
text = dom.createTextNode(j)
row.appendChild(cell)
cell.appendChild(data)
data.appendChild(text)
return dom
# Записываем изменения
def write_xml(self,dom,template):
f = open(template, "w", 1)
f.write(dom.toxml(encoding="cp1251"))
f.close()

def __init__(self,config):
self.search(config.root_dir)
dom = self.parsexml(config.template)
self.query(config.r1,dom)
self.write_xml(dom,config.output)
print "Коллличество файлов не соответсвующих шаблону"
print self.stat
a = App(conf) #В качестве параметров передаем скрипту объект, содержащий настройки

Все файлы кладем в директорию, в которой будет осуществляться поиск. Запускаем через Eclipse файл main.py (можно запускать также в чем-нибудь другом, при условии совместимости кодировок. Если запускать через консоль в Windows — появится ошибка)


Скрипт создает файл output.xml, который можно открыть с помощью Excel


Данный код не претендует на профессионализм и совершенство.


Пример иллюстрирует применение Python в бытовых условиях.

Prototype: AJAX — просто как 3x3

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

Первое что нам понадобится — это простая форма с одним текстовым полем.
<form onsubmit="view_my_name(); return false;">
  <input type="text" name='my_name' id="name_id">
  <input type="submit" value="Отправить">
<form>



Дальше следуют 2 дива, один из которых информирует о выполнение запроса, а во второй будут помещаться данные, полученные от AJAX запроса.
<div id="name_results"></div>
<div id="name" style="display: none">Процесс передачи данных</div>



А вот и сам php-двигатель который будет обрабатывать данные и формы.
<?php
  header('Content-type: application/xml; charset=utf-8');
  header('Cache-Control: no-cache');
  if(@$_POST['my_name'])  print"<p>Ваше имя: ".$_POST['my_name']."</p>";
?>



Как можно было догадаться после нажатия на кнопку «Отправить», данные формы передаются функции view_my_name.
function view_my_name() {
  if ($F("name_id").length <1)
  {
    alert("Ошибка! Вы не ввели имя.");
    return false;
  }
  $('name_results').hide();
  $('name').show();
  new Ajax.Updater('name_results', 'form.php',
    {
      method: 'post',
      parameters: { my_name: $F("name_id") },
      onComplete: function () {
        $('name_results').show();
        $('name').hide();
      }
    }
  );
}



Сначала идет проверка формы.
  if ($F("name_id").length <1)
  {
    alert("Ошибка! Вы не ввели имя.");
    return false;
  }



Затем очищаем поле «name_results» и показываем поле «name»
  $('name_results').hide();
  $('name').show();



Далее следует AJAX запрос на обновление (Updater)
  new Ajax.Updater('name_results', 'form.php',
    {
      method: 'post',
      parameters: { my_name: $F("name_id") },
      onComplete: function () {
        $('name_results').show();
        $('name').hide();
      }
    }
  );



Обновляется div c id=«name_results» результаты запроса. Запрашивать будем form.php — наш двигатель. Данные передаются методом POST. Передаваемый параметр всего 1 — это наше введенное имя «my_name» значение параметра "$F(«name_id»)" после выполнения (onComplete) показываем «name_results» и убираем поле «name» в которое можно вставить какую-нибудь картинку, показывающую что идет процесс передачи данных.

Евангелие

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

Линукс – это как мощная струя свежего воздуха их распахнутого настежь окна. Это бунт, это восстание, это попытка вырваться из круговорота. Линукс – это нечто новое. Линукс – это вторая, более правильная жизнью Новая жизнь с чистого листа. Начать ее никогда не поздно. Многие люди, особенно старые и закостенелые, боятся что-либо изменять в своей жизни. Собственно, они так и живут, выдыхая и вдыхая один и тот же воздух. А потом они, опутанные пыльной паутиной, помирают в своих каморках, так и не узнав, что на свете есть голубое небо, свежий ветер и яркое солнце. Линукс – это свобода выбора. Кто знает, что у него есть выбор?

Когда я первый раз поставил Линукс, я был разочарован. Ничего не понятно. Где что лежит, как управлять, как правильно включать компьютер, как правильно выключать… Непонятно, как открыть файл, как найти только что созданный документ. Какие-то непонятные папки, файлы. Системное меню «не на месте». Значки другие. Все по-другому!

То ли дело Windows! Все привычно, понятно и все на месте… И тут меня как током прошило – ребята, а, собственно, я ведь закостенел, я покрылся ракушками и ржавчиной. Кроме Windows я ничего другого не знаю. Более того, я уверен, что Линукс – не то, на что следует тратить свое время. Нужно и впредь оставаться под покровительством Майкрософта и Windows. И более не смотреть к соседу через забор.

Но одна дурацкая мысль не давала мне покоя: Windows – это хорошо, это замечательно, но ведь много людей и организаций работают и работают под Linux. Как это так им удается успешно функционировать на рынке? И по ним ведь не скажешь, что они что-то в Линуксе не могут делать. Более того, я знаю много примеров перехода людей с Винды на Линукс, и я не знаю ни одного примера обратного перехода с Линукса на Венду. Значит, тут что-то не так. Наверно, Linux – такая же полноценная система, а вся проблема во мне. Это я чего-то не понимаю. И я, закусив удила, с хорошей доброй злостью принялся за изучение Linux.

Я не давал себе послабления. Я заставлял себя выполнять свои задачи в Linux, хотя в Windows-е я бы их сделал в несколько раз быстрее. Я заставлял себя изучать новую ОСь. Примерно через месяц мучений я признал факт того, что Linux имеет право на жизнь на моем компе. А еще примерно через месяц, я заметил, что я больше времени провожу в Linux, чем в Windows. Я заметил, что я чаще решаю свои задачи в Linux, чем в Windows. И этот «перекос» объясняется тем, что в Linux-е мне это делать удобнее, чем в Windows-е. Т.е. в моем сознании произошла метаморфоза, перерождение.

Похоже, я понял в чем состоит прелесть Linux. Я понял его преимущество перед Windows. Но я также понял, что это не передается словами. Невозможно рассказать слепому о том, что такое голубое небо. Бесполезно рассказывать тем, кто ни разу не пробовал, что значит плыть в воде, лететь по воздуху, ехать на велосипеде, бежать на лыжах, вести автомобиль, любить женщину, … работать в Linux. Это все то, что нужно проделать самому, что бы понять, что это за явление. Так и с Линуксом, пока сами не научитесь в нем работать, бесполезно говорить о его преимуществах перед Виндой.

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

Я бы вам сказал: не усложняйте то, что можно сделать просто и понятно. Покуда вы не постигли Дао Линукса, вам будет не понятен смысл сказанного. Но, как вы видите, я все-таки сказал это. Сделал я это сознательно, дабы изучая Линукс вы ощущали простые истины, на которых строиться Линукс.

Выбирайте правильную операционную систему, в основе ядра которой лежит правильная парадигма, правильное понимание сути вещей и действий над ними. Знайте, что при необходимости «выпендриться», бесполезные бантики-фантики могут легко достраиваются сверху (системы). Но если в основе ОС лежат желание продавать ее, то она так и будет проектироваться – для продажи. В ней будет заложено великое множество разрозненных и грубо-стыкующихся друг с другом решений, возникших из-за погони за сиюминутными коммерческими идеями. В конечном итоге это выльется в сложность и запутанность ОС. Эта сложность даже будет трактоваться как навороченность системы, и будет использована в рекламных целях, как оправдание высокой цены. А с другой стороны, эта ОС будет обязательно увешана всевозможными бантиками и колокольчиками. Это будет сделано для того, чтобы привлечь внимание не разбирающихся в вопросе покупателей. Ведь всем давно известно, что чем бесполезнее товар, тем ярче его упаковка.

Спасибо, что дочитали до конца. Теперь вы уже кое-что понимаете, не так-ли?

Java. Создание и сборка проектов с помощью Maven на примере Web-проекта

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

Рассмотрим, как с помощью maven можно создать и собрать проект.
В качестве примера возьмем пример Web-приложения имеющего 2 модуля, собственно сам WEB-проект (SimpleWEB) и модуль (SimpleLogic), в котором будет находиться логика.

Первое, что нам нужно сделать, это настроить maven. Полную инструкцию можно прочитать на сайте maven. Краткое описание:

1. Скачаваем дистрибутив с сайта maven. В нашем примере, версия 2.0.9.
2. Распаковываем на диск, например в c:\tools\apache-maven (в дальнейшем, ${maven.home})
3. Прописываем в системную переменную «path» путь к bin каталогу ${maven.home}\bin
4. Можно поменять путь к репозиторию (хранилищу) библиотек на свой (по-умолчанию будет использоватья каталог ${user.home}/.m2/repository) — в файле ${maven.home}\conf\settings.xml прописать элелемент localRepository в разделе settings, например c:/tools/MavenRepository

Создание проектов.

1. Создаем каталог, например, c:\work\java\Simple\ (в дальнейшем — ${work}).
2. Запускаем консоль в этом каталоге или делаем в консоле этот каталог текущим.
3. Создание проекта SimpleWEB
Создание проекта с помощью maven производится командой
mvn archetype:create -DgroupId= -DartifactId= -DarchetypeArtifactId=,
где groupID — ваш идентификатор группы проектов, он же будет использован для создания пакета по-умолчанию, например, groupID=com.dom.simple,
artifactId — имя проекта, например SimpleWEB,
archetypeArtifactId — тип проекта, если не задан, то будет создан jar проект

Выполняем следующую команду:
mvn archetype:create -DgroupId=com.dom.simple -DartifactId=SimpleWEB -DarchetypeArtifactId=maven-archetype-webapp

4. Создание проекта SimpleLogic. Выполняем команду:
mvn archetype:create -DgroupId=com.dom.simple -DartifactId=SimpleLogic

5. Укажем что проект SimpleWEB зависит от SimpleLogic — в файле {work}\SimpleWEB\pom.xml в разделе «dependencies» прописать новую зависимость:

com.dom.simple
SimpleLogic
1.0-SNAPSHOT


6. Обычно, при использовании maven, создается еще один проект, который содержит в себе ссылки на все остальные проекты. Назовем его «parent». Выполняем комманду:
mvn archetype:create -DgroupId=com.dom.simple -DartifactId=parent
Далее нужно:
  • В ${work}\parent\pom.xml в «jar» заменить «jar» на «pom»
  • Блок «dependencies» можно удалить
  • Прописать блок «modules» с сылками на другие проекты


../SimpleLogic
../SimpleWeb


7. Проверим как собираются наши проекты. В каталоге ${work}\parent выполняем комманду:
mvn package
Если все сделали правильно, то проекты собирутся успешно и в каталоге "${work}\SimpleWEB\target" будет создан файл «SimpleWEB.war» который содержит наш проект SimpleWEB и внутрь war фала также помещен SimpleLogic.jar
8. Созданный при сборке war файл можно публиковать, например, в Tomcat.

9. Все, инфраструктура проектов создана, проекты собираются. Можно писать логику, добавлять странички и с помощью команды «mvn package» собирать web-проект.

Скачать файл с проектами

Как написать простенький локальный прокси на Java для текущих нужд

Хабрапользователь kalyaka попросил сделать небольшой корпоративный прокси.
И вот, сегодня, прокси готов. Написал я его на Java, как консольное приложение.
Почему на Java? Потому что kalyaka java-программист, и в случае чего, всегда сможет поправить мои кривые руки.
Почему консольное? Потому что… потому что так во-первых проще, во-вторых его можно будет поюзать под Линухом без GUI, ну и на мой взгляд консоль — это все таки более универсальный интерфейс, доступный практически всегда.
Ну и чего же может этот прокси?
Смотрим под катом

Бизнес и дружба

Начинается моя история в далеких 199х годах с того, что я, включая пару моих друзей, решили поработать на себя. Для этого выбрана была фирма, производящая внедрение систем бухгалтерского учета, но в которой уволился программист, а менеджеры разбежались. Путем переговоров с директором этой фирмы, нам был выдан мандат на любые вид деятельности, но с условием технической поддержки существующих клиентов (пару тройку). Занимались заправкой картриджей, поддержкой клиентов, ремонтом ПК. все закончилось в тот момент, когда все поняли, что расходы равноценны доходам и особой прибыли вскоре не будет. Все разбежались мирно. и после этого не пересекались по работе.
Вторая история была в позапрошлом году. Молодое рекламное агентство с уникальными рекламоносителями предлагает сделать им сайт в обмен на передачу всех заказов на сайты мне… соглашаюсь, пару дней и визитка на джумле готова. Сайт кажется до сих пор еще жив (хотя и закрыт), а агентство закрылось по причине внутренних разборок учредителей-начальства.
Я принял сторону одного из учредителей и ушел с ними. Вновь открытое агентство начало работать и производились поиски своего УТП. Я вспомнил старую идею с видеоэкранами вмонтированными в стену и предложил. Идею поддержали, экраны были куплены, поставлены. Собственными руками разработал крепление, крепили, сделал заставки собственные, придумали систему вещания и проект запустили. В силу ряда причин начальство не смогло обеспечить продвижение данного рекламоносителя и проект закрылся уже без меня.
В силу дружбы денег за проделанную работу я не получил, хотя и были затраты времени и сил.
Не так давно, через знакомых мне заказали сайт (одно агентство свадебное-развлекательно-фото и теле снимательное). Казалось бы, звоночек, но нет. Сайт начал делаться по предоплате 50%, макет утвердили, верстка, размещение на хостинге. И вот тут начался небольшой конфликт. Так как в фирме как бы 2 направления, то и 2 «директора». Каждый хотел видеть нечто свое и каждую неделю они меняли что либо, оттягивая процесс сдачи сайта… сначала на 2 месяца, потом еще на 3. Я еще по глупости помог им в Новый год поработать дедом морозом.
Итог истории таков. Когда я встав в позу, отключил работающий сайт, но директорша (блондинка с понтами обратнопропорциональными мозгу) начала скандалить по телефону. Попытка сказать, что без ПИСЬМЕННОГО ТЗ я делать нечего не буду скандал перерос в посыл меня на несколько букв и неоплатой ни работы деда мороза, ни сайта.

В чем соль моей истории? В том, что НИКОГДА не стоит делать что либо по дружбе. Если только это не родной человек. С которым мы сейчас занимаемся каждым своим делом и общим делом по изготовления кресел-подушек.
habrahabr.ru/blogs/my_business/59660 — спасибо автору за статью. чуть позже напишу нечто подобное, только про свое дело. Расходы намного меньше были, но это уже другая история.

Верстка оглавления деловой газеты «Ведомости»

Привет хабрадрузья!

В компании, где я работаю, есть интранет подписка на деловую газету «Ведомости».
http://www.vedomosti.ru/newspaper/

Необходимо было сверстать оглавление газеты в две колонки используя rss Ведомостей. Я решил немного отойти от оригинала.

Нарисовал макет.

Пару слов по макету:
— Две полосы: А1 и Б1 (на макете они не обозначены намерено, в XML присутствуют) разделяют статьи на 2–х колоночный дизайн.
— Первые заголовки статей полос А1 и Б1 отличаются цветом и размером шрифта. Это важно.
— Статьи группируются по категориям (пример, Власть / Деньги и Индустрия / Энергоресурсы, выделены зеленым) и соответственно отделяются друг от друга.
— В левой колонке должны находится статьи, сгруппированные по соответствующим категориям, до категории Б1, в правой, все статьи после категории Б1. Это очень важно.

В этом мне помог XSLT.
Читать дальше →

Создание в корпоративной сети ICQ сервера

Всем привет, хочу рассказать о создании в корпоративной сети сервера ICQ.


Как то в нашей организации понадобилась программа кадровикам, которая дни рождения сотрудников заранее показывала, типо напоминателя, в общем дали нам задание. Честно признаться, обычный напоминатель мне, почему то не очень нравится, слишком уж просто, я долго думал, и вдруг пришло в голову создать ICQ сервер, создать базу с сотрудниками, в базе вся информация о сотруднике: рабочий номер, почта, должность, ну и собственно дата рождения. Мне показалось — это всем пригодится, особенно когда тебя нет на месте, тебе могут сообщение написать, чтото типо: закончился картридж или перезвони, да и файл можно передать – некий документооборот. В организации уже на всех ПК стоял чат, но он был широковещательный – что не есть хорошо. В долгих поисках серверной программы я выбрал SIQ, программа легка в настройках, я всё оставил по умолчанию, кроме сервера и порта. Есть форма регистрации, её я поднял на IIS.

Возможности SIQ (с источника):
— Поддержка протокола v7/8
— работа в виде сервисов
-UIN от 1 до 4 294 967 294
-отправка сообщений с подтверждением и без него
-отправка онлайн- и оффлайн- сообщений
-отправка сообщений через командную строку
-отправка сообщений через ActiveX
-Поддержка списков рассылки
-виртуальный UIN — разослать всем онлайн-пользователям
-виртуальный UIN — разослать всем (и включенным и выключенным)формируется автоматически из всех клиентов в .DB*.ini за вычетом списков рассылок
-поддержка авторизации
-введена градация серьезности логов

В общем то что нам и нужно. =) Скачиваем, внутри у нас следующее:
-SIQAuth.exe — сервер авторизации
-SIQBOS.exe — сервер основных служб
-SIQCmd.exe — посылка сообщений через командную строку по TCP/IP
-SIQAx.dll — COM-объект для управления сервером и посылкой сообщений
-siq.ini — списки рассылок
-msg.htm — пример использования SIQAx

Каталоги:
db — профили пользователей
olm — off line message — сообщения, присланные во время отключения от сервера
Cookie — хранит файлы, используемые при авторизации. Каталог использует SIQAuth SIQBOS
Miranda — Миранда 3, со сделанными исправлениями и с самыми нужными плагинами

Процесс установки:
1. Запустить siq-full.exe
2. Выбрать параметры инсталляции и инсталлировать
3. После инсталляции настроить в реестре[HKEY_LOCAL_MACHINE\SOFTWARE\OVRSIQ] path — каталог с программой. («C:\Program Files\SIQ») должен обязательно заканчиваться слэшем
4. настроить параметры серверов файле siq.ini
— Auth_Port порт сервера авторизации (5190)
— BOS_Port порт сервера основных служб (5191)
— BOS_IP IP-адрес сервера основных служб (Обязательно сменить на реальный)
— LogLevel Уровень серьезности лога от 0 до 11 (9)
5. настроить списки рассылки в файле siq.ini
6. Стартовать службы SIQAuth и SIQBOS. При необходимости сменить параметры автозапуска а так же пользователя, под которым запускаются сервисы.
7. Запустить клиента из каталога "\SIQ\Miranda\miranda32.exe"
8. Сменить в настройках адрес сервера
9. Плагином Database Editor задать переменные Миранда/Текущий пользователь/ICQ/WWWPass и WWWReg — указать адреса www-страниц для напоминания пароля и регистрации нового пользователя. По умолчанию icq/password и icq/register Это для тех, у кого свой сервер с CGI

Вот собственно и установили сервер, в качестве клиента в SIQ, сразу же есть Miranda, но она мне внешне не очень понравилась, я использую у нас в организации Miranda ME, устанавливаем… Для того чтобы Miranda ME работала корректно, копируем из прилагаемой Miranda из папки Plugins файл icq.dll в нашу Miranda ME в туже самую папку Plugins. После чего Miranda нам не нужна, удаляем. Запускаем Miranda ME, в настройках указываем сервер и UIN. Теперь самое сложное, регистрируем всех сотрудников, вводим все данные, на это у меня ушло 3 дня %) … Ну и вот, почти всё готово, запускаем Miranda ME, ищем все UINы и добавляем в список, на всякий случай я создал около 100 пустых пользователей, что нам в будущем пригодится, если к нам в организацию примут новых сотрудников. Это и будет наш клиент, который распространим путем копирования на все ПК в организации, тоесть устанавливать на остальные ПК Miranda ME не нужно, нужно нашу всем скопировать в Programm Files, запустить у каждого пользователя, ввести принадлежащий ПК UIN и в настройках в автозагрузке поставить галочку. Ну вот и всё. Спасибо за внимание, надеюсь кому-нибудь пригодится. Просьба строго не судить, это мой первый пост...

Способ хранения массивов в Mysql или Cookies

Иногда web-разработчику необходимо хранить массив в БД, но в MySQL нет такого типа данных, как массив. Как же организовать их хранение? На самом деле, способов хранения массивов существует большое количество. Я расскажу вам 2 действенных, простых и быстрых способа, как это осуществлять. Я буду описывать их на примере MySQL, но они так же применимы и к cookies.
Упаковка массива в строку.

Для этого необходимо содержимое нашего массива записать в строку, а каждый элемент отделить символом (таким, который точно не может входить в состав элементов). К примеру, если мы храним в массиве только числовые данные, то разделять их можно символом ;.

К примеру, дан массив $mas[1]=5; $mas[2]=7; $mas[3]=9; $mas[4]=15; $mas[5]=1;

Нам необходимо записать все данные массива таким образом, чтобы у нас получилась строка $s=«5;7;9;15;1»;

Это можно организовать с помощью цикла перебора массива foreach()

Получившуюся строку необходимо записать в БД (соответственно в поле с типом varchar, text и т.п.).

Как же нам собрать массив заново? — спросите вы. А очень просто. Для этого достаточно использовать функцию explode();

<?php
$s="1;2;3;4;5;10;15";
$s1=explode(";",$s);

foreach($s1 as $val)
echo $val."<br>";
?>


Использование функции serialize() и unserialize()

При использовании описанного выше способа возникнут сложности с двухмерным массивом, а так же ассоциативным массивом, но и их можно решить путем исправления функции (к примеру использовать 2 разных типа знака и разбивать сначала по одному знаку, а затем каждый получившийся элемент по другому знаку), но это приведет к увеличению кода, а значит к возможности появления ошибки и замедлению выполнения. И разработчики php пришли на помощь web-программистам, создав специальные функции serialize() и unserialize().

Функция serialize() возвращает строку, являющуюся упакованным эквивалентом некоего объекта $obj, переданного в параметре.

Общий вид: string serialize(mixed $obj);

Применив функцию к массиву:
$mas[1]=1;
$mas[2]=2;
$mas[3]=3;
$mas[4]=4;
$mas[5]=5;
$mas[6]=10;
$mas[7]=15;

$str=serialize($mas);
echo $str; ///получим на экран что-то вида a:7:{i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:10;i:7;i:15;}


После этого достаточно к строке $str применить функцию Unserialize() и мы получим исходный массив. Так же с помощью этих функций можно упаковывать любой объект и хранить его либо в БД либо в куках.

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

Стартап — реальный опыт

Сатртап — это очень сложное дело.
У вас появляется идея. Лучше всего походить с ней. И если она не отвалится через месяц то появляется выбор. Либо начать ее реализовывать либо поставить на ней крест.

И вот, появилась такая идея. Появился проект в медиа сфере.Я не буду описывать его суть. Скажу что идея действительно стоящая. Я начал искать людей которые помогли бы реализовать такой проект. Нашел несколько программистов. Пообщался и выбрал одного. Вместе с ним мы начали делать проект. У нас была негласная договоренность. Домен зарегистрирован на мне. А вся программная часть у него.
В ходе проекта мы сделали работающую демо версию. Сайт можно увидеть в интернете и посмотреть как он работает. Однако в ходе проекта родилась новая идея. которая базировалась на старой. Только гораздо более масштабная.

Походу проекта я стал общаться с инвесторами. Ездил в другой город на переговоры. Собственно я знал что идея стоящая и даже если этот инвестор отказался бы. То с прототипом нового проекта мы бы точно получили бы деньги. Я договорился что будет прототип, и переговоры продолжим после презентации доработанной версии. Но как обычно все не так просто.

Я долблюсь в аську партнеру — программисту уже почти неделю. Но ответа нет. Он должен уже был закончить прототип проекта который можно показывать. Но ответа все нет. Я написал в аську, на почту. Но тоже глухо. Быть может он заболел или сломал ногу? Тоже нет. Слава богу что хабр показывает время последнего посещения пользователя. У моего партнера хватает времени почитать статьи. Но на общение со мной времени у него нет. Я написал что если он мне не ответит то я считаю что он меня кидает.

Самое интересное что я не знаю что делать! Весь код у него. И ведь надо же. У человека пол тысячи комментариев, ведет свой блог. Я знаю полностью его имя, где он учится, город проживания. Был еще номер телефона. Я даже звонил по нему. Вот только недавно он перестал работать. Я позвонил оператору и оказалось что телефон не существует. Как такое может быть? Ведь я по нему дозванивался может месяц назад.
Так что у меня нет выхода как начать делать проект заново. С новой командой. Благо он не настолько технически сложен. Инвайт на Хабре нужен мне для того чтобы найти другого партнера.

Какие выводы можно сделать из этой истории.
Нужно обладать максимальной информацией друг о друге. Понятно что я не поеду к нему бить морду. Все что реально можно сделать — опустить репутацию. Ведь работодатели уже начинают проверять в гугле имя претендента. Так вот единственное что можно сделать это создать простую страничку оптимизированную под запросы «имя и фамилия» кидаллы. И описать там честно всю историю сначала до конца.

Реализация AJAX на сайте средствами jQuery

Итак, я расскажу, как при помощи javascript фреймворка jQuery можно делать AJAX-запросы PHP скриптам.

Нам понадобится:
— заранее написанный PHP-скрипт
— немного времени

1. Подключаем сам jQuery



Скачать последнюю версию можно отсюда

2. Пишем JavaScript, например такого содержания:

function viewfiles(topic) {
jQuery.ajax({
type: "GET",
data: 'topic=' + topic,
url: './ajax/files.php',
success: function(data){
jQuery("div#inside_area").empty();
jQuery("div#inside_area").html(data);
}
})
}

Разберем скрипт поподробней.

type: "GET",

тип запроса к PHP скрипту, может быть GET или POST (в зависимости от метода приема данных PHP скриптом)

data: 'topic=' + topic,

данные, отсылаемые скрипту

url: './ajax/files.php',

путь до PHP скрипта

success: function(data){
jQuery("div#inside_area").empty();
jQuery("div#inside_area").html(data);
}


Эта часть обрабатывает ответ от скрипта. Сначала очищается слой, в который пишется ответ (inside_area — id слоя), потом в этот слой вставляются данные.

Дальше надо собрать все в одну HTML-страницу и пробовать.

Пример для files.php
<?php
echo $_GET['topic'];
?>

iLost.ru — быстрый поиск компаньона, партнера, товарища в своем городе

Начну с того, что живу я в Самаре, отнюдь не маленьком городе.
Решил найти товарища по несчастью и вместе открыть несетевой стартап.

Сначала обыскал все основные сайты по поиску работы — никого не нашел. Были только помощники бухгалтеров, начальников и юристов…

Затем стал искать по сайтам поиска партнера. Также ничего путного не нашел. В основном всякий немодерируемый хлам — пирамидальные предложения, спам, флуд, крупные поставки, франшиза, поиски спонсора… Изредка попадаются более-менее нормальные объявления, типа «ищу партнера для общего дела...», «ищу компаньона»… Но, когда я открываю их, чтобы прочитать подробности, это оказывается другой город или (если очень повезет с городом) давнишняя дата написания сообщения.

Еще одно замечание — почти все подобные сайты — или форумы с совершенно неподходящей структурой или полупорталы, давно закрывшиеся или заплывшие жиром рекламы…

В общем надо было что-то с этим делать, поэтому я и собрал быстренько (2 часа) данный сайт. Предупреждаю, что это только начало, но уже довольно самостоятельное и трудоспособное. Дизайн пока хромает, но для начала это не так важно.

В общем, если вам нужен партнер или товарищ для благого дела — милости прошу на iLost.ru