Как стать автором
Обновить

Эффективность ИТ проектов

В последнее время все большую актуальность приобретает тема эффективности внедрения IT технологий. Говоря об эффективности, многие специалисты употребляют этот термин в контексте финансовой составляющей. То есть, происходит попытка напрямую связать внедрение информационных технологий через финансовые показатели с различными финансовыми характеристиками бизнеса. Это может быть и стоимость бизнеса и чистая прибыль, выручка или любой другой показатель. И в связи с этим, на основе анализа многих проектов, можно прийти к выводу, что в целом IT проекты либо малоэффективны, либо существенного влияния на бизнес не оказывают. По крайней мере, российский IT в этой связи вспоминается достаточно часто.
Читать дальше →

Групповые политики в Samba домене.

О статье

Собственно необходимо написать пост соответствующий тематике Хабра. Хабр мне прежде всего интересен тем, что тут можно найти множество идей и решиний для системного администратора (на Linux и BSD) от обычных пользователей.
Вот я и решил написать что то в стиле How-to. На данный момент у меня под рукой было несколько моих проектов. К примеру «Контроллер домена c Web GUI на Linux. (Подробный HowTo)» или «Повелитель Proxy (SQUID+ClamAV+NTLM group win2003+SAMS) (Подробный HowTo) оказались слишком громоздкими для мини презинтационного поста. Решил написать пост среднего содержания. А именно о групповых политиках в домене на Samba (О да, он много где применяется :) ).

Чуть истории

Когда вы управляете большим количеством рабочих станций под управлением Windows и количество рабочих мест растёт и растёт. Очень важно грамотно и точно настроить рабочую среду, каждого компьютера. Важно не упустить даже мелкие детали настройки. Настройка каждого компьютера отнимает много времени. И вы всё больше и больше задумываетесь об автоматизации процесса настройки некоторых настроек операционной системы. Таким решением является групповые (системные) политики. Благодаря им, мы можем создавать набор правил, в соответствии с которыми рабочая среда каждого компьютера будет настраиваться автоматически.
Групповые политики хорошо реализованы в службе каталогов Active Directory. В *nix подобных контроллерах домена ничего похожего нет. Но был найден довольно интересный выход из ситуации. Конечно, этот самый выход, не сравнится с полным аналогом групповых политик в AD т.к. мы будем использовать древний стандарт доменной политики windows nt 4.0, но всё таки это довольно неплохой способ автоматизировать настройку рабочих станций в *.nix доменах.
В этой статье я подробно опишу реализации автоматической настройки рабочих сред Windows в Samba домене.

Немного о решении:

Что бы настроить рабочую среду, нам больше всего нужно что? Правильно – реестр каждого компьютера. Именно там и прописываются основные правила настройки среды. Путём внесения туда изменений, можно манипулировать этими правилами. Вносить изменения будем программой «Редактор системных правил (Poledit)» от Microsoft. C помощью неё, мы создадим правила которые нам нужны. Правила можно создать для пользователя, доменной группы или же компьютера. Все правила умещаются в один файл «NTConfig.POL», который помещается в папку netlogon нашего домена и при загрузке учётной записи доменного пользователя подгружается на его компьютер настраивая рабочую среду.

Где взять програму:

Вообще на сайте Microsoft говорится что программа есть к официальном Sp4 к Windows 2000 и предлагается распоковать её от туда.
Но осмыслев всю проблематичность данной операции, решил погуглить. Погуглив наткнулся на несколько ftp серверов:
К примеру на официальном ftp Microsoft лежит сама программа:
ftp.microsoft.com/Services/TechNet…TADMIN/POLEDIT/

А вот тут, лежат темы к политикам. Их тоже нужно скачать. Потом расскажу зачем:
ftp.usask.ca//pub/vendor/microsoft/WinNT Intel/NT4_sp6a/unpacked

Скачиваем на какую ни будь свободную Windows XP и переходим к настройке.

Сам процесс:

Итак. Для начала нужно что бы Poledit заработал. Для этого кидаем все темы (файлы с расширением «.adm») в папку «C:\Windows\inf». Обязательно проследите что бы файлы common.adm и winnt.adm скопировались, без них программа не будет работать.
Далее запускаем POLEDIT.EXE. И мы видим довольно симпатичный понятный интерфейс программы. Теперь нам нужно смоделировать какое ни будь правильно. Представим что домен, который мы поднимали в прошлой части, уже настроен и работает, в нём уже есть несколько пользователей. Пользователю maks, нужно ограничить рабочую среду. А именно сделать так что бы у него не было доступа к диспетчеру задач и что бы он не мог менять себе пароль (к примеру).
Жмём на File -> New Policy. Появится политика по умолчанию. Она разделена на две части, политика компьютера и политика пользователя. Политики с префиксом Default действуют для всех (по умолчанию там нет активных правил, отмечу что на администраторов эти политики не распространяются). Нам нужно ограничить только юзера maks. Для этого жмём на иконку с головой человечка (Add user) и вводим в окошко имя пользователя – maks.

