Перейти к основному содержимому

Планирование проекта в MS Project

· 4 мин. чтения

Управление проектом - задача трудная, совмещающая сразу несколько областей - финансовые возможности и потребности нескольких лиц, психологические и знания каждого работника и наконец бизнес-план и технические требования самого проекта. Всю информацию можно писать на коленках, составлять отдельно списки или всё по памяти делать, но в данной статье я знакомлюсь с Microsoft Project - отдельного продукта, не входящего в MS Office.

Сразу оговорюсь, что план, составленный в MS Project очень абстрактный и нужен больше для управляющего проектом и его общения с клиентом/заказчиком чем для программистов. В качестве конкретных задач и ошибок, как правило используется открытые и достаточно простые альтернативы -TracBugzilla

Возраст и день рождения через SELECT

· 1 мин. чтения

Иногда хочется быстро вычислить сколько дней до дня рождения пользователя. Вы все видели это в Одноклассниках и ЖЖ. Это можно делать в запросе например таким образом для mysql 5

SELECT
TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) years_old,
TIMESTAMPDIFF(DAY, NOW(), DATE_ADD(users.birth_date, INTERVAL 1+TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) YEAR)) next_birth_days
FROM users

Нашёл в своём стареньком коде, может кому полезно будет..

Коллега Юра скинул версию для старенькой mysql 4, может это даже лучше:

SELECT
IF(
DATE_ADD(birth_date, INTERVAL (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) YEAR) > NOW(),
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) -1,
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y'))
) as years_old,
DATEDIFF(
DATE_ADD (birth_date, INTERVAL IF(
DATE_ADD(birth_date, INTERVAL (DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) YEAR) > NOW(),
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) ,
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(birth_date,'%Y')) + 1
) YEAR ),NOW()) as next_birth_days
FROM users

Стратегический анализ инфосистемы

· 2 мин. чтения

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

Предмет Infos?steemide Strateegiline Anal??s (IDU0021) в ТТУ преподаётся лектором Mart Roost'ом и практующим Ants Torim'мом. В практической части предполагается что студенты смогут описать инфосистему организации согласно предлагаемым в лекциях условиям.

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


В данном предмете предлагается такой костяк для проекта:

  • Деловые процессы (как ИС смотрит глава компании)
    • Области ответсвенности лиц, роли (программисты, аналитики, бухгалтера) (p?devusalad)

      • цели
      • ответсвенности
      • необходимости
      • процессы
      • термины (бизнес-объекты, например "договор")
    • Функциональные подсистемы, департаменты (маркетинг, research&development, финансы) (alls?steemid). Описываются точно так-же все цели, процессы и тп.

    • Регистры, аналоги таблиц баз данных, только без посредтсвенных таблиц связей и ID'шников. Работают по элементарным CRUD -функциям.

      • Практическая реализация. SQL-схема.
      • Связи с подсистемами
      • Концептуальная классовая диаграмма
  • Архитектура технологий (как на ИС смотрит инженер)
  • Развитие организации (как финансисты общаются с технарями)
    • Стратегия и временной план

    • Проекты и оценка рисков

    • Оценки ресурсов

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

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

Читайте также:

Системные таблицы в базах данных

· 1 мин. чтения

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

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

Mysql - отдельный тип запроса. SHOW так-же может показывать состояние БД, нагруженность процессами и тп.

SHOW TABLE status SHOW COLUMNS FROM my_custom_table

Postgre - Иерархия разделена по принципу database.schema.table, поэтому часто администраторы не любят создавать новые базы данных - для них каждый раз дублируются системные схемы pg_catalog и information_schema.

select table_name, table_schema from information_schema.tables //все таблицы select column_name from information_schema.columns WHERE table_name='columns' // замкнутый круг

Oracle - обычные таблицы, которые правда мало кто может просто так взять и поменять

select * from ALL_TABLES ``select * from USER_TABLES

Mysql rownum

· 1 мин. чтения

вторник, 1 января 2008 г. в 22:40:38

