ermouth: (Default)

Поучаствовал в небольшой переделке дизайна заглавной CouchDB в части предложения контрибьютить. Слева – как было, справа – как стало.

Снимок экрана 2015-05-19 в 3.42.12 Снимок экрана 2015-05-19 в 3.42.33

По-моему, на две головы лучше, чем было.

ermouth: (ang)

Мне сегодня на Stackoverflow попался изумительной красоты вопрос про javascript. Я, как обычно, невнимательно его прочитал и ответил немного не в кассу, ну, меня быстро поправили.

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

Задача: нужно сконструировать такую функцию add, которая делает вот так

add(1) >> 1
add(1)(2) >> 3
add(2)(3)(4) >> 9

Цепочка вызовов может быть любой длины, в скобках только числа.

Сначала может показаться, что задачка нерешаема. Потом – что нам нужно локально расширить объект Number какой-то конструкцией, которая позволит вызывать Number как функцию. Это можно сделать – но получается очень громоздко. В самом деле надо идти с другой стороны – делать такую функцию, которая при попытке её с чем нибудь сложить кастится в число.

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

Сделать функцию, которая при попытке её с чем-нибудь сложить “прикидывается” числом совсем просто.

Дело в том, что любая функция в js – объект. У неё есть метод toString, который и управляет кастингом. Собственно, он и вызывается неявно, когда вычисляемое выражение требует привдения к примитивному типу. Если toString наследуется от прототипа – он вернёт исходный текст функции. Но мы можем его подменить – и он станет возвращать число.

Хак целиком выглядит вот так:


var add = (function() {
    var factory = function(value) {
        var fn = function(num) { return factory(value + num) };
        fn.toString = function() {return value};
        return fn;
    };
    return factory(0);
})();

Офигенно, по-моему, с эстетической точки зрения. На каждом вызове функции возвращается новая функция, которая скрыто каррирована значением предыдущего шага и которая прикидывается числом, если её закастить в примитивный тип.

Такой очень хитрый итератор.

Использовать в жизни я бы такое, правда, не посоветовал – оно mind-blowing, медленное и хрупкое. Как и всё, что красивое и бесполезное )

JSON editor

Jan. 9th, 2015 07:44 am
ermouth: (ang)

У меня тут в качестве побочного инструмента разработки возникла потребность в нормальном JSON-редакторе. Это то-есть такого, который:


  • распознаёт таймстампы и показывает их как даты

  • понимает стрингифаенные функции

  • определяет, что строка – base64 и её можно показать/скачать

  • прощает ошибки набора JSON (пропуск кавычек), но генерит корректный JSON

  • понимает JS-выражения, которые сразу вычисляет

  • позволяет размножать/переставлять ветки

  • позволяет каждую ветку поправить сорцом

  • даёт экстендить один JSON другим.

Ещё два важных момента – это должен быть компонент, который можно как контрол инициализировать и он должен уметь показать переменную в памяти – при этом напрямую мутировать-редактировать её, не портя и не разрывая связи.

У меня такой редактор написался внезапно, и такой хорошенький, что я вот его обвесил всякими сэмпл-доками и выложил как online tool. Он умеет доки хранить в локалсторидже есчо, так что всё помнит.

Снимок экрана 2015-01-09 в 7.26.06

http://cloudwall.me/etc/json-editor.html

Любопытно, что эта штука – “рекурсивное” приложение. Оно при раскрытии веток юзером инстанцирует само себя как дочки. Я сначала думал что это довольно дорого в плане памяти и CPU, но неожиданно оно норм даже на айпаде полетело. Хотя прожорливое, конечно.

ermouth: (Default)

Сделали первый проект, который, в каком-то смысле, распространяется на “физический” мир. Для меня это был пробный шар в реализации некоторых технологий того, что нынче называется “интернет вещей”.

Проект – диспетчерская для дорожной организации. Основная задача – распределение техники по участкам на даты и ведение отчётности по фактической занятости. Всего получилось три веб-приложения, естессно jQuery.my.

Вот скриншотик фрагмента одного из приложений – непосредственно перемещение техники между участками. Вместе с техникой “тащится” привязанный к ней поп-ап, это новая фича в jQuery.my.

