Все потоки
Поиск
Написать публикацию
Обновить

Постучат.ру, проект созданный для общения, выходит в открытый бета тест.

http://www.postuchat.ru/

Разрешите мне представить вашему вниманию свежайший отечественный стартап.

Постучат.ру — проект, созданный для общения и поиска новых друзей.

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

Денежный стартап: быть или не быть?

Здравствуйте, хабравчане!

Это открытое письмо. Месяц назад мне пришла в голову очень оригинальная идея — «переплюнуть СОРОС», а точнее создать безопасную систему прогнозирования рынка Форекс. Две недели ушло на то, чтобы перепробовать все основные варианты реализации моей идеи. Остановился на последнем — кажется начало получаться. И действительно — первоначальный тест на прошлом, а потом и на будущем показал, что прогнозы работают как часы. Сначала я начал с валютных пар EUR/USD, сейчас уже добавил и настроил USD/CAD, USD/CHF. В дальнейшем будут и другие валюты.

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

Что это значит?


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

Бесплатно?


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

Планы


Основные валюты Форекс, затем возможно акции. Также на сайте в дальнейшем появятся действительно полезные книги (а не та ужасная мура, которую предлагают новичкам-трейдерам), форум…

Бесплатный сыр в мышеловке...


Эту фразу мне говорили уже очень много раз. Но в данном случае она не подходит.

Не верите? Легко проверить!


К сожалению пока что не реализована вторая ступень проекта — почасовой прогноз. Сейчас доступен только дневной — MIN и MAX в течение дня, начиная с 3 часов по Москве (или 0 по Гринвичу). На главной странице написано всё, что нужно для понимания работы с прогнозами. Не поленитесь прочитать, если вас заинтересовало.

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

Кстати, ссылка на сайт: http://forex.ilost.ru

C# && Jabber. Компонеты. Использование

Захотелось мне написать jabber-бота, но велосипед придумывать было немного лениво, да и я не был уверен в том, что велосипед будет не с квадратными колёсами.
Гугл подсказал: jabber-net

Коротко: набор контролов для работы с jabber'ом.
Лицензия: GNU Lesser General Public License.
немного подробностей

1С vs СисАдмины

Ситуация. Работаю в компании сисадмином, около 40-ка windows машин, 2003 сервер, проксик… все как у всех небольших компаний…
Компанией приобретено несколько продуктов 1С (на что имеются рег. анкеты, товарные накладные и электронные ключи): 1С Бухгалтерия сетевая, 1С Торговля и склад сетевая, 1С Зарплата и кадры 3 пользователя. Электронные ключи стояли на сервере (Win 2003).

Но вот в один прекрасный день приходит проверка УБЕП на наличие конрафактного ПО (хотя между прочем ровно за год до этого была такая же проверка «Отделом „К“). На 4-х компьютерах запускается 1С без ключа. Все продукты которые запускаются без ключа указаны выше, т.е. ничего другого кроме купленного нет. Проверали очень просто — отключали от компов сетевой кабель и запускали 1С.

Мне во первых непонятно вот что: это что бизнес такой? Ты купи, а мы еще проверим правильно ли ты установил и правильно ли ты работаешь с нашей программой, которую купил?

Второе: Ущерб „1С“ насчитал 306 тысяч рублей. Купленные продукты перечисленные выше составляют общую стоимость едва ли больше 100 тыс. рублей. Но 1С считает по другому алгоритму. Их не волнует что продукт один (сетевой), они считают количество компьютеров отдельно, т.е. в данном случае получается что установлено контрафакта четыре экземпляра 1С Бухгалтерия сетевая, четыре экземпляра 1С Торговля и склад сетевая и т.д.

Третье: И самое главное что возбуждено уголовное дело, за которым последовал обыск у меня дома (ну это уже другая история), и мне реально грозит наказание по ст. 146 ч.3 УК РФ — наказываются лишением свободы на срок до шести лет (http://www.ukru.ru/code/07/146/index.htm).

Просьба внимательно прочитать, прошу у Вас любую информацию которая могла бы мне помочь!

ТОЧКИ большого города!

Сервис строит ваш маршрут проезда в двух столицах (Москва и Санкт-Петербург) c учетом пробок.
Нужно сделать запрос, указав адреса (откуда-куда). Маршрут придет в виде SMS на мобильный телефон.

Сервисом можно пользоваться на любом телефоне. Без установки программ в телефон или особых настроек. Без абонентской платы.
Можно пользоваться раз в год или каждый день.

Стоимость запроса маршрута на этапе тестирования — 5 рублей. Зарегистрированные пользователи могут создавать бесплатные расписания для своих маршрутов. Например получить утром маршрут, как лучше доехать до работы.

Информация о пробках от СитиГИД (City Guide) — поставщика информации о пробках для федерального канала Россия, портала Mail.ru, многих FM-радиостанций.

Это просто SMS. Просто, чтобы быстрее доехать. Вот и все. :)

