пятница, 26 апреля 2013 г.

Конфиг в erlang приложениях

Решил описать как правильно создать конфиг для erlang приложения, так как сам с этим немного помучался и не совсем однозначно это описано в официальной документации.

Предположим у нас есть приложение someclient, которому нужны настройки такие как логин и пароль. Для этого нам придется создать три файла: само приложение, файл описания приложения и файл конфигурации.

Приложение у нас будет просто выводить значения конфигурации "someclient.erl"

-module(someclient).
-export([start/0]).

start() ->
    application:start(?MODULE),
    io:format("all config values: ~p~n", [application:get_all_env(?MODULE)]),
    {ok, ConfigValue} = application:get_env(?MODULE, login),
    io:format("value form config: ~p~n", [ConfigValue]),
    {ok, AppValue} = application:get_env(?MODULE, password),
    io:format("value from app: ~p~n", [AppValue]).

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

{application, someclient, [
    {env, [
        {login, "login from app"},
        {password, "password from app"}
    ]}
]}.

Ну и сам файл конфигурации “someclient.config”

[{someclient, [
   {login, "login from config"}
]}].

Запускать все это нужно предварительно скомпилировав

$ erl -compile someclient.erl; erl -noshell -s someclient
all config values: [{login,"login from app"},
                    {password,"password from app"},
                    {included_applications,[]}]
value form config: "login from app"
value from app: "password from app"

Как видите, значение логина перезатерлось значением из конфигурационного файла.

среда, 20 марта 2013 г.

Предотвращения повторного запуска скрипта

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

Часто для этого используют pid файл, но его нужно удалять по завершению выполнения. И если наш скрипт свалится по ошибке и pid файл не удалили, то и запускаться дальше он не будет.

Также можно вызывать команду ps и парсить ее ответ.

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

пример кода:

#!/usr/bin/env python
import fcntl
import time

def main():
  time.sleep(5)

if __name__ == ‘__main__’:
    fl_lock = open(‘our_script.lock’, ‘w’)
    try:
        fcntl.flock(fl_lock.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
    except IOError:
        print ‘Another copy already run’
    else:
        main()

среда, 23 января 2013 г.

Backbone и JSONP минимальными усилиями

Данный способ действителен если только если ваше приложение написанное на Backbone будет ajax’ом обращаться исключительно через jsonp. Так как мы глобально будем подменять метод посылки ajax запросов.

Для того что бы глобально сделать все обращения через jsonp мы изменим метод ajax который теперь будет подставлять правильный тип и callback.

Непосредственно вся реализация

Backbone.ajax = function(options) {
    options.dataType = ‘jsonp’;
    if (options.url.indexOf(‘callback=’) == -1) {
        var glue = options.url.indexOf(‘?’) == -1 ? ‘?’ else ‘&’;
        options.url += glue + ‘callback=?’;
    }
    return Backbone.$.ajax.apply(Backbone.$, [options]);
}

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

Используем Automator. Перевод текста из английской раскладки в русскую и наоборот

Помните в QiP есть(ну или была в те времена когда я им пользовался) возможность нажать сочетание клавиш и текст набранный в английской раскладке превращался в текст набранный в русской раскладке? Так вот мне этого очень не хватает в Skype и Messages.

Оказывается что эта проблема элементарно решается при помощи Automator и небольшого скрипта на python.

Запускаем Automator. Создаем новый "Service", который принимает текст из любого приложения и заменяет выделенный текст результатом своей работы. Добавляем в сервис "Run Shell Script", выбираем интерпретатор python и в текстовое поле вставляем наш скрипт который и будет переводить текст.

скрипт: https://gist.github.com/3720255

понедельник, 23 апреля 2012 г.

oAuth авторизация в iOS

Нашел хорошую библиотечку, в которой реализована поддержка oAuth 1 & oAuth 2 для iOS/Mac OS. К сожалению, документации по ней нет, зато есть демка использования, в которой реализована поддержка авторизации для twitter, facebook, flickr, qq.

Далее расскажу как я делал авторизацию LinkedIn с ее помощью.

среда, 18 апреля 2012 г.

Я.Субботник в Киеве, 5 мая

Я.Субботник в Киеве пройдет 5 мая по адресу: Киев, ул. Б.Хмельницкого, 53, отель "Опера", зал "Симфония Гранд Холл".

Регистрация на мероприятие начнется 18 апреля. Количество мест ограничено.

Для тех, кто не попадёт в число участников или не сможет лично присутствовать на Я.Субботнике, будет организована онлайн-трансляция.

Подробную информацию о мероприятии читайте здесь.

среда, 8 февраля 2012 г.

Виджет файла с возможностью вставки по url

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

Так что пришлось писать свой велосипед. Виджет добавляет на форму текстовое поле и поле выбора файла, а как результат возвращает File или None. Его можно использовать как с FileField так и с ImageField.

Код виджета: gist.github.com/1766187