image

Создалась политика специально для пользователя maks. Щёлкаем на неё. Откроется древовидное меню со списком настроек которые можно использовать (для политики компьютера настройки будут другие).
Нам нужен раздел «Windows NT System». В нём ставим галочки на Disable task Manager и Disable Change Password.

image

Теперь нам нужно сохранить (File -> Save As) политику под именем «NTConfig.POL» и поместить в папку «netlogon» нашего домена. Важно знать, что у юзеров должны быть права на хотя бы на чтение папки «netlogon» и файла «NTConfig.POL», иначе правила не будут работать.
В принципе это всё. Теперь после того как пользователь maks залогинится в домене на его компьютер погрузится наша политика и настроит ему рабочую среду. По аналогии можно сделать политики для групп и компьютеров в домене.

Спасибо!

Простой способ разрезать видео

Вот, казалось бы, элементарная задача — порезать большой видео файл на два куска*. Что сделает обычный линуксоид? Откроет поисковик, напишет "mencoder split video" выберет первую попавшуюся ссылку или быстро прочитает man mencoder на предмет начала и конца кодирования. Более продвинутый линуксоид тут же напишет небольшой скрипт, который автоматом будет резать файл на два куска и соответственно их именовать. Менее продвинутый или более ленивый просто поищет в менеджере пакетов соответствующую программу и выберет подходящий гуй для mencoder-а или ffmpeg-а, коих есть огромное количество.
Время на решение задачи около 10-15 минут включая сам процесс конвертации.
Читать дальше →

Как перенести лучшие моменты офисной работы во фриланс

Как перенести лучшие моменты офисной работы во фриланс


Около пяти лет назад я попрощался с “настоящей работой” и занялся работой на дому. Я никогда об этом не сожалел и не собираюсь. Меня не напрягают постоянные обсуждения и совещания, офисная политика, какие бы то ни было прерии с начальством.

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

Сглаживание шрифтов в Wine

Вот какой интересный подход встретил на английском форуме:
Как известно, слаживание шрифтов в Wine возможно, но не включенно по умолчанию.
Вот как можно это исправить:

nano wine_fontsmoothing.reg

затем вставляем следующее:

REGEDIT4

[HKEY_CURRENT_USER\Control Panel\Desktop]
"FontSmoothing"="2"
"FontSmoothingType"=dword:00000002
"FontSmoothingGamma"=dword:00000578
"FontSmoothingOrientation"=dword:00000001


Сохраняем

Потом

regedit wine_fontsmoothing.reg

Следует отметить, что все это делаем от юзера.
Потом запускаем winecfg или любую другую прогу установленную под Вайном.
Радуемся красиво сглаженному шрифту.
Ссылка на оригинальную статью:

Установка и настройка Eclips + С/С++ в ubuntu

Не буду тут Вам, уважаемые, рассказывать зачем это Вам нужно, если читаете, значит знаете зачем.

Пункт первый: установка.
Запускаем вот эти команды в терминале:
1. sudo apt-get install eclipse (сама среда разработки)
2. sudo apt-get install gcc (компилятор)
3. sudo apt-get install gdb (дебагер)

Пункт второй: установка модулей в eclipse
1. sudo eclipse
2. Идем в Help->Software Updates->Find and Install…
3. Serch for new features to install [Next>]
4. Ставим галочку напротив «Callisto Discovery Site» [Finish]
5. Находим в списке модулей «Eclipse C/C++ Development Tooling — CDT», отмечаем его галкой и нажимаем «Select Required» [Finish]
6. после установки модуля, Eclipse перезапускать не надо, просто закрываем его.

Пункт третий: создаем тестовый проект на С
1. Запускаем Eclipse уже без суперпользователя.
2. Создаем новый проект «Standard Make C Prpoject»
3. Создаем тестовый файл «Source file» test.c и пустой файл makefile внутри проекта.
4. В test.c пишем следующий код:

#include
int main(){
printf("Hello World");
return 0;
}

5. В makefile:
CC = g++
CFLAGS = -Wall -o

all: test

1: test.o

test.o: test.c

.PHONY: clean

clean: rm -f test *.o

6. Сохраняем проект. Он будет автоматически скомпилироваться.
7. Запускаем Run. Нам будет предложено создать настройку для проекта. Кликаем два раза на надпись «C/C++ Local Application». Вписываем где необходимо имя проекта. В поле «C/C++ Application» нажимаем «Serch Project...» и там выбираем наш проект. Далее переходим на вкладку «Debugger» где выбираем в качестве дебагера «gdb Deugger».
8. Все! Нажимаем «Run» и готово. Получаем удовольсвие :)

Исключительными правами на медиапродукт обладает…

