LINUX.ORG.RU

Сообщения fuxter

 

Skype для линукса думает, что он на виндоусе

http://i.imgur.com/HcrxkLb.png

браво, аплодирую мелкомягким троллям.

для Ъ: субж.

fuxter
()

K.Mandla

fuxter
()

Достаточно срочно нужен заработок

Нужен заработок.

Кратко: Python (6 лет), Django (3 года), Javascript, HTML, CSS, Linux, FreeBSD.

Удалённо или в Москве/Балашихе.

Возраст: 28 лет.

Только что выпустил в публичное пользование проект http://cmhb.org/ (код).

CMHB.ORG — сайт для любителей чип-музыки, помогает оставаться в курсе последних событий. Удобно прослушивать треки и следить за интересующими дискуссиями. Сайт написан с помощью CanJS MV*. Все файлы и ресурсы приложения хранятся в CouchDB (CouchApp) и оттуда загружаются. Данные собираются сервисом написанным на Python (requests, lxml, couchdb), хранятся в CouchDB.

Есть ещё пара проектов на Django, но их код не готов к публикации. Резюме и код по требованию.

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

Email/Jabber: fuxterz@gmail.com

 , ,

fuxter
()

John Resig's prettyDate - timezones

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

/*
 * JavaScript Pretty Date
 * Copyright (c) 2011 John Resig (ejohn.org)
 * Modified to compensate for timezones by fuxter (fuxterz@gmail.com) 2012
 * Licensed under the MIT and GPL licenses.
 */

// Takes an ISO time and returns a string representing how
// long ago the date represents.
function prettyDate(time){
    var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),
        date = new Date((date.getTime() / 1000 - date.getTimezoneOffset() * 60) * 1000),
        diff = (((new Date()).getTime() - date.getTime()) / 1000),
        day_diff = Math.floor(diff / 86400);

    if ( isNaN(day_diff) || day_diff < 0 )
        return;

    return day_diff == 0 && (
        diff < 60 && "just now" ||
        diff < 120 && "1 minute ago" ||
        diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
        diff < 7200 && "1 hour ago" ||
        diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
        day_diff == 1 && "Yesterday" ||
        day_diff < 7 && day_diff + " days ago" ||
        day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" ||
        day_diff > 31 && "ages ago";
}

даты в формате «2012-06-23T18:19:00Z». в моём случае пришлось дописать -240*60, потому что даты хранятся в MSK-4. http://i.imgur.com/QzEsZ.png

 

fuxter
()

busy анимация из alpine в javascript

http://fuxter.ru/120519.1710.webm

Ъ: выдрал анимации занятости из исходников alpine и привязал их к своему javascript-приложению. использую can.js для типа-MVC.

 , , re-alpine

fuxter
()

ФУХТЕР - НИПОНИМАТ

привет, мой дебютный альбом был выпущен на лейбле 8081.

http://8081netlabel.ru/news/8081_070/2012-04-26-103

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

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

PS: если с первых нот вам поплохеет — выключайте. если с первых слов вас начнёт подташнивать — выключайте. меньше всего я хочу заставлять людей страдать от своей музыки.

EDIT: кстати вторая песня в альбоме, можно сказать, полностью отображает мой опыт использования линукса. там даже упоминается посыпавшийся диск и pacman, а так же глюки моего archlinux'а.

 , , ,

fuxter
()

yet another lor threaded comments

http://i.imgur.com/KtHwT.png

как-то так, не?

 

fuxter
()

[nginx][uwsgi][django] uwsgi_param UWSGI_ENV DJANGO_SETTINGS_MODULE=settings;

кто может подтвердить, что я не схожу с ума.

uwsgi -s /tmp/uwsgi.sock --master

nginx.conf:

server {
    listen 80;
    server_name localhost;
    location / {
        uwsgi_pass unix:/tmp/uwsgi.sock;
        include uwsgi_params;
        set $home /var/www/site;
        uwsgi_param UWSGI_CHDIR $home;
        uwsgi_param UWSGI_PYHOME $home;
        uwsgi_param UWSGI_ENV DJANGO_SETTINGS_MODULE=settings;
        uwsgi_param UWSGI_MODULE django.core.handlers.wsgi:WSGIHandler();
        root $home/media;
    }
}

окружение настроено и джанговский сайт сам по себе работает. вот как ругается uwsgi при обращении к нему через нгинкс:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

ШОЗАНАХ! все UWSGI_ должны работать. из консоли uwsgi --env... работает. через скрипт или через ini конфиг работает. а вот UWSGI_ENV не хочет. в гугле нашёл только пару примеров, но они не дали озарений. все примеры nginxa и uwsgi используют свой скрипт типа:

# site.py
import os, sys
sys.path.append(os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
c «uwsgi_param UWSGI_MODULE site;» в конфиге нгинкса. а почему по-моему не работает? сам же «django.core.handlers.wsgi:WSGIHandler()» стартует, ему только переменной не хватает. а UWSGI_ENV её не ставит. а ведь должен, собака.

 , ,

fuxter
()

[javascript][jquery] проверка на психоз

Не мог понять, почему вроде простой код не желал отрабатывать. Начал разбивать строчки на простые. После того как я ввёл приведённые ниже строчки и увидел ответ, мне немножко поплохело. Я очень надеюсь, что просто туплю. Проверил в ФФ и Хроме, везде одинаково. В документации jQuery вроде ничего про подводные камни не упоминается.

>>> jid
"2010Dec"
>>> top7DR.children('[id^="2010Dec"]')
[td#2010Dec5, td#2010Dec12, td#2010Dec19, td#2010Dec26]
>>> top7DR.children('[id^=jid]')
[]

Что за магия?

ps: jQuery 1.7.1 и 1.4.2, поэтому подозреваю, что туплю, но где?

 ,

fuxter
()

[rtmplite][django] что придумать для ограничения прав на трансляцию

По сути уже прикрутил на сайт видео чат с помощью rtmplite. Зарегистрированные пользователи могут зайти к другому пользователю в профиль и там начать обыкновенный персональный чат. На этой же странице довил кнопку, которая запускает трансляцию (publish) в потоке с именем пользователя

rtpm://host/app?publish={{ request.username }}
a так же в другом флэш окне приём потока от собеседника
rtpm://host/app?play={{ собеседник.username }}

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

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

как мне кажется, хорошей идеей будет при отправке потоков отдавать ещё и джанговские sessionid.

rtpm://host/app?publish={{ request.username }}&key={{ request.sessionid }}
потом расхачить rtmplite, чтоб он спрашивал у джанги (может через ./manage.py command или через базу напрямую) соответсвует ли сессия пользователю, и только тогда разрешать трансляцию.

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

rtpm://host/app?publish=ABCDE
и
rtpm://host/app?play=ZXCVB
, а у пети наоборот.

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

заранее спасибо.

PS: да, не спится

 

fuxter
()

[vimperator] [style] ня? буэ?

 ,

fuxter
()

[javascript] меня терзают смутные сомнения

postComment = function(){
    var form = $(this)
    form.find("input[type=submit]").attr('disabled', 'diabled')
    var comments = $('div.comments#'+form.attr('id'))
    var array = form.serializeArray()
    var postData = {}
    for (i in array) {
        postData[array[i].name] = array[i].value
    }
    postData['comment'] = tinyMCE.activeEditor.getContent()
    progress.show()
    $.post(form.attr("action"), postData,
        function(result) {
            progress.hide()
            form.find("input[type=submit]").removeAttr('disabled')
            if (result.result == 'OK') {
                tinyMCE.activeEditor.setContent('')
                pollForComments($([comments]), false)
            } else {
                handleError(result['message'], $('.messages'))
            }
            tinyMCE.activeEditor.focus()
        },
        "json"
    )
    return false
}
$("form.comment_form").submit(postComment)

function pollForComments(containers, doitagain) {
    containers.each(
        function(container){
            var container = $(containers[container])
            var timeout = container.data('timeout')
            var name = container.data('name')
            var id = container.data('id')
            var after = container.find('div.comment').first().attr('id')
            var type = container.data('type')
            var data = {
                method: 'poll_for_comments',
                name: name,
                id: id,
                after: after,
                type: type,
                }
            $.getJSON('/api/', data,
                function(result) {
                    if (result['result'] == 'OK') {
                        if (result['comments']) {
                            var newComments = result['comments']
                            $.each(newComments, function(comment){
                                var comment = $(newComments[comment]).hide()
                                comment.prependTo(container).animate({ height: 'toggle', opacity: 'toggle' }, 'slow')
                            })
                        }
                        if (doitagain) {
                            setTimeout(pollForComments, timeout, containers, true)
                        }
                    } else {
                        handleError(result['message'], container)
                    }
                }
            )
        }
    )
}
pollForComments($("div.comments"), true)

за такой код никто котят не убивает? мне как-то ссыкотно.

 

fuxter
()

[Django][Ajax] Бест практисис

Изначально:

  • На странице есть <div class=«comments»>...</div> с комментариями.
  • К этому блоку привязан pollForComments, который делает ajaxGet с параметрами {comment_object=x, after=y}.
  • Если к этому объёкту есть новые комметарии, view возвращает {result='OK', comments=comments}.
  • comments в ответе содержит комментарии отрендеренные по шаблонам, которые используются для отрисовки самой страницы. То есть достаточно просто comments.appendTo($(«div.comments»)).
  • Если результат pollForComment == OK, ставим pollForComments в таймаут на перезапуск. В противном случае показываем ошибку и больше не перезапускаем.

Дилемма:

Появились страницы, ны которых комментарии отрисовываются другим шаблоном, более простым. Как малой кровью модифицировать pollForComments и view для него, чтоб на таких страницах pollForComments возвращал комментарии, отрисованные другим шаблоном.

Варианты:

  • В ajax запросе передавать ещё и тип отрисовки комментариев. Прим.: 'mini', 'default'.
  • В json возвращать только данные, на клиенте держать нужный шаблон. Очень не хочется дублировать.
  • Ваш вариант, мысли по этому поводу...

Что делать?

P.S.: Трусы снял, бочку сделал.

 ,

fuxter
()

RSS подписка на новые темы