Смерть e-mail?

Позволю себе не согласиться с уважаемым Ike — пациент email скорее жив, чем мёртв :)

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

Посудите сами: у многих есть аккаунты на GMail и многие владельцы этих аккаунтов используют GTalk. Лично для меня это фантастически удобно: история всегда «под рукой» (кавычки — условность наличия сети); иногда я путаюсь где у меня сообщение из чата (пришедшее в момент моего оффлайна), а где реальная почта. Это ли не чудо?

В таких условиях прекрасно сохраняется универсальность: я могу использовать аккаунт и как почтовый ящик и как IM ID.
А возможность запускать несколько im-клиентов на один аккаунт. Я знаю людей, которые используют эту фичу ежеминутно.

Вобщем, я за почту и её маленькую эволюцию

Таскаем картинки

Итак, задача: написать скрипт, с помощью которого можно потаскать картинку по экрану.

Начнем с, так сказать, разбивки игрового поля:

<html>

<head>

<title> Таскаем картинки </title>

</head>

<body>

<div style="width: 100%; height: 100%;">

<div id=1 style="position:absolute; top: 100px; left: 100px; z-index: 0; width:200px; height:149px; background: url('pictures/image.jpg');" onMouseDown="startDrag(event,1)" onMouseUp="stopDrag()"> </div>

<div id=2 style="position:absolute; top: 100px; left :400px; z-index: 0; width:200px; height:149px; background: url('pictures/image2.jpg');" onMouseDown="startDrag(event,2)" onMouseUp="stopDrag()"> </div>

</div>

</body>

</html>


Итак, как видите, все предельно просто. На странице один слой, растянутый на весь экран, для того, чтобы можно было определять координаты курсора, где бы он не находился. Иначе это сделать не получится.В нем два слоя, которые, по сути, и являются картинками, которые мы будем таскать. Разберем один из них получше:
  • position: absolute — слой может свободно перемещатся
  • top: 100px; left: 100px — начальные координаты слоя
  • z-index: 0 — слой всегда ниже следующего
  • width:200px; height:149px — размеры слоя (подогнаны к картинке)
  • background: url('pictures/image.jpg') — собственно, сама картинка, которую мы будем таскать. мы ставим ее фоном слоя из-за особенностей браузера ИЕ
  • onMouseDown=«startDrag(event,1)» onMouseUp=«stopDrag()» — события, которые мы опишем в будущем скрипте


Ну, надеюсь, с этим проблем не должно быть. Элементарный HTML с примесью CSS.

Идем дальше. Перейдем непосредственно к скрипту.

Первая функция — функция, которая будет реагировать на опускание кнопки мыши на слое.

function startDrag(e, layerName)
{
lay=document.getElementById(layerName); //ищем слой, на котором произошло событие

//следующая часть отвечает за то, чтобы слой при щелчке мышью перемещался наверх. для этого ему ставится максимальный z-index, а остальным z-index раздается в порядке убывания
var layers = document.getElementsByTagName(«div»);
var layerLength = (layers.length — 1);
var layerZindex = lay.style.zIndex;

for(var i=1; i < (layerLength + 1); i++) {

if (parseInt(layers[i].style.zIndex) == 0) { continue; }
if (parseInt(layers[i].style.zIndex) >= parseInt(layerZindex)) { layers [i].style.zIndex = parseInt(layers[i].style.zIndex) — 1; }

}

lay.style.zIndex = layerLength — 1;

//это танцы с бубном для нормального получения координат щелчка мышью в браузере файрфокс
if (!e) e = window.event;

var x=e.clientX;

var y=e.clientY;

//действия, помогающие найти отношение координат слоя к координатам курсора
differenceLeft = parseInt(x) — parseInt(lay.style.left);

differenceTop = parseInt(y) — parseInt(lay.style.top);

//«рычаг» вкл
dragIsStarted = true;

}


