вторник, 7 февраля 2012 г.

Гривна или Доллар?

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

Допустим, у нас есть 2 варианта:
  • депозит в гривнах (UAH);
  • депозит в иной валюте (XXX), например, в долларе США (USD).
Также, нам известно, что банки предлагают процент по депозитам:
  • в гривнах - UAH_I годовых;
  • в валюте - XXX_I годовых.
Далее, нам известно, что валюту мы можем купить по ASK гривен, а также мы предполагаем, что после окончания срока депозита мы сможем продать валюту за BID гривен.

Вопрос - депозит в какой валюте следует выбрать, чтобы получить наибольшее количество гривен в итоге?

Итак, наши варианты (обладаем гривной, UAH, в конце получаем также гривну):
  • депозит в гривне: UAH * (1 + UAH_I / 100);
  • депозит в валюте: UAH / ASK * (1 + XXX_I / 100) * BID.
Найдем отношение обеих вариантов: UAH * (1 + UAH_I / 100) / (UAH / ASK * (1 + XXX_I / 100) * BID) = (1 + UAH_I / 100) * ASK / ((1 + XXX_I / 100) * BID).

Таким образом, если данное отношение больше единицы (или [1 + UAH_I / 100] * ASK > [1 + XXX_I / 100] * BID) - выигрывает первый вариант (гривна), иначе - второй (валюта).

Для текущего положения (конец зимы 2012), взяв, например, UAH_I = 15%, USD_I = 6%, ASK = 8.07 UAH/USD, предполагая BID = 8.50 UAH/USD, рассчитаем: что же выгоднее?

Проверим неравенство: (1 + 15 / 100) * 8.07 > (1 + 6 / 100) * 8.50, или 9.2805 > 9.01 - т. е. депозит в гривне выгоднее.

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

Вместо завершения: хорошо бы знать, какое граничное значение BID, при котором депозит в гривне еще выгоден? Все просто: MAX_BID = (1 + UAH_I / 100) * ASK / (1 + XXX_I / 100).

То есть, к примеру, при сохранении указанных выше процентов по депозитам, MAX_BID = (1 + 15 / 100) * 8.07 / (1 + 6 / 100) = 8.76 UAH/USD. Т. е. пока доллар стоит меньше 8.76 гривен, учитывая вышеуказанные проценты, депозит в гривне является более выгодным.

P. S. Здесь микространичка в Сети, которая возьмет на себя рутину вышеприведенных расчетов.

суббота, 10 декабря 2011 г.

Волшебные слова для разработчиков! :-)

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

Прочел в Твиттере новость (9 декабря 2011), что GSC Game World (разработчик "Казаков" и "Сталкера") закрывается. Там же по ссылке меня ожидал комментарий, содержащий (дословно):

"НО, отпилите себе ноги, отдавите себе яйца,выкиньте в окно тещу и сварите свою кошку ЧТОБЫ НИ ЧТО НЕ ПОМЕШАЛО ВЫПУСТИТЬ СТАЛЫЧА В СРОК!!"

Однозначно в закладки :D

среда, 26 октября 2011 г.

NuGet: Enable-PackageRestore

Если Вы пользуетесь NuGet для легкого управления зависимостями, то коммитить бинарники сторонних библиотек (они же пакеты) не обязательно. При экспорте/чекауте/пулле, получив свежие исходники, просто введите Enable-PackageRestore в командной строке менеджера управления пакетами (при этом уже должен быть установлен пакет NuGetPowerTools, если нет, установите его обычным образом с помощью NuGet) и он будет подтягивать нужные пакеты сам в случае их отсутствия (не забудьте закоммитить/запушить папку .nuget). Очень удобно!

понедельник, 12 сентября 2011 г.

Учебные проекты должны быть полезными - Learn Them All!

На выходных потянуло потренироваться с Python и Google App Engine. Но писать бессмыслицу не хотелось, к тому же давно планировал сделать удобное (по крайней мере для себя) и самое главное максимально простое (с точки зрения пользователя) облачное приложение, позволяющее заносить в список неизвестные слова иностранного языка и учить их, используя, например "Мозаику" (дальше пример).

