Сообщения fuxter
K.Mandla
Достаточно срочно нужен заработок
Нужен заработок.
Кратко: 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
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
busy анимация из alpine в javascript
http://fuxter.ru/120519.1710.webm
Ъ: выдрал анимации занятости из исходников alpine и привязал их к своему javascript-приложению. использую can.js для типа-MVC.
ФУХТЕР - НИПОНИМАТ
привет, мой дебютный альбом был выпущен на лейбле 8081.
http://8081netlabel.ru/news/8081_070/2012-04-26-103
там же можно релиз и прослушать и скачать. альбом состоит из моих песен написанных карандашом на бумаге, записанных с помощью гитар и геймбоя.
причём здесь линукс? а при том, что всё это было записано, сведено и смастеренкованно с помощью свободного программного обеспечения.
PS: если с первых нот вам поплохеет — выключайте. если с первых слов вас начнёт подташнивать — выключайте. меньше всего я хочу заставлять людей страдать от своей музыки.
EDIT: кстати вторая песня в альбоме, можно сказать, полностью отображает мой опыт использования линукса. там даже упоминается посыпавшийся диск и pacman, а так же глюки моего archlinux'а.
yet another lor threaded comments
как-то так, не?
[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()
[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, поэтому подозреваю, что туплю, но где?
[rtmplite][django] что придумать для ограничения прав на трансляцию
По сути уже прикрутил на сайт видео чат с помощью rtmplite. Зарегистрированные пользователи могут зайти к другому пользователю в профиль и там начать обыкновенный персональный чат. На этой же странице довил кнопку, которая запускает трансляцию (publish) в потоке с именем пользователя
rtpm://host/app?publish={{ request.username }}
rtpm://host/app?play={{ собеседник.username }}
в этой схеме меня устраивает всё кроме, того что посылать поток с именем «вася» может совершенно не «вася». вот хотел бы спросить в какую сторону мыслить для осуществления ограничения прав в rtmplite.
мои мысли по этому поводу. justin.tv, например, для каждого пользователя генерирует API_KEY, который никому нельзя показывать, потому что любой сможет с этим ключом посылать поток в твой канал. по-моему, не айс.
как мне кажется, хорошей идеей будет при отправке потоков отдавать ещё и джанговские sessionid.
rtpm://host/app?publish={{ request.username }}&key={{ request.sessionid }}
другое решение. хранить в кеше для каждого пользователя свежесгенерированные короткие токены. из-за маложивучести кэша ключи будут менятся, но для установки связи этого будет достаточно. то есть у васи на странице будет
rtpm://host/app?publish=ABCDE
rtpm://host/app?play=ZXCVB
чёт я ещё что-то придумал, но уже не могу вспомнить. вобщем, какому варианту вы больше симпатизируете? или вообще как бы вы по-другому сделали?
заранее спасибо.
PS: да, не спится
[vimperator] [style] ня? буэ?
[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)
за такой код никто котят не убивает? мне как-то ссыкотно.
[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.: Трусы снял, бочку сделал.