Снимок-экрана-2014-10-23-в-23.49.05

Ещё в рамках проекта мы впервые попробовали сделать удалённый датчик работы тяжёлой техники. Датчик собирает данные и сливает их на сервер, если есть связь, или сохраняет до тех пор, пока связь не появится, и потом сливает.

Интересно, как мы этот датчик делали.

Сначала я подумал, что для этой цели идеально подойдёт Tessel, и даже уже начал делать первый подход к снаряду. Первый подход породил вот такую конструкцию:

IMG_1248

Это, конечно, очень красиво эстетически, но в середине сентября, когда это фото было сделано, я понял, что собрал мобильный телефон без тачскрина и аккумулятора. Даже, если быть точнее, браузер мобильного телефона.

Ну то-есть, это javascript-микроконтроллер с модулями GPRS и GPS, с камерой, акселерометром и SD-ридером.

Эта конструкция требует постоянного питания, корпуса и вообще бубна. Первый подход занял один вечер и на выходе дал существенное переосмысление задачи. В результате вся эта конструкция заменилась мобильным телефоном под Андроидом.

На телефоне – PhoneGap-приложение, написанное на javascript. Для накопления и репликации данных оно использует технологии, на которых работает cloudwall.me – они стали приемлемо надёжными. В общем, отладка этого всего хозяйства, конечно, доставила, и пока всё неидеально, но задачу поставленную мы решили. 

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

А у меня какая-то дикая по силе депрессия, фак.

ermouth: (ang)
В рамках одного проекта вот родилось, хоть и не было заявлено как требование. Регэксп-индикатор наличия нецензурной лексики, а попросту мата

/\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}/i

Неидеальный, каэш, но в целом очень приличный. 
ermouth: (Default)

Нашёл вот прекрасное, ни по какому поводу сделал, ни для кого – не помню.

Клик – форма для набора режима работы:

Снимок экрана 2014-01-23 в 0.01.47

ermouth: (ang)

6 недель назад я нарисовал вот такую вот черновую схемку высокопроизводительной масштабируемой CMS (Коммент для понимающих: тут хреново названо только. Frontend – это общедоступная часть сайта, Backend – админка. Пользователи – на концах зелёных стрелок, за схемой, есличо).

image

Так вот, оно взлетело, да ещё как. Результаты по скорости рендера на Амазон EC2 medium (3.8 Gb RAM, проц примерно как Core2 Duo 1.5Ггц и диск как медленный SSD) вот такие:

BI3knElCAAAtZr0

Это неделю назад, сейчас ещё быстрее. Это случайный рендер по множеству из 112500 урлов. С выборкой из БД. Более 90% страниц предполагают выборку более 50 публикаций перед рендером целиком. С последующей группировкой и фильтрацией по тегам. И с расстановкой переносов )

На реальных условиях (с запросом и ответом в gzip) тоже оттестировано. С учётом пинга до Архангельска любая страница при нагрузке до 50 запросов в секунду в 99% случаев выдаётся менее, чем за 250мс. Если тестировать прямо с ирландского амазона с нагрузкой 100 страниц в секунду, получается “менее, чем за 20мс”.

Фактически на запросы из Архангельска сервер в Ирландии начинает отвечать через 100 мс, то-есть примерно через 120 мс при наличии скриптов/css в кэше браузера начинается рендер страницы.

Если по-русски, оно летает просто )

И это полностью, до последней строчки, javascript (скептики, утритесь). При этом оно чистый, не прошедший даже черновую оптимизацию, говнокод (утритесь снова ггг).

Я знаю, на фленте есть френды, которые прямо сейчас делают что-то подобное. И тоже функциональщина. И тоже nosql, и с прицелом на highload и лёгкую масштабируемость. Присоединяйтесь )

Na kolenke

Mar. 17th, 2013 08:50 pm
ermouth: (Default)

Soviet design bureau was eqipped with computer technology, but relied on it much less than their western counterparts.

There’s a russian term “nakolenke” which means working with a piece of paper on your knee. Its an approach highly respected in Russia, challenging designer’s resourcefulness, often giving outstanding results at a fraction of costs of a similar results in the West.”

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

