вторник, 7 июня 2011 г.

Используем Microsoft Excel при помощи C# и .NET

Для того, что бы можно было начать работу с Microsoft Excel необходимо в проект добавить ссылку на COM компонент "Microsoft Excel 12.0 Object Library" после чего в проекте можно будет использовать классы из пространства имен Microsoft.Office.Interop.Excel.

Для быстрого старта и понимания работы с Microsoft Excel посредством в COM в C# достаточно базового примера - считывание из указанного файла .xlsx и запись в указанный файл. Я использовал .NET Framework 4 и Microsft Excel 2007. 

Код программы с комментариями: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MicrosoftExcel = 
    Microsoft.Office.Interop.Excel;

namespace MicrosoftExcelDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // создание объекта 
            // приложения
            MicrosoftExcel.Application application = 
                new MicrosoftExcel.Application();
            try 
            {
                // открытие диалогового 
                // окна для поиска файла 
                application.FindFile();
                // считывание данных из активного листа 
                ReadData(application.ActiveSheet);
                // запись в активный лист
                WriteData(application.ActiveSheet);                
            }
            catch(Exception e)
            {
                Console.WriteLine(
                    "Exception catched " + 
                    "with message: '{0}'", 
                    e.Message);
            }
            finally
            {
                // обязательное завершение
                // работы приложения 
                application.Quit();                            
            }
            Console.ReadKey();
        }

        static void ReadData(
            MicrosoftExcel.Worksheet workSheet)
        {
            // индексация в Microsoft Excel идет с 1
            // далее следует обход только 
            // используемой области активного листа 
            for (int row = 1; 
                row <= 
                  workSheet.UsedRange.Cells.Rows.Count; 
                row++)
            {
                for (int col = 1; 
                    col <= 
                      workSheet.UsedRange.Cells.Columns
                               .Count; 
                    col++)
                {
                    Console.Write(
                        "{0, 5} ", 
                        workSheet.UsedRange
                                 .Cells[row, col]
                                 .Value);
                }
                Console.WriteLine();
            }
        }

        static void WriteData(
            MicrosoftExcel.Worksheet workSheet)
        {
            for (int row = 1;
                row <= 
                  workSheet.UsedRange.Cells.Rows.Count; 
                row++)
            {
                for (int col = 1; 
                    col <= 
                      workSheet.UsedRange.Cells.Columns
                               .Count; 
                    col++)
                {
                    workSheet.UsedRange
                             .Cells[row, col]
                             .Value *= 10;
                }                
            }
        }
    }
}

Или вы можете скачать исходный код и файл с которым я работал здесь

Если возникнут вопросы или что-то не понятно, то обязательно спрашивайте, я всегда рад помочь! 

четверг, 17 марта 2011 г.

LinkDump #01

Я неделю назад опубликовал LinkDump #00 (18 ссылок). Я собираюсь попробовать продолжить данное начинание и публикую следующий список ссылок:

1. http://www.webmascon.com/topics/text/18a.asp

Перевод статьи Якоба Нильсена: "Перевернутые пирамиды в киберпространстве".

2. http://www.useit.com/alertbox/9704b.html

Jacob Nielsen: Do Websites Have Increasing Returns?

3. http://www.webmascon.com/topics/adv/7a.asp

Статья Якоба Нильсена, заметка к предыдущей ссылке: "Кривые Зипфа и популярность веб-сайтов".

4. http://www.webmascon.com/topics/adv/6a.asp

Краткая заметка Якоба Нильсена: Трафик от ссылающихся сайтов. 

5. http://www.webmascon.com/topics/business/9a.asp

Якоб Нильсен: Обманчивость нетипичных примеров.

6. http://www.webmascon.com/topics/business/16a.asp

Якоб Нильсена: Десять главных ошибок веб-менеджера.

7. http://www.insight-it.ru/programmirovanie/oop-ili-ne-oop/

ООП или не ООП.

8. http://citforum.ru/nets/protocols2/2_04_01.shtml

В сетях Ethernet используется метод доступа к среде передачи данных, называемый методом коллективного доступа с опознаванием несущей и обнаружением коллизий (carrier-sense-multiply-access with collision detection, CSMA/CD).

9. http://citforum.ru/nets/protocols2/2_04_00.shtml

Введение в стандарты технологии Ethernet.

10.  http://citforum.ru/nets/protocols2/2_04_02.shtml

Форматы кадров технологии Ethernet.

11. http://citforum.ru/nets/protocols2/2_04_03.shtml

Спецификации физической среды Ethernet.

