• Монада Maybe на стероидах
    0
    У Марка Симана есть хорошая заметка насчет монады Maybe в .NET. Соль в том, что можно ничего не подключать и не реализовывать, ведь она у вас давно уже есть, вы просто раньше ее не замечали.

    Пример кода
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    
    namespace Ploeh.Samples.Booking.DomainModel
    {
        public class Maybe<T> : IEnumerable<T>
        {
            private readonly IEnumerable<T> values;
    
            public Maybe()
            {
                this.values = new T[0];
            }
    
            public Maybe(T value)
            {
                this.values = new[] { value };
            }
    
            public IEnumerator<T> GetEnumerator()
            {
                return this.values.GetEnumerator();
            }
    
            IEnumerator IEnumerable.GetEnumerator()
            {
                return this.GetEnumerator();
            }
        }
    
        public static class Maybe
        {
            public static Maybe<T> ToMaybe<T>(this T value)
            {
                return new Maybe<T>(value);
            }
    
            public static Maybe<T> Empty<T>()
            {
                return new Maybe<T>();
            }
        }
    }
    
  • Foreman — менеджер процессов для ваших веб-приложений
    +1
    Говоря о конфигурации веб-приложения, мы, как правило, имеем в виду все, что может отличаться для нескольких экземпляров одного и того же приложения, запущенного в разных окружениях. Скажем, параметры доступа к БД, очередям сообщений, внешним сервисам (API-ключи, логины-пароли) — это все конфигурация, тогда как список роутов или описание подключаемых компонентов в IoC-контейнере ею не являются — это уже внутренний конфиг, фактически, часть кода. Отсюда сразу следует рекомендация строго разделять конфигурацию и код — конфиг может меняться в разных окружениях, тогда как код для всех един.

    Поэтому, как правило, разработчики используют конфигурационные файлы. Некоторые все еще продолжают их класть в репозиторий, а остальные этого уже не делают и заполняют конфиги для каждого деплоя. Еще одна часто распространенная практика — написать пару-тройку готовых конфигов для основных окружений и положить их в репозиторий — в качестве примера можно привести известное заклинание «development, test, production». Понятно, однако, что такой способ не очень-то масштабируется.

    Соответственно, также используется и тот подход, о котором мы говорим — хранить конфигурацию в переменных окружения. Вот его достоинства:

    • Переменные окружения легко менять, к тому же для разработчиков есть такие штуки как Foreman и autoenv.
    • Не получится случайно закоммитить конфиг от околобоевого окружения в репозиторий, в отличие от файлов-конфигов.
    • Это, фактически, единственный способ описать конфигурацию, который не зависит от ОС, используемой платформы или языка.

    Как можно понять, это все неплохо вписывается в приложения, которым нужен высокий уровень гибкости и масштабируемости, а также подходит для новомодных облачных моделей типа PaaS и IaaS — одними переменными окружения мы можем рулить чем и кем угодно, вне зависимости от платформы — можно хоть на чистом C код писать. Именно поэтому такие сервисы, как, например, Heroku, используют переменные окружения для конфигурирования.
  • Анализ одного рефакторинга
    +5
    Некоторые советы в этой книге Боба Мартина довольно спорные, на самом деле. Вот хороший критический отзыв на нее, там в том числе и этот пример с PrimeGenerator бегло проанализирован.
  • Foreman — менеджер процессов для ваших веб-приложений
    +2
    Хотелось бы еще добавить к комментарию выше, что Foreman в первую очередь — инструмент разработчика, а не администратора. Более того, он поддерживает экспорт в том числе и в supervisord.
  • Foreman — менеджер процессов для ваших веб-приложений
    +1
    Да, конечно можно, например:

    $ foreman export upstart /etc/init -c habr=4 -c web=2
  • Работа с Git в Visual Studio 2012
    0
    Попробуйте cygwin/msys + mintty. Получите привычное окружение и неплохой эмулятор терминала.
  • Проектируем по DDD. Часть 1: Domain & Application
    0
    Можно, но это практически никому не нужно, persistence ignorance же.
  • HoloEverywhere v1.5
    –3
    Зашел, чтобы увидеть здесь богиню
    image
  • Атрибуты в C#
    +5
    Ждем статью от автора со срывом покровов про АОП?
  • C# консоль для выполнения простых «скриптов»
    +2
    Кстати, у того же mono есть C# REPL, довольно удобно.

    $ csharp
    Mono C# Shell, type "help;" for help
     
    Enter statements below.
    csharp> using System.IO;
    csharp> from f in Directory.GetFiles("/etc")
          >   let fi = new FileInfo(f)  
          >   where fi.LastWriteTime > DateTime.Now - TimeSpan.FromDays(7) select f; 
    { "/etc/adjtime", "/etc/asound.state", "/etc/mtab", "/etc/printcap", "/etc/resolv.conf" }
    csharp>
    
  • «Пакет смерти» для сетевых карт Intel
    0
  • Построение приложений командной строки (CLI)
    +1
    Самое приличное, что я видел для питона — это verb-based парсер Argh. По сути, все что нужно сделать — взять готовые функции и навесить декораторов.
  • Голосовой информатор через Skype для 1С: Предприятие
    –1
    1С позвонит тебе!
  • Модульный подход к разработке web-приложений с использованием JavaScript: AMD и RequireJS
    +1
    Не обязательно писать полные пути до файлов. Можно в конфиге RequireJS указать пути:
    requirejs.config({
           <...>
    	paths: {
    		jquery: 'third-party/jquery.min',
    		underscore: 'third-party/underscore.min',
    		backbone: 'third-party/backbone.min',
                    <...>
    	},
    });
    
    И если даже что-то изменится, то достаточно будет поменять путь к файлу в загрузчике.
  • Как правильно писать статьи о программировании для начинающих
    0
    Нда, к сожалению, в комментариях этот финт не работает, но в постах можно писать как-то так:

    <table>
    	<tr>
    		<td>
    			<source lang="python">
    1
    2
    			</source>
    		</td>
    		<td>
    			<source lang="python">
    def hello(name):
        print("Hello, " + name)
    			</source>
    		</td>
    	</tr>
    </table>
  • Как правильно писать статьи о программировании для начинающих
    0
    1
    2
    3


    1
    2
    3

  • Сжатие информации без потерь. Часть вторая
    +1
    Спасибо за статью.
    Хотелось бы также отметить, что построение этого самого отсортированного списка циклических перестановок можно написать более эффективнее, чем алгоритмом «в лоб». Для этого используется такая структура данных, как суффиксный массив и его можно построить за линейное время.
  • Яндекс.Деньги выходят на улицы!
    0
    Судя по этому документу нужно пройти идентификацию, а потом получить пин-код по телефону.
    <...> вы сможете снимать деньги и в банкоматах. Комиссия при этом составит 3% от суммы + 15 рублей (но не менее 100 рублей).
  • Яндекс.Деньги выходят на улицы!
    +13
    Хабрахабр, очевидно :)
  • Госдума представила доходы депутатов в новом виде
    +21
  • OtdamGolos. С 0 — 137 562 посетителя за 10 дней
    +3
    Ну как же не отдать голос за нее?
  • День Рождения Пьера Ферма
    +13
    Автор, видимо, в спешке забыл даже теорему Пифагора :)
  • Дерево ван Эмде Боаса
    0
    Не 1 операция, а O(1), это важно.

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

    Например, вот такой сдвиг влево

    shl eax, 1

    и вот этот

    shl eax, 8

    вообще ничем не отличаются и выполняются за одно и то же число процессорных тактов.
  • Дерево ван Эмде Боаса
    0
    Конечно, у нас же обращение к массиву за O(1).
    По поводу high и low — вот их реализация битовыми сдвигами:

    high(x) = x >> (k / 2)
    low(x) = x & (~(1 << (k / 2)))
  • Дерево ван Эмде Боаса
    0
    По иронии судьбы про это дерево я узнал где-то за неделю до того, как его рассказали, но не обратил должного внимания, как сейчас. Как-то так.
  • Дерево ван Эмде Боаса
    +1
    Насчет дерева отрезков могу сказать следующее. При K = 32 ось попросту отказалась выделять мне столько памяти для него, ну оно и понятно, поэтому U было снижено до 108. После чего RMQ отработала N = 107 запросов вставки и нахождения следующего за 5.24 секунды, тогда как дерево ван Эмде Боаса за 3.112. Ну как бы понятно, что все бенчмарки, проводимые мною, не совсем честные, поэтому надо делать нормальный, но уже можно видеть, что преимущество дерево ван Эмде Боаса таки дает.

    К вопросу об асимптотике. Следующий insert будет работать за асимптотику O(1) по той простой причине, что

    if T.children[high(x)].is_empty():
        insert(T.aux, high(x))

    по условию дерево T.children[high(x)] — пустое, а вставка в пустое дерево

    if T.is_empty():
        T.min = T.max = x

    как можно видеть, работает за константу.

    P. S. Привет команде посвята :)
  • Алгоритм нахождения N первых простых чисел — Решето Аткина
    0
    Ну это все понятно, куда интересней другой вопрос — а лично вы в каких целях использовали этот алгоритм?
  • Дерево ван Эмде Боаса
    0
    Да, было такое, пофиксил. Спасибо.
  • Дерево ван Эмде Боаса
    0
    Я же сказал, что надо делать нормальный бенчмарк. Это я предоставил в качестве примера того, что дерево ван Эмде Боаса работает быстрее сеты в некоторых условиях.
    Поиск в отсортированном векторе (и да, раз мы уж о производительности — к черту вектора, используем обычные массивы) бинарным поиском конечно тоже можно применить, но пока еще никто не научился вставлять элемент в середину вектора быстрее, чем за O(n).
  • Дерево ван Эмде Боаса
    +2
    Во-первых, k у нас является степенью двойки (по очевидным причинам) и немного неправильно писать «k > 18-20».
    Во-вторых, могу сказать, что при N >= 10^6, дерево ван Эмде Боаса начинает ощутимо перегонять двоичные деревья поиска, в том числе и красно-черное дерево. Если же нужны красивые графики, большие таблички и конкретные числа — тут нужно уже делать отельный крутой бенчмарк.
    Если же все-таки нужны конкретные цифры, то, скажем, на тесте N = 10^7, K = 32 всеми нами любимый STL'ный set (а STL, как известно, не индусы писали — чего только стоит их хитрый sort) работает за 4.856 секунд, когда дерево ван Эмде Боаса (в моей реализации) за 1.471. Вот как-то так.
  • Дерево ван Эмде Боаса
    +1
    Эта информация будет храниться в дереве вместе с минимумом (то есть T.min и, скажем, T.min_value) и ничего больше нам для этого не будет нужно.
  • Клиент Kebrum VPN портирован на Nokia N900
    0
    Это наш портированный VPN-клиент, который был изначально создан для десктопа. В качестве технологии работы используется OpenVPN, но клиент отличается тем, что он прост и в него уже все интегрировано, в том числе и биллинг. Поэтому для подключения и смены IP «на лету» необходимо нажать в нем всего одну кнопку и все будет работать без каких-либо настроек. Как-то так.
  • И снова здравствуйте
    0
    А оно никуда и не устанавливается, приложение-то портабельное. Разве что только драйвера, если очень хочется, их можно удалить в «Диспетчере устройств».
  • И снова здравствуйте
    0
    Да, на AnonymousCoat'е favicon плохо загрузился, видимо, спасибо. Теперь он там есть :)
  • И снова здравствуйте
    0
    Но это только для Kebrum'а актуально, так как только там конфиги предоставляются.
  • И снова здравствуйте
    0
    Советую посмотреть на пакет network-manager-openvpn.
  • И снова здравствуйте
    0
    1. Как конкретно проявляется то, что не работает?
    2. Оно ничего не ставит, кроме драйверов, на самом деле. Само приложение портабельно.
  • И снова здравствуйте
    0
    Простите, что? Не пугайте меня так, он там есть, сам помню, как добавлял :)