четверг, 26 ноября 2009 г.

Sharepoint Survey raise "You are not allowed to respond again to this survey"

В силу ряда обстоятельств мне необходимо было заполнить Survey ответами от разных людей , при этом настройка "Allow multiple responses?" должна быть в "No".
Заполнял примерно вот так:
var item = list.Items.Add();
var Author = web.SiteUsers[@"DOMAIN\user"];
item["TestQuestion"] = "TestAnswer";
try
{
    item["Author"] = Author.ID;
    item["Editor"] = Author.ID;
}
catch
{}
item.Update();
т.е. в теории, такой алгоритм приводил бы, к тому что ответы, даже от несуществующих пользователей, не пропадут.
Но получается все интереснее. Если создается хотя бы один ответ от пользователя под которым работает программа, в моем случае это "SystemAccount", то после этого уже никакие ответы создать нельзя. Даже если "Author" и "Editor" выставленны верно получаем все равно "You are not allowed to respond again to this survey".
Оказывается перед тем как засунуть данные в базу WSS вызывает сторную процедуру:exec proc_UserHasDataItems в которую передает идентификатор текущего пользователя (того под кем работает приложение) и лишь в случае успеха вызывает proc_AddListItem

Вот так вот.

среда, 4 ноября 2009 г.

Uninstall PowerShell 1.0

Потребовалось мне обновить PowerShell стоящий у меня, скачал новый отсюда, попытался поставить, а он меня просит удалить сначала предыдущую версию.
Своего значка uninstall я не нашел, и в "Add Remove Programs" его нет.

Бился бился, но оказалось что достаточно удалить ключ реестра :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell

И новая версия прекрасно ставится.

пятница, 23 октября 2009 г.

GAE: Mail API - Получение и отправка почты

Не так давно Google анонсировал, что приложения для Google App Engine (GAE) могут не только отправлять почту, но и принимать ее.
Документация на Mail API, в которой описывается механизм принятия сообщении, пока есть только на англииском.

Вот небольшой примерчик:

Пример принимает почту посланную на адрес вида string@supermailapp.appspotmail.com и возвращает его отправителю.

Тогда app.yaml будет выглядеть так:
application: supermailapp
version: 1
runtime: python
api_version: 1

inbound_services:
- mail

handlers:
- url: /_ah/mail/.+ 
  script: handle_incoming_email.py 
  login: admin

а обработчик вот так:

import logging
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import mail
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler

class MyInboundMailHandler(InboundMailHandler):
 def receive(self, mail_message):
  logging.info('Received greeting from %s: %s' % (mail_message.sender,mail_message.body))
  mail.send_mail(
   sender=mail_message.to,
   to=mail_message.sender,
   subject=mail_message.subject,
   body=mail_message.body)
  logging.info('Sended answer to  %s'% mail_message.to)