Ну вот, примерно так. Дальше — функция, которая будет ловить движение мыши, и делать необходимые действия:

function updateCoords(e)
{
//если «рычаг» вкл, то слой должен двигаться за курсором
if (dragIsStarted)

{

//опять танцы с бубном для нормального получения координат щелчка мышью в браузере файрфокс

if (!e) e = window.event;

var x=e.clientX;
var y=e.clientY;

//действия, которые изменяют координаты слоя, зная их отношение к координатам курсора
lay.style.top = parseInt(y) — parseInt(differenceTop);
lay.style.left = parseInt(x) — parseInt(differenceLeft);

}

}


Ну и наконец последняя функция — функция, реагирующая на отпускание кнопки мыши, и останавливающяя перемещение слоя.Наверное, самая сложная функция:

function stopDrag()
{
//«рычаг» выкл.
dragIsStarted = false;

}


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

Эффективен ли поиск пользователя по Логину \ паролю?

Как Вы делаете запросы на поиск пользователя в базе данных? Насколько оптимально Вы используете ресурсы сервера? Пока база данных небольшая, эти вопросы будут для Вас совсем неактуальны. Но по мере роста файла БД и числа пользователей, которые одновременно совершают подобные запросы они, запросы, могут стать краеугольным камнем проектируемой системы.
Существуют несколько стереотипных приемов получить идентификатор пользователя:
1. «Натуральный»: Запросить ID по значению логина и пароля в таблице.
2. «Индексированный»: Предварительно осуществить индексацию полей логина и пароля.
3. «Суррогатный»: Сформировать суррогатный индекс по обоим полям.
4. «Хэшированный»: Преобразовать значение логина или логина и пароля в хэш, отобрать записи, соответствующие хешу, а затем из них выбрать записи по соответствующему логину и паролю. Разумеется, для данного метода необходимо сформировать поле со значением хэша, и проиндексировать его.
На больших Базах от Натурального лучше совсем отказаться, так как производительность проседает капитально. Его основное достоинство – простота запроса. Однако, преимущество весьма спорное, и зависит от самой СУБД и величины таблицы.
Индексированный и Суррогатный обеспечивают идеальные условия выполнения запроса, однако величина индекса составляет размеру самих полей логин и пароль. Кроме того, в некоторых СУБД индексироваться могут только поля, размер которых не превышает определенную величину, например 240 символов, в то время как действительное значение логина, в соответствии с международным стандартом на длину e-mail может существенно превышать это значение. Ну понятно, что найти уника имеющий адрес электронной почты состоящий из 300 символов сложно, однако, стандарт есть стандарт.
Хешированный метод имеет один недостаток: сложность в понимании того как им нужно пользоваться для новичка. В остальном – существенные преимущества: поскольку значение хэша является числом, то и индекс будет существенно компактней. К тому же, поисковые запросы по индексированным числовым полям осуществляются быстрее, чем по аналогичным символьным. Новички забывают так же тот факт, что разные строки могут возвращать одно и то же значение хэша, а значит использовать только хэш для идентификации пользователя недопустимо.

На форум Silverlight возникла необходимость в рассмотрении вопросов производительности, поскольку .Net генерирует разные значения хэша на разных версиях платформы. Если использовать хеш значение .Net то может оказаться выгодней использование Индексированного метода.
Чтоб разобраться с этим вопросом решено было провести эксперимент, который показывал бы производительность запросов для каждого из методов.
Справедливости ради нужно сказать, что «Суррогатный» метод использовался только для того, чтоб список эксперимента был полон.
Идея была в том, чтоб создать таблицу с большим числом записей и большим объемом данных, а затем воспользоваться каждым из методов для поиска идентификатора пользователя в начале, в середине и в конце таблицы.

Формат таблицы следующий:
PK Поле Тип
X ID INTEGER
HASH_FIELD BIGINT
LOG1 VARCHAR(100)
PASS1 VARCHAR(100)
LOG2 VARCHAR(100)
PASS2 VARCHAR(100)
LOG3 VARCHAR(100)
PASS3 VARCHAR(100)

