Feb 11 2010

Buzz е новият Twitter… че какво му има на стария?!

Category: Web,Нонсенс,СоциалниLucho @ 16:16

Такааа, след близо 4 месеца без да напиша нищо ново най-накрая се реших. Провокира ме новата услуга на Google – Buzz. Може би ако Google не ми натрапваха един глупав сплашскрийн с глупави въпроси по него, докато се мъча да си видя мейла в Gmail, нямаше да се налага да пиша лоши неща за новата им услуга… но сега се налага.

За тези от вас, които все още живеят в пещерите, ще ви кажа че Buzz е просто поредната микроблогинг услуга, която копира идеята на Twitter, но е добавила няколко фенси неща, като например тъмбнейлове на клипчетата и възможност за директен отговор на пост. Добре, ама това напрактика прави микроблогинга да не изглежда микро и да не е съвсем блогинг, по-скоро прилича на грозен претрупан Фейсбук, от който повечето туйтърджии се опитват да се спасят.  Гугъл винаги са имали нюх и са правили страхотни неща, но истината е че немогат да създадат по-гениална социална мрежа от Фейсбук и Туйтър и да се опитват да ги копират е  обречена идея. Хората са свикнали с тези две популярни мрежи и няма да  ги зарежат… за разлика от настолните игри, социалните мрежи не се напускат НИКОГА! Освен това Фейсбук има добре измислена и изградена инфраструктура за интегриране на приложения, 350 милиона… да – милиона, души, Туйтър е постоянно претоварен от нетърпеливи потребители, доста е тренди назапад и печели симпатията на хората предимно с простата си изчистена визия, която набляга на съдържание, а не на безсмислени функции. Buzz е нещо средно между тези две социални мрежи – ФБ и Туйтър,  но за съжаление обединява предимно негативните им качествата – ни риба, ни рак.  Може би Гугъл се надяват да отклонят част от хората към своята мрежа или пък да зарибят потребителите на Gmail да ползват Buzz. Съмняваме да успеят да направят, което и да е от двете, но само времето ще покаже.

Мен лично ме вълнува само един въпрос – дали ще доживеем един ден да играем Farmville в Buzz? 😀


Oct 06 2009

Новите метростанции в София

Category: НонсенсLucho @ 20:33

Днес се видях с един много добър мой приятел (Весо), който учи в Германия и тъй като нито аз, нито той е виждал новата част от метродиаметъра, решихме да се разходим и да поснимаме из новите станции.

Извинявам се за лошото качество на снимките, но камерата на телефона ми просто неможе повече. Ако все пак качеството много ви дразни, просто се разходете из новите станции и вижте сами 😉


Sep 25 2009

Първа среща с Ubiquity

Category: Firefox,HTML5Lucho @ 01:40

Тези дни попаднах на поредното интересно нещо от Mozilla – Ubiquity. Накратко това е плъгин, който осигурява лесно и кратко писане на команди автоматизиращи последователност от действия или предоставящи интерфейс към услуга. На разположение е терминал, в който човек избира команда, извежда се малко панелче, в което се вижда резултата… и това е в общи линий. Това с което бие bookmarklet-ите е вграденото jQuery, възможността да има стотици команди (bookmark лентата е ограничена от към резолюция :P), предлагане на шаблонен интерфейс (попълвате дескрипшън, хелп, etc и те се появяват на правилното място в правилното време), прави Ajax заявки към произволен сървър, има разни шантави тематични аутокъмплийт списъци (nouns), notification bar-че  и още куп готини работи. Пише се на Javascript и Python (само за OS X и Linux, Windows не е стандартно с Python – така че няма как 🙁 ) и кода излиза умопомрачително кратък, главно заради хелпърите, които идват с Ubiquity и jQuery. Част от стандартните команди, които са в инсталацията са twitter клиент, бързо търсене на различни места, локиращо по IP скриптче, което дава линк към google maps, превод in-place на фрагменти от страница, скъсяване на линкове чрез tinyurl и други.