12. http://citforum.ru/nets/protocols2/2_04_04.shtml

Ethernet: стандарт 10Base-5.

13. http://citforum.ru/nets/protocols2/2_04_05.shtml

Ethernet: стандарт 10Base-2. 

14. http://citforum.ru/nets/protocols2/2_04_08.shtml

Правило 4-х повторителей.

15. http://citforum.ru/nets/protocols2/2_04_09.shtml

Методика расчета конфигурации сети Ethernet.

16. http://citforum.ru/gazeta/167/

Почему предприятия не заинтересованы в NoSQL?

18. http://www.useit.com/alertbox/frequentbrowser.html

Frequent-Browser Programs

19. http://www.webmascon.com/topics/adv/3a.asp

Якоб Нильсен: Почему веб-зеваки ничего не стоят.

20. http://www.webmascon.com/topics/business/15a.asp

Постоянные посетители вашего Web-сайта.

21. http://rian.ru/politics/20110302/341088817.html

РИАНовости: За чистоту помыслов. Сюжет: 20 лет без СССР: анализ, комментарии, документы.

22. http://www.webmascon.com/topics/adv/2a.asp

Якоб Нильсен: Почему реклама не работает в Web.

23. http://citforum.ru/nets/protocols2/2_04_06.shtml

Ethernet: стандарт 10Base-T.

24.  http://citforum.ru/nets/protocols2/2_04_07.shtml

Ethernet: стандарт 10Base-F.

Итого вместе с первым linkdump у меня вышло 42 ссылки и это всего лишь за 2 недели. 

воскресенье, 13 марта 2011 г.

Один язык программирования на стороне клиента и сервера

О чем пойдет речь 

Я хочу поразмышлять на тему языков программирования под веб, а именно, меня интересует вопрос: "Можно ли выучить один или чуть более языков программирования и спокойно разрабатывать веб-приложения, как на стороне сервера, так и на стороне браузера?".

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

Какие проблемы (возможно надуманные) мы имеем на данный момент

Сейчас ситуация представляется мне так: под клиент (далее браузер) программируют используя javascript как язык программирования, также html, css, возможно xml, на сервере же (далее бекенд) ведется разработка на PHP, Java, Python, ASP.NET и даже Javascript! и других языках программирования. Также на бекенде работают с базой данной, зачастую используют язык SQL.

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

Но другое дело поддержка кода, это же сколько кода получается на разных языках, в следствии чего приходится переключаться, то Javascript, то PHP, то CSS, то HTML. Причем у каждого из этих языков свои тонкости, которые порой часто забываешь, да и просто сложно учитывать. Возьмите, например, даже тот же javascript, вы думаете, что знаете этот язык? Черта с два!

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

Способ решения номер один: php_to_js($fileName)

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

function php_to_js($fileName)
{
    $content = file_get_contents($fileName);
    return str_replace(
            array('', '$', '?>'),
            array('', '.', '', ''),
            $content);
}

Данный код всего лишь на всего заменяет свойственные символы для php на свойственные для javascript символы. Внимание! Это всего лишь набросок, так сказать, концепт более сложных движков.

Вот как мы это применим в html:

<!DOCTYPE HTML>
<html>
    <!-- head part -->
    <body>
        <div id="simpleDiv">Text</div>
        <input type="button" id="btn" 
                  value="click on me" />
    </body>
</html>

А вот сам example.php:

$window->onload = function()
{
    $document->getElementById('btn')
             ->onclick = function()
    {
        alert('Text changed');
        $document->getElementById('simpleDiv')
                 ->innerHTML = 'another text';
    };
};

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

Способ решения номер два: javascript and backend handler

Есть другой способ, который мне более всего по душе, но это не чисто один язык. Суть в том, что вы пишете полностью приложение под браузер используя javascript. А когда вам необходимо достучатся к данным на сервере вы используете технологию ajax, причем на сервере скрипты на php или любом другом языке, пишутся легковесными, например, запрос к БД, и вывод ответа в виде json.

Наверное, один из плюсов такого подхода то, что почти вся логика будет на клиенте, хотя для некоторых видов приложений это может быть и минус. Причем логика эта описывается при помощи javascript. Тут главное следит за памятью и быстродействием, ибо вы не знаете, что там вас ждет на клиенте. У кого-то компьютер мощный, а у кого-то нет.

Способ решения номер три: nodejs 

Третий подход, который я нашел весьма популярным - это nodejs. Это популярный движок в последнее время. Суть его заключается в том, что вы пишете на сервере используя javascript - это весьма удобно, так как нужно будет всего лишь использовать один язык (если не считать HTML, CSS, SQL).

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