Поля LOG1, LOG2, LOG3 были заполнены идентичными случайными символьными значениями. То же касалось полей PASS1, PASS2, PASS3. Значение символа находилось в пределах от 32 до 255 включительно. Всего было сгенерировано 1 миллион записей.
Поля LOG2 и PASS2 были проиндексированы отдельно. LOG3 и PASS3 – суррогатно.
Параметры плафтормы эксперимена:
ОС: Windows 2008, SP1 x64.
Железо: Intel Core2 Quad CPU 6600 2,40 Ghz, 8 Гиг.
СУБД: FireBird 2.1.
Размер файла базы: 1,29 ГБ (1 395 998 720 байт).
Для генерации хэш поля использовалась функция Hash (string) FireBird. Отметим, что в данной СУБД хэш имеет значение BigINT, а не INT как в .Net
Предполагалось получить три группы параметров на 10%, 50% и 90% записей таблицы (100-тысячная запись, 500-тысячная запись, 900 –тысячная запись), значения которых использовать для запросов по поиску идентификатора пользователя.
Однако, в самом начале эксперимента меня ждало некоторое разочарование… Очень хотелось построить красивые графики и показать эффективность каждого из методов. Минимальная дискретная величина доступная для статистики запроса составляет 1 миллисекунду. Но, большая часть запросов была выполнена быстрее!

Ниже привожу таблицу полученных результатов:

Метод Время запроса
10% 50% 90%
Natural 1с 888 мс 1с 888 мс 1s 887 мс
Индексированный 0 мс 0 мс 0 мс
Суррогатный 0 мс 0 мс 0 мс
Хэшированный 0 мс 0 мс 0 мс

Как видите, никаких существенных отличий в том, где расположена запись (в начале, конце, или середине таблицы не обнаружено). И в то же время, однозначно можно сделать вывод, что Натуральным методом лучше не пользоваться вовсе.
Несомненно радует то, что на таблицах с миллионом записей другие методы осуществляют поиск «мгновенно».
Коэффициент эффективности для всех индексов составил 0,000 000 999 999 997 475 242 708.
Выводы: Быстродействие запросов посредством хэш поля и строкового поля выявлены не были. Однако, Объем файла базы данных в случае использования индексирования текстовых полей возрастает в два раза. Таким образом, в случае использовании хэш поля, мы имеем значительно более компактную базу при идентичной производительности.
N.B.!: Не проводите таких экспериментах на рабочей базе, так как заливка данных занимает несколько часов!

Ловушка Javascript

Ловушка JavaScript



Ричарт Столлман

Ты можешь каждый день запускать несвободные программы на своем компьютере и не знать об этом — через свой веб браузер.

В обществе Свободного Программного Обеспечения (СПО), известна идея о том что несвободные программы плохо обходятся со своими пользователями. Некоторые из нас полностью отказываются от установки проприетарного Программного Обеспечения (ПО), а многие другие бойкотируют несвободные программы. Многие пользователи знают, что этот вопрос относится и к плагинам, которые браузеры предлагают установить, поскольку они могут быть свободными или несвободными.

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

JavaScript (официально называемый как ECMAscript, но это имя редко используется) изначально
использовался для второстепенных «выкрутасов» на веб страницах, таких как привлекательная, но малозначащая навигация или особенности внешнего вида. Его рассматривали скорее как простое расширение возможностей разметки HTML, чем настоящее ПО, и оно не представляло значительной проблемы.

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

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

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

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

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

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

Загрузка без уведомления и запуск не свободных программ это лишь одна из многих проблем существующих в «веб приложениях». Термин «веб приложение» был разработан для игнорирование фундаментальных различий между ПО предоставляемое пользователям и ПО работающем на сервере. Это может относиться к специализированной клиентской программе, запущенной в браузере; это может относиться к специальному серверному ПО; это может относиться к специальной клиентской программе, которая работает «рука об руку» с специальным серверным ПО. Клиентская и серверная сторона порождают различные этические проблемы, даже если они так тесно взаимосвязаны, что возможно формируют части формы одной программы. Эта статья адресована только проблемам клиент-серверного ПО. Мы расскажем о серверных проблемах отдельно

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

Во-первых, нам необходим практический критерий для определения нетривиальных программ на JavaScript. Поскольку «нетривиальность» является мерой степени, то встает вопрос о создании простого критерия, который дает хорошие результаты при определении, а не дает один правильный ответ.

Мы предлагаем определять JavaScript программу, как нетривиальную, если она определяет методы и либо загружает дополнительный скрипт, либо загружает себя, или если она осуществляет AJAX запрос.

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

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