Разбира се, аз като open-minded developer на какъвто се правя напоследък, няма как да пропусна възможността да напиша нещо малко и от сърце за Ubiquity, а и ScreenShotMe стана толкова “популярен” (трябва да измислят четворни кавички, двойните неотразяват добре реалността в този случай), че съм готов вече на всякакви експерименти – включително и писане на Ubiquity команда, която да прави снимка на текущата страница и да я праща (в ада :D) на сървиса. След около ден рисърч и зяпане из сорсовете на Firefox, се убедих че nsITransferable неподдържа “image/bmp” data flavor – може би защото от BMP формата лъха твърде много на Microsoft, кой знае. Това директно изпотроши първоначалната ми идея юзера да цъка print screen и командата да изпраща целия екран. Но всяко зло за добро – докато разглеждах имплементацията на хелпърите на Ubiquity се натъкнах на нещо яко – начин да изрисуваш window-ски content в canvas. Това явление е тотална измишльотина на Mozilla, защото в HTML5 Canvas draft-та няма такива неща, но все пак спаси положението. Вярно – няма да записвам целия екран, но пък когато човек иска да print screen-не browser-а си, обикновено не иска да му се виждат всички табове например, така че от подобна функционалност, която да предлага снимка само на уеб страницата има смисъл, а и ще върви и под OS X (за разлика от предния път :-D).

// Най-добре натиснете "<>" горе вдясно на страницата, за да се разшири.
// Така създаваме нов запис на команда, която да ползваме от конзолата
CmdUtils.CreateCommand({

// име, аргументи, описание, превю, хелп са задължителни
  names: ["shotit"],
  arguments: [{role: 'object', nountype: noun_arb_text, label: "image format"}],
  description: _("Publishes the current browser snapshot on the web and puts a link to it in the clipboard."),
  homepage: "http://dailyffs.com/index.php/share-screen/",
  author: {name: "Lucho Yankov"},
  license: "GPL",
// preview може и да е метод, който да започне изпълнение веднага щом селектирате командата (без да натискате enter или да я изпълнявате даже), но на мен ми трябва само статичен текст
  preview: _("Publishes the current browser snapshot on the web and puts a link to it in the clipboard."),
  help: _("To specify the image format just put 'jpeg' or 'png' as command's parameter, if no format is specified and the image is smaller than 1200KB it will be saved as PNG, otherwise the JPEG format will be used."),

// execute е кодът, който ще се изпълни при стартиране на командата
  execute: function(args) {
    var window = CmdUtils.getWindow();
// Следващите няколко реда са взаимствани до голяма степен от имплементацията на CmdUtils.getWindowSnapshot
    var canvas = CmdUtils.getHiddenWindow().document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
    canvas.mozOpaque = true; // Дали canvas-ът да поддържа alpha или само солиден цвял (ускорява някои операции)
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
// Шантавият метод на canvas, който рисува прозорци - INSANE!
    canvas.getContext("2d").drawWindow(window, window.scrollX, window.scrollY, window.innerWidth, window.innerWidth, "rgb(255,255,255)");
    var data = null;
// Проверка, дали има експлицитно зададен формат на изображението и ако не, дали то не е твърде голямо за да го правим на PNG и директно да го запазим като JPEG.
// Параметрите трябва да са jpeg, jpg, j, png, p
    if (/^j(pe?g)?\s*$/i.test(args.object.text)) {
        data = canvas.toDataURL("image/jpeg");
    } else if (/^p(ng)?\s*$/i.test(args.object.text)) {
        data = canvas.toDataURL("image/png");
    } else {
        data = canvas.toDataURL("image/png");
        if (data.length > 1600*1024) data = canvas.toDataURL("image/jpeg");
    }
// Показваме в notification bar-а, колко данни се изпращат, за да придобие представа потребителя, дали ще чака докато остарее или повече
    displayMessage(_("Sending ") + parseInt(data.length/1024+1) + "KB...", this);
    MAIN_URL = "http://dailyffs.com/shotme/";
// Изпращаме изображението към сървъра и когато върне като отговор ключа индексиращ картинката, сглобяваме линк и го пъхаме в клипборда и в notification bar-а
    jQuery.post(MAIN_URL, "image="+data, function(key) {
        if (key == "ERROR") return;
        var url = MAIN_URL + "?" + key;
        Utils.clipboard.text = url;
        displayMessage({text: url, onclick: function(){window.open(url);}}, this);
      }
    );
  }
});

