• Тим О’Рейли. Работа, которая имеет значение: основные принципы

    • Перевод

    Work on Stuff that Matters: First Principles


    опубликовано 11 января 2009 года

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

    Но прежде всего я хочу прояснить, что «работа, которая имеет значение» не подразумевает только некоммерческие проекты, благотворительность или иную форму «добрых дел». Некоммерческие проекты часто означают хорошее дело, и люди с техническими способностями могут внести важный вклад, но очень важно выбраться за пределы этих рамок. Я абсолютно убеждён в социальной ценности бизнеса, который ведётся правильно. Нам нужно создать экономическую систему, в которой общественно значимые проекты автоматически и гарантированно получают вознаграждение, а не основанную на благотворительных организациях, финансируемых по доброте сердечной.
    Читать дальше →
  • Memoization в Python

      Memoization – свойство функций сохранять (кешировать) результаты вычислений, дабы не вычислять в последствии повторно.

      Эта технология оптимизации позволят достичь прироста скорости работы за счет потерь в свободной памяти.

      Допустим, у нас есть некая функция bigfunc, результат которой зависят только от переданных в нее аргументов, а сложность вычислений достаточно большая. Естественно нам не хотелось бы производить вычисления при каждом вызове bigfunc если она уже вызывалась ранее с теми же параметрами. Тут то нам на помощь и приходит memoization.

      Для python декоратор для функции будет выглядеть следующим образом:

      import cPickle
      def memoized(func):
          memory = {}
          def memo(*args,**kwargs):
             hash = cPickle.dumps((args, sorted(kwargs.iteritems())))
             if hash not in memory:
                 memory[hash] = func(*args,**kwargs)
             return memory[hash]
          return memo
      

      Далее, нам достаточно объявить bigfunc как

      @memoized
      def bigfunc(…):
      …

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

      bigfunc = memoized(bigfunc)

      Декоратор, объявленный в начале статьи, работает только с пиклезуемыми объектами. Если ваша функция работает с непиклезуемыми объектами – вы можете заменить

      hash = cPickle.dumps((args, sorted(kwargs.iteritems())))

      на

      hash = (tuple(args), frozenset(kwargs.items())

      но вы потеряете возможность работы с mutable объектами.

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

        Haskell достаточно необычный язык. Но, несмотря на немалое количество статей по нему, нередко можно столкнуться с мнением, что всё это помогает лишь в синтетических примерах. И действительно, на простых примерах всё выглядит просто, но куда сложнее представить себе хотя бы небольшую программу в таком стиле, а статьи зачастую рассматривают особенности языка. Поэтому я захотел написать серию статей, в течение которых мы изучим возможности языка и попробуем написать простой чат. Почему именно чат? Потому что там есть место и многопоточности, и GUI клиента, и БД сервера. Хотя я с удовольствием послушал бы и ваши предложения, так как мне самому интересно, насколько этот язык удобен для решения более сложных задач.
        Так что, если вас это заинтересует, то я рискну.

        Основы
        Типы данных, паттерн матчинг и функции
        Классы типов, монады
      • Memcached: статистика, отладка и RPC

          Серия постов про “Web, кэширование и memcached” продолжается. Начало здесь: 1, 2, 3, 4 и 5.
          В этих постах мы поговорили о memcached, его архитектуре, возможном применении, выборе ключа кэширования, кластеризации, атомарных операциях и реализации счетчиков в memcached, а также о проблеме одновременного перестроения кэшей и тэгировании кэшей.

          Сегодняшний пост завершает эту серию, в нём обзорно мы поговорим о технических “мелочах”:
          • анализ статистики memcached;
          • отладка memcached;
          • “RPC” с помощью memcached.

          Полный текст всех разделов в виде одной большой PDF-ки можно скачать и посмотреть здесь (в разделе “Материалы”).
          Читать дальше →
          • +38
          • 6,8k
          • 7
        • WPF Binding: Мощь стилей и шаблонов в WPF.

          • Перевод
          В WPF существует очень четкое разделение между поведением Control'а и тем, как он выглядит. К примеру, поведение объекта класса Button состоит в том, чтобы реагировать на различные события по клику, но его вид может быть любым — вы можете сделать кнопку в виде стрелки, рыбы, или чего-либо еще, что подходит для вашего приложения. Переопределение отображения Control'а очень просто сделать при использовании VS со стилями и шаблонами, и даже еще проще, если у вас есть Microsoft Expression Blend. В этом примере я покажу вам, как переопределить отображение ListBox'а, который используется для отображения списка планет.
          Читать дальше →
        • Правильный цикл работы с версиями SVN

            Я думаю многие любопытные люди уже знают, как нужно верно работать с SVN.
            Но во многих статьях это описано достаточно поверхностно. Хочется немного приоткрыть завесу верного цикла версионирования, при разработке проекта, на примере TortoiseSVN.
            И так, поехали
            Читать дальше →
          • Cisco. Второй выпуск. Используем Packet Tracer 5.0 для моделирования сети. Скринкаст.

              Сегодня в выпуске:


              Packet Tracer 5. Изучаем возможности программы.
              Выпуск выполнен в виде скринкаста.
              За 20 минут вы познакомитесь с основными функциями PT5.

              image

              На повестке дня:

              Читать дальше →