Пользователям браузеров также необходим удобный инструмент для указания кода JavaScript для его использования вместо кода JavaScript на определенной странице. (Указанный код может быть либо полностью замещенным, либо модифицированной версией свободной программы на JavaScript на этой странице.) Greasemonkey почти в состоянии сделать это, но не полностью, поскольку он не гарантирует, что модифицированный код JavaScript на странице, на которой раньше он выполнялся, выполнится. Использование локального прокси сервера также неудобно, чтобы быть действующим решением. Нам необходимо конструктивное решение, которое будет надежным и удобным, также и для сайтов распространяющих изменения. GNU Project будет рекомендовать подобные сайты, которые посвящены только свободным изменениям.

Эти шаги сделают возможным чтобы страницы включали программы на JavaScript, которые являются свободными в реальном и фактическом смысле. JavaScript не будет больше серьезным препятствием для нашей свободы — не больше чем С или Java сейчас. Мы сможем отказаться и даже заменить несвободные нетривиальные программы на JavaScript, как только мы откажемся и заменим несвободные пакеты, которые предлагают для установки обычным способом. Наша компания для веб сайтов с свобдным JavaScript начинается.
Спасибо вам Мэт Ли и Джон Ресиг за вашу помощь в определении наших предложенных критериев.

Оригинал статьи

Как я писал каталог ссылок, Или почему не надо пользоваться Дрюпалом

Задача: написать страничку — каталог ссылок для сайта на шестом Дрюпале.
Исходные данные: простой список без иерархии, отображаемые поля: название сайта, favicon, ссылка, описание сайта, скриншот, количество переходов. Список должен иметь постраничный вывод и возможность сортировки по разным полям. Все. Мой личный опыт работы с Дрюпалом довольно небольшой — около 1 месяца — но и задача выглядела на редкость тривиальной, так что особых проблем я не ждал.
Читать дальше →

Kohana хелперы в Yii

На самом деле Yii является отличным инструментом для создания приложения на PHP. Первое с чем сталкивается разработчик на Yii – это нехватка общего количества помощников (хелперов) для выполнения общих задач.

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

Хелперы, как говорит их название, помогают в решении ваших задач. Каждый файл с хелперами — это простая коллекция функций в той или иной категории. Есть URL Хелперы, которые помогают создавать ссылки, есть Хелперы форм, которые помогут создать элементы форм, Текстовые хелперы выполняющие различные функции по форматированию текста, Cookie Helpers устанавливающие и читающие cookie, Файловые хелперы помогающие управлять файлами и так далее (из документации по Code Igniter)

Вот перечень хелперов Kohana:

1. Array
2. Cookie
3. Date
4. Download
5. Email
6. Expires
7. Feed
8. File
9. Form
10. Format
11. HTML
12. Inflector
13. Number
14. Request
15. Security
16. Text
17. Upload
18. URL
19. Valid

А теперь давайте разберемся как подключить данное расширение к Yii.

  • Первым делом вам необходимо скачать искодные коды расширения и поместить в папку вашего приложения (protected). Т.е. поместить ей на уровне с вашими контроллерами, моделями.
  • Теперь необходимо подключить данное расширение к нашему Yii приложению. Самый простой способ для этого – добавить в конфиге намёк на импорт:
    'import'=>array(
    'application.kohana.Kbridge',
    ),

  • После этого нам необходимо инициализировать рашсирение:
    Kbridge::init();
  • Теперь после этого вы можете использовать хелперы в ваших отображениях (представлениях): echo num::round($number,5);


Пользуйтесь!

Быстрая разработка приложений DDD или MDA.

Что такое MDA — архитектура приложения управляемая моделью.


Что такое DDD — разработка приложений на основе правил предметной области.