Резултата от усилията ми е качен в Git, напълно отворен и поощрен за разширение – http://gist.github.com/192995 , версията на Ubiquity за която го писах е 0.5.4 (в случай, че нещо при някой невърви).

Ако някой има идеи, предложения или питания да заповяда – коментарите са за това 😉

// така създаваме нов запис на команда, която да ползваме от конзолата
CmdUtils.CreateCommand({

// име, аргументи, описание, превю, хелп са задължителни
names: [“shotit”],
arguments: [{role: ‘object’, nountype: noun_arb_text, label: “image format”}],
description: _(“Publishes the current browser snapshot on the web and puts a link to it in the clipboard.”),
homepage: “http://dailyffs.com/index.php/share-screen/”,
author: {name: “Lucho Yankov”},
license: “GPL”,
// preview може и да е метод, който да започне изпълнение веднага щом селектирате командата
// (без да натискате enter или да я изпълнявате даже), но на мен ми трябва само статичен текст
preview: _(“Publishes the current browser snapshot on the web and puts a link to it in the clipboard.”),
help: _(“To specify the image format just put ‘jpeg’ or ‘png’ as command’s parameter, if no format is specified and the image is smaller than 1200KB it will be saved as PNG, otherwise the JPEG format will be used.”),

// execute е кода, който ще се изпълни при стартиране на командата
execute: function(args) {
var window = CmdUtils.getWindow();
// следващите няколко реда са взаимствани до голяма степен от имплементацията на CmdUtils.getWindowSnapshot
var canvas = CmdUtils.getHiddenWindow().document.createElementNS(“http://www.w3.org/1999/xhtml”, “canvas”);
canvas.mozOpaque = true;
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// шантавият метод на canvas, който рисува прозорци – INSANE!
canvas.getContext(“2d”).drawWindow(window, window.scrollX, window.scrollY, window.innerWidth, window.innerWidth, “rgb(255,255,255)”);
var data = null;
// проверка, дали има експлицитно зададен формат на изображението и ако не,
// дали то не е твърде голямо за да го правим на PNG и директно да го запазим като JPEG.
// параметрите трябва да са jpeg, jpg, j, png, p
if (/^j(pe?g)?\s*$/i.test(args.object.text)) {
data = canvas.toDataURL(“image/jpeg”);
} else if (/^p(ng)?\s*$/i.test(args.object.text)) {
data = canvas.toDataURL(“image/png”);
} else {
data = canvas.toDataURL(“image/png”);
if (data.length > 1600*1024) data = canvas.toDataURL(“image/jpeg”);
}
// Показваме в notification bar-а, колко данни се изпращат, за да придобие представа потребителя,
// дали ще чака докато остарее или повече 😉
displayMessage(_(“Sending “) + parseInt(data.length/1024+1) + “KB…”, this);
MAIN_URL = “http://dailyffs.com/shotme/”;
// изпращаме изображението към сървъра и когато върне като отговор ключа индексиращ картинката го сглобяваме
// и го пъхаме в клипборда и в notification bar-а
jQuery.post(MAIN_URL, “image=”+data, function(key) {
if (key == “ERROR”) return;
var url = MAIN_URL + “?” + key;
Utils.clipboard.text = url;
displayMessage({text: url, onclick: function(){window.open(url);}}, this);
}
);
}
});


Sep 24 2009

TLA

Category: Dev,НонсенсLucho @ 16:26

Ето някои абривиатури, които може и да знаете или да незнаете, кой знае…

ACID – Atomicity, Consistency, Isolation, Durability

CRUD – Create, Read, Update, Delete

DRY – Don’t Repeat Yourself

GNU – GNU is Not Unix (recursive acronym)

BSD – Berkeley Software Distribution

BashBourne-again shell

GPL – (GNU) General Public License

CRM – Customer Relationship Management

CMS – Content Management System

DTD – Document Type Definition

PHP – PHP: Hypertext Preprocessor (recursive acronym)

ASP – Active Server Pages

TDD – Test-driven development

BDD – Behavior Driven Development

REST – Representational State Transfer

SOAP – Simple Object Access Protocol

COTS – Commercial off-the-shelf

TFT – Thin-film transistor

LCD – Liquid Crystal Display

Естествено има още много, но според мен има голям шанс да незнаете някои от тези, а пък се срещат тук-таме 😛


Aug 22 2009

Share your screen

Category: Dev,Firefox,HTML5,Web,НонсенсLucho @ 03:43

Напоследък съм изгубил творческата си искра, в работата се занимавам с .NET 2 (нестига, че е .NET ами и е от 2004г 🙁 ) не съм почивал цяло лято и ми се ще да пиша на Ruby и Rails или Objective C за iPhone. Та сред всички тези несгоди и поради факта, че съм програмист все пак (а добрите програмисти решават проблеми ежедневно и би трябвало и своите да могат да решат!!!) предприех някои стъпки за измъкване от блатото, като една от тях беше да си пиша малко проектче за мое лично удовлетворение. Първоначалната идея изникна в главата ми по напълно случаен начин, с времето идеята се развиваше и променяше, пишех по малко код и очаквах вдъхновението ми да се върне и да ми каже какво да правя… е този момент дойде днес – тази вечер.

Първоначалната ми идея, с която няма да ви занимавам сега, включваше използване на HTML 5 Canvas – платно на което може да се рисува и дава пълен достъп до битмапа – красота! Естествено този стандарт е все още слабо разпространен сред браузърите, защото е нов (Microsoft-ския Trident още не го подържа изобщо, бахти изостаналата нация :-P). Идеята включваше и Рейлс, но прагматичното в мен победи и пожела да запълня 99% свободен bandwith на хостинга ми (да, блога ми е толкова популярен, че ползвам <1% от линията 🙁 ). Това води след себе си сравнително неприятното задължение да пиша на PHP… но няма да се лъжем, на PHP се пише много бързо, ама много, много бързо и грозно и… абе селска работа! Предните седмици, докато чаках вдъхновението, реших да проуча въпроса, как мога да взема изображение от клипборда и да го плесна на кенвъса, оказа се нетолкова лесна история, но възможна все пак. Цената не е прекалено висока – ползвам Java Applet-че, което върши цялата работа всъщност. Алтернативата е Flash, но доколкото разбрах Flash 10 налагал по-строги ограничения за боравене с клипборда, а и не обичам Flash и ActionScript (винаги ме е боляло много след интервенция с тях). Големият проблем е, че някъде при прехвърлянето на битмапа от клипборда през аплета към javascript-ския код нещата стават много бавно и това може да отнеме до няколко секунди, за по-големи изображения, но като се абстрахираме от това – ТО РАБОТИИИИ!!!! Следващото нещо, което направих е функционалност за селектиране на фрагмент от кенвъса, почти като в Paint или друг редактор… и в общи линии до тази вечер бях стигнал до тук, когато ме осени идеята – selection tool-а става на crop tool и целия проект се превръща в 3-click-screen-share. Гениално наистина, print screen, paste, [optional: crop], save и получаваш линк… а и подобно нещо не съм виждал да има досега… е друг е въпросът колко често на човек му трябва подобно нещо, но като се замисля, че иначе трябва да отваряш image editor, пък после да save-ваш, пък после да го публикуваш някъде, и накрая да пратиш линк – it is retarded!

Първоначалната версия на услугата е тук: http://dailyffs.com/shotme/

За сега всички енджини без този на Microsoft подържат в някаква степен Canvas, като за FireFox 3.5 приложението върви на 100%. Естествено за view на изображението впоследствие не е необходимо нищо специално и всеки браузър би свършил работа, така че всички ще могат да видят скрийншота ви – спокойно 😉

Ако някой има предложения или поне му е харесала идеята или пък го е отвратила, може да напише мнението си тук. Чуждият фийдбек е стимул, стимул за подобряване, изпипване и разширяване на идеята. Ако има интерес ще наема нов domain и ще се постарая да оправя забавянията, да сложа една четка, че да може да оградите примерно определено място от изображението, на което искате да наблегнете.

Хубаво е когато човек дава свобода на въображението и творчеството си, кара те да се чувстваш щастлив и да си изпълнен с идеи и енергия… даже и цената, която трябва да платиш да е малко писане на PHP 😛


Aug 02 2009

Трамбоване

Category: СоциалниLucho @ 11:20

Понеже в момента съм в тотален творчески блокаж и е 2-ри Август ще посветя една статия изцяло на трамбоването.

Забелязах че повечето хора, които могат да плуват незнаят как да се задържат неподвижно над водата с минимални усилия. То май никой не им го обяснява това, като ги учат да плуват, но трамбоването (egg beater) e един супер ефективен начин, който няма да ви измори (и евентуално да се удавите) бързо. Цялото движение изглежда елементарно, но си изисква време докато свикнете. В резултат ще можете да се задържите на едно място изцяло чрез краката си и ще имате свободни ръце, поради което  е много удобно за морски пехотинци (на тази снимка: http://en.wikipedia.org/wiki/File:Marines-tread-water-July_12-28-05.jpg ) 😀 и състезатели по водна топка.

Скромната ми кариера на състезател по водна топка (5-6 клас) сега допринася за това да си стоя спокойно посредата на 3 метра дълбок басейн заобиколен от … никого. Даже и да си паскам топка с някого (обикновено този някой след 20 минути се уморява и отива до ръба на басейна). Та запишете се на водна топка 🙂


Jul 06 2009

Дългият път на съзиданието

Category: Dev,НонсенсLucho @ 18:24

Често обичам да не документирам, да не описвам нещата които правя… понякога съжалявам за това. И не толкова че видите ли след 5 години ще съм забравил за какво е бил даден проект, а по-скоро защото не записвам яките моменти, които съм преживял докато съм го разработвал.

Ето, сега ще се поправя и ще опиша стъпките, идеите, мислите, абе всичко през което минавам докато дивелъпвам проекта си по Python. В този смисъл постът, който четете в момента ще се допълва ежедневно с новости, за това стей тюнд.

Проекта представлява конзолен mp3 плейър за Линукс (уж Python е портабъл… но аз не го вярвам това, за сега 😛 ), като интерфейсът ще е тип “стара дос програма” – графичен интерфейс с ascii символи. Надявам се, освен стандартните за всеки mp3 плейър нещица, да успея и да го накарам да работи с онлайн радиа (streaming). Естествено в момента си поставям цели, за които не съм напълно убеден дали ще са реализуеми… но какво пък – ще опитам! Друг фичър, който много искам да направя е да минава в бекграунд режим, за което имам някакви идеи, но пак неизвестните са доста.

Естествено вече съм попрегледал какви благинки предлага Python и какви външни компоненти (ех, колко SE  звучи това) бих могъл да ползвам. За нещастие, част от нещата изглежда са за Python 2.5, но докато неразцъкам и това твърдение е в сферата на unknown-ото.

Day 0:

И така “дей 0” е по-скоро “вечер 0”, бутнах се под Убунтуто си и си сложих Eric (IDE за Python). Доста бутони, доста функции, дано да се работи приятно с това нещо. Тръгнах да създавам нов проект и се сетих – нямам име за него. Е… след 15 секундно размишление се спрях на “Pyp3” (“пай-пи-три”). И така вече съм готов да започвам най-нелепата част… подкарване на някой от основните модули които ще ползвам. За съжаление не намерих нищо,  което да пуска звук и да е за Python 3, така че ще се пише на Python 2.5. Това всъщност не е толкова зле, защото:

А) Рано или късно ще портнат библиотеките до 3

Б) Python 2.5 е стандартна версия за всяко Убунту и други дистрибуции

