Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
в Пошук

usarskyy

  • Windows 7: Binaries from SVN

    От уже декілька тижнів я працюю в новій компанії, що означає не тільки зміну обстановки і оточуючих тебе людей, а й зміну робочого (читай "віртуального") середовища. Про одну з таких змін я зараз розкажу і можливо воно збереже комусь 2-3 години робочого часу.

    В попередній організації у нас в SVN був такий собі репозиторій "tools" в якому знаходились різноманітні допоміжні програмки (зокрема NAnt). Кожен девелопер мав локальну копію цього репозиторію, обновляв його час від часу і використовува що було необхідно.

    А на мому теперішньому місці праці, нажаль, такого ніхто не додумався зробити. От я і взявся "пофіксити цю багу". Хоча, а що там такого робити? Створити директорію, скопіювати все що треба, закомітити в SVN і готово :) Єдине чого я не врахував, це OS на якій ми працюємо. Раніше у мене була Windows Server 2003, а тут Windows 7. Одна з основних їх відмінностей - це система безпеки. У Windows 7 всі скачані файли (Інтренет чи SVN не грає ролі) будуть помічені як небезпечні і будуть виконуватись з пониженими правами. Так от, якщо я раніше на WinServer 2003 запускав скачаний з SVN NAnt без проблем, то тепер у мене він "вилітав" з помилкою:

    Unhandled Exception: System.TypeInitializationException: The type initializer for 'NA
    nt.Console.ConsoleStub' threw an exception. ---> System.Security.SecurityException: R
    equest for the permission of type 'System.Security.Permissions.FileIOPermission, msco
    rlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
       at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& s
    tackMark, Boolean isPermSet)
    ..
    ..
       at log4net.Core.DefaultRepositorySelector.GetRepository(Assembly repositoryAssembl
    y)
       at log4net.Core.LoggerManager.GetLogger(Assembly repositoryAssembly, String name)
       at log4net.LogManager.GetLogger(Assembly repositoryAssembly, String name)
       at log4net.LogManager.GetLogger(Type type)
       at NAnt.Console.ConsoleStub..cctor()

    Після невеликих пошуків в Гуглі я натрапив ось на цей пост. Нажаль, у мене не вдалось розблокувати всі файли, так як частина з них автоблокувалась через секунду-дві. Тому було вирішено знайти альтернативний шлях без рутинних "клікань". І такий шлях існує! :) Для цього потрібно:

    1. Скачати "streams.exe" від SysInternals
    2. Запустити "streams.exe" з ключами "-s -d %DIR_PATH%", щоб видалити всі потоки, які були додані до скачаних з SVN файлів

    Ось тут ще можна прочитати варіанти вирішення проблеми.

  • Open space і девелопмент

    Прочитав ось цю статю про засновника Kayak.com (сервіс порівняння цін на квитки, готелі і т.д.) і хочу зробити невеликий коментар до неї для тих хто мріє заснувати свій Гугл/Майкрософт/ПупкінСофт чи ще щось таке.
    По-перше, вам треба буде вибити слово "арбайтен" у себе на чолі :) Пити мохіто на пляжі по пів року явно не получиться.
    По-друге, як тільки вам прийде в голову геніальна (??!) ідея посадити девелоперів в "open space" (під будь-яким приводом) - знайдіть будь-який стіл і стукніться об нього головою з усієї сили. Процедуру повторяйте кожного разу як схожі ідеї вам приходять в голову.
    Якщо ж на вас зійде осяяння, що просто "open space" - це мало, тому треба додати ще й червоний теелфон з підтримкою користувачів... тоді знайдіть найближчу несучу стіну і повторіть вправу, яку ви натренували з столом.

    В результаті має получитись одне з двох: або успішна ІТ-компанія, або красивий зеркальний напис слова "арбайтен" :)

    P.S.: цитата про червоний телефон:
    About a year ago, I bought a red telephone with a really loud ringer for the office. Whenever a customer calls the help number on our website, that phone rings. The engineers initially complained about it. They said, "That's so friggin' annoying!" And I'd say, "There's a really simple solution: Answer the friggin' phone and do whatever it takes to make that customer happy. Then hang up, unplug the phone, walk it down to the other end of the office, and plug it in down there."
  • Локальний веб-сайт на Win7

    Мені, як і більшості девелоперів, приходиться повторювати "ритуал" створення локального веб-сайту на власній девелопмент-машині час від часу, і буває що я забуваю про один з кроків. Тому цей пост буде швидше простим нагадуванням для мене Big Smile ніж чимось новим для community. Хоча, сподіваюсь, що для когось це також стане непоганою покроковою інструкцією на початку його кар'єри.

    І так, допустимо, що на компютері вже встановлено:

    • Windows 7
    • IIS
    • MS SQL Server

    Всі дії я проводив через GUI, проте вони можуть бути виконані і через командну строку і/або Powershell.

    Новий користувач

    Першим кроком необхідно створити нового користувача для нашого майбутнього веб-сайту. Звичайно, не заборонено працювати і під локальними правами, але я вважаю це поганою практикою + такого ніколи не трапляється у Production-середовищі.

    Відкрийте "Computer Management" консоль і знайдіть там "Local Users and Groups". Після чого правим кліком по "Users" ви зможете викликати контексне меню і через пункт "New User..." створити нового користувача:

    Не забудьте помітити чекбокси "User cannot change password" та "Password never expires".

    Після збереження всіх змін, відкрийте вікно "Properties" новоствореного користувача. Там вам потрібно буде видалити всі групи до яких він належить і додати його у групу "IIS_IUSRS":

    Новий веб-сайт

    Для того щоб створити новий веб-сайт потрібно в уже відомій вам "Computer Management" консолі знайти "Internet Information Services", перейти до списку "Sites" і там створити новий веб-сайт:

    Закінчивши клікніть по кнопці "Connect as..." і введіть логін та пароль користувача створеного попередньо:

    Клікаємо на "ОК", знову "ОК" і перевіряємо чи все працює (кнопка "Test Settings..."):

     

    Буває, що з "Authorization" виникають проблеми. У такому випадку необхідно у властивостях директорії, де розміщений веб-сайт, змінити настройки безпеки і дозволити користувачу з попереднього пункту читати/зберігати данні у цій директорії.

    Сподіваюсь до цього моменту все пройшло без проблем і ми можемо спокійно додати URL нашого творіння у локальний "hosts"-файл, щоб броузер не шукав його, як виразився один коЛЛЄга, "по всіх інтернетах" Big Smile

    Прошу звернути увагу на те, що для модифікації цього файлу у Win7 вам знадобляться права адміністратора.

    В загальному, на цьому можна закінчити цей короткий пост для тих, хто не планує використовувати Windows-аутентифікацію для роботи з Sql Server. Якщо ж ви все-таки хочете скористатись всіма багами благами, то ласкаво прошу витратити ще 5 хвилин вашого дорогоцінного часу і дочитати все до кінця.

    Новий користувач у Sql Server

    Підключіться до вашого MS SQL Server з допомогою "Microsoft SQL Server Management Studio", перейдіть до списку логінів (Security > Logins) та відкрийте діалог створення нового логіну:

    Після цього введіть всю необідну інформацію у вкладці "General", але НЕ зберігайте зміни:

    Тепер переходимо на вкладку "User Mapping":

    Тут необхідно вказати БД до якої наш користувач зможе звертатись і його права. На завершення перевіримо вкладку "Status", щоб упевнитись, що ми успішно зможемо залогінитись та працювати:

    Зберігаємо!

    Якщо все було зроблено правильно, то у списку користувачів нашої БД має зявитись новий користувацький запис:

    The end! Smile

  • "Тут вам не там" (с)

    Недавно прочитав ось це і так як мені часто приходилось чути дивні мрії на тему "а я поїду в Бла-Бла-Бла і мені там будуть платити купу бабла", то вирішив трохи описати всі реалії роботи закордоном. Ну і так як ми говоримо про роботу, то почну я з...

    Резюме

    Так історично склалось, що Україна має (мала?) хороших технічних спеціалістів, які... абсолютно не можуть себе "продати" роботодавцю. Можете називати це природною скромністю, але я бачу тут інші причини:
    1. направленість індустрії на аутсорсинг
    2. банальне не знання того, як правильно себе подавати
    Всі прекрасно знають, що наша ІТ індустрія в останні роки переживала неабиякий ріст і в звязку з цим гостро відчувалась нехватка спеціалістів практично усіх напрямків. А раз є високий попит, то який зміст витрачати час і сили на "саморекламу"? Тебе у будь-якому випадку знайдуть і наймуть!
    На додачу, аутсорсингову роботу не настільки легко описати як те чим ти займався в "продуктовій" компанії (хто знає кращий термін?). За 2-3 роки легко можна змінити десяток команд, стільки ж напрямків роботи і технологій. І навіть якщо кандидат працював над одним продуктом чи однією технологією, він завжди може зіслатись на NDA (не залежно від того знає він чи ні що це таке :) ).
    Як найгірший випадок можна рахувати ситуацію, коли девелопер "перескакував" з однієї компанії в іншу в погоні за зарплатою чи "погонами".
    На результат можна подивитись тут (в кінці є лінк на резюме). А ось у цій вітці обговорюють недоліки і дають хороші поради як потрібно писати резюме.
     
    Тепер перейдемо до пункту під номером два, де, на жаль, у нас є більш серйозні проблеми.
    При комунізмі самопрезентація була швидше шкідливим ніж корисним навиком (за виключенням політичних осіб та "вищого" начальства), а в умовах "розвинутого" українського капіталізму - непотрібним надлишком. Тому, на відміну від західних країн, ми ніколи не задавались питанням як готуватись до співбесід, як там себе поводити і як правильно відповідати на поставлені питання.
    Приведу приклад резюме (лінк всередині поста), щоб не бути голослівним. Як бачимо, є суттєвий прогрес у порівнянні з попередньо розглянутим випадком, але все ще "не фонтан". Що не так? Шаблон, відсутність фото, опис досвіду роботи... Можливо в українських/російських компаніях на таке і не звертають уваги, але закордоном неналежно оформлене резюме є достатнім приводом для відмови (навіть при наявності усіх "ключових" слів). Я не спеціаліст у рекрутингу, але рекомендую використовувати шаблон "Elegant" як основу, він прекрасно переформатовується в PDF і не стаждає надлишковими стилями.
     
    Наступне, чим зловживають наші спеціалісти - це опис власного досвіду. Для чого згадувати в резюме на позицію "C# .Net Developer" про свої знання в області розробок під ARM? Або ассемблер для мейнфреймів..? Там ці знання абсолютно не потрібні, а на додачу рекрутер може просто вирішити що ви overqualified (не можу підібрати потрібний переклад) і вам буде не цікаво на проекті... Тому уважно перечитуйте вимоги в описі вакансій і готуйте унікальне резюме для кожної з них. Звичайно ж, я не говорю про екстремальний випадок - цілком унікальне резюме Wink Скажемо, 70-80% можна залишити - ті самі "знання Asp.NET, SQL Server, IoC" які пишуть повсюду. Решта - це "технічний опис" того, чим ви будете займатись наступні 2-3 роки (розробка GeoServices, Financial Services, ...).
     
    Як поводити себе на співбесідах - це окрема тема. Я не буду вдаватись в детальні, в різних країнах це проходить по різному і універсальних порад не існує. Зазначу тільки те, що на заході прийнято трохи перебільшувати в описі власних знань та можливостей, і дуже не рекомендують давати негативні відповіді. Наприклад:
    Кваліфікація Правдива відповідь "Рекомендована" відповідь
    Рівень знання англійської мови Intermediate Upper intermediate
     
    або:
    Питання Правдива Відповідь "Рекомендована" відповідь
    - Ви маєте досвід роботи з БлаБлаБла?
    Ні, не маю

    Я читав про це, проте реального досвіду не маю.

    АЛЕ дуже хочу вивчити.

     
     
    УВАГА: моя порада аж ніяк не означає, що ви маєте безсовісно брехати Smile Просто спробуйте складати текст більш "вигідними" для вас словами.
     

    Зарплатня (мзда, получка, поденщина)

    Ви прорвались через армію рекрутерів та нескінченні співбесіди? Smile Мої поздоровлення, але від підписання контракту вас все ще відділяє одне маленьке питання: на яку зарплату ви розраховуєте? В принципі, таке можуть запитати і з самого початку, проте суті справи це не змінить.
    В Україні прийнято потупити погляд вниз і пробубніти (максимально нерозбірливо!) одну з двох фраз: "вагон бабла" або "щоб вистачало на пиво". І що дивно, в тій же Україні обидва варіанти є абсолютно прийнятними! В першому випадку рекрутер виміряє скільки копійок поміститься в дитячий вагончик, а в другому - подивиться на етикетку найдешевшого українського мочогонного засобу. Потім ця сума множиться на 30 і призначається кандидату як місячний заробіток Smile Знайома ситуація..?
    На щастя у західних компаніях почуття гумору не так розвинуте, як наслідок від вас будуть вимагати конкретної цифри. "Офіційну получку" рекомендую шукати на сервісах схожих на http://www.glassdoor.com, а про "неофіційну" я розкажу нижче.
    Варто звернути увагу на відмінності у підходах по підрахунку зарплати: в українських компаніях переважно бажають почути місячну суму; в західних - одразу річну до оподаткування.
    Річна зарплата:
    • на Україні = 12-13 * місячну + можливі бонуси
    • на заході =  14-16 місячних +  можливі бонуси

    Тому можливий випадок, коли ваш друг Вася буде заробляти в київській компанії 2000 USD в місяць, а ви у Парижі лише 1700 USD. Проте його річних дохід все-таки буде нижчим за ваш.

    УВАГА: на заході діє прогресивний податок на дохід! Це необхідно враховувати в остаточних підрахунках. А також в деяких країнах бонуси оподатковуються по іншій схемі (на вашу користь).

     
    "Неофіційна" частина - це різного роду пільги (benefits), а не офісна техніка, яку можна "прикарманити" поки ніхто не бачить Smile До цих пільг будуть відноситись:
    • фрукти/пиво/шоколадки в офісі
    • обіди в офісійній столові або ваучери на обіди в кафешках
    • ваучери на покупки в компаніях-партнерах
    • знижки в різних магазинах при наявності вашої карти-пропуску
    • безплатна сертифікація за рахунок компанії
    • приватна страхівка (особливо актуально для USA)
    • тощо

    Наприклад, Райфайзен у Відні має стільки пільг, що до їхньої річної зарплати можна сміло додавати 500-1000 неоподаткованих євро.

    Інформацію про наявні пільги ви завжди зможете попросити у рекрутерів вашої компанії. І не нехтуйте можливістю отримати щось на халяву! Це такі ж гроші як і зароблені вами за грою в "Косинку" Smile

    А тепер найосновніше правило яке завжди потрібно памятати: ніхто не збирається гратись з вами у Діда Мороза! "Вагон бабла" просто за красиві очі ніхто не подарує, на кожну вакансію є свій визначений "нерезиновий" бюджет. Максимум що можуть запропонувати - розширити неофіційну частину (наприклад, пять сертифікацій замість трьох; або 100 USD ваучерами на обід замість 75). На заході на вас будуть економити не гірше ніж у нас, проте в межах більш розвинутого законодавства і без надмірного фанатизму Smile (з чим на Україні є серйозні проблеми).

    І ще декілька слів...

    Ну от, здається нічого не забув Smile Не претендую на найбільш розгорнутий огляд, але сподіваюсь, що комусь це зможе допомогти. Якщо у вас є додаткові питання щодо роботи закордоном, то я завжди буду радий вам відповісти.

  • IIS 6 Application Pool Warm up

    В минулому спрінті ("sprint" - Wiki) мені дісталось доволі просте завдання - написати Powershell скрипт який би перезапустив заданий Application Pool і зробив декілька запитів до заданих веб-сторінок. В принципі, нічого надто складного: прочитати конфігураційний файл, перезапустити Application Pool і виконати простий HTTP GET запит. І все було б настіли ж тривіально як я і описав якщо б не одна деталь Smile

    Перед тим як я опишу проблему, давайте напишему просту функцію для HTTP GET запиту. Найпростіша функція може бути такою:
    function Http-Get {
        param (
            [parameter(Mandatory=$true)]
            [string]$url
        )
       
        $response = (new-object System.Net.WebClient).DownloadString($url)
       
        return $response;
    }


    або такою:

    function Http-Get {
        param (
            [parameter(Mandatory=$true)]
            [string]$url
        )
           
        $webRequest = [System.Net.WebRequest]::Create($url)
        $webRequest.Method = "Get"
       
        [System.Net.WebResponse]$webResponse = $webRequest.GetResponse();
       
        $responseStream = $webResponse.GetResponseStream();
        [System.IO.StreamReader]$reader = New-Object System.IO.StreamReader -argumentList $responseStream;
        [string]$results = $reader.ReadToEnd();
       
        $reader.Close()
        $responseStream.Close()
       
        return $results;
    }


    В результаті кожна з них поверне очікуваний результат, що мало б гарантувати нам "прогрів" IIS Application Pool. АЛЕ при наступному запиті до тієї ж сторінки (== $url параметр) з будь-якого веб-броузеру ви побачите, що час очікуванні відповіді від серверу буде практично таким же як і без "прогріву". У мому випадку результати були наступними:
    • без "прогріву" час очікування відповіді від сервера (у Firefox) ~8-10 секунд (час рендеру стрінки не враховується)
    • час виконання HTTP GET функції перший раз ~7 секунд, всі наступні - практично миттєво
    • час очікування відповіді від сервера (у Firefox) після "прогріву" ~5-7 секунд, всі наступні - практично миттєво
    Спочатку я думав, що мій HTTP GET виконується неправильно, але після виводу результатів в лог-файл мої сумніви розвіялись... Далі я спробував знайти хоча б якусь інформацію в Гуглі, проте нічого такого знайти мені не вдалось. Залишився єдиний вихід - емулювати роботу броузера з Powershell.
    Для цього я просто додав декілька хедерів (headers) у запит у другому варіанті HTTP GET функції і ЧУДО! Все запрацювало як і очікувалось :) Хоча залишилось питання який саме хедер спричинив такі зміни..? Виявляється це банальний "UserAgent":
    <blockquote>...
    $webRequest = [System.Net.WebRequest]::Create($url)
    $webRequest.Method = "Get"
    $webRequest.UserAgent = 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)';
       
    [System.Net.WebResponse]$webResponse = $webRequest.GetResponse();
    ...
    </blockquote>


    Всі тести проводились на Windows Server 2003 + IIS 6 (у IIS 7 з'явився вбудований модуль який виконує описану мною функцію "прогріву").

    Буду вдячний за додаткову інформацію, якщо хтось знає чому IIS поводить себе так дивно.

    P.S.: якщо комусь буде цікаво, то я можу описати як потрібно правильно робити перезапуск IIS Application Pool
    Надіслане Friday, March 04, 2011 11:14 AM від usarskyy | 0 коментарів
    Помічено як: ,
  • VS 2010 performance issues

    Ми перейшли на VS 2010 + ReSharper 5.1 (попередньо користувались VS 2008 + ReSharper 4.5) близько 3 тижнів тому і з того часу не проходить і дня щоб я не згадав команду девелоперів цього прекрасного програмного продукту :) Осодливо щедрим на компліменти я стаю під кінець робочого дня після 5-10 крешів студії. Про "феноменально швидкий" редактор коду я згадувати не буду так як це треба просто особисто попробувати :)

    Приведу конфігурацію своєї development-машини, щоб ніхто не подумав що я пробую кодити на 386-му і ще жаліюсь на життя:
    • WinServer 2003 SP2
    • Intel Xeon 5450 @ 3 GHz
    • 4 GB of RAM
    • WesternDigital Raptor 1600ADFD-60NLR5 (10000 RPM)
    До недавнього часу у мене прекрасно виходило запускати на цій конфігурації 2-3 VS2008, Chrome з двома-трьома десятками вкладок, Outlook, MS SQL Management Studio 2008 + ще декілька програм по-менше.
    Були креші, були OutOfMemoryException в "решарпері"... але не кожного ж дня!

    І так, якщо вас оминули такі пробеми - прийміть мої поздоровлення! :) Продовжувати читати вам уже не обовязково.

    Тепер для тих хто ще тут я розгляну найбільш популярні проблеми:
    Перша проблема про яку всі говорять - це ReSharper. Радили або відключити, або обновити до версії 5.1. Мені нічого з цього не допомогло :( Швидкодія покращилась, але недостатньо щоб компенсувати незручності "голої" IDE.
    Обновити можна тут: http://www.jetbrains.com/resharper/download/
    Відключити так:



    Під номером два йде текстовий редактор.
    Hotfix який має покращити швидкодію можна скачати тут: https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=27829
    Наступне що радять зробити - відключити ось ці опції:



    От це мені допомогло :)

    Третім номером буде "Insufficient Memory" помилка (виникає при копі-пейсті) і патч для неї, який знаходиться тут: https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=29729&wa=wsignin1.0 (а ще пост про цю проблему).


    Залишається не вирішене питання з 1-2-3-секундною затримкою при переключенні вкладок та при скролі великих файлів. Хоча останнє проявляється не завжди і виявити хоча б якусь закономірність мені так і не вдалось.

    Пишіть, якщо у когось є додаткова інформація по вирішенні вищезгаданих або неописаних тут проблем. Буду радий розширити цей пост :)

    LINKS:
    http://blog.kellybrownsberger.com/archive/2010/06/08/82.aspx

    @UPDATE 03.09.2010: після відключення всіх Extensions переключення між вкладками стало значно швидшим. Нажаль, затримки при прокрутці великих файлів залишились.

    Також помітив, що "студія" працює швидко перший день-півтора, а потім все різко переходить в режим "ultra slow" :) Як тільки я починаю щось писати CPU моментально загружається на 25-30%, використання памяті при цьому не зростає. Після перезапуску все знову починає працювати в нормальному режимі.

  • String vs FileInfo як аргумент методу

    Натрапив сьогодні на збірку лінків про всякі цікаві штуки (хочу сказати, автор справді знайшов цікаві теми). Одна з обговорюваних тем (прямий лінк) - як краще передавати шлях до файлу в метод: через FileInfo чи через string?

    Для тих хто не хоче перечитувати всі коментарі в темі на StackOverflow, постараюсь стисло передати всю їх суть:

    1. як "золоту середину" було запропоновано рішення з 2 методами один з яких приймає string, а інший FileInfo
    2. особливо оптимістично налаштовані вирішили, що використання Stream має вирішити  всі проблеми
    3. тільки один з учасників читає MSDN :) саме він і запостив, на мою думку, найбільш інформативний коментар ("The difference is primarily that there is a little bit of checking going on; the FileInfo constructor does some checking for a null or clearly invalid parameter...")

    Тепер декілька слів по кожному з пунктів:

    1. Створювати два методи (які будуть практично ідентичні!) тільки для того щоб всі залишились задоволеними - це якось тупо... і "попахує" добре відомою американською політкоректністю :)
    2. у випадку передачі Stream як аргумента без гострої на те необхідності - на кодревю зразу ж потрібно перевіряти справку від психіатра
    3. а от почитати MSDN + подивитись Reflector-ом всередину конструктора FileInfo і аргументувати його (не)використання - це досить-таки непогана ідея!

    І так, ось що можна побачити всередині конструктора:

    [
    code language="C#"]
            public FileInfo(string fileName)
            {
                if (fileName == null)
                {
                    throw new ArgumentNullException("fileName");
                }
                base.OriginalPath = fileName;
                string fullPathInternal = Path.GetFullPathInternal(fileName);
                new FileIOPermission(FileIOPermissionAccess.Read, new string[] {fullPathInternal}, false, false).Demand();
                this._name = Path.GetFileName(fileName);
                base.FullPath = fullPathInternal;
            }
    [/
    code]

    Коротке пояснення коду:

    • спочатку йде перевірка на null (до речі, в когось є ідеї чому "fileInfo" не перевіряється на пусту строку?) - це ясно
    • всередині "Path.GetFullPathInternal(fileName)" проходить валідація шляху до файлу + отримання повного шляху в разі, якщо "fileName" - це відносний шлях  (ага! а от перевірка на пусту строку :) )
    • перевірка прав на читання - на мою думку, одна з осносних причин чому варто використовувати FileInfo
    • виклик "Path.GetFileName(fileName)" просто перевіряє шлях до файлу на invalid-символи

    Як бачимо, нічого надзвичайного :)
    Переваги в порівнянні з методом який використовує
    string-аргумент очевидні:
    - "халявна" перевірка шляху на валідність
    - перевірка прав перед читанням (про це постійно забувають), а значить можна спростити код обробки помилок в процесі самого читання

    Недоліки:
    - виклик методу з
    kernel32 для отрмання повного шляху і перевірка прав доступу займає якийсь час, хоча не думаю що це критично

    FYI:
    Атрибути і вся інша інформація підгрузиться тільки в момент коли це справді необхідно, тому про додаткові витрати ресурсів хвилюватись не варто.


    Як на мене, я бачу більше "плюсів" при використанні
    FileInfo - додаткові халявні перевірки (в межах розумного) ніколи не бувають лишніми :)

    The end

    P.S.: Якщо хтось бажає додати "за/проти" кожного з методів, розказати байку про їх використання або просто висказати своє "+1" - прошу в коменти

  • Win7 for .NET developer

    Напевне, ні для кого не стане новиною те що МС вирішило роздати на халяву 2.5 млн копій бета версії Win7. І щось мені підказує, що багато з учасників dev.net.ua скористались можливістю скачати цю "халяву" :) Скачати - не проблема, а от чи варто її інсталювати..?
    "Гугл - наш друг" і по запиту "Windows7" видає "тонну" оглядів, які, всі як один, розписують яка ж хороша нова ОС! І ні один (принаймні, я так і не зміг знайти) не розказує якими граблями може получити по чолі чесний .NET девелопер :(
    Чесно кажучи, брак інформації по даному питанню мене трохи насторожив, але так як моя XPюша уже давно мріяла відправитись в "кращий світ", я все ж таки вирішив ризикнути... і от уже рівно тиждень мій лептоп працює з новою операційкою :)

    Не буду більше витрачати букви впусту і перейду до суті справи :)
    Позитивні сторони:
    1) швидкість + мінімальні потреби для роботи
    2) VS 2008 + SP1, IIS, TypeMock.NET, ReSharper 4.1 поставились без жодних проблем
    3) а чого ще треба для повного щастя? :)

    Негативні сторони:
    1) SQL Server 2005 SE проінсталювати не вдалось :(
    Прийшлось скачувати SQL Server 2008 with Tools (поставився без жодних проблем). А чому не SQL Server 2008 with Advanced Services запитаєте ви..? А тому що воно видає якусь незрозумілу помилку і навідріз відмовляється інсталюватись :(
    2) нажаль про SVN 1.5.* теж прийдеться забути. Прийдеться інсталювати щось з вітки 1.4.*
    3) трохи нервує нова політика безпеки і новий інтерфейс (думаю, ті хто довго працювали з вістою мали б бути звичні до цього)
    4) постійні апдейти! хоча, чого ж чекати від бета-версії..? :)

    І так, висновки :)
    Поки що враження в більшості позитивні і якщо хтось думає над тим, щоб теж проінсталювати Win7 - інсталюйте! (особливо я б рекомендував це для девелоперів, які працюють над десктопними рішеннями). Але памятайте, що термін бета-версії закінчується 1 серпня!

    UPDATE: VMWare Player заінсталювався без проблем. Gtk# 2.12.* - викидує помилку на початку інсталяції
    UPDATE 2 (10.02.09): хочеться додати ще декілька слів про Win7: 1) баг з msi-інсталлерами можна виправити так як мені підказали в коментах; 2) в процесі роботи було знайдено ще декілька дивних проблем :(
    Перша проблема - інколи при роботі курсор різко змінює своє положення без видимих причин. Звичайно, це не критично, але трохи діє на нерви...
    Друга - FF 3.0.6 часто починає "відгризати" 15-25% процесорного часу (хоча на WinXP SP2/Win2003 все працює чудово!).
  • Architects in Ukraine - code review

    Думаю уже всі встигли встигли прочитати новину про новий айтішний портал і протестити його функціонал, тому "копіпастити" в свій блог цю інформацію не буду. Якщо ще не встигли - "лінки вам в руки" :)

    Особисто від себе додам: все сподобалось! Як ідея, так і реалізація. Розробникам бажаю продовжувати розвивати ресурс з тим же ентузіазмом!

    Тепер коротко про те для чого я почав писати цей пост :)
    Коли прочитав "Файловое хранилище SkyDrive" аж в голові закрутилось :) Памятаю, читав що команда SkyDriv-a хотіла випустити API, але новин про реліз так і не було... а тут цілий ПОРТАЛ зберігає файли на майкрософтських серверах! ХАЛЯВНО! 5 Гігабайт!
    На жаль, після біглого перегляду коду вияснилось, що ніякого API портал не використовує... Натомість девелопери (Константин Косинский і Алена Косинская) цілком успішно використали уже наявні можливості (дивимось VideoListControl.ascx):
    </asp:XmlDataSource ID="fileListDataSource" runat="server" DataFile="<%$ AppSettings:FileList %>"
        XPath="/rss/channel/item" EnableCaching="true">

    Ключ "FileList" веде сюди.

    Залишилось придумати якби реалізувати автоматичне додавання файлів і можна запускати власний rapidshare :)
  • Kaspersky Antivirus SDK - міф чи реальність?

    На днях менеджерам моєї компанії захотілось чогось "великого і прекрасного", ну як завжди Big Smile Коротка суть "великої" ідеї: юзер аплоадить файл на сервер, який потім треба певним чином обробляти. Ніби нічого незвичайного... окрім того, що всі юзери "по дефолту" - погані і можуть загрузити якусь "бяку" Sad Під останнім розуміються дві речі: "небажаний контент" (порнографічні/расистські малюнки, ...) і віруси.
    На жаль, з першим можна боротись тільки людськими ресурсами... а от другий треба фільтрувати автоматично на етапі аплоаду.

    Не знаю хто як звик відловлювати віруси у себе на компі, але я довіряю свій дорогоцінний лептоп антивірусу AVG :) Майже так само думає і керівництво моєї компанії і для того щоб гарантувати "тотал секюріті" придбало N ліцензії Касперського (з таким вибором я не зовсім згідний, але моєї думки ніхто не питався).

    Думаю, всім зрозуміло що сканувати кожен файл що був завантажений на сервер вручну - це повний ідіотизм (тим більше, якщо в словниковому запасі є такі страшні слова як "Касперський" і "API" Big Smile)
    Після недовгих пошуків в Гуглі я знаходжу сторінку з описом Kaspersky Antivirus SDK... і НЕ знаходжу лінка на скачування цього SDK! Перше що подумалось - сьогодні не мій день! Але не все так погано і завжди можна мило поспілкуватись з саппортами :) Дзвоню... спілкуюсь...
    І що цікавого я дізнався? Перше, музика "на очікуванні" у них досить непогана, хоча постійно повторюється Tongue Tied (я це перевірив за ті 4 рази як дзвонив, в сумі "провисів" на ліній чуть більше пів години). Друге, саппорт уявлення не має що таке SDK і головне що існує Kaspersky Antivirus SDK (я не став їх шокувати історіями про інші SDK, які описані у них на сайті :) )! Третє, на російському сайті касперського про SDK нічого не згадується! (в кого є думки з цього приводу - прошу прокоментувати).
    В результаті, все що я отримав - це мейл саппорту SDK. (в цьому місці мій настрій суттєво покращився і я навіть вирішив, що сьогодні мені щастить, але...)

    Пишу лист в SDK-саппорт: доброго-дня-бла_бла_бла-треба-SDK-підкажіть-де-скачати. На моє щастя відповіли мені досить швидко, десь за 3-3.5 години, але замість довгоочікуваного лінка ввічливо поцікавились для чого він мені здався. Ну що ж, в скороченій формі пояснюю хто я, в якій компанії працюю і для чого мені потрібен SDK. Пройшло ще 3 години... Отримую ще одну відповідь... скажу чесно, я очікував будь що: від "а SDK можна скачувати тільки на Новий Рік і Піздво" Big Smile до "ми забули видалити наш першоквітневий жарт", але аж ніяк не "Я передам ваші контактні дані нашим менеджерам і вони з вами звяжуться"! При цьому варто зауважити, що спілкувався я не з простим девелопером, а з одним із керівників (принаймні в підписі мейлів у нього значиться такий статус)!

    За своє життя мені довелось скачати немало SDK-шок, але ще ні разу для цього не треба було витрачати стільки часу на спілкування з саппортами і тим більше розмовляти з менеджерами (в принципі, це мене чекає в найближчому майбутньому). Я взагалі мовчу про логічне питання "а для чого це все?". Таке враження, що керівництво компанії всіма силами старається запобігти інтеграції своїх продуктів з іншими системами (хоча в цьому випадку можна було б взагалі не згадувати про SDK). А відповідальні керівники бояться приймати хоча б якісь відповідальні(?) рішення... Повний "ахтунг"!

    І для чого я це все написав..? Головна мета посту - надати першу інформацію тим нещасним, хто захоче повторити мій шлях. Ну і запитати в шановних колег якщо хтось уже мав незабутній досвід спілкування з менеджерами/девелоперами Касперського - відпишіться, пліз, в коментах! Буду дуже вдячний за будь-яку інформацію Wink

    UPDATE 13.08.2008
    На наступний день після написання цього поста мені написав sales-менеджер Касперського (тут можна поставити 5+ за оперативність!). Він переслав документ який треба було підписати і відіслати назад, коротка суть документу - моя компанія не має права копіювати/продавати і т.д. Kaspersky AntiVirus SDK ну і т.д. Як результат, після узгодження всіх формальностей, я мав би отримати демо версію SDK.
    Так як пересилання мейлів/факсів ніколи не було моєю сильною стороною, я просто подзвонив sales-менеджеру і поцікавився скільки коштує повна версія AntiVirus SDK. На мій подив, він не зміг дати мені навіть приблизну відповідь (wtf?!). Основним аргументом неможливості сказати ціну було те, що вони не знають які зміни в SDK мають бути зроблені спеціально на моє замовлення (я так і не зрозумів чи вони для всіх "підганяють" пакет, чи це тільки я попав на спец. акцію :) ). Хоча я і був трохи шокований таким розвитком подій, але все-таки поцікавився скільки ж буде коштувати "стандартний" пакет... на що мене ввічливо запитали "а скільки користувачів буде перевіряти ваша система?". Скажу чесно, таке питання повністю відправило мене в нокдаун! Можна було б зрозуміти питання "а скільки серверів з нашим антивірусом ви маєте і на скільки з них буде залучено у вашому проекті?", але кількість користувачів - це повний "ахтунг"!
    Закінчивши розмову, я переслав лист з документом проджект менеджеру і попросив його розібратись в ситуації.
    До цього часу, ніяких новин від мого ПМ-а на рахунок Kaspersly SDK не надходило (я так підозрюю що і не надійде).


    P.S.: може хто знає, чи існує ще вітчизняний антивірус UNA? памятаю, колись про нього досить непогано відзивались і я навіть хотів купити ліцензуйну версію, але так і не зміг її знайти :(
  • Are you already Meshed?

    Не знаю хто як переклав "Meshed" і про що подумав, але мова зараз піде про платформу LiveMesh Wink

    Про LiveMesh я встиг начитатись всяких маркетингових "охів-ахів" і навіть зареєструвався в черзі на тестування... але 2 дні тому фортуна показала свою начищену до блиску "блендаметову" посмішу і завдяки добрим людям у мою Гмейловську скриньку "впало" запрошення на тестування "LiveMesh tech preview" :)
    Скажу чесно, після залогінювання на порталі я спочатку було витягнув свій губозакатувальний механізм і почав шукати якусь лінку з текстом "Download LiveMesh SDK" (що цілкому природньо для девелопера Geeked )... але круто обламався Tongue Tied Простим смертним треба чекати осіннього публічного релізу (тоді як деякі словочі програмери уже використовують SDK "на повну" і успішно викладають скрінкасти на цю тему!).

    Як тільки стало зрозуміло, що SDK мені не знайти, я почав освоюватись в користувацькому веб-інтерфейсі... Що тут можна сказати? Виглядає досить симпатично :) Звичний віндовський інтерфейс стилізований під Vist-у:

    Але це тільки мала частина всіх можливостей! Щоб відчути що таке LiveMesh насправді, потрібно додати свій ПК в "девайси" і визначити папки які будуть синхронізуватись:


    При додаванні ци самих девайсів не обійшлось без "ложки дьогтю" Sad Мій робочий ПК працює під ОС WinServer 2003, яка не входить у список ОС що підтримуються клієнтом LiveMesh (він є частиною процесу додавання нового девайсу і він же потім синхронізує папки/файли з сервером), тому він вперто показував ось таке симпатичне вікно:

    Після недовгих пошуків виявилось, що проблему вирішує параметр "-Force" при запуску інсталяційного пакету Smile Чому було просто не додати на форму кнопку "Install anyway" для мене так і залишилось загадкою.
    Після інсталяції і додавання свого робочого ПК в список девайсів клієнт працював стабільно, ніяких проблем помічено не було... Дивно, правда? Big Smile

    І так, синхронізувати файли між ПК і сервером - це круто... але якось тупо Confused Процес дуже скидається на банальний бекап. Тому було вирішено принести в жертву домашній лептоп і встановити LiveMesh клієнт ще й на нього.
    І тут [цензура] знову "лажа"!!! Клієнт навідріз відмовився інсталюватись на Win XP SP2 :( Знову до болю знайоме "-Force"... знову все працює ОК Smile

    Наступним пунктом в списку тестування стояло "розшарювання" папки... На цьому етапі не було ніяких сюрпризів, все пройшло без проблем.

    Тепер коротке резюме: у мене є 2 ПК з встановленим LiveMesh клієнтом, розшарена папка і велике бажання щось поламати :))
    Останнє вилилось у тестування функції "Live Remote Desktop" (яка, як сказано в маркетингових матеріалах, має працювати стабільно незважаючи на фаєрволи, NAT та інші страшні слова :) ).
    Для тестування "живого" RD я спершу законектився з робочого ПК на домашній лептоп. В загальному - враження позитивні, хоча відчувались невеликі затримки, яких ніколи не було при використанні звичного Remote Desktop.
    Окрім цього, попри всі нові корисні "features", які мають гарантувати ще більшу безпеку зєднання, я був радий побачити що копіювання файлів між 2 ПК через Remote Desktop працює і надалі :) Але кому воно потрібне, якщо у нас є папка з автоматичним синхронізуванням.?!

    Зізнатись чесно, до питання синхронізації файлів я підійшов з особливим ентузіазмом! Скопіювати 1-2 фільми було б найпростіше (в мому тестовому аккаунті доступно 5 Гб), але користі від них мало... тому я скопіював "trunk" SVN-a проекту CC.NET :) Процес синхронізації "лептоп -> LiveMesh Server -> робочий ПК" зайняв біля 5-10 хв (70 Мб).
    Результат доволі непоганий, АЛЕ як завжди не все так добре як здається. На даний момент у LiveMesh не реалізовано функції "diff", тому при зміні файлу клієнт синхронізує його ПОВНІСТЮ, що доволі неекономно з точки зору трафіку (для прикладу, в цьому проекті завдяки diff-у все працює набагато швидше). На додаток, при синхронізації кудись пропали всі "hidden" папки (у мому випадку це були всі ".svn"-папки).

    Після випробування функції "Live Remote Desktop" з робочого ПК підійшла черга до лептопа. У цьому місці треба зробити невеликий відступ і сказати, що робочі ПК в моїй компанії "заховані" за 2 чи 3 фаєрволами і ще якоюсь фігньою, яку я не зовсім розумію... Тому для забезпечення конекту своїх працівників до робочого місця компанія використовує софт третьої сторони, що створює тимчасовий VPN канал між робочим і домашнім ПК. На даний момент це єдиний спосіб доступу ззовні.
    Знову звичний інтерфейс клієнтської програми...

    Connect to device... УРА! я знову можу читати свою робочу пошту :) Хоча останнє трохи проблематично робити і ось чому саме: на роботі у мене два 21-дюймових монітори (Dual Monitor), в кожного з них "Screen resolution" більший ніж на мому лептопі... і тепер уявіть собі картину, коли цей Extended Desktop пробує втиснутись на маленькому (15.4 дюйми) лептопному дисплеї... уявили? Картина явно не для людей з слабкою психікою!
    Раніше, при використанні звичайного Remote Desktop-а, все працювало нормально: Screen resolution на робочому ПК змінювався, вікна з додаткового монітору "зїжали" на основний, що давало можливість нормально працювати... А зараз "хотіли зробити як краще, а получилось як завжди" :( Сподіваюсь, у фінальній версії все буде працювати як і має працювати :)

    Summary. Що тут можна сказати?
    1) Як для "tech preview" версії все працює досить непогано, будемо надіятись, що надалі все буде тільки краще :)
    2) В процесі роботи я все-таки побачив одне вікно помилки... нажаль все що там було написано це "Виникла помилка (а я і не помітив :) ). Номер помилки такий_то". Не знаю як хто, а я б хотів побачити більш інформативний текст :) Хоча це ще можна списати на версію продукту...
    3) Також хочеться думати, що в майбутньому Майкрософт перестане дразнитись скрінкастами на тему "як буде добре жити коли ми випустимо SDK" без надання можливості попробувати це SDK!

    Особисто від себе хочу додати: ЗОДОВБАЛО вікно допомоги! Я так і не знайшов спосіб, щоб його відключити :(


    Всім дякую за увагу :) Також буду радий почути про ваш досвід роботи з LiveMesh!
  • І знову про StyleCop

    З самого початку думав почати цей пост з слів типу "який я хороший, добрий, мудрий і т.д."... але прийдеться визнати, що я ППЦ який лінивий :))

    Як усім уже, мабудь, відомо Microsoft 23 травня цього року виклала в публічний доступ свій Source Analyzer (StyleCop). І все було б просто супер, якщо б не той факт, що всі правила перевірки коду - абсолютно статичні :( Щоб остаточно переконатись в цьому, в день релізу я трохи "погуглив" і натикнувся на цікавий пост, де один з кодерів майкрософта розказував які вони щасливі з своїм Source Analyzer-ом :) Також він писав, що правила у ньому статичні не через "криві руки "... а тому що тільки ці правила можуть принести абсолютне щастя девелоперам які будуть ними керуватись! Одним словом, логіка в його словах проста - "ми щасливі, і вам прийдеться бути щасливими" :)
    Так як характер у мене поганий, я погано сприймаю той факт що комусь роблять добре. Тому з допомогою Reflector-а я дизасемблював Source Analyzer і хотів створити свої правила. Проте, все що було після дизасемблювання йшло туго і постійно відкладувалось "на завтра" :( Як результат - фінішна пряма позаду, але перше місце дісталось іншому.

    Цього "іншого" і його статтю можна знайти тут. Що я можу сказати..? В пості добре описаний шлях створення custom rules з прикладами, всі хто хотів додати в StyleCop щось своє тепер мають таку можливість :) Думаю, в найближчому майбутньому можна сподіватись на появу Add-In-а який дозволить писати власні правила в конфігураційних файлах і створювати локальне (проте власне!) щастя :)

    P.S.: Також раджу зайти сюди. Автор цього поста пробує схрестити StyleCop з ReSharper-ом! І навіть пообіцяв викласти сорси в публічний доступ!
    Надіслане Wednesday, June 04, 2008 8:51 PM від usarskyy | 6 коментарів
    Помічено як: , ,
  • Перевірка параметрів у TypeMock.NET

    Не так давно Mike Chaliy опублікував пост про перевірку параметрів за допомогою Rhino.Mocks. Так як мені довелось трохи попрацювати з TypeMock.NET, то я поцікавився у автора чи не знає він як реалізувати подібну штуку там. Нажаль Mike Chaliy дав негативну відповідь :( тому прийшлось розбиратись самотужки.

    В результаті виявилось, що у TypeMock.NET це реалізовується набагато простіше:

        public class SomeClass
        {
            public int TestMethod(int x, string y)
            {
                throw new NotImplementedException("TestMethod(int, string) is not implemented");
            }
        }
        [TestFixture]
        [ClearMocks]
        public class Tests
        {
            [Test]
            [VerifyMocks]
            public void FirstTest()
            {
                SomeClass s = new SomeClass();
                using (RecordExpectations recorder = RecorderManager.StartRecording())
                {
                    recorder.ExpectAndReturn(s.TestMethod(1, "2"), 10).RepeatAlways();
                    recorder.CheckArguments(Check.Not(-1, "'x'-parameter can't be less than 'zero'"), Check.NotNull("'y'-parameter can't be null"));
                }
                Assert.AreEqual(10, s.TestMethod(1, "2"));
                Assert.AreEqual(10, s.TestMethod(-1, null));
               
            }
        }


    Все ніби і класно, але щось підказує, що має бути "ложка дьогтю"... і імя цій ложці - "ліцензія"! :( Іншими словами, код приведений вище буде працювати тільки після покупки Professional або Enterprise ліцензії. А "бідним" студентам прийдеться користуватись "стандартним" набором можливостей:

        [TestFixture]
        public class Tests
        {
            [Test]
            public void SecondTest()
            {
                Mock sc = MockManager.MockAll(typeof(SomeClass));
       
            sc.AlwaysReturn("TestMethod", 10).Args(Check.Not(-1,
    "'x'-parameter can't be less than 'zero'"),
    Check.NotNull("'y'-parameter can't be null"));
                SomeClass s = new SomeClass();
                Assert.AreEqual(10, s.TestMethod(1, "2"));
                Assert.AreEqual(10, s.TestMethod(-1, null));
            }
        }



    >> UPDATE

    Тут мене справедливо "ткнули носом" в той факт, що я пропустив важливе слово "Callback" в кінці теми минулого поста від Mike Chaliy. Зараз я постараюсь виправитись і для повноти картини додам ще один код тесту:

        [Test]
        public void ThirdTest()
        {
            Mock sc = MockManager.MockAll(typeof(SomeClass));
            SomeClass s = new SomeClass();
            sc.AlwaysReturn("TestMethod", 10).Args(
                                        new ParameterCheckerEx(delegate (ParameterCheckerEventArgs e)
                                        {
                                            if(((int)e.ArgumentValue) < 0)
                                            {
                                                e.FailureMessage = "First param can't be less then zero";
                                                return false;
                                            }
                                            return true;
                                        }),
                                        new ParameterCheckerEx(delegate (ParameterCheckerEventArgs e)
                                        {
                                            if (e.ArgumentValue == null)
                                            {
                                                e.FailureMessage = "Second param can't be null";
                                                return false;
                                            }
                                            return true;
                                        }));
           
            Assert.AreEqual(10, s.TestMethod(1, "2"));
            Assert.AreEqual(10, s.TestMethod(-1, null));
        }


    От тепер справді можна порівнювати :)
    Надіслане Thursday, May 22, 2008 3:08 PM від usarskyy | 3 коментарів
    Помічено як: ,
  • Тріал період у ... 0 днів!

    Всім алоха!

    Warning! Якщо ваші релігійні чи ще_якісь_там погляди не дозволяють користуватись такою чудовою тулзою як Reflector, прохання далі не читати! Так як в основі даного поста буде лежати саме його використання.

    Думаю, цей пост буде цікавий насамперед новачкам у .NET, тому прохання до "фулів" і "суперіорів" не писати коменти в стилі "ми таке в дитсадку робили".


    Частина перша: передісторія
    Недавно я вирішив додати до однієї з власних програмок трохи гламуру (під "власною" я розумію тулзу, яку використовую виключно я і тільки я). Конкретніше, мені знадобився красивий ListView Smile Гугл видав декілька результатів, але мій вибір впав саме на цей контрол.
    І хоча виробник не давав ліцензії "for non-commercial use", я все-одно вирішив викачати бібліотеку і протестувати її тріальну версію Smile

    Скачав... проінсталював... переніс контрол на форму... тут мені запропонували або купити контрол, або задовільнитись 30-денним тріальним періодом, я вибрав тріал (у нашому колгоспі поки не дають грошей на такі гламурні штуки Crying )... додав декілька колонок у ListView... натиснув F5... і тут мені повідомляють:



    Не знаю як хто, але я розраховував на трохи більший тріал-період Big Smile
    Повторний запуск не дав жодних позитивних результатів Tongue Tied


    Випивши чаю і обдумавши ситуацію, я вирішив що просто так не здамся і все-таки подивлюсь як виглядає скачаний ListView в дії (звичайно ж крякнувши його перед цим Devil )! Єдине що лякало в цій ситуації - це захист бібліотеки.

    Я більш ніж упевнений, що люди, які зробили скачаний мною контрол - професіонали своєї справи. І як професіонали вони вирішили скористатись послугами таких же професіоналів з захисту програмних продуктів.
    Часи коректування ключів реєстру з назвами IsRegistered давно минули, тому мені мало б світити повне фіаско у справі "крякання"... але, як кажуть, "проба грошей не коштує" Cool

    Отож, що ми маємо на цей момент?
    1) GUI-бібліотека, яка відмовляється працювати гарантовані 30 днів - 1шт.
    2) Велике бажання спробувати цю бібліотеку в дії - 1 ВЕЛИКА шт.
    3) Автор цього поста, юзверь який прочитав статтю "Reflector for dummiesGeeked - 1 шт.

    А що нам необхідно?
    1) Все вище перелічене (хоча, третій пункт прийдеться замінити Wink )
    2) Reflector і один чудовий Add-in до нього


    Зовсім випадково весь необхідний набір виявився у мене на вінчестері Yes Тому я переходжу до наступної частини!


    Частина друга: темні справи
    Відкриваємо папку, куди був встановлений наш GUI-компонент і дивимось які там є бібліотеки. У моєму випадку їх 3:
    1) LidorSystems.IntegralUI.DLL
    2) LidorSystems.IntegralUI.Lists.DLL
    3) LidorSystems.IntegralUI.Lists.ListView.dll

    Судячи з назв, декомпілювати їх прийдеться у перерахованому вище порядку...

    Відкриваємо Reflector, додаємо потрібні нам ліби і зберігаємо їхні "сорси" на хард-диск Smile Як зберегти сорси показано на малюнку нижче (не забудьте встановити скачаний Add-in!):



    В результаті маємо отримати 3 незалежні проекти.


    Наступний крок: створюємо WinForms-проект (для тестування нашого контрола) і додаємо до нього проекти декомпільованих бібліотек. Після цього потрібно не забути поправити референси в кожному з декомпільованих проектів один на одного, так як на даний момент всі референси вказують на бінарники, а нам потрібно щоб вони були "проектними" (project reference).

    Тепер пробуємо скомпілювати весь наш солюшн... З першого разу може і не вдатись, так як можуть бути незначні помилки в коді, які потрібно буде виправити. Після вдалого компілювання не поспішайте додавати контрол на форму і пити пиво! Памятаєте заради чого я почав писати цей пост? Правильно! заради обходу механізму тріал-періоду Wink

    Тому спробуємо додати ListView програмно (хоча достатньо буде просто створити екземпляр його класу):

            private void button1_Click(object sender, EventArgs e)
            {
                ListView testControl = new ListView();
                Controls.Add(testControl);
            }


    Запускаємо WinForms-проект і натискаємо на button1... На моніторі має зявитись вікно аналогічне першому малюнку. Ввічливо відмовляємось від купівлі компоненти і отримуємо exception в методі Init() класу LidorSystems.IntegralUI.Lists.ListView. Код, що викликав exception виглядає так:

    if (!base.DesignOnly && !this.Intialize(this))
                {
                    throw new Exception("Your evaluation has expired");
                }


    Думаю, логічно буде закоментувати цю частину коду Wink Після цього компонент можна вільно тестувати!
    А щоб все було взагалі ідеально, видаліть атрибут LicenseProvider(typeof(EncryptedLicenseProvider)) класу ListView.


    Заключна частина
    Як висновок можу сказати одне, платити гроші за всякі "хитрі" LicenseProvider-и для компонентів не має змісту. Всі вони легко обходяться і не становлять якусь надзвичайну міру захисту :( В найгіршому випадку, прийдеться витратити на пів години більше часу на видалення перевірки ліцензії Smile


    Памятайте, що використання "крякнутих" пограмних продуктів категорично заборонене! За таке можна "отримати по вухах" :)
    Надіслане Thursday, March 06, 2008 12:23 AM від usarskyy | 7 коментарів
    Помічено як: , ,
  • Програвання музичних файлів

    Арігато!

    Не так давно я зіткнувся з необхідністю програвання музичних файлів у своїй програмі. Пошук в Гуглі видав досить багато результатів, але всі вони зводились до написання врапера над DirectSound (або використання стандартних засобів .NET Framework, які і є тим самим врапером).

    Мені було абсолютно всерівно над чим там треба писати врапер (головне, щоб це працювало!), тому я швидко скопіпейстив текст класу у свії проект... і круто обломався! Динаміки навіть не пікнули Crying, а головне помилок при виконанні коду також не виникло. Тобто, все ніби працює, але в той же момент нічого не працює Tongue Tied

    Подальші пошуки проблеми дали нульовий результат, у всіх все було "тіп-топ". А якщо і не працювало, то тільки тому що хтось погано скопіпейстив код :( Метод "тику" також не приніс потрібного результату.
    Єдиним позитивним моментом в цій ситуації було те, що це потрібно для моєї власної тулзи, яку ніхто окрім мене не буде використовувати :)


    Пройшов приблизно місяць і сьогодні моя "звукова" проблема дістала продовження Big Smile Зовсім випадково я натикнувся на бібліотеку, що могла відтворювати більшість популярних аудіоформатів (принаймні, автори так написали).
    Спортивний інтерес взяв гору і я таки вирішив перевірити чи вона спрацює на мому лептопі. Як виявилось - "не спрацює" :( Але ж хіба я з індуського роду, щоб так швидко здаватись? Тому одразу ж вирішив скачати ще кілька ліб... які в результаті так само вперто відмовлялись працювати!
    Я вже думав було завершити свої блукання в "павутині", коли натрапив ось на цю сторінку. Чесно кажучи, я був налаштований досить скептично щодо цього продукту, так як він використовував той самий DirectSound :( Але "проба грошей не коштує" і можна було спробувати "покулупатись" ще кілька хвилин :)
    І, О ЧУДО! все запрацювало! без жодних "танців з бубном"!

    Якщо у когось виникали такі ж проблеми і ви знаєте ЧОМУ САМЕ вони виникали - відпишіться в коментах!
Більше повідомлень Наступна сторінка »