Как часто при рарзработке информационных систем нам (архитекторам, программистам) приходится упрощать видение предметной области, чтобы закончить проект в какие-то приемлемые сроки.
в 1998 году группа ребят из Швеции решили сделать что-то интересное. Buisines Object Layer for Delphi BOLD, инструмент который позволил бы имея модель описания предметной области разработать в приемлимые сроки приложение, насколько я помню DDD еще не пахло. Задач стояло много, но одна из задачь уйти от SQL. в качестве языка запросов использовать OCL -object colnstraints language язык ограничений. вот в 2002 году Борланд купила эту компанию, и начала разработку продукта Enterprise Core Objects. К тому времени они успели выпустить ECO 1, который по функциональности даже рядом не стоял в решением BOLD для Delphi. короче история длинная… что мы имеем сейчас:
ECO 5 самый мощный инструмент для разработки приложений по DDD и MDA, который просто НЕ ИМЕЕТ аналогов:
язык запросов OCL, эволюцию базы данных, транзакции, блоки отката, синхронизация нескольких объектных пространств (причем передаются не все объекты а только изменения), подписка на объекты, вычисляемые атрибуты(ocl code), можно создавать свои ocl-операции, испольнение SQL, машина состояний для объекта, куча дата провайдеров(причем написать новый для любой базы данных можно не более чем за один день), возможность регистрации своих и замены стандартных сервисов ECO space, версионные данные, lazy fetch, выполнение ocl по отношениюк объектам в памяти и выполнение удаленных OCL, сейчас даже LINQ и даже Silverlight. собственный редактор модели, с возможностью документирования модели и работы нескольким разработчикам одновременно(новое для ECO5), а так же многое другое.
ECO бесплатна для работы с моделями в 12 классов? проектировать можно сколько хочешь, а вот запускать только модели где не более 12 классов. я считаю этого достаточно чтобы померить.


Приступим


как сделать так чтобы работало :)?
Читать дальше →

Пишем Java сервлет для отображения картинок хранящихся в LDAP

Часто возникает необходимость отобразить в браузере картинку, которая хранится в LDAP. Так бывает, когда Вы, допустим, храните в LDAP список пользователей домена. Явным тому примером является связка Samba + LDAP. В этой статье описывается процесс создания Java сервлета, который получает через адресную строку идентификатор пользователя и в зависимости от его значения отображает его фотографию. Фотография хранится в поле jpegPhoto.

Итак, для начала объявим имя пакета и импортируем нужные классы:

package ru.itmanblog.web;

import java.io.*;
import java.util.Hashtable;

import javax.servlet.*;
import javax.servlet.http.*;

import javax.naming.NamingEnumeration;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;


Далее в созданном классе, объявляем переменные для подключение к LDAP серверу и фильтру по которому будут извлекаться пользователи:

@SuppressWarnings( "serial" )
public class LdapImgServlet extends HttpServlet
{
private final String LDAP_LISTEN_ADDR = "192.168.0.1";
private final String LDAP_LISTEN_PORT = "389";
private final String LDAP_BASE_DNAME = "ou=Users,dc=itmanblog,dc=ru";
private final String LDAP_FILTER_LPART = "(objectclass=inetorgperson)";
private final String LDAP_FILTER_RPART = "(businesscategory=general)";


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

@SuppressWarnings( "unchecked" )
public void doGet( HttpServletRequest req, HttpServletResponse res )
throws ServletException, IOException
{
res.setContentType( "image/jpeg" );
try
{
Hashtable<String, String> ldapParams = new Hashtable
<String, String>();

ldapParams.put( "java.naming.ldap.version", "3" );
ldapParams.put( "java.naming.factory.initial",
"com.sun.jndi.ldap.LdapCtxFactory" );
ldapParams.put( "java.naming.referral", "follow" );
ldapParams.put( "java.naming.provider.url", "ldap://"+
LDAP_LISTEN_ADDR +":"+ LDAP_LISTEN_PORT );

InitialLdapContext ldapLink = new InitialLdapContext(
ldapParams, null );
SearchControls ldapSearchCtrls = new SearchControls();

ldapSearchCtrls.setSearchScope( SearchControls.SUBTREE_SCOPE );

NamingEnumeration searchResults = ldapLink.search(
LDAP_BASE_DNAME, "(&(uid=" + req.getParameter( "uid" ) + ")" +
LDAP_FILTER_LPART + LDAP_FILTER_RPART + ")", ldapSearchCtrls );
Attributes ldapAttrs = ((SearchResult)searchResults.next()).
getAttributes();

byte [] bytePhotoStr = (byte[])ldapAttrs.get("jpegPhoto").get();

for( byte i : bytePhotoStr )
res.getOutputStream().write( i );

res.getOutputStream().close();
}
catch( Exception e ) {}
}
}


На этом все!

На что идут трёхбуквенные домены?

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

Я пропарсил около 100 купленных доменов (сортируя по давности около 2 недель с момента покупки), и в итоге у меня получилась примерно такая статистика:
  • около 90 — просто или пустуют, или же используются под почту.
  • 3 — не оплачены. Видимо, купили «впрок» — первый же месяц можно не платить — снимется только делегирование.
  • На остальных — или дорвеи или каталоги. Единственный читаемый был сайт с анекдотами — но и то, не тянущий на совершенство — вероятно, тоже для seo-нужд.