Власий Труш наблюдал, как золотыми слитками порхают тяжелые буханки, — и ликовал: «Эка, голод-то! Чего там по пять рублей… Драть так драть. Недаром от самого Сингапуру тащил… Опять же и рыск, дело благородное!» Боцман ехал во втором классе, почти полупустом, загрузив свое купе ящиками с ананасами. Крепкие мышцы боцмана, отъевшегося на казенных харчах, играли заранее — скоро он будет сгружать ящики на перрон…
Валентин Пикуль. Из тупика.



Здесь, и много где еще, в связи с выходом в свет поправок к ГК и идущего сейчас суда над торрент-трекером PirateBay ведутся бесконечные споры между поборниками копирайта и копилефта. Хочется ответить, но нет возможности :), поэтому пишу сюда. По причинам, которые будут изложены ниже, оставим в стороне программное обеспечение, сосредоточимся на фильмах, музыке и книгах. Итак:

Аргументы копирайтеров сводятся к 1) «несанкционированное копирование информации — воровство» 2) «не нравится — не покупай», 3) «каждый, кто скачал, вместо этого купил бы диск» 4) «владельцу необходимо отбить затраты на производство» 5) «соблюдайте закон».
Ответы сторонников копилефта, соответственно, к 1) «копирование — не воровство» 2) «куплю твердую копию, только того, что понравилось после бесплатного ознакомления» 3) «упущенная выгода — фикция» 4) «заплачу автору, а не медиа-холдингу» 5)«законы несовершенны».

На 99,9% это безвыходный тупик, что бы там не говорили про альтернативные модели распространения контента. Рассмотрим теперь пищевую цепочку распространения:

Автор-(договор)-> медиа-холдинг-«правообладатель»-(оптовая цена)-> розничные магазины -(розничные цены)-> покупатели
Вот тут и возникает ключевое слово — конкуренция, вернее, её видимость. Она имеет место среди розничных продавцов, оставляя нам иллюзию выбора — купить за 510 рублей здесь или за 500 за углом, в то время как основную цену определяет монополист, заключивший с автором договор на исключительное право распространения произведения! Это не ПО и не железо, где не хочешь Windows — ставь Linux, не хочешь Intel — покупай AMD.
Альтернативы авторскому произведению нет.

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

РПГ по «лейкоцитарным» мотивам: мысли вслух.

Где-то здесь, на Хабре, наткнулся на идею игры по мотивам «приключения лейкоцитов в организме». Несколько дней в голове вертелись мысли по этому поводу, которые в итоге сложились в некоторую систему. На самом деле — жизнь клеток крови в организме — это уже практически готовая РПГ, или даже РТС! Постараюсь кратко изложить свои идеи, может, кому пригодится:
1. Итак, первое, с чем у меня ассоциируется РПГ — дерево классов и скиллов. Тут не приходится даже особо думать, природа сама дает нам это дерево — вот схема развития клеток крови в организме:
image
Пойдем по порядку (нижний ряд, слева-направо):
— эритроциты. не слишком интересный класс с точки зрения экшена. это, скорее, торговцы-переносчики. большая грузоподъемность, неповоротливы. могут переносить кислород, который в игре играет роль «топлива» и «лечилок» (условно, конечно), а также в связке с тромбоцитами могут останавливать кровотечение. класс поддержки.
— базофилы. это, грубо говоря, маги-стихийщики. вырабатывают вещества, заставляющие окружающее пространство подчиняться себе — вызывают повышение температуры и прочие прелести воспалительной реакции.
— эозинофилы. тяжелые войны ближнего боя (танки) — атакуют многоклеточных врагов.
— нейтрофилы. своеобразные клетки-камикадзе, пожирают большое количество врагов и сами погибают на поле боя, создавая заслон своими телами.
— лимфоциты: Т-лимфоциты — универсальные войны-рукопашники, владеют различными видами оружия, мобильны. В-лимфоциты — это, скорее, ассассины, освоившие производство ядов (антител) самого разного действия.
— моноциты. варвары, жестоко расправляются с врагами, хорошо ориентируются на местности (могут выходить за пределы «коридоров» кровеносного русла).
— тромбоциты. наряду с эритроцитами являются классом поддержки. дебафают врагов, бафают союзников. совместно с эритроцитами останавливают кровотечение.
2. Уровни и дизайн. Опять же, можно обратиться к анатомии — путешествие по организму может быть очень увлекательным, а дизайн делается в соответствии со строением тканей органов (легкие, мышцы, печень, почки, нервная ткань, костная ткань и т.д.). Каждая ткань имеет свои особенности — «мышечные» уровни пульсируют, сокращаются; «легочные» уровни будут ажурными, подобными лабиринту; нервная ткань имеет «электрические» ловушки и т.д.
3. Противники-монстры. Тут уж природный бестиарий просто огромен — от относительно безобидных вирусов типа герпеса до хитрых раковых клеток, которые могут маскироваться под «свои» клетки и использовать то же оружие, что и наши «герои». Арсенал огромен — мутации, токсины, прямое разрушение-пожирание клеток, экспансия и захват контрольных точек, паразитирование внутри клеток организма и т.д.
4. Сюжет и фичи. Ну, сюжет стар и прост: есть организм, есть болезнь и есть наши «герои» — задача героев спасти организм от болезни до того, как болезнь уничтожит его :-) Как всегда, мы спасаем мир! Основными фишками игры будут: относительная анатомическая достоверность уровней и умений основных классов героев и их противников; изменение условий ведения боя в зависимости от особенностей органа, в котором происходит битва; совместное действие клеток иммунитета для максимально быстрого и эффективного достижения цели; возможность клеток иммунитета и их противников изменять условия окружения «под себя» с целью усиления своих позиций и ослабления противника; включение в игру принципов действия реальных иммунных механизмов, например, механизмов ограничения и изоляции «особо крупных» противников, которых невозможно уничтожить физически; развитие «персонажа» с основной клетки может идти в любом направлении, причем по мере прокачки будет расти специализация — т.е. если начальная клетка может делать все, что угодно, но эффективность этого мала, то по мере развития клетка теряет какие-то способности, но зато приобретает большое мастерство в своей области (это, конечно, не совсем верно с точки зрения физиологии, но это же все-таки игра); при должном подходе игра будет иметь не только развлекательный, но и познавательный эффект.