Итоги 

Вообщем, мне кажется, что тем, кто хочет "одноязычие" , еще стоит посмотреть в сторону технологии ASP.NET и глянуть на NodeJS

четверг, 10 марта 2011 г.

LinkDump #00

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

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

Посты, я буду помечать ярлыком "ссылки", а первый LinkDump, я начну со следующих ссылок:

1. http://ru.wikipedia.org/wiki/Microsoft_Solutions_Framework

Microsoft Solutions Framework (MSF) — методология разработки программного обеспечения, предложенная корпорацией Microsoft. MSF опирается на практический опыт Microsoft и описывает управление людьми и рабочими процессами в процессе разработки решения.

MSF представляет собой согласованный набор концепций, моделей и правил.

2. http://www.rsdn.ru/article/philosophy/WhyOOP.xml

Почему объектно-ориентированное программирование провалилось?

3. http://rdos401.org/

К 15-летию русской версии MS-DOS.

4. http://bugtraq.ru/library/programming/objectshavefailed.html

Вводное выступление Ричарда П. Гэбриэла на диспуте по поводу ООП. 
Конференция OOPSLA, Сиэтл, 6 ноября 2002г.

5. http://bugtraq.ru/library/programming/objectshavenotfailed.html

Вводное выступление Гая Л. Стила на диспуте по поводу ООП. 
Конференция OOPSLA, Сиэтл, 6 ноября 2002г.

6. http://altdevblogaday.org/2011/02/12/alternatives-to-malloc-and-new/

Alternatives to malloc and new by Steven Tovey.

7. http://www.computerra.ru/hitech/35042/

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

8. http://channel9.msdn.com/Blogs/mikcher/249693

Юрий Стариков - первый советский гражданин в Microsoft.

9. http://channel9.msdn.com/Blogs/mikcher/249690

Как живет Microsoft? Игорь Бекельман и Людмила Фокина про Редмонд и округу.

10. http://channel9.msdn.com/Blogs/mikcher/415331

Алексей Пахунов про ядро Windows и поддержку 32-битных приложений. 

11. http://blog.not-a-kernel-guy.com/2008/11/13/373

Первое прямое наблюдение экзопланеты!

12. http://www.computerra.ru/xterra/34923/

Существует ли способ увеличить скорость человеческого мышления? Возможно ли каким-нибудь образом заставить человеческий мозг думать быстрее?

13. http://anton.shevchuk.name/my-life/story-about-god-dev/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+AntonShevchuk+(Anton+Shevchuk)

Сказка о программисте от Антона Шевчука. 

14. http://www.aiportal.ru/articles/neural-networks/1/

Набор статей, которые позволяет за короткие сроки разобраться в базовых понятиях нейронных сетей. 

15. http://pseudocoder.com/archives/you-dont-really-want-a-rock-star

I don't think I'm going out a limb when I say we (developers/designers) are sick of seeing "Rock Star" in job postings. Not only is it overused, it's not even analogous. Let's take a look at what a job posting would say if the company really wanted a "Rock Star" developer.

16. http://pseudocoder.com/archives/you-dont-really-want-a-ninja

Here's what a job posting would look like if the skills of a ninja were really applied to web dev.

17. http://pseudocoder.com/archives/the-type-of-employee-you-really-want-porn-star

So what kind of employee do you want? That's right: a Porn Star. Just checkout this job posting:

18. http://foundersblock.com/anecdotes/why-startups-fail-an-analysis-of-failure-post-mortems/

Why Startups Fail: An Analysis of Post-Mortems.

И еще вопрос: знаете ли вы какие-либо удобные сервисы для работы с ссылками и удобной организации оных по категориям? 

среда, 9 марта 2011 г.

Программа Paseek 2.5

При решении задач по криптографии часто возникает необходимость подобрать слово, например, имя существительное. В данном случае мне хорошо помогает программа Paseek 2.5. Также она может вам пригодиться, если вы:
  • решаете кроссворды;
  • угадываете анаграммы;
  • любите "словарные" головоломки. 
Если вы хотите сами во всем разобраться, то вы уже можете скачать программу, в противном случае, я расскажу вам как я пользовался данной программой, что в ней есть и что она умеет. 

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



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

  • "а??а??" - в данном случае слово должно состоять из 6 букв, а на 1 и 4 позиции слова должна быть буква "а".
  • "?????" - слово из 5 букв.
  • "аб*вд" - слова которые начинаются на "аб" и заканчиваются на "вд", а между началом и окончанием любое количество букв. 
  • "п!+р!+" - слово из 4 букв, где вместо комбинации символов "!+" может быть любая гласная, для согласных нужно использовать "+". 