Соответственно, меня до сих пор интересует вопрос — что руководствовало людьми, когда они сломя голову помчались отдавать 1 бакс за домен, продление которого через буквально пару недель обошлось им в стандартную доменную цену.

Погоня за сомнительной модой — больше, вероятно, ничего.

Диспетчеров — нет?

Вы бы заказали такси по интернету, если бы видели на карте свободные машины вблизи вашего дома, а также «визитную карточку» водителя? А также его рейтинг в системе, «стену» на его персональной странице, его фотографии, рекомендации и прочее? А, заказав, могли бы наблюдать как машина едет в сторону вашего дома? А посадив в такси жену (мужа) или дочь (сына), могли бы наблюдать как оно едет к месту назначения?
Суть идеи — создать ресурс, позволяющий водителям такси обходиться без диспетчеров, получая заказы на свои мобильные устройства напрямую от заказчиков (пассажиров). А пассажиры могут «ловить» такси, не выходя на улицу. Естественно, все основано на LBS (GPS + WiFi + соты GSM). Фронт-энд на флексе, все анимировано, машинки ездят по карте с той же скоростью (с учетом масштаба), что и по улице, все живьем. Запросы можно посылать сразу нескольким выбранным водителям, а потом уже выбирать из ответивших «Да». Поиск такси может быть географически привязан к местонахождению заказчика, а может быть расширенным — по критериям (модель, год выпуска, тип кузова, тариф, детское кресло и т.д.). Проект готов процентов на 60. Интересуют инвесторы (бизнес-ангелы), комментарии, мнения специалистов и любителей. Мнения людей, занимающихся частным извозом (хотя бы эпизодически) интересуют в квадрате.

Управление проектом для чайника или что делать, если вас «повысили”

Что делать если вы всю свою сознательную жизнь были программистом, причём 99% времени работали один, и вас неожиданно повысили?
Следовательно, вам неизвестны принципы работы в команде. Вам надо начинать довольно объёмный проект.
Один вы не справитесь, значит надо набирать команду. Ваша задача на данный момент — за кратчайшие сроки узнать, как можно больше о том, как организовать работу над проектом. В этой статье я попытаюсь ответить, как это можно сделать. Попытаемся ответить на следующие вопросы:

1. С чего вообще начать делать проект? Например, что идёт первым — набор людей, а потом составление некоего плана проекта или наоборот?
2. Как правильно планировать проект? Какие инструменты применять?
3. Каким образом организовать работу? Как распределять задания? Как потом собирать воедино то, что написали программисты, и как описать программисту, что от него конкретно надо?
4. Нужны ли метадологии разработки программного обеспечения, такие как RUP, XP, Agile, AgileUP etc. Если да, то как выбрать то, что надо?
5. Как оценить, сколько и каких ресурсов надо?

Рассмотрим каждый вопрос отдельно:

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

2) Начинать планирование стоит с определения и документирования требований. Потом постепенно начинаете описывать, из чего оно должно состоять (отдельные модули проекта) и в итоге детализируете до той степени, на которой задача будет ясна хотя бы вашим подчинённым. Если эту проектную документацию будете показывать заказчику, надо позаботиться, чтобы и ему она была понятна. Постарайтесь сначала всё описать и только потом раздавать задачи для кодирования. Опыт показывает, что начало написания до завершения проектировки приводит в конечном итоге к несогласованности модулей и увеличению сроков и нервного напряжения. Чтобы понять, как правильно планировать объект и какие инструменты использовать, полезно почитать заметки Джоэла Спольски на эту тему, его вариант не самый лучший, но для начала то, что нужно, т.к. не надо разбираться с различными специализированными программами. Уже потом, если захочется, можете посмотреть различные программы и выбрать, что тебе удобнее и полезнее. Если вы хорошо владеете UML, можете использовать его при проектировании и описании, но если нет, то не стоит, в этом случае лучше спроектировать все на бумаге. Заметки Спольски можно найти на его сайте www.joelonsoftware.com (там же неподалёку есть и локализованная русская версия, но заметки в ней не все).