Есть такой русский термин – “на коленке” – который означает “работать с клочком бумаги на коленях”. Такой стимулирующий инженерный потенциал подход к разработке высоко ценится в России. Нередко он позволяет достигать выдающихся результатов существенно более дешевле, чем принято на Западе.”

Отсюда. Это что же, оно уже признано как способ разработки боевой техники по всему миру штоле? о_О

Я сам этот волшебный способ систематически практикую, компьютером, правда, не брезгую )Моё текущее “на коленке” выглядит примерно так:

Photo-17.03

ermouth: (Default)

Вчера ближе уже к утру наткнулся на обсуждение – какое уж по счёту – кривого интерфейса фейсбука. И меня вдруг осенило, где я уже видел такой адЪ до этого. В японских газетах.

Это вот фейсбук на инглише.

Снимок экрана 2013-03-12 в 23.44.50

Это типичная японская газета, из лучших ещё:

obama-youth

Это вот скриншот газеты пострашнее:

Снимок экрана 2013-03-13 в 0.06.50

Ну и типичный японский новостной сайт, тоже газеты кста:

Снимок экрана 2013-03-13 в 0.09.28

Офлайновая бумажная версия делается вот по такой раскладочке, из которой явственно видно, что на сетку ребятам глубоко похуй. Так приусадебные участки нарезают, а не интерфейсы:

Это оказалась не раскладочка нихрена, а типо инфографика аудиторий, мильпардон.

newspapers

И оно там в Японии такое чуть менее чем всё. Вот вкусняшек ещё. Я даже разобрался откуда эта дикая типографская традиция – но это в другой раз.

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

Черты дачного самостроя фейсбук стал приобретать в середине 2008 – начале 2009. Именно тогда фб предпринял адское усилие по переводу интерфейса фб на японский – за 3 недели – явно с прицелом потеснить расовый японский вконтакт mixi.jp (скриншоты). Я не смог там зарегистрироваться – нужен японский номер мобилы, лень добывать – но и по скриншотам видно, откуда ноги растут.

Тут надо ещё понимать, что переводили фб на японский полторы тыщи добровольцев, и этот разношёрстный хор “дизайнеров” внимательно был выслушан. На японский рынок, видимо, очень фейсбуку хотелось – но не знали, как взяться. Хотелось правильно – mixi.jp тогда зарабатывал $100 млн в год, и это легальный рынок, не то что Россия.

А чтобы не делать разные интерфейсы под разные языки – очень неудобная задачка вообще говоря – эти японские нововведения распространили на всех. И получилась японская газета.

Спасибо Дурову, что пошёл своим путём, чесслово. Тропка хоть и кривовата чуток местами, но наголову лучше, чем азиатский базар фейсбука.

ermouth: (ang)

Волшебный яваскрипт. Просто вставьте это в консоль браузера, ну кто знает где она )