Справа ниже под пунктом кроссворд, есть пункт "Анаграммы", там так же нужно нажать "Новый поиск...", суть поиска в данном случае заключается в том, что программа просто решает анаграмму и находит правильное слово. 

Также есть раздел с палиндромами. Палиндром - это такое слово, которое с двух сторон читается одинаково, например "доход". В данном случае в программе можно просто просмотреть список палиндромов. 

Если в верхнем меню нажать "Поиск", а затем "Цепочка слов..." или комбинацию клавиш "Ctrl+W", то можно воспользоватся утилитой которое позволяет изменяя букву за буквой (или сразу несколько букв) превратить одно слово в другое. 



Также программа позволяет создавать и работать со своими словарями и настраивать внешний вид. Если у вас возникнут сложности в использовании программы - обращайтесь (я не являюсь автором программы)! 

Шифр Полибия

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


Сегодня речь пойдет, а самом используемом шифре, правда не в данное время, а вообще за всю историю криптографии. Я расскажу о шифре Полибия, его можно отнести к классу исторических шифров, так как он в наше время уже не используется. Но в свое время, это был "прорыв", так как тексты зашифрованные шифром Полибия, были более устойчивые, чем тексты зашифрованные шифром сциталы (шифр Древней Спарты), шифром Цезаря или Августа (шифр Цезаря или Августа появились после шифра Полибия) и т. п.

Попробуем зашифровать текст шифром Полибия. Для этого возьмем квадрат с размерами 5x5 и впишем в него буквы латинского алфавита, причем I,J пусть будут в одной клетке:


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

m = "cipher"
c = "13,24,35,23,15,42"

Можно разделитель и не использовать. Таким образом, мы получили шифр текст. Прямая атака (методом перебора) здесь не пройдет, так как имеется, примерно, 15511210043331000000000000 вариантов ключ. Но, но, но...

Для данного шифра можно использовать частотный анализ. Это простой статистический подход, в котором учитываются частоты букв. Для латинского алфавита (как и для любых других) известны частоты появления букв в тексте. Например, известно, что среди 1000 букв в обычном русском тексте, буква "О" встречается примерно 90 раз (частота 0,090). Так как шифр Полибия является шифром замены, то есть такой в котором все буквы исходного текста заменяются вполне определенными последовательностями, то частоты распространяются и на закодированное сообщение. Следовательно, можно с легкостью применить частотный анализ, правда на текстах, длина которых, хотя бы более 50 букв. Поэтому-то этот шифр и не считается стойким, что и естественно для шифра разработанного в 2 веке до н.э!

Теперь задание, вы можете скачать его отсюда. Известно, что используется квадрат с русским алфавитом, где буква ё=е, также используется пробел, точка и запятая. Известно, что строки и столбцы нумеруются с 0 до 5, то есть квадрат имеет размеры 6x6 (по шифр-тексту видно).

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

При решении вам можете пригодиться программа Paseek 2.5. Я ее использую для подбора имен существительных.

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

Тип работника который вам по-настоящему нужен: порно-звезда

Данная статья является переводом статьи The Type of Employee You Really Want: Porn Star.

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

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

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

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

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

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

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

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

Мы большие поклонники тестирования. Мы прогоняем весь набор тестов после фиксации каждого "бага".  Если ваш код не будет проходить тест, то вы не сможете заняться ничем другим до тех пор, пока не будет выяснена причина ошибки.

Мы компания людей, которые заканчивают начатое. Если мы начали проект, мы должны завершить его.

Мы ожидаем тонны пользователей при выпуске нашего продукта. Эта штука выстрелит и мы будем круче, чем TechCrunch.

вторник, 8 марта 2011 г.

Список форумов по .NET/C#

Я решил составить список наиболее популярных форумов по .NET/C#. В список вошли, как англоязычные так и русскоязычные форумы. Я отсортировал их по "оценке", которая вычисляется по простой формуле:  "Оценка = Google PageRank * 0,05 + Yandex Rank * 0,05 + Yandex тИЦ * 0,001 + Количество тем * 0,00001 + Количество сообщений * 0,000001 + Количество пользователей * 0,0000001 + Количество сообщений в теме (в среднем) * Количество сообщений на пользователя (в среднем)".

