А чем не устроил вариант использования текстового, например, виджета, текст которого меняется вызовом функции из какого-нибудь shell скрипта через awesome-client?
Хорошая идея выпилить список окон. Можно добавить какую-нибудь пометку к тэгу, говорящую о том, что на текущем тэге больше двух окон открыто, да и то не обязательно.
На reddit есть раздел unixporn, на котором вывешивают скриншоты своих десктопов. Одно время awesome был там самым популярным wm, до прихода новой волны: bspwm, herbstluftwm, 2bwm.
Стоит ещё заметить, что в wayland не будет такой вещи, как оконный менеджер, будет некий плагин оболочки. И со временем от любимого awesome, возможно, придётся отказаться.
Не могут пропасть платежи? А разве на корр. Счетах они не могут вечно висеть, пока отправитель не укажет точные реквизиты получателя? А если получатель не знает, отправил что-то отправитель или нет, как то в случае с пожертвованиями? Это теория, а на практике как раз недавно была ругань именно в сторону Сбера, дама обнаружила, что её регулярные пожертвования ни разу за годы не доходили до адресата.
В том смысле, что не используется ли в нём SkypeKit. Посмотрел, вижу, что не используется.
С последними обновлениями скайпа внешний вид изменился, теперь окно с контактами и окно сообщений — два разных окна, но всё равно гораздо лучше, чем голый skype. Спасибо за него.
Исправил в топике, ошибочно было указано, что a и code>A — разные регистры, на самом деле один и тот же, а при использовании дозаписи нужно брать тот, который в верхнем регистре, работает это как с [y]ank, так и с записью [q].
Вы знаете, на чём выстрелил Ruby on Rails? Всё стандартно. Один фреймворк, и в нём всё делается одним способом. Ушли одни разработчики — пришли другие. В PHP десятки разных фреймворков, и если ушли одни разработчики, и потом пришли другие, последним очень долго разбираться, что там и как делали прошлые, это ещё повезёт, если не навелосипедили. То же самое и с JS. Этот код на Morearty мне уже не понятен, какие-то коллбеки, рутинг, явно привязанный к #, и, кстати, отсутствие связи с сервером. Добавить туда в модель связь с сервером и fallback'ом на localStorage, и всё будет ещё более запутанно.
А вот, к примеру, d3js работает с shadow dom или с самим dom? Делал богатые графики с добавлением и удалением элементов, ленивыми загрузками, zoom'ом, особых тормозов при добавлении элементов не замечал. Стоит ли заморачиваться? Где реальное сравнение скорости этого подхода с diff?
Можно посмотреть в сторону более быстрого шаблонизатора, например из riot.js.
И вообще, зачем эти велосипеды, если грядёт Web Components?
Ещё видел, что для shadow dom в одном из этой сотни js mv* фреймворков был один, который был сделан модульно, и в том числе отдельный модуль для обновлений по diff'у. Ссылку найти не могу.
В общем, пока я остаюсь при своём мнении — код, написанный с использованием большинства js mv* фреймворков нечитаем, не подлежит повторному использованию, громоздок, содержит кучу boilerplate, а принципы его работы зачастую понятны только авторам. Но это моё личное мнение, исходит которое в основном из воспоминаний о простоте написания приложений на Java Swing и NextApp Echo2 (тот же Swing, но для веб).
Я влёгкую могу накидать DSL для JS UI, который бы меня устроил.
var total = JSDSL.addElement('#total')
var list = JSDSL.addList('#list', {source: '/todos', template: '#todo'})
.updateOn({title: 'blur', priority: 'change'})
.on('update', function() { total.total = query('item').length }) # Обновление отображения количества по фильтру
Вот это компактненько. Может ещё как попроще можно.
Я делал todo, но без фильтра и без пометки сделанным или не сделанным. Зато с выставлением приоритета. С размашистым форматированием 88 строк js. Думаю, что до 220 всё равно не дотянет, если сделать всё остальное. Использован html.js, чуть более декларативный и компактный сородич jquery.
Скрытый текст
// Utility
function xhr(method, url, data, success) {
var xhr = new XMLHttpRequest()
xhr.open(method, url, true)
xhr.addEventListener('load', function() { success(xhr) }, false)
xhr.addEventListener('error', function() { warn('Connection error') }, false)
xhr.send(data)
}
// Update item
function update(item) {
xhr('post', '/item', new FormData(item), function(request) {
var id = request.response
item.query('input[name=id]').value = id
})
}
// Listen to edits
function listen_to_edits(item) {
item.query('input[name=title]').addEventListener('blur', function() {
update(item)
})
item.query('[name=priority]').addEventListener('change', function() {
update(item)
})
item.query('a[name=delete]').addEventListener('click', function() {
var id = item.query('input[name=id]').value
xhr('delete', '/item?id='+id, null, function(request) {
item.remove()
})
})
}
// Load all todos
function load_todos() {
xhr('get', 'items', null, function(request) {
JSON.parse(request.response).forEach(function(item) {
added_todo(item.id, item.title, item.priority)
})
})
}
function show_actions() {
html('.actions').classList.remove('hidden')
// Add new todo item on click
html('input[name=add]').each(function(button) {
button.addEventListener('click', function() {
added_todo(null, '', 20)
})
})
}
function added_todo(id, title, priority) {
var item = html('.proto').cloneNode(true)
item.classList.remove('proto')
html('.list').appendChild(item)
item = html('.list .item:last-child') // Hack, HTML.js doesn't wrap cloned/added nodes
item.query('input[name=id]').value = id
item.query('input[name=title]').value = title
item.query('select[name=priority]').value = priority
listen_to_edits(item)
item.query('input[name=title]').focus()
}
window.addEventListener('load', function() {
window.html = HTML.query.bind(HTML)
// Post sign in/up form with xhr
html('.signin-signup form').each(function(form) {
form.addEventListener('submit', function(event) {
xhr('post', document.activeElement.name, new FormData(form), login_callback)
event.preventDefault()
})
})
load_todos()
show_actions()
})
И пару «шаблонов» в html (slim):
Скрытый текст
.todos
.invisible
form.proto.item method='post' action='/item'
span.hidden
input type='hidden' name='id'
span.title
input type='text' name='title' placeholder='Buy some milk'
select.priority name='priority'
option value='10' Low
option value='20' Normal
option value='30' High
a href='#' name='delete' Delete
.list
.actions.hidden
input name='add' type='button' value='Add todo item'
Хорошая идея выпилить список окон. Можно добавить какую-нибудь пометку к тэгу, говорящую о том, что на текущем тэге больше двух окон открыто, да и то не обязательно.
Стоит ещё заметить, что в wayland не будет такой вещи, как оконный менеджер, будет некий плагин оболочки. И со временем от любимого awesome, возможно, придётся отказаться.
Только thin, passenger, rainbows, puma и goliath.
С последними обновлениями скайпа внешний вид изменился, теперь окно с контактами и окно сообщений — два разных окна, но всё равно гораздо лучше, чем голый skype. Спасибо за него.
a
и code>A — разные регистры, на самом деле один и тот же, а при использовании дозаписи нужно брать тот, который в верхнем регистре, работает это как с [y
]ank, так и с записью [q
].Можно посмотреть в сторону более быстрого шаблонизатора, например из riot.js.
И вообще, зачем эти велосипеды, если грядёт Web Components?
Ещё видел, что для shadow dom в одном из этой сотни js mv* фреймворков был один, который был сделан модульно, и в том числе отдельный модуль для обновлений по diff'у. Ссылку найти не могу.
В общем, пока я остаюсь при своём мнении — код, написанный с использованием большинства js mv* фреймворков нечитаем, не подлежит повторному использованию, громоздок, содержит кучу boilerplate, а принципы его работы зачастую понятны только авторам. Но это моё личное мнение, исходит которое в основном из воспоминаний о простоте написания приложений на Java Swing и NextApp Echo2 (тот же Swing, но для веб).
Я влёгкую могу накидать DSL для JS UI, который бы меня устроил.
Вот это компактненько. Может ещё как попроще можно.
И пару «шаблонов» в html (slim):
PS Я тоже бекендщик.
wc -l? А опция -c в grep почему не?