Есть таблица меню в БД с полем порядка order_id, но порядок неправильный и надо порядок обновить по алфавиту другого поля title. Сортировка по полю title исключается, потому что таблица представляет из себя иерархическое меню, где порядок может менять пользователь устанавливая order_id. Использовать отдельно серверную обработку (php) тоже невыгодно - лишнее разделение бизнес логики если это можно сделать в БД, да и на случай больших объемов данных это займёт больше ресурсов.

Решение

В MySQL к сожалению отсутсвует такая возможность ROWNUM, RANK(), ROW_NUMBER() как в ORACLE или MSSQL. Присутсвие _rowid никак не влияет на ситуацию. В нашем случае можно использовать переменные, введённые с пятой версии (или раньше):

SET @rank=0; SELECT @rank:=@rank+1 AS rank, id FROM menu;

Для обновления такой таблицы через саму себя у меня не получилось, поэтому я просто скопировал таблицу под другим именем и выполнил такой запрос:

SET @rank=0;  
UPDATE `menu` SET order_id=(
SELECT @rank:=@rank+1 FROM `menu2` WHERE `menu`.id=`menu2`.id LIMIT 1
) WHERE parentID=0 ORDER BY `title` ASC;

EDC

· 7 мин. чтения

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

Если надо добраться быстро - иди сам,
если надо идти далеко - идём вместе
Африканская поговорка

Видео и mp3 в своём блоге

· 3 мин. чтения

Чем профессиональней становится web-ресурс тем больше необходимость использовать собственных технологий, или по крайней мере своего стиля. Применимо к видео и аудио это значит что внешний вид, функциональность и хостинг - не от youtube/rutube/vimeo а свой. Особенно это заметно когда у вас 500 статей и у большинства - ролики с ютуба, и можно с высокой долей вероятности утверждать что несколько из них уже не работают потому что автор или ютуб их удалил.

Поэтому преимущества держать файл у себя и показывать в своём плеере:

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

В качестве примера таких решений в рунете можно привести ТНТ и Absolute Games.


Аудио-плеер

Для mp3 есть JW MP3 Player и Macloo player, оба на flash естественно. Второй мне особенно показался симпатичным, отчасти из-за его схожести с используемом в сервисе boomp3. Код достаточно простой - в качестве параметра передаётся URL источника. В своём блоге я уже прикрутил - смотрите ниже, как и поиск по эстонско-русскому словарику, но это не в тему. Так что подумайте о ведении подкастинга или видео-кастинга. Уникальность содержимого очень ценится. Есть ещё dewplayer.

Для того что-бы встроить такой элемент в rss 2.0 надо вставить внутрь item-блока примерно такой код

<enclosure url="http://kurapov.name/pathkrasivosleva.mp3" length="7332316" type="audio/mpeg" />

Видео-плеер

Появление flv-видео значительно укрепило перспективы flash. И хотя для этого надо конвертировать стандартные форматы (avi, mov, mpg) с помощью ffmpeg в качестве консоли на стороне сервера и могут возникнуть проблемы с кодеками, размер и удобство стало очевидным.

Некоторые из плееров
Spring playerHD, поточность, есть поддержка MOV и MP4
flv-mp3.comНикита для wordpress советует
Flowplayerнемножко игрушечный
JW FLV Playerдостаточно заезженный
FLV-playerслишком примитивный
uppodочень схож с flv-mp3
xmoovс лишними иконками
Sonneticc HD, немного игрушечный
Agriyaплатный
AS-Flash Media playerплатный, отличный скин
Proxus FLV component

Сложность возникает с перемоткой, буфферизацией и тп. Здесь нельзя обойтись без возможности сервера в поточной раздаче (streaming), т.е. с подстраиванием под возможности клиента. Для этого нужны специальные серверные программы типа xmoovStream и mammoth server. По этой теме советую послушать Андрея Смирнова на РИТ 2007, где он советует модуль для nginx lighttpd. Теоретически конвертация из командной строки должна выглядеть так..