Вот, в общих чертах, концепция возможной игры. Наверняка я что-то упустил с точки зрения грамотного построения проекта… не судите строго :-)

Вопросы, советы, жалобы и предложения для hideme.su, помогающего забороть спам и управлять URL

Приветствую уважаемое хабрасообщество и хочу представить на ваш строгий суд занятный ресурс.
Ресурс расположен по адресу hideme.su, а занятность его заключается в том, что он объединяет в себе два сервиса.
Первый сервис, мы назвали его «Укротитель URL», позволяет извратить любой урл приятным для вас способом (например, получить из урла вида: «yandex.ru/yandsearch?text=%F5%E0%E1%F0%E0%F5%E0%E1%F0&rpt=rad» какой-нибудь такой: «my-habr.hideme.su» в отличии от привычных hideme.su/krakazabra). Для размещения получившегося URL предоставляется html-код, который счастливый пользователь размещает в своем блоге, сайте, форуме и т.д.
Изюминка заключается в том, что после регистрации на hideme.su становится возможным управлять содержимым ссылки, не меняя ее внешней формы, т.е. если раньше она вела на хабр (как в приведенном выше примере), то будет вести на ваш блог, например.
Таким образом становится возможным управление большим количеством ссылок из единой админки.

Второй по списку (но не по значению) ресурс олицетворяет собой разновидность защиты от спамеров.
В основу была положена идея сокрытия e-mail от спамерских ботов. Наиболее очевидным решением является указание своего e-mail на картинке, но такие сервисы уже есть, поэтому мы добавили функционал.
В нашем варианте полученная картинка с e-mail является кликабельной. После клика по такой картинке желающий написать вам письмо попадает на форму отправки письма онлайн. Чтобы не спамили и таким способом, мы защитились капчей.

Писался этот текст на Хабре, конечно же, не просто так. Наш ресурс только-только начинает развиваться, поэтому нам крайне важна обратная связь. Любые возражения и пожелания равноуважаемы и очень приветствуются.

п.с. также сейчас активно тестируется плагин для wordpress, с целью максимально повысить комфорт пользования сервисами.

Из-за чего не стартует Exchange 2003

Имелся довольно забавный опыт восстановления работы Front-end Exchange 2003

Дано: Центральный московский офис с корневыми контролерами домена(2 штука) и двумя Exchange-ми 2003(вся почта компании). Плюс дивизиональные КД(выделенные VPN каналы) со своим поддоменами в основном домене.

Начало проблем: нежданно не гаданно перестаёт работать Front-End Exchange(приём-отправка почты+антиспам(GFI)+OWA).
Ребут сервака ничего не даёт. Exchange не хочет стартовать никак. Точнее не стартует одна из основных служб: MTA. В логах пишет, что не может считать глобал каталог на основном КД, хотя в его логах всё чисто.
Так же нам сообщают, что начались проблемы в дивизионе: они с очень большим трудом достукиваются до файловых ресурсов, RDP вообще не работает, только по RAdmin-у можно добраться.

Развитие ситуации: Ладно. Дивизионом не занимаемся, пока так поживут. Первоочередная задача нормализовать работу почты в компании.

Начинаются ночные бдения. Подъём из годового Acronis-овского бэкапа ничего не даёт.
Начинаем новую инсталляцию с другим именем сервака. Время уже за полночь.
Опа! После установки на сервак Exchange-а он запускается! Ура-ура. Накатываем антиспам, ребут, опять те же я*ца, только в профиль.
Не стартует MTA, хоть ты тресни(головой об стену бьётся человек в печали).