application = webapp.WSGIApplication([MyInboundMailHandler.mapping(),], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

Всё очень просто.

четверг, 22 октября 2009 г.

SQL: Куда деваются коннекции

При отладки приложения бывает полезно узнать сколько в текущий момент установлено коннекции к SQL.

Вот запрос который показывает подключения ко всем базам на SQL-сервере:

declare @t TABLE
 (
     SPID INT, 
     Status nVARCHAR(100) NULL, 
     Login SYSNAME NULL, 
     HostName SYSNAME NULL, 
     BlkBy SYSNAME NULL, 
     DBName SYSNAME NULL, 
     Command VARCHAR(32) NULL, 
     CPUTime INT NULL, 
     DiskIO INT NULL, 
     LastBatch nVARCHAR(100) NULL, 
     ProgramName nVARCHAR(100) NULL, 
     SPID2 INT,
     requestid int 
 )

insert @t exec sp_who2

select ProgramName, COUNT(ProgramName) as count from @t  GROUP BY ProgramName ORDER BY count



Проверено на MS SQL 2005.

SQL: INSERT OR UPDATE

Часто бывает ситуация что надо обновить данные в таблице если они там уже есть ,а если нет то добавить их. Делается достаточно просто:

IF (EXISTS (SELECT ID FROM MyTable WHERE ID = 123))
begin
     UPDATE MyTable  SET MyValue = 555 WHERE ID = 123
end
else
begin
     INSERT INTO MyTable (ID, MyValue) VALUES(123, 555)
end

среда, 21 октября 2009 г.

VMWare Virtual Server 1.0.6 -> VMWare ESXi 4: Экономим дисковые ресурсы сервера

Оказывается VMWare Converter по умолчанию преобразует диски в Flat (Thick). Если на VMWare Server диск был не преалоцированым, то после конвертации он станет Flat. Т.е. например при формировании виртуальной машины было указано 40G, но реально использовано лишь 10G, и на VMWare Server файл с диском занимал около 10G, то после перевоза на ESXi он займет все 40G. Так что если вам, как и мне, жалко дисковых ресурсов (особенно если используются снэпшоты), то не забывайте при конвертации выставлять Thin для дисков.

понедельник, 19 октября 2009 г.

VMWare Virtual Server 1.0.6 -> VMWare ESXi 4: Аккуратней со снэпшотами

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

пятница, 16 октября 2009 г.

Радио on-line

Нашел приятный сервис в котором представлены разные on-line радиостанции. Удобно что большой выбор и единообразный интерфейс.
Вот он

VMWare ESXi 4 Server вместо VMWare Virtual Server 1.0.6

Долгое время для создания виртуальных машин я пользовался VMWare Virtual Server, он бесплатен, легко ставится под 32х и 64х битный версии Windows 2003, имеют вполне удобную консоль и возможность удаленного управления скриптами. Пробовал я и версию 2.0, но мне не очень понравилась идея web-интерфейса, посему я предпочел остаться на версии 1.0.6.
Недавно я узнал что VMWare ESXi стал бесплатным и решил опробовать его на одном из своих серверов (Dell PowerEdge 1950).

Процесс установки ESXi чрезвычайно прост и, думаю, сказать мне тут практически нечего, отмечу лишь одну маленькую трудность которая привела к тому что ставить ESXi мне пришлось дважды. В первый раз я выбрал 0-вой HDD и после перезагрузки увидел опять свой Windows, можно было конечно по колдовать, но мне проще было поставить ESXi еще раз уже на 1-ый HDD.

После установки можно зайти на сервер по http и скачать VI Client, все остальные настройки можно делать уже через него.

Основная задача у меня была перемещение уже существующих под Virtual Server машин в ESXi, для этого существует отдельный тул - VMware vCenter Converter, с помощью которой можно с конвертировать машину и залить ее на сервер. Работает весьма просто и отдельных слов не заслуживает. Работает правда достаточно долго, машина с двумя дисками по 20G (реальный размер файлов не превышал 15G) заливалась около трех часов, но возможно что скорость зависит от загрузки сети и исходной машины т.к. коллеги рапортовали о более высоких скоростях.

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




Интересен тот факт что VMware vCenter Converter при переносе машин не процессит (или не полностью) конфигурационный файл вары - ".vmx". Это приводит к тому что часть настроек которые были в старом сервере и отсутствуют в интерфейсе нового - работают, но изменить их из UI не получается. Сначала я было расстроился что из за того что у меня в старом сервере была включена галочка мне придется заливать вару снова ,но оказалось что можно скачать этот самый vmx файл себе на компьютер ,подправить и залить обратно.



Вызывается этот чудный диалог нажатием правой кнопки мыши на "datastore1" и выбором пункта "Browse Datastore"

О дальнейших впечатлениях расскажу позже.

воскресенье, 27 сентября 2009 г.

Failure decoding embedded permission set object

Рефакторил код и столкнулся с ошибкой при выполнении автоматических тестов "Failure decoding embedded permission set object", долго курил, что же я такого натворил, и удивлялся описанию ошибки в гугле.
Оказалось все просто , я использую SharePoint 2003 и SharePoint 2007, при этом для удобства сборки приложении на машинах где нет этого самого SharePoint у меня в системе source control'а лежат, в разных папочках, 2 версии библиотеки Microsoft.Sharepoint.dll, ну и как водится по умолчанию копируются при сборке в общий bin. Причем в одном солюшене у меня есть проекты залинкованые на новую (WSS3) и проекты линкующиеся на старую версию (WSS2).
При выполнении авто тестов на виртуальную машину копируется весь bin без разбора.
Оказалось что из за смены порядка сборки проектов в bin вместо новой версии попала старая (WSS2), что и вызывало такую необычную ошибку.
Вылечилось убиранием этой библиотеки из bin ,при этом каждая версия берет ту dll которая уже есть в системе.

суббота, 26 сентября 2009 г.

Профсоюз програмистов

Сегодня утром наткнулся на программу где какой то товарищ (глава союза профсоюзов Спб ?), радостно рассказывал о преимуществах профсоюза.
В своей жизни ,работая в НИИ я состоял в профсоюзе связистов, белая з\п там была маленькая, посему профсоюзные взносы не напрягали. Пользой от этого членства была лишь одна бесплатная поездка на выходные, на какую то базу отдыха, где коллектив пил водку, кушал шашлыки и катался на лошадках.
Заинтересовался, существует ли "Профсоюз программистов" или "...работников ИТ"? Так вот оказывается - не существует. Но интеренет полон обсуждений на эту тему.
Похоже дефицитность ИТ специалистов приводит к тому что организации сами вынуждены достаточно внимательно относится к условиям работы и как следствие особой организации для защиты прав не требуется , срабатывает так сказать "голосование ногами".

Ссылки по теме:
Хабр - "Профсоюз программистов. Реальность?"
Длинный тред дискуссии на SQL.RU

Все остальное как то мало интересно и не информативно.

пятница, 24 июля 2009 г.

Начальство и подчиненные

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

вторник, 14 июля 2009 г.

GTD Попытка найти софт

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

Недавно услышал о методике приведения множества мелких дел в порядок - "Getting Things Done (GTD)" и решил испробовать на себе. Первым делом захотелось найти удобный софт для этого , требования к софту достаточно простые - варианты под iPhone и Windows, возможность синхронизации через интернет, бесплатность.

Вот краткие отзывы о том что посмотрел:


  1. myLifeOrganized - есть версия под Windows и Windows Mobile при этом есть, как платная, так и бесплатная версия. Я скачал обе, разницы почти не заметил. Разрабатывают русские ребята, но по умолчанию поддержки русского языка я не нашел. Пока использую именно эту десктопную версию с целью посмотреть подходит ли мне вообще эта методика. Из первых впечатлении - очень перегруженный и не вполне понятный интерфеис содержащий огромное количество контролов. Основные для меня минусы - нет версии для iPhone,нет синхронизации через inet (возможно есть в платной версии), платная.

  2. Things - посмотреть к сожалению не смог ,но в инете очень хвалят. Есть версия для iPhone и Mac, нет для Windows,нет синка с инетом, платная ($10 за iPhone и $50 за Mac).

  3. OmniFocus - могу сказать то же что и про Things - только Mac и iPhone и приличная цена (обе версии вместе почти $100)

  4. Remember The Milk - в начале обрадовался - бесплатный online-сервис, бесплатная версия для iPhone. Но после того как поигрался понял что не то. "Бесплатное" приложение для iPhone на деле оказывается работает лишь 15 дней, при этом требует постоянного подключения к инету. К тому же весьма скудные функции, например у меня так и не получилось создавать подзадачи для задач, задавать контекст и прочее, да и веб морда не удобная.

  5. GTD-Free - бесплатная и open-source. Сразу как поставил испугался уж очень перегруженому интерфейсу, с первого раза даже не понял как мне просто создать элементарную задачу типа "Сходить за пивом" выставить ей приоритет и контекст. Так же само собой нет версии для iPhone и снихронизации. Зато бесплатно.


  6. Appigo To Do List - смотрел бесплатную версию для iPhone. Вроде неплохо ,но оказалось что бесплатная версия поддерживает всего 10 задач, что делает ее полностью бесполезной, а платная стоит $10. Умеет синкаться с online-сервисами Toodledo и Remember The Milk (требует платный аккаунт).


В итоге софт полностью удовлетворяющий моим требованиям я так пока и не нашел. :(

пятница, 5 июня 2009 г.

Russian podcasting

Оказывается русский подкстинг тоже существует, живут они тут.

Я послушал несколько и спешу поделится своим скромным мнением:

1. RADIO-T неплохой подкаст по всяким ИТ темам. Постоянно рекламируют Яндекс и Твиттер в несколько завуалированной форме.
2. Еженедельный подкаст от Umputun (US, Чикаго) Тоже ИТ ,поскучнее предыдущего (кстати автор участвует и в RADIO-T) т.к. автору не с кем дискутировать.
3. compulenta.ru - новости ИТ, сухое изложение новостей, что то типа автоматической читалки новостей.
4. Янки после пьянки - Ребята развлекаются, особой темы и веселья я не понял. Сил дослушать до конца даже один подкаст не хватило.
5. Сиськи - Письки Шоу - фривольные разговоры на немного компьютерную тематику, иногда смешно
6. PODслушивание Анатолия Вассермана - Анатолий человек уважаемый, но подкаст его надо ставить в детском саду перед сном. Очень монотонно и занудно.
7. АЭРОСТАТ - очень качественный подкаст ведомый БГ о музыке и с музыкой.

Касательно ИТ-подксатов рекомендовал бы только РАДИО-Т.

четверг, 14 мая 2009 г.

Опоздания на работу

Я понимаю что в среде ИТ приходить к 8-9 утра совершенно не принято, но все же считаю что у команды должно быть время когда все сотрудники на месте, и опаздывать к этому времени уже верх не уважения.

Режим работы моего отдела очень гибок, время прихода на работу у нас до 13:00. При этом ровно половина сотрудников ну никак не может приходить во время. Вот замечательный лог СМС-сообщений от самого главного опоздуна.



Что бы вы сделали с таким человеком?

понедельник, 13 апреля 2009 г.

Как определить x64 или x86 у нас OS?

Нужно определить под чем запущено наше 32битное приложение ,под 32х-битной Windows или по 64.
Пока ничего умнее не придумал как делать так:


def IsItx64():
import _winreg
import win32con
try:
RegPath = r"SOFTWARE\Wow6432Node"
hKey = _winreg.OpenKey (_winreg.HKEY_LOCAL_MACHINE, RegPath,0, win32con.KEY_READ | win32con.KEY_WOW64_64KEY)
except:
return False
return True

пятница, 10 апреля 2009 г.

Редирект в SharePoint

Появилась задача перенаправлять обращения по некоторым URL в SharePoint'е на другие URL в нем же. Оказывается люди такое уже делают.

Получилось и у меня:

Делаю редирект с урла вида
 http://server/TestRedirectionSharePoint/ 

на
 http://server/NewRedirectionSite/ 




using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Text.RegularExpressions;
using Microsoft.SharePoint;

namespace SP2007RedirectExample
{
public class RedirectModule : IHttpModule
{
public void Dispose()
{ }

public void Init(HttpApplication context)
{
context.BeginRequest +=
new EventHandler(context_BeginRequest);
}

void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
string requestUrl = app.Request.Url.ToString();

if (requestUrl.Contains("TestRedirectionSharePoint"))
{
var destinationUrl = requestUrl.Replace("TestRedirectionSharePoint", "NewRedirectionSite");
app.Response.AddHeader("Location", destinationUrl);
app.Response.StatusCode = 301;
}
}
}
}


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

четверг, 9 апреля 2009 г.

Публикация исходных текстов в блоге

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


public void Init(HttpApplication context)
{
context.BeginRequest +=
new EventHandler(context_BeginRequest);
}

пятница, 27 марта 2009 г.

Ошибка при деинсталяции приложения

Перемудрил я с правкой сетапа своего продукта и получилось что он перестал деинсталироваться. :( Выкусывать его частями из реестра и прочего - крайне муторно. Но оказывается все MSI которые стоят в системе, windows копирует себе в C:\windows\Installer. Я нашел там свою MSI убрал кривой custom action и продукт прекрасно снесся.

четверг, 26 марта 2009 г.

Язык BAT

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

Вот кстати очень приятное FAQ по BAT языку ,лично я много не знал из того что здесь сказано, например не знал как экранировать кавычки в параметрах (%~1) ,не знал о новом IF ELSE ,не знал о функциях.
BAT-аники

понедельник, 5 января 2009 г.

FreeNAS

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



Поставляется эта штука в виде LiveCD с которого все кстати прекрасно работает, но есть возможность поставить ситсему на диск. При старте ОС загружается на предопределенном адресе - 192.168.1.250 и с предопредленными именем пользователя и паролем. В консольном меню доступно всего несколько простых и понятных пунктов, в принципе для начала работы нужен всего один пункт - номер 2 (Set LAN IP address)нажав на которой можно указать что NAS будет использовать DHCP и наконец получет нормальный адрес и покажет его.
После этого можно будет воити в веб интрерфейс (имя: admin пароль: freenas), и заняться уже непосредственно конфигурацией.



Первое что бросилось в глаза это наличие русского интерфейса , для его включения во вкладке General есть пункт Language, перевод вполне себе сносный и понятный.

Для начала рекомендую сменить пароль веб-интерфейса с дефолтного, да и включить HTTPS не помешает.

Диски добавляются так же через веб интерфеис, но на мой взгляд можно было сделать это несколько проще. Сначала в Управлении надо добавить диск, после чего отформатировать его после чего указать ему точку монтирования, а для того чтобы он стал виден снаружи надо его еще и в Службе CIFS\SMB прописать.

Но вместе с тем интерфейс весьма гибок , можно легко поднять доступ по SMB,FTP, включить шифрование, настроить несколько протоколов бэкапа, создать софтварный RAID , прописать маршрутизацию, создавать пользователй и использовать LDAP, подключать WiFI, настраивать cron, ставить пакеты FreeBSD.

На странице диагностики можно посмотреть инф о системе.



Немного огорчило что данный дистрибутив не предназначен для того чтобы его использовали в качестве роутера. Более того в документации сказано что роутинг между интерфейсами запрещен специально.
Немного жаль , т.к. наличие роутинга и поддержка PPTP и L2TP позволила бы использовать этот дистрибутив в качесве домашнего файл сервера с возможностью раздавать через него интернет.
Так же в дистрибутиве не предусмотрены клиенты для популярных файлообменых сетей типа Torrent и DC++.