Вот это приложение - Learn Them All:


Единственное на данный момент упражнение - это "Мозаика":


Принцип прост - входим с помощью аккаунта Google (у каждого пользователя - свои слова), добавляем слова, затем переходим к упражнению. Верный ответ (правильно сопоставлена пара) - это +1 к счету для данного слова, иначе -1. Когда счет больше 5, слово уже не появляется в упражнении. Слова можно редактировать (включая счет для данного слова). Также из списка слов можно перейти на страницу Лингво.Про - посмотреть варианты перевода, примеры использования, найти транскрипцию или прослушать слово. Да, еще одно: список слов поддается сортировке путем щелчка по заголовку столбца.

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

Кому интересно - можно посмотреть (вход, используя аккаунт Google).

Особенность Html.TextBoxFor() в ASP.NET MVC 2

Если вы активно используете HTML хелперы в ASP.NET MVC фреймворке, вам наверняка известен TextBoxFor() - о нем и пойдет речь.

Допустим, вы создаете форму с методом GET с целью организовать фильтр.

Контроллер и модель:

public class HomeController : Controller
{
    private static readonly string[] Fields = new[] {"Ann", "George", "Fred", "Amanda"};

    public ActionResult Search(SearchModel searchModel)
    {
        searchModel = searchModel ?? new SearchModel();
        searchModel.Field = searchModel.Field ?? string.Empty;

        searchModel.Field = Fields.FirstOrDefault(x => x.Contains(searchModel.Field));

        return View(searchModel);
    }
}

public class SearchModel
{
    public string Field { get; set; }
}

Представление:

<% using (Html.BeginForm("Search", "Home", FormMethod.Get)) { %>
    <%= Html.TextBoxFor(x => x.Field) %>
<% } %>
<form action="<%= Url.Action("Search") %>" method="get">
    <input id="Field" name="Field" type="text" value="<%= Model.Field %>" />
</form>

Запустив приложение, получим:

Введем во второе поле "g" и отправим форму нажатием на Enter. Вот что придет в ответ:

Почему в первом поле "g", когда должно быть "George", как во втором? Все просто, фреймворк анализирует строку запроса, и предпочитает значение Field=g из нее значению, приходящему в модели (Model.Field), что не плохо учитывать при разработке.

При этом, если интересно, вот во что рендерится представление:


вторник, 23 августа 2011 г.

Полезное приложение expect (Linux)

Понадобилось автоматизировать процесс развертывания свежей версии веб-приложения на Django из SVN-репозитария.

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

Рассмотрим подробнее - необходимо выполнить:

django-admin.py flush --pythonpath . --settings settings

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

Как организовать эмуляцию ввода?

echo yes|django-admin.py flush --pythonpath . --settings settings

А как быть с вводом нескольких строк?

django-admin.py flush --pythonpath . --settings settings << EOF
yes
yes
admin
...
password
EOF

Все хорошо, да вот пароль так ввести не получится.

Выход? Правильно - expect!

Создаем следующий скрипт flush.exp:

spawn django-admin.py flush --pythonpath . --settings settings
expect continue { send yes\r }
expect create { send yes\r }
...
expect Password { send password\r }
expect again { send password\r }
close

Все! Теперь осталось выполнить:

expect -f flush.exp

О назначении команд скрипта догадаться не сложно, на этом все.

пятница, 19 августа 2011 г.

Sharing ASP.NET MVC views across multiple projects (apps)

Если ведется разработка нескольких проектов, использующих ASP.NET MVC, вполне возможна ситуация, когда появляются представления (views), или частичные представления (partial views) с идентичной функциональностью. Например, календарь для выбора даты. Но попытка получить из одного приложения доступ к ресурсам другого будет пресечена политиками безопасности (что, в принципе, разумно).

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

Для решения задачи целесообразно применить возможность IIS создавать виртуальные директории. Теперь, при разворачивании (deployment) решения, необходимо создать одну физическую директорию (physical directory), содержащую общие представления (shared views), и после этого создать по виртуальной директории (virtual directory) для каждого проекта, которые будут отображаться на эту единственную физическую.

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