Финал: ОК.
Ещё одна инсталляция. Вообще никакого эффекта. Exchange, точнее MTA, так ни разу и не запустился.
Много думаем.
И тут меня вштыривает глянуть логи на КД в дивизионе.
Выглядит это так: смотрим RAdminom на машину в дивизионе, с неё RDP на КД и там смотрим логи.
Красноты полно, а потом оппа! В то время ночи, когда у нас Exchange поднялся, всё стало беленьким.
Тааак.
Развиваем тему.
Оказывается проблемы в дивизионе начались из-за того, что до них не ходят пакеты объёмом больше чем 660 байт.
В результате для Exchange КД дивизиона вроде как доступен, но считать и обновить у него Global Catalog не возможно. Из-за этого MTA и не стартует
Выключаем КД дивизиона, Exchange запускается влёт.
Начинаем гнуть провайдера VPN. Выясняется, что они поменяли оборудование в дивизионе на то, которое не поддерживает фрагментацию. Как результат перестали ходить большие пакеты данных.

В общем вот такой опыт получили.

PHP: array 2 XML — это удобно (мой опыт)

Мне часто приходится писать от простых до серьезных сервисов на PHP, взаимодействующих с XML-интерфейсами. Опробовав несколько родных/сторонних механизмов создания XML на лету, я не удовлетворился никакой библиотекой, и посчитал нужным опробовать концепцию «Массив->XML», которой вполне должно хватить для большинства задач. Впоследствии оказалось, что действительно хватает с головой, при этом остается гибкость массивов: создавай сразу, создавай в цикле, создавай в if-ах, предварительно проверяй что создал, переназначай перед преобразованием в XML, используй множество родных PHP-функций для массивов и т.д. Ясно, что многие библиотеки предлагают те же возможности, но сколькими вызовами? Из опыта скажу, выходит, что с массивами проще — т.к. ты формируешь структуру и имеешь над ней полный контроль без всяких getAttribute, createXML, addChild и т.д.

Итак, для мелких и средних задач — это более наглядно и более практично. Поэтому хочу поделиться своим опытом с Вами. Ниже рассмотрена моя простенькая библиотека, реализующая идею, и наглядные примеры использования.

Hello World


Вот простенький пример массива PHP и пару инструкций; затем XML, в который преобразовывается наш массив.

PHP

$xmlData = array(
	'xml' => array(
		'~attr' => array(
			'xsi:schemaLocation' => 'http://example.com/schema.xsd',
			'xmlns' => 'http://example.com/envelope'
		),
		'EnvelopeVersion' => '1.0',
		'FormHeader' => array(
			'FormIdentifier' => 'AA29',
			'SubmissionNumber' => 601),
		'Form' => array(
			'CompanyName' => 'TotoSoft',
			'~array:Applicant' => array('Anton Homenko', 'Ivan Rednikov'),
			'IngoreMe' => '~ignore'
		)
	)
);

$xml = new DOMDocument("1.0", "UTF-8");
$xml->formatOutput = true;
xmlAddElementsFromArr($xml, $xml, $xmlData);
$xmlStr = $xml->saveXML();

echo "<pre>";
print_r($xmlStr);
echo "
";


XML

<xml xsi:schemaLocation="http://example.com/schema.xsd" xmlns="http://example.com/envelope"> 
  <EnvelopeVersion>1.0</EnvelopeVersion> 
  <FormHeader> 
    <FormIdentifier>AA29</FormIdentifier> 
    <SubmissionNumber>601</SubmissionNumber> 
  </FormHeader> 
  <Form> 
    <CompanyName>TotoSoft</CompanyName> 
    <Applicant>Anton Homenko</Applicant> 
    <Applicant>Ivan Rednikov</Applicant> 
  </Form> 
</xml>


Принятые соглашения:
  • Для игнорирования элемента массива используем значение '~ignore'
  • Для назначения атрибутов, добавляем в массив, представляющий XML-элемент, пару '~attr' => array(attrName => attrValue, ...)
  • Для создания нескольких одноименных XML-элементов на одном уровне используем ключ '~array: НазваниеXMLЭлемента'
  • Для создания пустого XML элемента (но НЕ его игнорирования) используем значение false


Библиотека


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

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

Первая концепция состоит в том, чтобы использовать значение '~ignore' для тех элементов массива, которые наш xml-билдер должен игнорировать. Это удобно в том плане, что, во-первых, проще назначить '~ignore', чем вовсе не создавать элемент массива, во-вторых, отвечает концепции «NULL лучше и информативнее, чем неопределенность/несуществование переменной». Для этой концепции имеются функции:

function xmlBoolean($value)
{
	return (isset($value) && $value) ? 'true' : 'false';
}

function valueByKeyOrIgnore($ar, $key)
{
	return (isset($ar[$key]) && $ar[$key] != '')? $ar[$key] : '~ignore';
}

function valueOrIgnore($condition, $value)
{
	return ($condition)? $value : '~ignore';
}

function issetValueOrIgnore(&$value)
{
	return (isset($value)) ? $value : '~ignore';
}

function arrayWithItemsOrIgnore($ar)
{
	return (is_array($ar) && count($ar) > 0)? $ar : '~ignore';
}