Я учитывал Google PageRank, Yandex Rank, Ynadex тИЦ, количество зарегистрированных пользователей, количество сообщений, количество тем, но не факт, что эти параметры являются объективными. Далее приведу список форумов в порядке убывания оценки. Чем выше оценка, тем лучше, чем меньше, тем хуже:
  1. Forums at asp.net
  2. Microsoft Developer Network > Forums
  3. Microsoft.NET на sql.ru
  4. .NET форум на forum.vingrad.ru
  5. С/С++, C#, Delphi, .NET, Asm  на forum.antichat.ru
  6. .NET на forum.shelek.ru
  7. .NET на Исходники.Ru
  8. .NET на forum.sysman.ru
  9. PHP форум на ПЫХА.РУ => Языки программирования => C/C++ и C#
  10. .NET Programming Forum at CodeGuru.Com
  11. C# .NET на КиберФоруме
  12. C# Corner Forums
  13. C# на forum.chertenok.ru
  14. Программирование для .NET в клубе программистов
  15. C# Online.NET Forums
  16. .NET на programmingforum.ru
  17. Forum at csharphelp.com
  18. .NET на forum.codeby.net
  19. Microsoft .NET framework на codenet.ru
  20. .NET на realcoding.net
  21. MSDN Форум
  22. .NET на progz.ru
  23. Основы программирования на C# на форуме forum.intuit.ru
Вот как примерно, выглядит сама таблица:



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

Я мог ошибиться или не правильно продумать формулу, если у вас есть предложения или возражения, то обязательно напишите в комментариях. 

Вам не нужен ниндзя

Данная статья является переводом статьи You Don't Really Want a Ninja .

Вчера мы посмотрели почему рок-звезда разработчик ничего не значит. Теперь посмотрим, как будет выглядеть опубликованная вакансия, если в веб-разработке будут требоваться навыки ниндзи. 

Мы стартап YC W10, который разрабатывает социальные игры для сети facebook, включая одну из популярнейших игр подбрасывания монеты flip.ly. Мы ищем разработчика ниндзю  для присоединения к нашему клану.

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

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

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

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

понедельник, 7 марта 2011 г.

Вам не нужна рок-звезда

Данная статья является переводом статьи You Don't Really Want a Rock Star

Я не впаду в крайность, если скажу, что нам (программистам, дизайнерам) надоело видеть вакансии на работу, в которых требуется рок-звезда. Это не только злоупотребление, но уже даже сложно найти какие-то другие объявления. Давайте-ка посмотрим, как будет выглядеть объявление, если компания хочет нанять на работу рок-звезду. 

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

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

От вас ожидается, что вы напишете великолепный маленький кусочек кода, после чего вы сможете извлекать выгоду из проекта до завершения вашей карьеры. Как альтернатива - вы можете скопировать существующий код и немного его изменить. Откровенно говоря, нам не важно сколько времени вы потратите, что бы убедить MTV (Marry, Todd и Vince - наша продуктовая команда), что наш продукт хорош.

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

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

У нас очень строгий дресс-код и вам придется его соблюдать. Компания предоставить вам фирменные поло, но вам придется самим раздобыть себе прочные кожаные штаны.

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

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

суббота, 26 февраля 2011 г.

Парсинг HTML: путь Ктулху!

Данная статья является переводом статьи Parsing HTML The Cthulhu Way Джефа Эфтвуда. 

Каждый программист в независимости от опыта понимает, что парсинг HTML при помощи регулярных выражений считается плохой идеей. Насколько плоха эта идея? Это сразу становится очевидным после рассмотрения одного случая, когда один из пользователей StackOverFlow.com дошел до грани безумия (текст по ссылке на английском языке): 

"Вы не можете парсить HTML используя регулярные выражения. Regex не является средством, которое позволяет корректно парсить HTML. Как я уже много раз отвечал на вопросы связанные с парсингом HTML, использование regex не позволяет вам полностью обработать HTML и учесть все нюансы этого языка разметки. 

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

Только Jon Skeet не может парсить HTML при помощи regex. Каждый раз когда вы пытаетесь парсить HTML при помощи регулярных выражений - ребенок плачет кровью девственниц и русские хакеры взламывают ваше веб-приложение. Парсинг HTML при помощи regex вызывает грешные души в царство живых. Regex и HTML вместе сочетаются также как и любовь, брак, а также ритуальное детоубийство. Тег <center> не будет сохранятся вечно - он уже мертв. Использование regex и HTML - это сила, которая при использовании на одном концептуальном уровне, просто вынесет ваш мозг вдребезги! Если вы парсите HTML при помощи regex вы приводите к гибели всех нас, которые бесчеловечно трудятся для одного языка, который не может быть выражен в рамках базовых многоязычных конструкций." 