Та инсталирах audiere и numpy (дипенденси) от репобраузъра и успешно пуснах една mp3-ка (чак да не повярва човек 😀 ). Следваща стъпка е да разцъкам curses – нещото, което осигурява ascii интерфейса.

След един час четене не умопомрачително дългия менюъл на curse и малко конзолно тестче стигнах до следните два важни извода:

1. Curse няма готови диалогчета (за open file например) – селско (все пак има надежда, че някъде някой е написал нещо по въпроса)

2. Терминалите не са това което бяха. На 22 инчов монитор в текстов режим имам 48 реда по 136 колони, в графичен много повече… къде изчезнаха добрите стари 80×25. Може би са изчезнали заедно с DOS, кой знае :D. На малкия ми латоп (резолюция 1024х600), в текстов режим конзолата е баш 80х25 реда. Т.е. нищо не изглежда както трябва – неприятно.

Друг проблем е че трябва да поддържам доста диалогови прозорци и мишка. Решението може би е тази надстройка на curses – Urwid, която ще спести излишното копане за диалози.

Интерфейса, който за сега ми се върти в главата включва тикер за текуща песен, скролче за звука, бутони add, rem, jmp, que, ext, bkg (добавяне/махане на песен, jump по име – включва диалог, que – включва диалог, exit и преминаване в background режим), текуща плейлиста (в общи линии списък със заглавия).