Остальные концепции сводятся к соглашениям, описанным в списке выше. Остаются функции формирования XML:

function xmlCreateAttributes($xmlDoc, $xmlElement, $attributes)
{
	foreach($attributes as $attrName => $attrValue)
	{
		$xsi = $xmlDoc->createAttribute($attrName);
		$xmlElement->appendChild($xsi);
		$xsi->appendChild($xmlDoc->CreateTextNode($attrValue));
	}
}

function xmlCreateElement($xmlDoc, $xmlParent, $elemName, $elemText = false,
	$attributes = array())
{
	// Create element
	$elem = $xmlDoc->createElement($elemName);
	$xmlParent->appendChild($elem);
	
	// Set text contents if any
	if ($elemText !== false)
		$elem->appendChild($xmlDoc->createTextNode($elemText));
	
	// Set attributes
	if (count($attributes) > 0)
		xmlCreateAttributes($xmlDoc, $elem, $attributes);
	return $elem;
}

function xmlAddElementsFromArr($xmlDoc, $xmlParent, $elems)
{
	foreach($elems as $name => $value)
		// Must be ignored
		if($value == '~ignore')
			continue;
	
		// Attributes specified
		elseif ($name == '~attr' && is_array($value))
			xmlCreateAttributes($xmlDoc, $xmlParent, $value);
			
		// Array of elements with the same name
		elseif(strpos($name, '~array:') !== false && is_array($value))
		{
			$elName = str_replace('~array:', '', $name);
			foreach($value as $val)
				xmlAddElementsFromArr($xmlDoc, $xmlParent, array($elName => $val));	
		}
			
		// Simple child element with text value inside
		elseif (is_string($value) || is_numeric($value))
			xmlCreateElement($xmlDoc, $xmlParent, $name, $value);
		
		// Simle child element with no value inside
		elseif($value === false)
			xmlCreateElement($xmlDoc, $xmlParent, $name);
			
		// Call recursively for child items
		elseif(is_array($value))
		{
			$elem = xmlCreateElement($xmlDoc, $xmlParent, $name);
			xmlAddElementsFromArr($xmlDoc, $elem, $value);
		}
}


Главная функция function xmlAddElementsFromArr($xmlDoc, $xmlParent, $elems)
  • $xmlDoc — объект XML документа, который мы создаем
  • $xmlParent — элемент, который будет верхним для нашей функции; чаще всего использую то же значение, что и для $xmlDoc
  • $elems — массив элементов, который должен быть преобразован в XML


Все описанные функции в одном PHP файле — это и есть вся библиотека, решающая поставленную задачу.
Очень интересно узнать практичность/полезность данной концепции.

Синхронизация iPhone с iTunes на разных компьютерах

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

Итак нужно сделать резервную копию файлов:
на мак — iTunes Music Library.xml и iTunes Music Library
под виндой — iTunes Music Library.itl или iTunes Library.itl

Часть 1
На компьютере с которым сейчас синхронизирован айфон открываем в текстовом редакторе файл iTunes Music Library.xml и находим там следующий текст: «Library Persistent ID» (обычно он находится в верхней части файла). Нас интересует длинное выражение из букв и цифр (ID, он же идентификатор, библиотеки iTunes), которое находится между тегами , к примеру, 8B6C633F7DACB74B. У вас оно будет отличаться. Записываем это значение куда-нибудь и закрываем этот файл ничего не меняя и не сохраняя.

Часть 2
Проделываем теже самые операции на втором компьютере с которым хотим синхронизировать. Аналогично необходимо открыть тот же файл (iTunes Music Library.xml) в текстовом редакторе и найти текст «Library Persistent ID». После этого, записываем длинное и нечитаемое значение между тэгами .

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

Часть 3
Это еще не все — наш ID библиотеки iTunes используется еще и в другом файле. Откройте файл iTunes Library с помощью любого Hex-редактора на втором компьютере. В меню Hex-редактора выберите пункт наподобие «Найти и заменить». Обязательно выставте 16-ричную «Hex» кодировку (а не «ASCII»)

В поле «Найти» введите значение которое вы записали в часте два. А в поле «Заменить на» напишите значение из шага 1. Жмем на кнопку «Заменить всё», дожидаемся окончания операции, сохраняем и закройте редактируемый файл, а в месте с ним и Hex-редактор.

Если вы все сделали в точности, то теперь у вас не должно возникнуть проблем с синхронизацией iPhone/iPod с iTunes на двух разных компьютерах (кстати, этот метод работает и для большего числа компьютеров) и сообщение о том, что данные будут стёрты, не будет появляться.

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

Задумайтесь, как часто вы тянетесь к shift чтобы нажать запятую? А как часто вы глядите на клавиатуру/в трей чтобы увидеть индикатор раскладки и узнать стоит её переключать или нет? А теперь задумайтесь сколько сил и времени вы тратите на это в течения дня, месяца, года? Лично мне жалко тратить свою жизнь на подобные мелочи, которые к тому же довольно просто исключить из своей жизни. Об этом и будет эта статья, материал для которой был собран из в разное время написанных записей моего личного блога.
Читать дальше →