3)Для начала надо разбить проект на подзадачи. Выделить обособленные части (которые можно разрабатывать параллельно. А затем раздавайте задачи либо тем, кто лучше и быстрее сделает, либо тем, кого желаете подтянуть в данной области.
Сборку воедино практически всегда можно сделать полуавтоматической. Нужно сделать костяк проекта, к которому будут присоединяться модули (куски кода) и положить этот скелет на VCS/SVN/иже_с_ними. Каждый программист будет выкладывать туда свой модуль (рабочий вариант, даже если вместо функций заглушки — всё равно проект должен компилироваться), а когда надо будет собрать проект воедино, кто-то будет либо вручную, либо автоматически (например, Ant'ом) собирать его.
Чтобы не было конфликтов, надо описывать в проектной документации интерфейсы модулей. Тогда и разночтений по поводу имён функций и возвращаемых типов не будет в принципе. Кстати, модуль не обязательно должен быть представлен классом. Это может быть и просто набор функций, например.

4)Лучше не заострять внимания на этом, пока вы не знакомы с подобными методологиями. Маловероятно, что хотя бы одна из этих метод является панацеей. Отдельные элементы полезны во многих случаях, но в целом методу каждый раз применять не выйдет. Сначала стоит наладить работу команды, а отом же можно экспериментировать с различными методами.

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

Определение версии браузера

Определение версии браузера
Попросил как-то друг написат такой скриптец, который бы определял с какого браузера (обычного или мобильно) зашел человек и перенаправлял на соответствующие страницы.

Почесав свой неумудрённый знаниями мозг, написал примерно следущее:

function check_ver() {

$browsers = array('Opera', 'MSIE 7.0', 'MSIE 6.0', 'Mozilla/5.0');
$browsers_mobile = array('Windows CE', 'NetFront', 'Palm OS', 'Blazer', 'Elaine', 'Opera mini');

$user_agent = $_SERVER['HTTP_USER_AGENT'];

foreach ($browsers_mobile as $v) {
if (stristr($user_agent, $v)) return 'mobile';
}

foreach ($browsers as $v) {
if (stristr($user_agent, $v)) return 'normal';
}

}

if ('normal' == check_ver()) {
header('location: www.yandex.ru');
exit();
} elseif ('mobile' == check_ver()) {
header('location: www.rambler.ru');
exit();
}

Массивы $browsers и $browsers_mobile — это соответственно массивы браузеров обычных и моильных, которые в свою очередь можно и нужно расширять.

Скриптец конечно же простейший, но для начала думаю пойдёт.

6 Трюков в PHP

Недавно нашел англоязычную статью, в которой описывались приемы сокращения PHP-кода. Признаюсь, некоторые методы мне были известны, а о некоторых я даже не подозревал.
«${0}» и «0» — ведь это хорошее название для переменной, почему нет… Как вам ???
Но я уверен, что когда нет переменной, нет и проблемы. Поэтому приведу несколько приемов, которые делают Ваш код короче и труднее для восприятия :)

1.Используйте || (или) и && (и) вместо if

Много кода:

$status = fwrite($h, 'some text');
if(!$status) {
log('Writing failed');
}

Меньше кода:

${0} = fwrite($h, 'some text');
if(!${0}) log('Writing failed');

Еще меньше кода:

fwrite($h, 'some text') or log('Writing failed');

2.Используйте «тернарный оператор»

Много кода:

if($age < 16) {
$message = 'Welcome!';
}
else {
$message = 'You are too old!';
}

Меньше кода:

$message = 'You are too old!';
if($age < 16) {
$message = 'Welcome!';
}

Еще меньше кода:

$message = ($age < 16)? 'Welcome!': 'You are too old!';

3.Используйте «for» вместо «while»

Много кода:

$i = 0;
while($i < 100) {
$source[] = $target[$i];
$i += 2;
}

Меньше кода:

for($i = 0; $i < 100; $source[] = $target[$i+=2]);
4.В некоторых случаях PHP требует от вас создания переменной. Например, при получении массива элементов, когда массив возвращается функцией:

$ext = pathinfo('file.png')['extension'];

Результат: Parse error: syntax error, unexpected ’[' in … on line …

Чтобы справиться с этими ситуациями Вы можете создать несколько небольших функций для быстрого вызова часто используемых операций:

// Возвращает ссылку на создаваемый объект
function &r($v) {
return $v;
}

// Возвращает сдвиг массива
function &a(&$a, $i) {
return $a[$i];
}

5.Исследуйте язык, который используете

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

6.Пишите комментарии

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

Особая роль программных продуктов как объектов ИС в экономике

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