Day 1:

Продължих да разцъквам Urwid и като цяло съм доста доволен. Направих прототип на плейлиста, но изникна нов проблем. В плейлистата човек може да има хиляди песни и е нормално да има скролбар, само че скролбара е фиксиран от броя редове в терминала (това значи, че е ограничен по брой позиции, на които да се мести), което неминуемо води до проблем че при преместване на скролбара с една позиция, в листата може да бъдат скипнати повече записи отколкото може да покаже. Ще се получи “прескачане”, което ще е по-скоро дразнещо от колкото полезно. Поради този факт (и това че скролбар не е имплментиран в Urwid официално :-P) обмислям вариант да мина без скролбар, а по-скоро с филтър, който да филтрира песните по част от име и да сложа поле, което да показва на кой номер песен (страница) е плейлистата в момента. Това би помогнало и за реализацията на Jump функционалността, като просто се филтрира по ключова дума и се натисне някаква клавишна кобмбинация… нийййт. Вечерта завърши с Пранка 🙂

Day 2 & 3:

За тези два дни горе-долу направих плейлистата и филтрирането и леко се отчайвам от скоростта с която напредвам, а ми предстой да свържа кода за directory browsing с плейлистата. Все пак все повече ми се избистрят идеите в главата, така че може да се каже че положението не е толкова критично. Дано дедлайна не ме притисне много…