И это правильно, если вы пытаетесь парсить HTML при помощи regex, то вы поддаетесь искушениям темного бога Ктулху... 


Это конечно же все весело, но это очень важно, что эти слова имеют смысл и родились из очень реального разочарования (текст по ссылке на английском языке). 

Я уже слышал этот аргумент. Обычно я слышу это как обоснование следующего кода:

# pull out data between tags
($table_data) = $html =~ /(.*?)<\/td>/gis; 

"Но это работает!" - они говорят. 
"Это легко!" 
"Это быстро!"
"Это хорошая работа."

Я ругаю их, что бы они были ленивыми. Вы должны быть ленивы как программист. Парсинг HTML - решенная проблема. Вы не должны решать ее. Вы всего лишь должны быть ленивы. Будьте ленивы, используйте CPAN и HTML::Sanitizer. Ваше программирование будет значительно более легким занятием. Ваш код будет расширяем. Вы не должны сидеть и вручную писать регулярные выражения. Ваш код будет более надежный. Вы не должны будете заниматься отладкой все время из-за ошибок, которые возникают, если HTML "поломает" ваши регулярные выражения. 

Новички программирования сильно удивляются, когда узнают, что парсинг HTML при помощи regex это - путь Ктулху, вместо использования необходимых библиотек, как поступил бы разумный человек или опытный программист. Это означает, что это обсуждение будет постоянно продолжаться на StackOverFlow. Выше написанный пост, которому уже 5 лет, может обсуждаться так, как будто он написан еще вчера, я думаю это позволительно, учитывая степень важности данной проблемы.

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

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


Кроме того, жесткие ограничение никак не должны быть связаны с HTML ограничениями. Они должны быть такие простые как "работа с этими наборами веб-страниц", "работа с данными с этих веб-страниц", "работать для 98% пользователей 98% времени" или даже "О, нет! Мы должны сделать эту работу за час, сделай все, что сможешь!". 

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

Таким образом, если я захочу парсить HTML при помощи regex, то я четко понимаю, что:
  • Это очень плохая идея. 
  • Если вы не дисциплинированы и строго себя не ограничиваете, то парсинг HTML при помощи regex приведет вас к безумию, а Ктулху это любит!
  • Я очень четко осознаю, что причина использования regex для парсинга HTML в данном сценарии (полу) оправдана. 
Я думаю, что полностью ограничить парсинг HTML при помощи регулярных выражений, это тоже самое, что решать простую тривиальную задачу парсинга HTML при помощи какого-нибудь огромного движка. Лучше понимать инструменты, их сильные и слабые стороны, чем просто подчинятся догмам. 

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

Какой бы метод вы не выбрали, никогда не открывайте тег <cthulhu> ради всего человечества. 

вторник, 22 февраля 2011 г.

Разоблачить коварные планы Цезаря!

Вы математик, молодой римский математик! В вашем доселе демократичном государстве назревают войны и великие потрясения. Вы решаетесь на подвиг - украсть тайные письма Цезаря! Самого Гая Юлия Цезаря! Вы еще понимаете, что вас ждет смертная казнь, но вы все же крадете его тайные письма.

Однако вы удивлены! Вы видите там просто набор букв! О, ваш бог, это же не что! Вы рисковали жизнью за это: "JQDHXVSRPSHLXVPDJQXVLVPBHQHPB".

Но постойте-ка, а разве вы забыли, что вам говорил ваш друг Вар: "Я точно уверен, что Цезарь шифруя сдвигает буквы в слове, словно они были бы в алфавите.". Ваша задача отгадать самую тайную тайну Цезаря и поделится с другом числом на которую сдвигаются буквы в алфавите. 

Жду ответа!

пятница, 18 февраля 2011 г.

Ответы на вопросы по теории вероятностей и математической статистике.

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

Вот перечень вопросов, на которые я попытался ответить:

1. Дискретное пространство элементарных событий.  Операции над событиями. 
2. Классическое определение вероятности. Свойства вероятности. 
3. Произвольное пространство элементарных событий. Алгебра и ? - алгебра множеств. Борелевские множества. Вероятность. 
4. Геометрическая вероятность. 
5. Условные вероятности. Независимые события и их свойства. 
6. Формула полной вероятности. Формула Бейеса. 
7. Повторяющиеся испытания. Формула Бернулли. 
8. Случайные величины и функции распределения. Свойства функции распределения. 
9. Дискретные случайные величины. Биномиальное, геометрическое, гипергеометрическое распределения, распределения Пуассона. 
10. Абсолютно-непрерывные случайные величины. Равномерное распределение, нормальное распределение, показательное распределение. 
11. Математическое ожидание случайной величины и его свойства. 
12. Дисперсия случайной величины и ее свойства. 
13. Нормированные случайные величины. Коэффициент корреляции. 
14. Неравенства Чебышева. 
15. Закон больших чисел.
16. Локальная и интегральная теоремы Муавра-Лапласа.
17. Теорема Пуассона.
18. Характеристические функции и их свойства.
19. Сходимость случайных величин и функций распределения.
20. Центральная предельная теорема.
21. Основные задачи математической статистики. Выборка и вариационный ряд, полигон и гистограмма частот. 
22. Эмпирическая функция распределения. Эмпирические моменты. Метод условных вариант.
23. Точечные оценки параметров распределения. 
24. Метод моментов определения параметров распределения. 
25. Метод максимального правдоподобия нахождения параметров распределения.
26. Некоторые распределения связанные с нормальным распределением: Пирсона, Стьюдента.
27. Интервальные оценки параметров распределения. Нахождение доверительных интервалов для распределений Пуассона, биномиального, нормального.
28. Статистическая проверка статистических гипотез. Ошибки первого и второго рода.
29. Оптимальный критерий. Теорема Неймана-Пирсона.
30. Непараметрические критерии. Критерий Колмогорова.
31. Критерий Пирсона. Вычисление теоретических частот для различных видов распределений. 
32. Элементы теории корреляции. Понятие корреляционной зависимости. Точечные оценки для условных математических ожиданий и коэффициента корреляции. 
33. Цепи Маркова. Матрица перехода.
34. Классификация состояний цепи Маркова. Теорема солидарности. 
35. Теорема о предельных вероятностях.
36. Случайные процессы. Марковские процессы со счетным множеством состояний.
37. Локально-регулярные марковские процессы. Система уравнений Колмогорова. 
38. Применение теории марковских процессов к задачам теории массового обслуживания.
39. Процесс Пуассона. 

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

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

четверг, 20 января 2011 г.

C#/.NET маленькие чудеса: ограничение обобщений при помощи условия where

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

К сожалению, когда вышел .NET 1.0, там не было эквивалента шаблонам. Однако с .NET 2.0, мы окончательно получили обобщения, которые позволили нам еще раз взмахнуть крыльями и программировать более обобщенно в мире .NET.

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

Проблема - C# допускает наименьший общий знаменатель

В C++, вы можете создать шаблон и делать практически все с параметром шаблона, конечно, если это допускается синтаксически, и C++ не будет проверять корректен ли вызванный метод/поле/операция до тех пор, пока вы не объявите реализацию типа. Давайте-ка я вам это продемонстрирую:

// компилируется нормально, C++ не делает 
// никаких предположений о типе T
template <typename T>
class ReverseComparer
{
public:
     int Compare(const T& lhs, const T& rhs)
     {
         return rhs.CompareTo(lhs);
     }
};

Заметьте, что мы спокойно вызываем метод CompareTo() для шаблонного типа T. Потому, как мы на данный момент не знаем, что из себя представляет тип T, и C++ не делает ни каких предположений, следовательно и не возникает ошибок.

C++ стремится не проверять используемый тип шаблона до тех пор, пока метод действительно не будет вызван для конкретного типа, что очень отличается от поведения C#:

// это НЕ скомпилируется! 
// C# допускает наименьший общий знаменатель
public class ReverseComparer<T>
{
     public int Compare(T lhs, T rhs)
     {
         return lhs.CompareTo(rhs);
     }
}

Так почему же C# выдает ошибку компиляции когда, мы еще не знаем, что за тип имеет T? Это происходит потому, что C# идет по-другому пути создания обобщений, в отличии от C++. Пока вы не укажите обратное, T трактуется как нечто похожее на object (заметьте я не сказал как object).

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

Сейчас, чем шире объект является, тем более абстрактным (более общим) он должен быть. Так как же мы позволим нашему обобщенному типу заменителю, делать нечто большее, чем может делать object?

Решение: ограничить тип используя условие where

Так как же нам обойти это в C#? Ответ заключается в том, что бы ограничить обобщенный тип при помощи условия where. В основном, условие where позволяет вам определить дополнительные ограничения о том какой тип, фактически, должен поддерживаться обобщенным типом заменителем.

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