ffmpeg -i movie.[avi] -s 320x240 -ar 44100 -r 12 movie.flv cat movie.flv | flvtool2 -U stdin movie.flv

Подробней о конверторах смотрите:

Будущее

Если основная функциональность имеется, то во многих видео-сайтах уже прослеживаются инновации типа

  • HD-разрешение
  • субтитров
  • слоёв, зависящих от времени
  • комментариев, зависящих от времени
  • geo-tagging
  • поиск лиц
  • полный 360° обзор со специальной камерой

По теме читайте также:

Межтабличный UPDATE

· 1 мин. чтения

Редко когда, но всё же приходится делать в базе данных одиночные запросы по перемещению существующих данных из одной таблицы в другую. И если с добавлением рядов используя INSERT проблем возникает мало, то с обновлением существующих таблиц у меня возникла трудность. А именно - была старая таблица Invision Powerboard форума, и имелась новая таблица пользователей, с одинаковыми пользователями.

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

UPDATE sys_users  
SET avatar = ( SELECT ibf_members.avatar
                            FROM ibf_members
                            WHERE sys_users.login = ibf_members.name LIMIT 0,1)
WHERE EXISTS ( SELECT 1
                                FROM ibf_members
                                WHERE sys_users.login = ibf_members.name )

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

Call of Duty 4

· 2 мин. чтения

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

Alter sequence

· 1 мин. чтения

Обычно в Postgre последовательности (sequence) обновляются естественно, но как и в случае с дупликатами, порой иногда хочется одним запросом восстановить правильный максимум .. Сначала я подумал что сработает обычный под-запрос типа

ALTER SEQUENCE sysusers_id_seq RESTART SELECT MAX(id)+1 FROM sysusers ; 

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

SELECT setval('sysusers_id_seq', (select max(id)+1 from sysusers))+1;

Теперь можно просто продублировать этот запрос для разных таблиц и последовательностей и беззаботно продолжать работу..

AddHandler в Visual Basic 2005

· 2 мин. чтения

С Visual Basic мне пришлось столкнуться по учёбе, и именно по невизуальной его части - создание элементов форм динамически (в цикле) с частично ограниченным числом оных элементов. Задание в общем звучит невинно - создать программу (автомобильного) теста.

Для упрощённого решения, все данные лежат в открытом виде в текстовом файле. Пользователю надо показать форму с вопросами. По умолчанию пользователь вводит сам ответ в TextBox компоненты, что даёт ему 3 очка за правильное решение. Если нажать на вопрос, то TextBox прячется и пользователь выбирает из предлагаемых вариантов.

Честно говоря самое сложное это вовсе не чтение из файла, а привязка создаваемых объектов с событиями (Events)

Dim resFile As IO.StreamReader Dim Row As String Dim line As Integer resFile = New IO.StreamReader("Valuutad.txt") Do line = line + 1 If resFile.EndOfStream Then Exit Do Row = resFile.ReadLine Me.AddQ(line, Row) Loop resFile.Close()

Сначала я нашёл такой кусок кода как AddHandler objLabel.Click, AddressOf Labelx_Click и решил что неплохо бы передать вместе с этим параметры EventArgs. Не тут то было, оказалось что VB делали такие перцы, логика которых с моей не совпадала вовсе, и которые наделали в VB тучу возможностей которыми я даже и не задумывался пользоваться..

Как оказалось, третьи примеры кода следовали всё тому же AddHandler, но уникальность того, что за кнопка из сотни кнопок была нажата брали из ActiveControl.Text! Это всё равно что баловаться фокусом в среде где фокус легко может отбираться или вообще не присваиваться, как это у меня с Label и происходило. Просто взять и добавить в объект новый параметр ID и по нему найти объект обратно, подобно getElementById в Javascript, тоже задача не из лёгких - надо тогда делать новый класс и наследовать контрол.. дебри.

Программу спас параметр Tag и занесение объектов в массив.

Две lan карты одновременно

· 2 мин. чтения