Day 4:

Интегрирах кода за браузване из файловата система с плейлистата и добавих код за плейване на аудио файлове – даже пуснах няколко (big success)! Вече съм една идея по-спокоен, защото имам нещо работещо. И все пак ми остава queue функционалността на плейлистата, което няма да е толкова прозрчано и просто. Чудя се дали да не напиша малко тестове и паралелно с това да не рефакторна кода на няколко места, може би е добра идея (Както се вижда съм скептик относно предварителното писане на тестове… а по принцип съм скептик и относно писането на тестове ИЗОБЩО, но се старая да променя това!!!). Намерих още една библиотека, която би била полезна в проекта – Mutagen, служи за четене на тагове от разнообразни аудио формати и ще ми помогне с title/author в плейлистата.

Day 5 & 6:

Уж беше събота и неделя, а свърших доста малко неща. Все пак позавърших изгледа на плейъра и четенето/показването на ID3 таговете. Реших да отложа правенето на опашка, защото е мега досадно и не е толкова фън, колкото плейването на стрийминг и рънването в бекграунд. Плейването на стрийминг се оказа доста нетривиална задача, която ми отвори един куп проблеми, та и там нещатата не са розови. Трябва да почна да пиша тестове… ех тези ш****и тестове…

Day 7 & 8:

Оказа се, че Audiere е тотално скаран с всичките ми идеи да го подкарам с http стрийм… то не бяха наименовани пайпове, сокети, даже се мъчих да му вкарам numpy-ски масив от float32, но след дълги среднощни борби реших да се преориентирам към GStreamer, който е бая тежко, по-точно обемно нещо, и много исках да не опирам до него. За това пък плейва без грижи само като му се даде URI. Отначало исках да ползвам Audiere за плейване на локални файлове и Gstreamer за уеб стрийминг, но освен че е доста грозно решение, срещнах трудности в освобождаването на заетия аудио ресурс когато искам да подменя on-the-fly библиотеката. По-точно Audiere освобождаваше веднага всичко, но на GStreamer му отнемаше поне 5-6 секунди и switch-ването помежду им не ставаше гладко. В резултат на това се наложи да си напиша адаптор към GStreamer от стария код за плейване на фиайлове, който ползваше Audiere. Беше кървава баня, но се справих, даже промените по интерфейса бяха почти незначителни. За съжаление GStreamer е слабо документиран също, макар че има туториали, но референса (вкл. и този, който е в интерпретатора) е много постен. Голяма мъка беше, но сега поне мога да плейвам радио 🙂

Day 9:

Гледах Ледена Епоха 3 (3D), но не беше нещо особено. Поради този факт не свърших много – оправих цветовата схема на плейъра, проведох задълбочен рисърч за пускане на application в background, който не доведе до никакви реални резултати. Впоследствие открих workaround – просто трябва да се пусне плейъра във втори терминал (ctrl+alt+f[1..6]) и да се switch-ва в него като трябва да се контролира pyp3. Останаха ми още два малки таска и после тестове.

Day 10:

Добавих възможност за конфигуриране на outlook-а на плейъра, като се опишат цветовете на отделните части от ascii интерфейса в конфигурационен файл. Готино е когато нещата са максимално customisable. Сложих и event handler, който да следи по кутлурен начин дали дадена песен е свършила. Това ми отне сумати време, защото няма кой знае колко полезно инфо в нета… или трябва да падне голямо четене, докато се разбере по-точно. Много мразя, когато се занимавам с непопулярни неща, защото са слабо документирани и само ми късат нервите! Освен това в крайна сметка при четене от online stream не пристига event за край на stream-а ако се прекъсне връзката, което е хипер малумно, защото на това се надявах най-вече :(. Оправих разни бъгове и с това приключвам официално работа по Pyp3 (е имам да пиша тестове, но за тях няма да блогвам).

Final Conclusion:

Използвани компоненти: GStreamer, Urwid, Mutagen, Audiere (GStreamer-а го замени впоследствие)

Функционалност:

– плейване на файлове и стрийминг

– филтриране, jump, add/del, select, directory browsing dialog (само интегриране)

– auto save/load на плейлистата и цветовата гама на плейъра

– play/pause/stop/next/prev, fastforward/slowbackward ( 😀 ), ID3 tags, текущо време на плейване, state на плейъра, volume

– autoplay next track, autoreconnect to stream on lost connection

След една камара време и безсъние резултата не е чак толкова грандиозен, но това се дължи основно на факта, че падна голяма борба заради слабите документации и защото трябваше да switch-на от Audiere към GStreamer. Съответно голяма част от времето отиде за направата на, иначе, не особено сложни неща.

Неща за които не ми стигна времето:

– Queue – малко ме е яд за това, защото има полза от опашка

– Rating – не ползвам такива неща… но може да има смисал

Все пак от много време не бях писал нещо, което да ми е на сърце и да ме ентусиазира, така че, въпреки всички трудности съм happy 🙂

pyp3


« Previous PageNext Page »