blog.

Almost there.

  • Share link decrapifier

    Приложението добавя елемент в менюто за споделяне на Android, който копира споделяния текст, премахвайки частите от него, които се използват за допълнително следене. Неща като “utm_source”, “fbclid” и др. изчезват.

    Така, например, адресът “https://www.instagram.com/p/BppzKrmneqd/?utm_source=ig_share_sheet&igshid=jywYcSpOs8008“, който генерира Instagram от share бутона си, ще стане “https://www.instagram.com/p/BppzKrmneqd/“.

    Може да се свали от Google Play от тук:
    Get it on Google Play

    Предистория

    Не обичам постоянното произволно следене отвсякъде с цел таргетирана реклама. Досадно е. Тъй като не искам да използвам интернет, както го прави Сталман, използвам AdBlock, където мога. Освен това използвам и ралични други похвати, докато използвам интернет, за да се чувствам спокойно и да се залъжа, че профилът ми при всеки рекламиращ отпадък не е плашещо подробен. Смятам скоро* да подкарам pi-hole на OLinuXino-то в нас.

    Понякога се сещам да напиша някаква простотия, която се гаври с analytics софтуера на някой сайт. Пример за това е глупавият ми chrome extension, който взема “utm_source” в даден адрес и го променя на нещо по-подходящо за тези хора. Далеч от перфектен, но беше забавна играчка.

    Преди време започнах да си играя с Instagram. Дълго време не ъпдейтвах, защото няма случай, в който такова приложение е станало по-добро след ъпдейт. След като се подлъгах да ъпдейтна, се оказа, че са променили начина, по който копират линка към дадена снимка. Преди процесът по копирането беше прост – кликваш на менюто с трите точки -> Copy Share Link… и готово. Сега има “Share”, което изкарва подробно Share меню, в което са изброени всички приложения, заедно с конкретни хора от някои. Това означава, че трябва да чакам да хвърчат една камара Intent-и, докато копирам линк.

    Когато най-накрая успея да стигна до “Copy to clipboard” менюто или използвам някое от готовите, линкът, който се копира съдържа информация от вида “/?utm_source=ig_share_sheet&igshid=sittagd5tf01”. Тоест всеки, когото наспамя със снимка на мотор или задник, ще получи линк, чрез който лесно се проследява откъде идва. От там е елементарно да се направят много изводи. Щом този човек е отворил снимка, която е изпратена от човек, който харесва мотори и задници, значи и този конкретен нов човек харесва същото! Нека му рекламираме чорапи за каски и селфита на произволна кака с нарцистично разстройство!

    Това вероятно е едно от нещата, които дразнят само мен, но все тая. Имах проблем и го реших чрез силата на програмирането!


    * Виж Valve time


  • Локална разработка с отдалечен сървър като хост на контейнери, сървъри, service-и и т.н.

    Пак открих топлата вода.

    Налага ми се да работя с Macbook. За преживяването ще кажа, че дори след като му сложих Debian, не мога да разбера защо някой може да го ползва доброволно. За 12-те години, в които ползвам Linux, не бях виждал да се ползва swap-а при сериозно натоварване. Тук стигнах 7 GB swap при нормална употреба. Необяснимо за мен е как толкова хвалено нещо работи толкова зле. Говоря чисто като хардуер. Откъм неудобността на интерфейса няма смисъл да коментирам. Толкова с хейта. Най-вероятно има случаи, в които си струва да дадеш близо 6K за лаптоп.

    Малко преди екраните да започнат да мигат и да се изключи.

    В процеса на работа се налага да пусна няколко docker-ски контейнера с различни услуги. Тъй като не мога да променям конфигурациите без да счупя работата на други хора, услугите на docker-а трябва да работят локално. Това води до повишаване на температурата на процесора от 75 градуса при idle до около 100. 

    Първото ми решение беше да пусна Apache с ReverseProxy, но това беше не само неудобно заради излишно много конфигурация, но и не особено добре работещо. След това мислех да пусна squid, който да пренасочва локалните ми портове към портовете на отсрещната машина. Това също ми изглеждаше като много конфигурация.

    Решението на проблема ми се оказа доста по-просто – SSH с GatewayPorts=yes и изброени портовете, които да се пренасочат. Цялата работа се свежда до това:

    ssh \
    	-L 3306:localhost:3306 \ # SQL
    	-L 5672:localhost:5672 \ # Rabbit
    	-L 6379:localhost:6379 \ # Redis
    	-L xxxx:localhost:yyyy \ # Друго
    	-N -o GatewayPorts=yes mgc@whatever
    

    Така когато се обърна към localhost:3306, например, заявката се обработва от MySQL сървъра, който работи на отсрещната машина (whatever в примера по-горе).

    Засега не съм срещал проблеми при този начин на работа. Използвам го както с GCP, така и с DigitalOcean без забележимо забавяне. 


  • BMW Testride

    BMW Testride

    Вчера карах два мотора, за които мечтая, откакто ги има – BMW S1000RR и R1200GS. Едното е суперспорт, другото – dual sport/jizzmachine.

    От BMW Motorrad Варна за втори път правят тестрайд на нови модели мотори (или поне за втори път стигам до него). Миналия път много исках да пробвам точно RR-а и GS-а, но карах S1000XR и R1200R. Влюбих се и в двата. XR-а е удобен за дълъг път, а R1200R е с убийствен звук и за града и средни разстояния е идеален.

    И този път маршрутът им беше хубав. Изглеждаше долу-горе така:

    И този път всички от предходната група слизаха от моторите с усмивки от ухо до ухо. Разбирам ги напълно.

    Първо карах S1000RR-а. Според сайта на BMW тежи 208 килограма мокър и прави 199 к.с. Има видеа на хора, които правят 0-300 km/h за 16 секунди с този мотор. По една от спецификациите ги правеше за 19.1 s.

    BMW S1000RR
    Някой е наклонявал до ръба на гумите с това животно :/

    Този мотор е много над възможностите ми. Тъй като е чисто нов (на под 1000 километра пробег), все още е в режим на разработване на двигателя и беше ограничен само до 10 000 оборота и 200 km/h. Донякъде се радвам, че беше така, защото на шеста дърпа без да му прави впечатление. При скорост от 205 km/h и напълно легнал не се усеща, че се движа с такава скорост. Това е силно притеснително, защото лесно може да спреш да си даваш сметка какви са последствията от грешни движения.

    Пробвах няколко пъти ускоряване от 100 до 200 km/h. Трудно ми беше да се задържа без да съм легнал напред и да стискам резервоара с крака. Ускорението на това нещо е безумно. Спирачките са много добри и на няколко пъти ми се стори, че ще направя предно кълбо.

    Този имаше Shift Assist Pro, което е модерния quickshifter/auto blipper на BMW. През цялото време си играех да ритам скоростите нагоре-надолу без съединител. Въпреки стоковия ауспух, звукът беше силно задоволителен и пука приятно.

    По едно време спрях ABS-а и го сложих в Race режим. Страшното стана още по-страшно. На няколко пъти вдигах предна гума на всички предавки. С включен ABS и рязко връщане на газта на втора колелото се вдига леко и се усеща как веднага се включва защитата и се отнема от мощността. В Race и без ABS няма такова нещо – даваш газ и си заминаваш.

    Направи ми впечатление, че е нужно осезаемо повече усилие, за да се наклони в завой, отколкото при моя мотор. Но пък завои, които с моя са страшни при 100 km/h, тук не се усещат при 180 km/h.

    Много съм малък и неопитен за такава машина още. Не мога да си представя как хора карат това до пълните му възможности. Определено е впечатляващ. Всичко в него е за писта и каране без ограничения.

    Някъде по средата на маршрута разменихме моторите и имах щастието да покарам R1200GS-а. Този ми е в идеалите за мотор, защото съм скучен моторист и си падам повече по спокойното каране, отколкото Street Rossi изпълненията.  Въпреки че тежи 244 килограма според сайта, изобщо не си личат. Всичко е балансирано и се усеща като много по-малък и лек.

    Не знам защо стана модерно да слагат телевизори на моторите, но тук всичко ми хареса как е подредено. Имаше доста отразена светлина от дисплея и на моменти не се виждаше нищо, но решавам да обвиня лепенката, която беше отгоре. Този мотор също е нов все пак.

    Искаш да провериш налягането на гумите без манометър? Няма проблем!

    Като потеглих, помислих, че вдигнах гума. Оказа се, че окачването има огромен ход и просто задницата потъва, а предните амортисьори се разгъват. Като лодка е. С моя се уморявам след 500-600 километра за ден. С този виждам как лесно се минават над 1000. Разбирам хората, които правят преходи от единия край на континента до другия с тези мотори.

    Тук също имаше quickshifter и също се забавлявах да ритам нагоре-надолу, докато ауспуха гърми. Интересно беше, че когато форсирам със стиснат съединител, моторът се накланяше наляво заради въртящия момент на двигателя. Ако не бях изтрил всички видеа от камерата, щях и да го покажа[1].

    Чудих се срамно много време как се пали, докато не ми показаха, че е без ключ…

    Освен всичко друго, седалките и на двата мотора са страшно удобни. Не знам от какъв материал са, но са доста меки и не спарват.

    Когато порасна, ще си купя GS (и SuperDuke, и S1000RR, и Africa Twin, и V-Strom, и HP4 Race, и H2, и Duke 390, и Duke 690, и WR450R, и 500 EXC-F, и Shadow, и V-Star 1300).

    Междувременно на паркинга на Metro има някакво автомобилно шоу, където показват и няколко нови модела на Honda – Africa Twin, CB650F, Rebel, някакво NC и разни скутери. На косъм съм между GS и Africa, но там не ми дадоха да карам, защото нямам три години стаж с категорията. Жалко. Разбирам ги, но пък точно за това са застраховките 🙂

     

    [1] Реших пак да сложа Linux на основния компютър и да се върна към ученето на нови неща и странични проекти. Пуснах да се прави флашка за новия Mint и вместо флашката избрах камерата без да искам. И така час и нещо видео от RR-а и GS-а си заминаха безвъзвратно и завинаги.


  • Туп

    В четвъртък паднах за първи път с мотора. Отне ми малко по-малко от година и малко над 10 000 километра.

    Had to lay ‘er down

    Как?

    Докато се разкарвахме из града, минахме през едно от многото места с ремонт – тунелът под ФК – Варна. Доскоро беше затворен изцяло, но тази вечер видяхме, че има отворена една лента и един знак за заобикаляне. Докато излизах от тунела, гледах да не се хлъзна в калта и не видях камарата с пръст и камъни, която беше малко по-висока от мен и заемаше моята лента и малко от насрещната. Дали заради разсеяността ми заради разни лични драми или липсата на очила – не знам.  Движех се с не повече от 35-40km/h, защото беше мокро и кално навсякъде. Въпреки това не можах да реагирам адекватно.

    Заради очевидно несъобразената скорост и доста хлъзгавия път не посмях да  направя рязкото заобикаляне, което упражнявам постоянно. Изборът ми беше да съборя мотора на лявата му страна или да мина през камарата. Събарянето на мотора крие потенциалното му преобръщане или т.нар. “highside“. Вярно, че скоростта ми беше прекалено ниска, за да ме хвърли чак толкова, но пък щях да спра рязко в камарата и да си смачкам репродуктивните прелести. Реших и, че не искам да се пързалям по пътя, осеян с кофти остри камъни, докато моторът е върху крака ми.

    Намалих, колкото можах за краткото време, което имах, опитах да заобиколя плавно, но минах през по-ниската част на камарата. Моторът скочи и за малко да успея да направя приземяването. Не помня как и точно в кой момент паднах. Мисля, че съм заключил предното колело, когато се е докоснало до земята, но не съм сигурен. Преметнах се през кормилото, приземих се по гръб (според болките – на дясната страна) и започнах да се пързалям. Докато се пързалях, усетих предната гума на мотора с ръка и си представих какви неща ме очакват, ако спра преди него. Приземяването го усетих все едно съм се тръснал малко по-силно върху леглото.

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

    Извадих голям късмет и се разминах с една малка синина от някой камък, върху който съм се приземил и болки в дясното рамо и гърдите. Очаквам докторът да каже, че е само леко натъртване.

    Доста мисля как можеше да си го отнеса много по-лошо – при премятането над кормилото ръката ми можеше да се закачи между ръчката на спирачката и ръкохватката, можеше моторът да се приземи върху мен по много различни начини и още една камара гадости.

    Поражения

    Както казах, разминах се само с малко болки тук-там. Моторът и екипировката поеха останалото.

    Дясното огледало се отчупи директно, пластмасите не стават за нищо, резервоарът е огънат, рамката и капакът на статора имат надраскано.

    Радвам се, че ми се размина с толкова нищожни повреди. Радвам се и, че този път нямаше никой на седалката зад мен. Имайки предвид тъпотиите, които успях да свърша върху мотора за нещастно малкото ми опит, можеше да не мога да пиша нито една посредствена публикация повече. Противно на очакванията, не паднах, докато правя типичните за глупавите моторджии неща, а докато карам бавно, внимателно и недоглеждащо 🙂

    Основна част от щастливата развръзка е екипировката, с която бях, а именно (по слоеве):

    • Ботуши – Spada Curve Evo WP
    • Супер мъжествени моторни гащи, които не са клин – Rev’it Inca
    • Анцуг, за да не ми е студено
    • Моторни дънки с Covec – Bull-it Covec SR6
    • Някаква термо блуза
    • Някакво горнище с полар и нещо против вятър
    • Яке – RST R-16 (без протектора за гръб)
    • Ръкавици – Oxford HotGloves (подгряването беше включено)
    • Каска – Icon Airmada (Rubatone Black)

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

    Нататък

    Ще опитам да докарам мотора във вид годен за каране възможно най-бързо, защото колкото и леко да беше това падане, доста ми повлия на психиката и едва ли скоро ще се чувствам спокоен върху него. Това се оправя с каране => трябва да го оправя бързо.

    В момента моторът е с разглобена предница и му предстои да се преобрази в още по-гол, почти streetfighter. Все още търся подходящия фар. Засега се заглеждам в единичния фар на MT-09 и фабричния на FZ6N.

    Гледката е странна без всичката пластмаса и таблото

    Има много потенциал да стане интересен

    Далеч съм от идеята да го правя шарен. Мисля си, че скоро няма да харесам фар и ще карам с оригиналния, но без пластмасите. Засега идеята е да сменя ръчките, ръкохватките и доста да префасонирам предницата. Това ще стане плавно и малко по малко. Ако изобщо стане.

    Засега нещата са в този ред:

    1. Фар + слюда
    2. Мигачи
    3. Тапи на рамката и поне предната ос (след дъжд – качулка)
    4. Ръчки
    5. Ръкохватки
    6. Степенки, защото hero blob-овете на моите са счупени, а искам да ги изтъркам сам

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


  • 2017

    Можеше да е по-гадно, но не беше. Този път научих много.

    Годината ми започна силно с научаването на това какво е burnout и как може да се преработиш толкова, че да ти е трудно да говориш.

    Известно време бях one-man team. За малко над два месеца написах софтуера за POS терминал (без да рисувам дизайна), който после ходи да впечатлява хора по изложения. От нищо. На Android.

    Първите два commit-а доста добре описват началото на проекта

    Тези малко над два месеца изкарах с 16-часови работни дни и една почивна събота за целия период.
    Въпреки работата с не особено добре документирани китайски библиотеки, научих много. Например – наложи ми се за два дни да напиша цялата комуникация между терминала и PayPass/PayWave карти на ниво APDU, защото нямаше работеща такава библиотека.

    Смятам, че това е проектът, на който съм дал най-много. Преди да се наложи да копирам чужд код върху моите неща, никъде нямаше недокументирани части.

    Силно увреждащо преживяване.

    ***

    Overtime-а от големия зор ми помогна най-накрая да си купя мотор. Това го чакам, откакто се помня, а последните няколко години отделям доста време на четене и гледане на моторни неща.

    Като за първи мотор ми се падна Yamaha FZ6-S (или Fazer). Двигателят му е от R6. 600cc, 90-100hp.

    Доста се колебах дали да не започна с някой 250-кубиков и после да взема по-голям. Понеже безпроблемно карах курса за категорията на малко по-нов FZ6, реших, че ще мога и така.

    Така изглеждаше през октомври. Мястото е мидената ферма Дълбока

    Остатъка от годината мина в прилично количество каране и към момента имам около 10 хиляди километра с моя мотор. Освен него карах още 10. Да са живи и здрави от Yamaha и BMW, че дават на произволни хора да карат чисто нови мотори! Без такива събития и testride-ове едва ли щях скоро да се кача на последен модел мотор за 50+k . Съжалявам само, че не можах да карам R1200GS и S1000RR. Единият е удобен и красив adventure, а другият е красив и прави 0-300 за 19.1 секунди. И техният ред ще дойде.

    Много се надявам да не се затрия някъде заради някой идиот (включвам и себе си в това). Засега смятам, че се справям с чупенето на стереотипа за гадните мотористи.

    Сред любимите ми случки е как един тип искаше да ни сгази, докато се движехме с 50 в града, защото бързал. Спряхме да го питаме какво прави.  Част от репликите: “Бързам. Точно вие трябва да давате газ. Как да пазя моториста като ми карате с 50”. След това влезе в кафене.

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

    Предположението ми се потвърди – дори да караш спокойно и да следваш закона, мнозинството смятат мотористите за “донори” и правят всевъзможни тъпотии. Това е спор, който ми омръзна да водя. Трябва да си събера мислите по въпроса някога.

    Разбира се, не са ми само другите виновни, но за това ще пиша след малко. Засега ето част от видео, докато въртя гума с около 100km/h върху BMW R1200R 🙂

    Мигащата светлина е traction control-а, който не може да смогне с тъпотията ми отговорното каране в студеното време.

    Тъй като всяко качване на мотора ми дава много материал, ще пиша пак по темата някога.

    ***

    Официално приключих с училището. Защитих си дипломната работа и вече съм още повече инженер.

    ***

    Покрай burnout-а се оказа, че редовният сън е нещо, без което не е много умно да се съществува.

    Използвам SleepBot от август 2014-а и за 2017-а имам 363 записа. Средно съм спал 6.68 часа, което е доста добре, имайки предвид преобладаващите ми периоди от по 1-2 часа спане, когато се занимавах с много freelance, full-time работа и университет. Графиката изглежда така, като на 2-3 места има липсващи записи:

    Ще се постарая да е малко по-добре занапред.

    ***

    Случиха ми се неща, които не съм предполагал, че биха се случили по този начин и други, с които дори не мислех, че ще се сблъскам някога.

    След като се разминаха драмите, започнах да се връщам към нормалното. Започнах пак да свиря малко по-редовно и да уча нови компютърни неща постоянно.

    Толкоз.


  • 10 години

    Преди малко повече от 10 години инсталирах WordPress за първи път, защото случайно го мернах като алтернатива на glog (бях забравил как се казва даже), защото нещо не можах да се справя с подкарването му върху apache2triad.

    Първата версия на текущото място тръгна през лятото на 2006 и вървеше върху XP. В момента има малко под 100 скрити поста заради cringeworthy съдържание и около 60 драфта, стоящи такива заради мързел.

    За тези години от келеш, който няма идея какво прави, минах през всевъзможни компютърни приключения и станах 25-годишен тип, който няма идея какво прави. Успях да програмирам смислени и безсмислени неща на всякакви езици за програмиране и платформи – от различни асемблери до неща, които те разтреперват със синтактичната си захар. Минах през уеб, хардуер, бази, администрация и още интересни неща. По някое време станах и инженер (спорът колко компютърните инженери са инженери е за друг път :)).

    Известно време мислех, че ще мога да напиша операционна система. В крайна сметка стигнах до “микроядро“, което се boot-ва и слуша прекъсванията, с които работи DOS. Напълно безполезно, но пък мога да кажа, че съм писал драйвер за екран и клавиатура. Едното беше framebuffer заигравка, а другото – масиви със символи, които се използват според това дали има Shift или Caps Lock. Тъпо, но “драйвери” 🙂

    Нямах никакво намерение да работя със C++, но в последните няколко години правя точно това, след като сайтовете ми омръзнаха.

    10 години по-късно компютрите са ми още по-интересни, отколкото бяха преди. Противно на твърденията на една камара народ, че ще ми омръзнат.

    Имам да уча още прекалено много неща. Навън вали и не става за мотор, затова отивам да чета!


  • Умна шамандура, част 1

    a.k.a. “инж.”, part deux

    Преди време писах, че ще си водя бележки за дипломната, но се наложи да я зарежа и да не предам през януари, както беше първоначалния замисъл.

    Първият draft на това е от втори януари 🙂

    Ghetto-ass шамандура
    “Шамандурата”, сглобена върху прототипна платка, две планки и няколко шпилки за закрепване на анемометъра, ветропоказателя, LoRa-та и GPS-а.

    Ще я опиша тук, за да си припомням какви шарении съм правил преди да стана стар, циничен и (още по-) скучен. Записката излезе малко над 100 страници без задължителния пейстнат код. Освен многото приказки, има и 102 “фигури”, примери и таблици, солидна част от които си играх да рисувам.

    Първоначалната идея беше следната – едно Arduino следи всички датчици и предава стойностите им безжично по LoRa радио. От другата страна да стои друг LoRa възел, който е свързан към PSoC 4 и приема данните. PSoC-ът ги предава по сериен порт към компютър, на който работи .NET-ско приложение, което ги обработва и ги тика в MS SQL баз от данни някъде. Визуализацията е с много форми, графики и т.н.

    Проблемът с това е, че цялото нещо може да тръгне точно веднъж, защото има много зависимости от библиотеки, dll-и и т.н (това да се чете като “не ми се занимаваше с глупости”).

    Тъй катo трябваше да напиша документацията и да направя всичко сравнително бързо, реших да не се затормозявам с излишно сложни неща и разделих работата на три части: “отдалечена станция” (a.k.a шамандура), наземна станция и уеб приложение.

    Представено графично изглежда долу-горе така:

    Шамандурата използва китайска имитация на Arduino Nano. Микроконтролерът е същият, но и ма малки разлики в пиновете. Когато паметта в един момент се запълни на 99%, контролерът спря да работи и да се разпознава от компютъра. Оказа се, че докато е в “bootloader” режим (или както се нарича, режимът, в който влиза, малко след като му се бутне Reset копчето), може да се програмира. Освен това се оказа, че Serial1.available() връща true, когато на серийния порт няма нищо. Дори когато RX пинът е с pull-down резистор. Благодарение на това се наложи да правя геройства като изчакване на някакви секунди време, когато си говоря с LoRa модула.

    Така и не успях да подкарам GPS модула успешно, дори след като го изкарах на терасата и чаках 30 минути да търси сателити с неговия си софтуер. Хардкодването на NMEA данните, които очаквах, ми спести няколко байта и нещото заработи пак.

    Тук е моментът да си призная как ме домързя да изградя LoRa мрежа само за едната дипломна работа. Добре, че модулите (RN2483) могат да работят като прости радиа. Цялата безжична комуникация се гради на две команди.
    В изпращащата част:
    mac pause\r\n
    radio tx CAFEBABE\r\n

    Където “CAFEBABE” е гениално построеният ми пакет от данни, разделени с точка и запетая, но представен като шестнадесетичните стойности на ASCII кодовете на всеки символ от низа.

    Приемащата част прави това постоянно:
    mac pause\r\n
    radio rx 0\r\n
    Втората команда отваря неограничен прозорец за приемане на данни и блокира модула, докато не дойде нещо.

    Така изглежда LoRa модулът, след като го запоих с поялник, на който човката е дебела, колкото пин и половина.

    Радвам се и, че нямах антени за радиата, защото иначе щеше да ми се наложи да вложа мисъл и да се боря със смущения, ако някой беше решил да предава произволни данни на 868 MHz. Вярно е, че щеше да ми е по-забавно да направя комуникацията с целия LoRa стек, но реших да не се хабя толкова. Някой ден ще си поиграя с истинското нещо, както трябва.

    Като се замисля, че миналата година си играх да чертая схема на Proteus за това, ми става смешно.

    В един момент мислех да сложа и LDR, за да следя видимостта и коя част от денонощието е в момента. (наблюдателните ще забележат, че някои букви имат фон, защото ме домързя да експортирам наново и трих фона, който слага Proteus, с GIMP)

    Приемащата част на това беше изключително лесна – PSoC 4, който само праща команда за чакане към LoRa-та, приема, каквото дойде и го предава към компютъра. В PSoC Creator това изглежда като два UART блока и малко код за комуникация.

    На компютъра работи .NET (C#, разбира се) приложение, което слуша на някой COM порт, обработва данните и ги хвърля към уеб приложението. Изглежда така:

    Token-ът е md5 на “suck my dick”.

    Първата версия се казваше “Shamandura Control Center” и използваше DevExpress. Имаше няколко екрана за управление на всичките данни, но не ми хареса колко много работа трябва да се свърши, за да изглежда добре и зарязах.

    Най-забавната ми част от това е, че BackgroundWorker-а, който се грижи за серийната комуникация, има методи “worker_Suffer” и “worker_Whine”, съответно за DoWork и ProgressChanged. Голямата хитрост тук е, че използвам ProgressChanged метода, за да си пращам съобщения, които да вършат нещо в UI нишката. Това е, за да избегна всички красоти около делегатите и другите C# неща за достъпване на контрол от не-UI нишка.

    Така нареченото уеб приложение е Symfony проект с няколко контролера, генерирани с app/console generate:doctrine:crud и един, който се грижи да приеме и обработи заявката от десктоп приложението. Бидейки почти арт директор, намерих готова bootstrap-ска тема и я орязах, докато заприлича на нещо.

    След логин излиза това.

    Скоро не си бях играл с Google Maps, затова след логин в системата се показва карта с всички шамандури и по тях може да се цъка. В страницата с “детайли” на шамандура има няколко графики и карта с история на местоположението.

    Тук скрих sidebar-а.

    Това е.

    Смятам, че си заслужих шестиците. Заедно с мен шестиците си заслужиха и проекти, които работят само на хартия и такива, на които дизайнът включваше форми, подредени с <br/> и много &nbsp;, както и черен цвят на тъмнозелен фон. Всички сме инженери 🙂

    От въпросите, които ми зададоха, ми беше интересен следния: “Добре, де, виждам, че сте използвали всякакви езици: C, C#, PHP, има сайт… Защо не го написахте цялото на C#?”. Това зададено с леко тъп, снизходителен тон.

    Bullshit mode: ON.

    Както писах, горе – мързел. Използвайки суперсилата ми за празни приказки, “мързел” се превърна в обяснение как няма смисъл да товаря компютрите на хората със зависимостите, които води със себе си сложния .NOT проект. Всички имат браузър => сайт.

    Приключвам с училището след близо 18 години. Ако се пречупя, може да изкарам и PhD, но това е прекалено ниско в приоритетите ми засега.

    return; return; и обратно към интересните неща.


  • Програмата за геодезически задачи и за Android

    Тъй като виждам, че доста често се тегли desktop версията на програмата за геодезически задачи, реших да я напиша набързо и за Android. Все пак, след като имаше версия за MIDP 2.0 телефони, защо не и за нещо по-модерно 🙂

    Оказа се забавна играчка и смятам да добавя още доста неща, но първо ще трябва да намеря учебниците по геодезия, за да си припомня кое какво беше.

    Като за начало, смятам при първа възможност да добавя останалите засечки и разни други шаренийки. Мисля си, че ще е удобно да могат да се избират директно точки от карта или от каталог. Само да не ме домързи.

    Може да се свали от Google Play от тук:
    Get it on Google Play


  • Умна шамандура, част 0

    Дойде време да пиша дипломна работа за магистратурата. Този път ще си водя бележки какво се случва.

    Тъй като предната ми струваше около 1100лв. и в момента събира прах, защото така и не се научих да хвърча, реших тази да е нещо по-просто. Предложиха ми да правя “система за наблюдение на морската среда” и се съгласих. Кодовото име е “умна шамандура”, защото реално ще правя почти същото нещо, което се намира в буйовете, които се използват в момента. Почти същото, защото няма смисъл да имплементирам всичките комуникации, протоколи и красоти, които са в истинските шамандури. Не ми трябва да следя корабите, не ми трябва и да е вечно.

    Планът в момента е да има това:

    • Метеорологична станция (частта за “наблюдение на морската среда”), която ще мери следните неща:
      • посока и скорост на вятъра,
      • температура на водата,
      • температура и влажност на въздуха,
      • атмосферно налягане,
      • видимост (т.е. дали има мъгла)
    • GPS, който да следи дали шамандурата не се е откачила от котвата
    • Радиовръзка до “наземна станция”. Това ще са две LoRa радиа (RN2483 на Microchip), които ще си говорят (засега еднопосочно). Най-вероятно “шамандурата” ще праща към приемащото радио, което ще е закачено по сериен порт към компютър
    • Светлинна и (може би) звукова сигнализация, което е силно вероятно да са мощен светодиод и “сирена”

    За реализацията смятам да използвам един PSoC 4 и малко Arduino. Още не съм решил какво ще представлява “наземната станция”, но най-вероятно ще е PSoC-а, който взема данните от радиото и ги предава по UART към компютър с някакъв софтуер. Този някакъв софтуер най-вероятно само ще рисува карта и шамандурите върху нея с проста база от данни отзад за добавяне, редакция и т.н. на шамандури.

    Към момента имам почти всичко за шамандурата готово – едно Arduino Micro Pro събира данни от всичките датчици, пакетира ги и ги праща по серийния си порт към компютъра, където си представям, че са дошли по радио.
    Остава ми да направя GPS-а, да започна да чета данните за посока и скорост на вятъра и комуникацията с компютъра.

    Ако не бях изгорил GPS модула, можеше и да съм готов вече. Кой да предположи, че като размениш VCC и GND платката ще замирише…


  • Spotify shower

    (Това стана дълго. Директно към свалянето)

    Преди (вече доста) време в офиса ни отрязаха YouTube и Facebook. И двата сайта редиректват към jobs.bg. Колкото и да е хитро и да ме радва идеята, основният ми източник на музика от 9 до 6 дотогава беше YouTube. Докато съществуваше Grooveshark, се преживяваше, но го убиха и трябваше да търся други решения.

    Основното ми изискване към плеърите, които ползвам, е да мога да следя какво съм слушал в last.fm. Често това доста ми ограничава избора.

    Първо на едното OLinuXino пуснах ampache, което stream-ваше от външен диск. Като изключим всичките грозни хакове покрай подкарването му да го виждам на работа, всичко беше идеално. Ако не се бъркам, имах ReverseProxy на едно apache някъде, което водеше до единия рутер, който препращаше към OLinuXino-то. Дори да бъркам за проксито, накрая със сигурност имаше SSH с port tunneling през PuTTY и слушах музика на http://localhost:8008/ampache. Гениално, да, но малко след това ми омръзна да слушам едно и също. Защото дори краденето законното сваляне на нова музика изисква известна липса на мързел.

    През цялото време бягах от Spotify, защото рекламите не ми действат добре и не ми се занимаваше да плащам такса всеки месец. След известно време с реклами накрая се прекърших и от няколко месеца използвам Spotify Premium. С малки изключения съм доволен и не мога да измисля много неща, от които да се оплача. Може би случаят, в който някой ми открадна акаунта и го напълни с немска чалга, е причина за оплакване. Намирането на контактите на support-а им се оказа трудна задача, но накрая ми оправиха проблемите приемливо бързо.

    Нещо, което започна да ми пречи е, че когато слушам разни колекции с изпълнители, които не знам или пък произволни песни на нови, трябва да вдигам прозореца, за да видя кое как се казва. Linux клиентът няма този проблем (но пък за сметка на това има други в излишък), защото използва notification-ите по подразбиране и изкарва балон при всяка смяна на песен. Разбира се, че има много приложения, които показват какво свири Spotify като notification, но аз исках нещо просто и да го виждам постоянно, а и ми е по-интересно сам да си пиша нещата.

     

    rage_preview
    Между taskbar-а и desktop-а

    Преди няколко седмици забелязах, че taskbar-ът върху десния монитор основно стои празен, защото по подразбиране прозорците са групирани и малки. Реших, че ако мога да си изпиша песента под него, ще е идеално. Оказа се, че мога и така се роди просто малка програма, която е на път да прерасне в съвсем истинско приложение.

    На скрийншота горе се вижда, че спокойно мога да си виждам песента. Така е, но той е от лаптопа, върху който не ползвам Windows често. Taskbar-ът ми на работа изглежда долу-горе така през по-голямата част от времето, когато нямам осем отворени инстанции на Visual Studio:

    20160422desktop
    Когато “Close to tray” не се чупи, нямам и Spotify прозорец.

    Първо опитах да ползвам API-то, което предлагат от Spotify, но липсата на продължаваща поддръжка и огромния overhead ме спряха. Няма смисъл да включа огромна библиотека, да се занимавам с автентициране, токени и т.н., само за да взема името на текущата песен. С 15 секунди търсене попаднах на SpotifyToaster, който взема името на песента по хитър начин. Програмата се закача за процеса на Spotify и започва да слуша за Name Change събития. При всяко такова се опитва да вземе името на песента и го показва.

    settings_screen
    Главният прозорец с “настройките”

    В момента приложението показва песните по два начина – с “overlay” и “проста форма”. При първия се пуска отделен процес, който рисува директно върху Desktop-а, а при втория излиза недекорирана форма. Отделният процес се наложи, защото се оказа, че само със C# не мога да сляза толкова надолу (въпреки, че викам същите Win32 функции от същите DLL-и) и нещото се рисуваше върху taskbar-а вместо под него. Дори с допълнителното приложение има тъпи проблеми, които не ми се занимава да решавам, защото не ми пречат.
    Ефект на рисуването по този начин е, че всяко опресняване на област, върху, която съм рисувал, затрива това, което е имало преди това. Пример:

    overlay_before_screwup overlay_screwupРешавам, че това не ми пречи, защото винаги рисувам под taskbar-а, а там не бутам кой знае колко често.
    Освен това имаше случаи, в които заглавието на предната песен не се зачистваше правилно и се получаваше тъпо застъпване. В момента съм си решил проблема като рефрешвам около правоъгълника, който се рисува. Ако някога реша да си доразвия приложението, ще го направя по-умно, но към момента си върши работата идеално.

    Вторият вариант за показване на песните използва проста форма без декорация, която пак навирам под taskbar-а, за да я виждам постоянно. Не мога да избера кой вариант ми харесва повече. Ако стигна до release, най-вероятно ще оставя само формата, защото пускането на отделен файл като дъщерен процес може да направи проблеми при определени тъпи настройки и permission-и (или поне както го пусках в началото). И без това с два изпълними файла ми се струва прекалено претрупано.


    Още не съм решил как да си кръстя приложението. В момента се казва SpotifyShower, но не като душ, а като “показвател”. Не знам и дали иконките, които му избрах, са достатъчно различни от оригиналната. Важното е, че ми върши работата, която искам.

    Последната версия може да се свали от тук (zip, ~178KB).
    Трябва инсталиран .NET 4+. Ползвал съм го само на Windows 8.1 и не гарантирам, че ще тръгне навсякъде.

    Когато се пусне, излизат настройките, от които се избира къде да се показва песента и начинът на показване. При “Save” или минимизиране се скрива в notification area-та, за да не ми пречи. Когато се освободя, ще му сложа възможност за локализация, защото само с хардкоднати текстове не става.

    Все още има някои проблеми, които трябва да реша, за да съм напълно доволен. Например, от време на време закачането към евента гръмва и приложението крашва или пък заглавия на песни, които имат специални символи в името си, излизат наполовина. Според скромните ми наблюдения останалите подобни приложения имат същите проблеми, така че не смятам да си давам много зор с това. Поне не за момента.

    Време ми е да събера всичките приложения, които съм пускал тук в отделна страница с по-малко излишен текст около тях.

    Докато пишех това, видях, че в новия WordPress paste-ването на URL при отбелязан текст прави линк автоматично. Ще ме накарат да мисля повече неща за писане.