Снова «улучшаем» готовые программы.

Данная статья будет интересна тем, кому понравилась вот эта, т.к. является дальнейшим раскрытием темы, но не концентрируется на улучшении конкретного приложения с конеркетными примерами, а «обозревает» методы, благодоря которым возможны различные модификации.
Тем не менее, я старался щедро разбавлять теорию примерами. Примеры, кстати, под Windows NT и старше.
Читать дальше →

Превращаем Ubuntu в Mac OSX Leopard

Недавно появилось желание найти приятную тему для Ubuntu. После долгих поисков в инете я так и не нашел темы которая бы мне понравилась, поэтому решил превратить свою ubuntu 8.10 в Mac OSX Leopard.

Сразу предупреждаю, что у кого-то нормально работать и не будет, но у меня прошло все практически без проблем. Оригинал статьи находится здесь
Итак начнем. Качаем Mac4Lin themes и разархивируем в вашу HOME директорию. У вас должна появиться Mac4Lin_v1.0_RC1 директория, в которой хранятся все конфигурационные файлы.
Читать дальше →

snmp и Linux — простым языком

мониторинг? не так уж и страшно!
изучаем snmp

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

Cтолкнулся я как то по работе с необходимостью развертывания системы мониторинга на приличное количество разношерстных серверов — windows, debian, gentoo. Для мониторинга был закуплен и установлен некий продукт (PRTG network expert, см www.paessler.com — что за зверь могу написать в следующий раз) и стояла задача подключения к нему всего оборудования.
С windows он справился в пару кликов, как и обещанно, опознал и сетевое оборудование. Проблема встала с линукс. Если для windows предлагались разные протоколы и стандарные пакеты настроек, для линукса был оставлен один единственный snmp. Надо заметить в документации к продукту не было сказано не слова о том как его настраивать.
На тот момент я слабо представлял что это за зверь и с чем его едят. Порывшись в гугле так и не нашел достаточно простого мануала «для чайника» чтобы понять что да как. Все информация уводила либо в густую техническую информацию, либо предлагала решения «в пакете» так и не рассказывая что делать. Первое впечатление что это чтото сложное и непонятное. Видать поэтому эта технология так мало используется в наши дни.

Так что же это? Когда разобрался, все оказалось очень простым и мощным инструментом.

Смотрим википедию:
SNMP (англ. Simple Network Management Protocol — простой протокол управления сетью) — это протокол управления сетями связи на основе архитектуры TCP/IP.

На основе концепции TMN в 1980—1990 гг. различными органами стандартизации был выработан ряд протоколов управления сетями передачи данных с различным спектром реализации функций TMN. К одному из типов таких протоколов управления относится SNMP.

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

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

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

Теперь хватит теории, перейдем к практике.

snmp технология клиент-серверная. Значит понадобится как минимум один клиент и сервер. сперва разберемся с сервером:
В случае с линукс он как правило идет в стандартной сборке. Разных вариантов установки — много, общее — надо посмотреть есть ли в системе файл конфигурации /etc/snmp/*.conf и скрипт автозапуска /etc/initd/snmpd
Если нет — устанавливаем. В случае генту emerge net-snmp установит необходимо-достаточный набор утилит. Для других дистрибутивов найти несложно.

В этом же пакете есть программы для клиентских запросов. Для визуальности и любителей графического интерфейса можно поставить mbrowse или mibbrowser (под windows)

После установки смотрим файл конфигурации. /etc/snmp/snmpd.conf Как правило дается пример конфигурации. В первую очередь интересуют следующие строчки:

Первое — ограничения доступа. Задает из каких сетей и адресов можно обращаться к серверу. Весьма удобно для ограничения доступа.
# sec.name source community
com2sec local 127.0.0.1/32 public
com2sec local 192.168.0.*/32 public

Этот пункт создает группы по указанному выше имени и версии протокола. можно разграничить кто сможет получать какую информацию
# sec.model sec.name
group MyROGroup v1 local
group MyROGroup v2c local
group MyROGroup usm local

Очередное разграничение прав, конкретнее какую часть mib дерева можно смотреть.
# incl/excl subtree [mask]
view all included .1

Последняя строка доступа. задает права доступа для групп.
# context model level prefix read write notify (unused)
access MyROGroup "" any noauth exact all none none

самый на мой взгляд интересный пункт, аддоны. Кроме стандартного набора параметров, сервер позволяет загружать пользовательские скрипты.
Здесь как пример — вызывается шелл скрипт с параметром, возвращающий значение. можно было бы сразу написать команду, но для приера можно и поизвращаться.
#Add-on's
exec root /bin/sh /usr/monitoring/df.sh hda2
exec home /bin/sh /usr/monitoring/df.sh home