Вчера мне провели кабельный интернет и оказалось что теперь у меня старое wifi соединение с хорошим upload каналом но низким ping-ом, и кабель с хорошим ping-ом, но низким upload. Ясное дело - два канала, работает только один, так почему же второму пропадать?

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

Проблема лишь в том что она прописывает шлюзы для IP конкретных получателей, что очень полезно при статичных VPN, но в моём случае она бесполезна, поскольку по wifi я хотел бы иметь доступ ко всему спектру IP. Но сузив рамки, я решил что по wifi имеет смысл пустить только mail сервак и задача сводится к маршрутизации пакетов в зависимости от используемых портов (110,25,995).

Для такой перенастройки маршрутизации я попробовал:

  • wipfw, портирование из freeBSD
  • kerio winroute, вместе с уймой настроек, firewall, traffic quotas и тп. Даже основная фича по транслирование сетевых адрессов (NAT) не помогла ником образом
  • Netcom Routix по идее очень навороченная прога, позволяющая даже изменять модули маршрутизации по своему усмотрению, если есть знания в Visual Basic.

Предложения заблокировать порты на одном шлюзе с мыслью что они сами побегут на другой - не получилось. Копания в течение суток я понял что data layer и network layer в windows очень слаб, даже несмотря на присутсвие третьих программ. Надеюсь кто-нибудь найдёт решение кроме как установки второго компа.

Удаление дубликатов в Mysql

· 1 мин. чтения

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

SELECT login, COUNT(login) AS cnt
FROM sys_users GROUP BY login
HAVING ( COUNT(login) > 1 )

И теперь..

DELETE t1 FROM sys_users t1, sys_users t2 
WHERE t1.login=t2.login AND t1.ID > t2.ID

Ещё один красивый и лаконичный способ..

ALTER IGNORE TABLE sys_users ADD UNIQUE INDEX(login);

Читайте также:

Crysis

· 1 мин. чтения

Crysis, ожидаемый ещё с весны выпустил демку, в которую я с удовольствием порубился. Новый движок cryengine творит чудеса, не нагружая сильно процессор, а cюжет не срывается до уровня ужасов Bioshock, покрайней мере в начале

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

Пингуем technorati и feedburner по XML-RPC

· 2 мин. чтения

Я уже писал про XML-RPC и использование его с livejournal.

Месяца 4 назад я зарегистрировался для продвижения блога наtechnorati - англоязычном аналоге яндекс.блогов, но обнаружил отсутсвие обновления. Как оказалось, всё дело в том что technorati пошло как раз по тому пути о котором я говорил чуть ранее про Google.

XFN и FOAF

· 3 мин. чтения

Не основываясь ни на чём я могу сказать что 40% читаемых мною блогов обращают какое-либо внимание на шумиху Web 2.0, 4% из них задумываются о будующем web 3.0, о семантике и только единицы реально изучают микроформаты и пытаются об этом писать.

FOAF это практическое применение формата семантики RDF, а цель раскрывает значение этого сокращения - друг моего друга, т.е. формат связей некоего блога или ресурса с другими. Документация и весь формат разрабатывался с 2000 года и с того времени завоевал популярность в основном среди прогрессивных web-разработчиков.

XFN это микроформат проще реализующий смысл FOAF, технически в виде отношения многое к многим как и тэги. Отвечает стандартам XHTML,и всё что от вас требуется так это добавить параметр rel='friend' в каждую ссылку из списка. Параметр может быть не только friend, но и другим отвечать значениям - см. XFN 1.1. creator. А что-бы показать всем пример и выпендиться, можно использовать иконки.

Цель и перспективы

  1. Децентрализованная сетка друзей. Заходите на любую социальную сеть, регистрируетесь, находите друзей, и объединяете всех в один список. Для этого надо, что-бы популярные сервисы поддерживали формат FOAF. И некоторые уже это делают - LivejournalLiveinternet.

  2. Поиск по сетке. Вообще поиск по людям в интернете отсутсвует, чего бы не писала seobaby. Всему причина как я уже писал, политика конфиденциальности. Конечно вы можете попробовать умерший поисковик Rubhub. Mindsack.com предлагает создать список в виде JSON, и прыгаеть с одного списка на другой.

  3. Визуализация. Построить граф всея интернета хочет разве что параноик-детектив, но видеть нечто отличное от текстовых списков всегда приятно, особенно когда в качестве узлов выступают фотки знакомых людей. Однако достаточно взглянуть на граф от six apart что-бы понять что графы неудобны. Можно использовать xfngraph.