(eval((function(){var Y,$,_="\"ПC@H56!LnУ F59y97E395ц K3ш`@ CуE@ C7з3бC^yKXjscrush @ 8K5`^ 5гXqC@F59@FыF K`yE@C@``@цы @ H867HE@ H E3K б5з 383б3гXбуб97.LnJscrush – 8уq5C3бфу8E763C @ 8уq5C3FqC5883C E3K7 7H63C86H7 Aivo Paas. Н5E363CыF K3q@`@H79@5F 5гX`5гEXз7867H@6ь q7E3H^ @ qC386X86C3E@.LnО9 383б599Xх3C3шXC7б36756 97 E3K5 @ K`@99ых json-F788@H7х q3H63Cяющ@х8yK799ых, жFё6 EC7693, E7E zip – 9X3ч59ь F5K`5993. 10EБ H F@9у6у qC@F5C93. ИF599Xэ636 65E86 8ж76 qC@F5C9X97 20%.LnЖ^ 83H85F E3C36E@5 K799ы5, E3C3ч5 83659 б7й6, 95 @F556 8Fы8`7 – overhead 36 8`3H7C5й @ C78E3K@C3Hщ@E7 8ъ5K756 эфф5E6. ПC@ э63F K799ы5 з7qC386XF3гу6 8K5`^8y95ч@675FыF@, F3ж9X@8q3`ьз3H^ K`yэ63г3.LnР78E3K@Cу568yэ6XH8ё 3ч59ь бы86C3, 83q3867H@FX8XHC5F595F qC386XC7зб3C7 @8х3K93гXE3K7.LnС3б86H5993, H36 E3K:LnLn\"+\"function (s0){4var i,B,m,S,c,M,N,e,Z,t,o,x,j,R,Y,s=s0;4B=sG/2,m='';4T;;m=c+m){4 Tc=0,i=122;!c&&--i;!~WQ[i])&&(c=Q[i]));4#if(!c)break;4# To={},M=N=e=Z=t=0;++t<=B;)4##Ti=0;++i<sG-t;)4## if(!o[x=s.substr(j=i,t)])4###if(~(j=Wx,j+t)))4### TZ=t,o[x]=1;~j;o[x]++)Dj=Wx,j+t);DB=Z;DTi in o){D j=encodeURI(i).replace(/%../g,'i')G;D if(j=(R=o[i])*j-R-j-1) if(j>M||j==M&&R>N)M=j,N=R,e=i;D}Dif(!e)break;Ds=sVe).join(c)+c+e4}4c=sV'L\"')G<sVL\"'L\")G?(B='L\"', /L\"/g):(B=L\"'L\", /'/g);4return '(eval((function(){var Y,$,_='+B+s.replace(c,'LLLL'+B)+B+';TY=0;$='+B+m+B+'[Y++];)with(_V$))_=join(pop());return _})()));';Ln }\"# 3о4Ln#5е6т7а8с9н@иCрD4####EкFмG.lengthHвKдL\\Tfor(V.split(Ws.indexOf(X3 ^76ь`лqпyя ";for(Y=0;$="yq`^XWVTLKHGFEDC@9876543#"[Y++];)with(_.split($))_=join(pop());return _})()));
ermouth: (Default)

Последний день до ДР – 9 мая – я встретил на квартире в ремонте, за односолодовым виски. Был прекрасный разговор – я утверждал, что добрая воля существует, а мне оппонировали, что это просто форма корысти.

Я до этого слопал вкусный стейк с картошечкой размером с вишенку и вот такой вот десерт (чёто не в фокусе) – и совершенно размяк.

IMG_0523

Спорилось как-то вяло – зато потом нашлись всякие интересные музыкальные приложения на айпаде – и пошло-поехало. Музыканты же ж все, чуйство прекрасного, то-сё)

А потом досталась гитара:

IMG_0533

И мой кореш Паша спел (ну типа) и сыграл как мне помнится прямо из головы вот так:

Есличо, чувак, это было круто! Я не мог это не выложить.

Днём 9 мая я отправился выполнять важную часть плана пребывания – добывать трусы. В Архангельске нереально купить нормальные трусы, вы не поверите, дорогие лжефренды. Раньше ездили за колбасой в столицу – а теперь вот за трусами, ога. В результате я так и не нашёл ck в Европейском и программу выполнил частично.

Ближе к вечеру 9 мая я попал в офис ЖЖ – там сейчас работают @mark_ilansky, с которым мы когда-то ссорились, но вроде помирились, и olegfreedom (вот был бы нормальный софт чтобы постить с мака с картинками – вставилось бы ссылкой, это намёк есличо).

В ЖЖ мне понравилось, общее пространство, много народу, видимо. Хотя я себе плохо представляю масштаб платформы.

В ЖЖ сразу видно трон – красивый такой 27-инчёвый аймак )) Доски на стенах прикольные – чёрное и по нему разноцветными мелками.

В ЖЖ работает некая Нина, женщина невообразимой грубости. Вот ей надо посмотреть кино про доктора Лектора. Он кушал людей за неучтивость. Жаль, он не работает в ЖЖ.

В ЖЖ вкусный кофе из автомата. Вполне себе.

Ну и Суп-сити, конечно:

IMG_0548

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

***

ДР я встретил (вернее, 10 мая наступило), вы не поверите, в Марьино, у ларька с сигаретами. В Марьино я попал случайно, в общем то.

Потом мы выпили – лафройга и мартини в захолустном баре – и долго болтали про будущее. Про бизнес. Про счастье, совесть, жадность, про всякое. Это было круто – я почуйствовал себя старичком бгг )