Переменные для имени сервера и адреса сисадмина. для красоты. остальные параметры можно узнать из мануала.
syslocation — syscontact — сохранить, перезапустить демона ./etc/init.d/snmpd restart

Теперь к клиенту:
snmpgetnext -c public -v 2c -O n localhost 1
выведет первое значение из доступных в формате оид=тип: значение. Вместо единички можно подставить любой оид, вместо localhost — ип компьютера.
snmpgetnext -c public -v 2c -O v localhost 1
выведет только значение
snmpwalk -c public -v 2c -O n localhost .1
выведет все дерево ОИДов с значениями.
snmpwalk -c public -v 2c -O n localhost .1.3.6.1.4.1.2021.8.1
выведет таблицу выше описанных аддонов.

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

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

Флэшка из клавиши Shift.

Отличный подарок, сделанный своими руками. Многие знакомые сказали, что «Я тоже такой хочу».
USB Flash девайс в новой для него оболочке. для изготовления понадобится сам брелок и ненужная клавиатура.

Ингредиенты:

* USB Flash Device (в нашем случае Kingston DataTravel 1GB);
* Подходящая по размеру клавиша от старой клавиатуры(здесь это Shift);
* Руки и немного свободного времени.

Читать дальше →

Half-open соединения в windows и P2P

Я более чем уверен, что многие хабраюзеры знают, что такое half-open и я не расскажу для них ничего нового.
НО, наверняка найдутся пользователи, для кого моя статья станет полезной.
Опишу проблему с которой я столкнулся и её решение.
Проблема заключается в следующем — в windows xp sp2 при включенном торрент клиенте (в моем случае uTorrent) — дико тормозит интернет, несмотря на то, что скорость скачки и раздачи не всегда максимальная.

продолжение - под катом

Пишем аналог $(document).ready( f ) из jQuery

В бибдиотеке jQuery есть замечательная функция которая проверяет загрузку структуры DOM.

$(document).ready(function(){
// Your code here
});


или
$(function(){
// Your code here
});


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

Последовательность операций в браузере выглядит так:

1. Синтаксический анализ разметки.
2. Загрузка стилей и сценариев.
3. Выполнение кода сценариев по мере их анализа в документе.
4. Полное формирование структуры документа.
5. Загрузка изображений
6. Завершение

Поэтому JavaScript который находиться в заголовке начинает выполняться до фактического формирования DOM. Это является существенной проблемой, поскольку скрипт не будет иметь доступ к структуре DOM. Существует несколько решений этой проблемы.

Самой популярной является ожидание загрузки всей страницы перед выполнением операций над DOM, на деле это вызов функции по событию load объекта window. Код:

addEvent(window, "load", function(){
//Манипуляции с DOM
});


Однако этот метод самый медленный. Если у вас на странице множество изображений и разнообразной графики и т.п. то придется ждать загрузки всего контента, перед выполнение JavaScript кода.

Второй способ это Ожидание загрузки основной части DOM. На самом деле это вставка кода перед закрывающим тегом , то что практически каждый второй рекомендует делать).






И последний самый интересный нам метод это — Определение факта загрузки

Эта методика работает за счет контроля готовности необходимых вам DOM -возможностей c максимальной скоростью и без блокирования браузера. Есть несколько вещей который необходмо проконтролировать, чтобы понять, что с HTML-документом можно работать:

* document. Выявить существование DOM-документа.
* document.getElementsByTagName и document.getElementById. Нужно проверить есть ли в документе эти часто используемые функции, они появляются при готовности к применению.
* document.body. Удостовериться, полностью ли загружен элемент body.

Использую эти проверки, можно достаточно точно узнать, когда DOM-структура будет готова к использованию.

Вот код функции которая проверяет готовность DOM-структуры:

function dready( f ) {
//Если DOM загружен то выполняем функцию
if( dready.done ) return f();
// Если мы дополнили функцию
if( dready.timer ) {
// внести ее в список исполняемых
dready.ready.push( f );
} else {
// Подключение события завершения загрузка страницы
// на тот случай, если загрузка завершиться первой
addEvent( window, "load", isReady);
// Инициализация массива исполняемых функций
dready.ready = [ f ];
//Проверка DOM на готовность как можно ыстрее
dready.timer = setInterval( isReady, 13);
}
}
// Проверка DOM на готовность к перемещению по ее структуре
function isReady() {
// Если мы определили готовность страницы -
// проигнорировать дальнейшее выполнение
if ( dready.done ) return false;
// Проверка доступности некоторых функций и элементов
if ( document && document.getElementsByTag && document.getElementById
&& document.body ) {
// Если они готовы, можно прекратить проверку
clearInterval( dready.timer );
dready.timer = null;
//Выполнение всех ожидавших функций
for ( var i = 0; i < dready.ready.length; i++ )
dready.ready[i]();
// Сохранение того, что было сделано
dready.ready = null;
dready.done = true;
}
}

// применять очень просто)
dready(function() {
alert("DOM загружен");
});


Ничего не напоминает? )