Работы

  • Для работы с XFN Дима Джус например уже нахимичил паука с такими аббревиатурами как XSLT, Python, tidy.
  • Oliver Brown наваял неудачно какой-то географический проект с отображением друзей.
  • Дикий попробовал mindsack и даже Бишопа с Флинтом подключил до момента перезапуска блога последним.
  • Optimus конвертит XFN в нужный xml или json.

Якобы вывод

FOAF и XFN это всего лишь "фича" блогеров, которая предоставляет данные тем кто их понимает (поисковикам и программам) и если он наберёт популярность, то его будут учитывать большие игроки... например livejournal уже учитывает. Но для коммерческих систем естественно такой формат для услуг не нужен. Тем временем можно занять нишу rubhub, хитро скомбинировать это с блогами и сделать подобие blogowar , Дима ты меня слышишь?

В заключение можно заметить, что на протяжение всей истории интернет-поиска, крупные поисковики никак не пытались повлиять и навязать форматы данных которые сайт должен показывать. Sitemap, favicon, robots.txt, meta и headers не в счёт. Когда же появятся "Google рекомендует"?

Система прав в инфосистемах

· 4 мин. чтения

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

Управление СУБД

· 1 мин. чтения

С СУБД сталкивается практически каждый разработчик, начиная как правило с PhpMyAdmin, PhpPgAdmin, простейших серверных скриптов, постепенно переходя на более тяжёлое но удобное ПО, которое я тут постараюсь описать.

Maestro group

SQL Maestro это компания, производящая административные программы баз данных. Практическая реализация очень схожа с SQLyog, т.е. так же позволяет легко управлять таблицами, данными, базами, схемами, функциями, тригеррами и тп. В плюс - возможность составление диаграммы структур. В комплекте есть поддержка MySQL, Postgre, Oracle, MS SQL server, Firebird, Max DB. В последних версиях есть HTTP-туннелирование. В минусы - порой выпадают ошибки нехватки памяти.

SQL yog

SQLyog 6 Enterprise стоит 67$, что для фирмы, которая хочет экономить время своих работников, цена приемлимая. Интерфейс построен как и в pgadmin - слева список таблиц с подразделами (поля, индексы, триггеры), справа - данные таблицы и sql запрос. Сверху - меню с удобными диалогами создания FOREIGN KEY, управлением привилегиями, структурой таблиц, возможностями импорта/экспорта и т.п.

См. также

VPN

· 1 мин. чтения

Virtual Private Network это искусственный защищённый канал связи между двумя LAN-сетями использующий протоколы аутидентификации IPSec, PPTP или L2TP и алгоритмы криптографии DES, triple DES, AES.

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

Для обычного пользователя VPN-туннель просто создаёт второй сетевой интерфейс и как результат - второй IP, который доступен из второй сети. Благодаря этому все остальные программы и протоколы (SVN, FTP, SMTP) могут использовать ресурсы корпоративной сети. Это в корне увеличивает возможности пользователя по сравнению с использованием SSH-туннелирования, которое часто исопльзуется для защищённой передачи данных (через WinSCP и Putty)

VPN-соединение устанавливается программами:

Как побочный эффект от соединения, вы можете заметить что пропал доступ к интернету - ваш gateway оказался перенаправленным на VPN'овский интерфейс. И наоборот, внутри внутренней сети нельзя пользоваться глобальным DNS.

Если возникает ошибка ROUTE, то можно создать .bat файлик и прописать туда нужные пути таким образом..

route ADD 10.138.12.4 MASK 255.255.255.255 10.138.11.109