10 мая я провёл, делая ничего почти весь день. Вкусно поел, сладко поспал, полетал в самолётики. Потом съездил по делам, обломавшись с Яндекс-навигатором, кста – он туповат и неточен.

Потом мы с Пашей опять долго болтали, безо всякого алкоголя причём на этот раз (ну кто понимает). Картинка вот у меня нарисовалась:

IMG_0097

На свой юбилей я был одет вот так (фотка перед сном, да-да, ковёр):

 IMG_0544

Хипстота аццки непатриотичная, надо сказать.

Когда летел домой, на борту подрались два чуркобеса – здец какие они животные некоторые. Дома холодно, низкие тучи, но как-то мне клёво.

У меня вторая половина жизни. Дима ягодка опять, ога

vk.com

Jan. 26th, 2012 08:03 pm
ermouth: (Default)

Ни на что не претендую, но…

image

Фрагмент резинки от трусов, нопремер. Под катом – пример использования. Впечатлительным лучше не ходить – там жопа бгг

Read more... )
ermouth: (Default)

Примерно с год назад меня один френд попросил порисовать макетеги для его проекта – и пропал. На письма не откликается, так что выложу я это тут – не пропадать же добру ) Клик на картинки – покрупнее.

3-реклама-свёрнута

Под катом ещё несколько.

Read more... )
ermouth: (Default)

Я тут развлёкся и нарисовал работающий прототип выбора дома для портала ЖКХ. В общей сложности это у меня заняло примерно 6 часов.

Выглядит это так (клик перекинет на работающую страничку):

image

Адреса внизу – это куда я ходил, страничка помнит ваши последние дома.

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

Read more... )
ermouth: (Default)

Чуть меньше недели назад я тут написал грустный пост про правительственный дезигн. И пообещал в конце нарисовать, как должен на мой взгляд выглядеть портал ЖКХ (его современное состояние можно лицезреть по адресу gkh.dvinaland.ru).

Задача осложняется тем, что вряд-ли кто-то будет вносить серьёзные изменения в серверный код и надо использовать то, что уже есть. То-есть перелицовывать html и недостающий функционал добавлять по преимуществу уже в браузере.

Ну и конечно, смотрел я в первую очередь с точки зрения сценариев пользователя, а не инженера.

Всю неделю думал, порвал два баяна и вот что получилось в черновой итерации (тык на большие картинки – фуллскрин).

Так может выглядеть заглавная для неавторизованного пользователя:

image

То-есть было понятно, что основная дизайнерская задача – это максимально уменьшить количество кликов при выборе дома.

Вторая задача – стимулировать пользователей регистрироваться и писать самим в разделе дома полезную информацию – потому что очевидно, что УК этого делать никогда не будут, им просто пох всё.

Остальные задачи чисто оформительские и компоновочные. Это типа меню почистить и другие сопли, лишнее выкинуть, ленты причесать, над поиском подумать и над тем, как в такой шаблон остальные страницы вписывать.

Ну и редактура нужна – та имперско-канцелярская велеречивость, что сейчас, ужасна местами до оторопи (например вот премерчег, смотрим на заголовок и breadcrumbs бгг)

Но основное – это стимулирование регистрации и удобный выбор дома. И вот что мне придумалось…

Read more... )
ermouth: (Default)

Моя коллекция парфюмерии, раз уж заикнулся – где то в районе 100 наименований. Небольшая часть конца XX века не дома, так что наверняка забыл чёнить.

На память по запаху опознаю примерно половину. Приподнятые картинки – любимые ароматы.

Read more... )
ermouth: (Default)

К предыдущей записи нарисовалась вот обложечка )

cover

Все совпадения случайны, бгг )

ermouth: (Default)

Типа, с годом наступающих металлических зайцев.

z1

Рисовалось просто так есичё, художественной ценности не несёт.

Под катом – центровой крупным планом )

Read more... )
ermouth: (Default)

Это для веб-деятелей пост. Остальным будет неинтересно. Веб-деятели будут реально в ахуе.

Read more... )

Profile

ermouth: (Default)
ermouth

July 2017

S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526 272829
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2017 04:40 am
Powered by Dreamwidth Studios