Ограничение обобщенного типа интерфейсом или суперклассом

Одно из удобных возможностей where ограничений - указывать какой интерфейс обобщенный тип должен реализовать или какой класс обобщенный тип должен наследовать. Например, вы не могли вызвать метод CompareTo() в нашем первом C# обобщении, но если ограничить тип T интерфейсом IComparable<T>, то вы сможете:

public class ReverseComparer<T> 
    where T : IComparable<T>
{
    public int Compare(T lhs, T rhs)
    {
        return lhs.CompareTo(rhs);
    }
}

Теперь, когда мы ограничили T реализацией IComparable<T>, это означает, что наши переменные обобщенного типа могут вызывать любые члены IComparable<T>. Теперь можно легально вызвать CompareTo().

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

Ограничение обобщенных типов  только ссылочными типами

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

Хорошо, мы можете это исправить ограничением class в where условии. Объявляя то, что обобщенный тип, должен быть class, мы говорим, что он является ссылочным типом и может принимать значение null для экземпляров этого типа:

public static class ObjectExtensions
{
    public static TOut Maybe<TIn, TOut>(
        this TIn value, Func<TIn, TOut> accessor)
        where TOut : class
        where TIn : class
    {
        return (value != null) 
                   ? accessor(value)  
                   : null;
    }
}
>

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

Ограничение обобщенных типов только типами значений

Как обобщенный тип может быть ссылочным типом, также само он может быть и типом значений. Что бы это сделать используйте ограничение struct, которое говорит, что обобщенный тип должен быть типом значений (примитивный, структура, перечисление и т.п.).

Рассмотрим следующий метод, который будет конвертировать, что угодно реализующее IConvertible (int, double, string и т. п.) в тип значение, который вы укажете, или null, если экземпляр является null:

public static T? ConvertToNullable<T>(
    IConvertible value)
    where T : struct
{
    T? result = null;
  
    if (value != null)
    {
        result = (T)Convert.ChangeType(
                     value, typeof(T));
    }
  
    return result;
}

Так как T был ограничен типом значений, мы можем использовать T? (System.Nullable<T>), где мы не могли этого делать, если T был ссылочным типом.

Ограничение обобщенных типов требованием к наличию конструктора по умолчанию

Вы также можете ограничить тип требованием к наличию конструктора по умолчанию. Так как C# по умолчанию не знает какой конструктор имеет или не имеет обобщенный тип заместитель, то он не может позволить конструктор. Это говорит о том, что если обобщенный тип будет ограничен new(), то это будет обозначать, что тип реализующий обобщенный тип должен иметь конструктор по умолчанию (без параметров).

Предположим, что у вас есть обобщенный класс адаптер, который получив некоторые отображения, будет адаптировать некоторый предмет из типа TFrom в тип TTo. Так как он должен создавать новые экземпляры типа TTo в процессе, то мы должны указать, что TTo обязан иметь конструктор по умолчанию:

// Полученный набор Action 
// отображений будет отображен из TFrom в TTo
public class Adapter<TFrom, TTo> : 
    IEnumerable<Action<TFrom, TTo>>
    where TTo : class, new()
{

    public List<Action<TFrom, TTo>> Translations 
    { 
        get; 
        private set; 
    }
   
    public Adapter()
    {
        Translations = new List<
                           Action<TFrom, TTo>>();
    }
  
    public void Add(
        Action<TFrom, TTo> translation)
    {
        Translations.Add(translation);
    }


    void Add(
        Predicate<TFrom> conditional, 
        Action<TFrom, TTo> translation)
    {
        Translations.Add((from, to) =>
            {
                if (conditional(from))
                {
                    translation(from, to);
                }
            });
    }
  
    public TTo Adapt(TFrom sourceObject)
    {
        var resultObject = new TTo();
  
        Translations.ForEach(
            t => t(sourceObject, resultObject));
        return resultObject;
    }

    public IEnumerator<
        Action<TFrom, TTo>> GetEnumerator()
    {
        return Translations.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Заметь, что вы не можете указать любой другой конструктор, вы можете ограничить тип, только конструктором по умолчанию (без аргументов).

Выводы

Условие where - это превосходная вещь, которая дает .NET обобщениям больше мощи для выполнения заданий, которые требуют большего поведения, чем базовое (речь идет об object).

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

Следующие вещи, которые вы не можете указать, при помощи ограничений на данный момент:

В дополнение, вы не можете перегружать определение шаблона, разными ограничениями. Например, вы можете определить Adapter where T : struct и Adapter where T : class. 

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

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