kernel panic in userspace

my own self destruction
  • Blog
  • about
  • articles
    • Virtualbox bridge
    • linux blogging
    • Gentoo on Acer Extensa 5630Z
  • code
    • @unfollowr
    • WordPress
      • WordPress-bbPress syncronization
      • IE Warning
      • PostAds
    • Callisto overlay
    • @listwatcher
  • CV
  • belarusian
  • russian
  • english

Hide Mentions in Twitter Web Interface

Jan 24 2010
Deftones – Deathblow
  • belarusian
  • russian

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

Некоторые тви-фашисты (вроде меня) не слишком любят читать реплаи чужим людям. Порой хочется открыть веб-интерфейс, открыть чью-нибудь ленту и просто почитать. Благо, букв немного. А там закрадутся 100500 реплаев, которые вообще ну никак в картину мира не вписываются. Так вот, давно хотелось их выпилить. Сначала я хотел сделать расширение для Chromium, но не вышло потом подумалось, что недурно было бы сделать что-нибудь более универсальное, например закладку. Пользователь на неё клац — и реплаи исчезли/появились. Ну не чудесно ли? :)

Этот большой и сташный кусок непостигшие дао могут пропустить, листайте ниже. Написался следующий скрипт (лицензирую под GPL v3, к слову):

if (typeof toggleTwitterUserMentions == "undefined")
{
  toggleTwitterUserMentions = function()
  {
    self = this;
    if (self.knowSettings == undefined)
    {
      self.knowSettings = true;
      self.hideMentions = true;
      self.getTweetsWithMentions = function()
      {
        return $('#timeline>li.status>span.status-body>span.entry-content>a.username').parent().parent().parent();
      }
      self.toggle = function()
      {
        if (self.hideMentions)
        {
          self.getTweetsWithMentions().slideUp();
        } else
        {
          self.getTweetsWithMentions().slideDown();
        }
        self.hideMentions = !self.hideMentions;
      }
      self.onPageChange = onPageChange;
      self.calledInternalOnPageChange = false;
      onPageChange = function()
      {
        if (!self.calledInternalOnPageChange)
        {
          self.calledInternalOnPageChange = true;
          self.onPageChange();
        } else
        {
          self.hideMentions = !self.hideMentions;
          self.toggle();
        }
      }
    }
    this.toggle();
  }
}
toggleTwitterUserMentions();

После долгих и мучительных попыток его минимизировать и при этом оставить в рабочем состоянии осталось только первое требование. Видимо, я слишком хитро написал, чтобы обфускатор правильно всё разбрал и потом собрал обратно. Ну и ладно. Тем не менее, всё, что нужно для использования — добавить на панель следующую ссылку:

javascript:if(typeof toggleTwitterUserMentions=="undefined"){toggleTwitterUserMentions=function(){self=this;if(self.knowSettings==undefined){self.knowSettings=true;self.hideMentions=true;self.getTweetsWithMentions=function(){return $("#timeline>li.status>span.status-body>span.entry-content>a.username").parent().parent().parent()};self.toggle=function(){if(self.hideMentions){self.getTweetsWithMentions().slideUp()}else{self.getTweetsWithMentions().slideDown()}self.hideMentions=!self.hideMentions};self.onPageChange=onPageChange;self.calledInternalOnPageChange=false;onPageChange=function(){if(!self.calledInternalOnPageChange){self.calledInternalOnPageChange=true;self.onPageChange()}else{self.hideMentions=!self.hideMentions;self.toggle()}}}this.toggle()}}toggleTwitterUserMentions();

Потом можно в веб-интерфейсе твиттере этой кнопочкой пользоваться. Что стоит учесть:

  • Повторное нажатие вернёт все реплаи
  • При использовании кнопки «more» настройка сохраняется и реплаи прячутся
  • При переходе в DM, replies или другие меню реплаи тоже прячутся
  • При появлении новых твиттов вверху страницы реплаи не прячутся, что логично (?)

Enjoy, как говорится. Распространение в твиттере приветствуется %)

Парфюмерия для вас и ваших любимых

Услуги colocation для тех, кто хочет иметь полный контроль за сервером за умеренные деньги

Бесплатные курсы Linux — красные глаза, бессонные ночи :)

  • belarusian
  • russian

Падчас сэсіі пастаянна хочацца зрабіць што-небудзь гэтакае зусім бессэнсоўнае, толькі б не рыхтавацца да іспытаў. Нечакана апошні экзамен атрымаўся аўтаматам (быў на адной лекцыі цалкам), так што я вырашыў папрактыкавацца ў JavaScript, замест таго, каб займацца патрэбнымі справамі.

Некаторыя тві-фашысты (кшталту мяне) ня дужа любяць чытаць рэплаі іншым людзям. Час ад часу хочацца адкрць вэб-інтэрфейс, адкрыць чыю-небудзь ленту і проста пачытаць. Добра, што літар няшмат. А там закрадуцца 100500 рэплаяў, якія ну ніяк не ўпісваюцца ў сьветаўленьне. Спачатку я хацеў напісаць пашырэньне для Chromium, але ня выйшла потым падумалася, што няблага было б і што-небудзь больш універсальнае зрабіць, напрыклад закладку. Карыстач на яе клац — і рэплаі зьніклі/зьявіліся. Ну не цуд, га? :)

Гэты вялікі і страшэнны кусок можна прапусьціць, калі вы дао не спасьціглі яшчэ. Напісаўся наступны скрыпт (ліцэнзірую пад GPL v3, дарэчы):

if (typeof toggleTwitterUserMentions == "undefined")
{
  toggleTwitterUserMentions = function()
  {
    self = this;
    if (self.knowSettings == undefined)
    {
      self.knowSettings = true;
      self.hideMentions = true;
      self.getTweetsWithMentions = function()
      {
        return $('#timeline>li.status>span.status-body>span.entry-content>a.username').parent().parent().parent();
      }
      self.toggle = function()
      {
        if (self.hideMentions)
        {
          self.getTweetsWithMentions().slideUp();
        } else
        {
          self.getTweetsWithMentions().slideDown();
        }
        self.hideMentions = !self.hideMentions;
      }
      self.onPageChange = onPageChange;
      self.calledInternalOnPageChange = false;
      onPageChange = function()
      {
        if (!self.calledInternalOnPageChange)
        {
          self.calledInternalOnPageChange = true;
          self.onPageChange();
        } else
        {
          self.hideMentions = !self.hideMentions;
          self.toggle();
        }
      }
    }
    this.toggle();
  }
}
toggleTwitterUserMentions();

Пасьля доўгіх і беспасьпяховых спроб яго мінімізаваць і пры гэтым заставіць у працоўным стане засталося толькі першае патрабаваньне. Напэўна, я дужа хітра напісаў, каб абфускатар правільна ўсё разабраў і потым сабраў зноў. Ну і ладна. Тым не менш, усё, ўто трэба для карыстаньня — дадаць на панэльку наступную спасылку:

javascript:if(typeof toggleTwitterUserMentions=="undefined"){toggleTwitterUserMentions=function(){self=this;if(self.knowSettings==undefined){self.knowSettings=true;self.hideMentions=true;self.getTweetsWithMentions=function(){return $("#timeline>li.status>span.status-body>span.entry-content>a.username").parent().parent().parent()};self.toggle=function(){if(self.hideMentions){self.getTweetsWithMentions().slideUp()}else{self.getTweetsWithMentions().slideDown()}self.hideMentions=!self.hideMentions};self.onPageChange=onPageChange;self.calledInternalOnPageChange=false;onPageChange=function(){if(!self.calledInternalOnPageChange){self.calledInternalOnPageChange=true;self.onPageChange()}else{self.hideMentions=!self.hideMentions;self.toggle()}}}this.toggle()}}toggleTwitterUserMentions();

Потым можна будзе ў уэб-інтэрфейсе твітэра гэтай кнопкай карыстацца. Але варта ўлічваць:

  • Паўторнае націсканьне верне ўсе рэплаі
  • Пры выкарыстаньні кнопкі «more» наладка захоўваецца і рэплаі хаваюцца
  • Пры пераходзе ў DM, replies ці іншыя меню рэплаі таксама хаваюцца
  • Пры зьяўленьні новых твітаў уверсе старонкі рэплаі не хаваюцца, што лягічна (?)

Enjoy, як кажуць. Распаўсюд у твітэры вітаецца %)

Парфюмерия для вас и ваших любимых

Услуги colocation для тех, кто хочет иметь полный контроль за сервером за умеренные деньги

Бесплатные курсы Linux — красные глаза, бессонные ночи :)

{ Comments : 2 Comments » }
{ Tags: chromium, javascript, jquery, twitter }

new project: @listwatcher

Nov 20 2009
  • belarusian
  • english
  • russian

Снова мне что-то не сидится на месте, тянет что-нибудь сделать в меру бесполезное, что сам бы мог использовать неделю, а потом забыть. На сей раз захотелось поделиться с общественностью твиттера. Новый проект @listwatcher — бот, следящий за списками, в которых вы состоите, и сообщающий, если вдруг видны какие изменения на фронтах.

Чем-то он похож на мой другой проект для твиттера, а именно @unfollowr. Тот пишет личное сообщение, если вас кто-то перестал читать (а теперь пишет ещё и про количество спамеров, которые так поступили). Только вот в отличие от @unfollowr, @listwatcher пишет не только о

  • списках, в которых вы состояли и из которых вас удалили

но и о

  • списках, в которые вас добавили (twitter не пишет сам)
  • списках, которые удалали или сделали приватными, в которые вы входили
  • списках, в которых вы состояли и которые переименовали

Таким образом, можно будет всегда узнать, что некто подло вас перенёс из списка “boyz” в список “bastards” или удалил из списка “favs”. Впрочем, может вы того и заслуживаете. Меня не волнуют ваши проблемы подобного рода :)

В будущем планирую дописать на Django web-интерфейс с авторизацией по OAuth для настройки этого безобразия, чтобы можно было, допустим, изменить формат присылаемых сообщений, ограничить их по типу или использовать локализованные сообщения. Неплохо было бы что-нибудь ещё такое написать к @unfollowr, чтобы с графиками и прочим клёвым стаффом. Ждите и подписывайтесь :)

Что действительно стоило бы сделать, так это дизайн какой-нибудь приемлемый и описание как в твиттере, так и на страничке в блоге, чтобы можно было показывать людям. Если у кого есть идеи/желание — высказывайтесь я буду только рад.

p.s.: ещё было бы круто, если кто-нибудь помог бы мне перевести описание на английский (или какой-нибудь ещё вдобавок, если хотите)

Colocation и аренда серверов для больших проектов

  • belarusian
  • english
  • russian

Зноў мне нешта ня седзецца на месцы, тягне што-небудзь зрабіць у меру бессэнсоўнае, каб сам мог пакарыстацца тыдзень, а потым забыць. На гэты раз захацелася падзяліцца з грамадскасьцю твітэра. Новы праект @listwatcher — бот, які глядзіць за сьпісамі, у якіх вы знаходзіцеся, і піша, калі бачны нейкія зьмены на франтах.

Чымсьці ён падобны на мой іншы праект для твітэра, а менавіта @unfollowr. Той піша асабістае паведамленьне, калі вас нехта перастаў чытаць (а цяпер яшчэ піша і пра колькасьць спамераў, якія так зрабілі). Толькі вось у адрозненні ад @unfollowr, @listwatcher піша ня толькі пра

  • сьпісы, у якіх вы былі і зь якіх вас выдалілі

але і пра

  • сьпісы, у якія вас дадалі (twitter ня піша сам)
  • сьпісы, у якія вы ўваходзілі, але якія выдалілі ці зрабілі прыватнымі
  • сьпісы, у якія вы ўваходзілі, але якія перайменавалі

Такім чынам, можна будзе заўсёды даведацца, што нехта вас перанёс са сьпісу “boyz” у сьпіс “bastards” ці выдаліў са сьпісу “favs”. Але ж, можа вы таго вартыя. Мяне не турбуюць вашыя праблемы такога кшталту :)

У будучым пляную даписаць на Django web-інтэрфейс з аўтарызацыяй па OAuth для наладкі ўсяго гэтага, каб магчыма было, дапусьцім, зьмяніць фармат дасылаемых паведамленьняў, абмежаваць іх па тыпу ці выкарыстоўваць лакалізаваныя паведамленьні. Няблага было б яшчэ что-небудь напісаць для @unfollowr, каб глядзець статыстыку з графікамі і іншымі клёвымі штукамі. Чакайце і падпісвайцеся :)

Што насамрэч варта было б зрабіць, дык гэта дызайн які-небудзь прыгожы і апісаньне як ў твітэры, так і на старонцы ў блоге, каб можна было паказваць людзям. Калі ў каго якія ідэі/пажаданьні — выказвайцеся, я буду толькі рады.

p.s.: яшчэ было б крута, калі хто-небудзь дапамог бы мне перакласьці апісаньне на ангельскую (ці якую яшчэ ў дадатак, калі пажадаеце)

Colocation и аренда серверов для больших проектов

  • belarusian
  • english
  • russian

We’re waiting for help in translation. You may use Google Translate now. Sorry :)

Colocation и аренда серверов для больших проектов

{ Comments : 1 Comment » }
{ Tags: bots, django, listwatcher, oauth, twitter, unfollowr }

whitelisted unfollowr troubles

Nov 13 2009
  • belarusian
  • russian

Свершилось чудо и моего ненаглядного @unfollowr добавили в список избранных пользователей Twitter, которым позволено использовать API запросы без ограничений. Теперь мне пишет, что осталось 20000 запросов в час, а не 150, хотя сколько бы я их ни делал, всё равно число не меняется. Не знаю даже, с какой попытки мне всё это далось. Далее о печальном и разном.

Незадолго до этого я вообще решил переписать бота с Perl на Python. Просто так захотелось, да и Python надо немножко вспоминать иногда, а то я его что-то подзабросил. Переписалось всё отлично, даже лучше чем было. Как только можно было делать неограниченное количество запросов к API, так я даже от Yahoo Pipes отказался, который порой выдавал не самые полные данные, что, к слову, компенсировалось частыми проходами по спискам. Только вот Twitter API — вещь в себе и большая загадка порой.

Вот к примеру, есть некие люди, которые не хотят, чтобы их обновления видели другие люди, если им на то дозвол не выдан. Ну и бг с ними, пускай. Эдакие социопаты тоже не прочь узнать, кто это такой подлый перестал их читать. Тоже можно понять. Они фолловили @unfollowr, тот им через Yahoo Pipes тягал список фолловеров и вроде бы как и считал что-то. Вроде и считал, а вроде и нет. Когда всё работало через Pipes, было незаметно, что там API говорит по поводу таких пользователей (за всеми и не уследишь), а когда работа начала вестись напрямую, тут и всплыли странные глюки. На некоторые запросы Python начал спрашивать пароль, хоть тот и указывался явно в URL в виде http://user:pass@host/. Я уж думал, что это просто API глючит местами, написал WorkAround даже (об этом позже), да вот только всё не то.

Оказывается, если пользователь с закрытыми апдейтами читает тебя, а ты его нет, то получить список его фолловеров через API нельзя. В Web интерфейсе поглазеть можно, а через API забрать нельзя. Логика шопппц. Причём мало того, что нельзя, выдавало бы хоть какую инфу в ответе, так нет, делается хитрее. Выдаётся HTTP Error 401 (Not Authorized) и требуется авторизация. Новая авторизация, как будто блин у меня 500 логинов в этот чертов твиттер и я буду их перебирать. По такому радостному поводу я даже написал в Google группу twitter-development-talk. Пока тихо, будем ждать результатов.

К слову, о том, как избежать запроса пароля в консоли, если данные получаются с помощью urllib в python. По умолчанию используется “Opener” FancyURLopener, который берёт на себя грязную работу по обработке многих ситуаций. Так вот именно он и выдаёт запрос пароля. Можно унаследовать от него ещё один класс, в нём перегрузить метод получения пароля, но это всё тупиковый путь и нам не нужен в общем. Нам просто нужно использовать другой класс для получения данных, а именно просто URLOpener, который будет не запрашивать пароль, а генерировать исключение, которое мы сможем потом красиво обработать в автоматическом режиме. Листинги давать не буду, почитать подробнее можно вот здесь, сам код @unfollowr лежит на Github, там можно посмотреть, как оно вообще у меня реализовано и работает.

Виртуальный сервер – vps — XEN виртуализация на дороге не валяется

  • belarusian
  • russian

Здарылася неверагоднае і майго ненагляднага @unfollowr дадалі ў сьпіс выбраных карыстачоў Twitter, якім дазволена выкарыстоўваць API запыты без абмежаваньняў. Цяпер мне піша, што засталося 20000 запытаў на гадзіну, а не 150, хаця колькі б я іх не рабіў, усё роўна чысло не зьмяняецца. Ня ведаю нават, зь якой спробы мне ўсё гэта далося. Далей пра сумнае і рознае.

Незадоўга да гэтага я ўвогуле вырашыў перапісаць бота з Perl на Python. Проста так захацелася, ды й Python трэба ўзгадваць час ад часу, а то я нешта яго падзакінуў. Перапісалася ўсё проста цудоўна, нават лепей, чым было. Як толькі зьявілася магчымасьць рабіць неабмежаваную колькасьць запытаў да API, дык я адразу адмовіўся ад Yahoo Pipes, які час ада часу выдаваў не самыя поўныя дадзеныя, что, дарэчы, кампенсавалася частымі праходамі па сьпісах. Толькі вось Twitter API — рэч у сабе і вялікая загадка.

Вось напрыклад, ёсьць нейкія людзі, якія ня хочуць, каб іх аднаўленьні чыталі іншыя людзі, калі ім на тое не далі дазволу. Ну й фіг зь імі, няхай. Эдакія сацыяпаты таксама не супраць даведацца, хто такі подлы перастаў іх чытаць. Таксама можна зразумець. Яны фолавілі @unfollowr, той ім праз Yahoo Pipes цягаў сьпісы фолавераў і здаецца нават нешта там вылічваў. Здаецца і вылічваеў, а атрымваецца, што і не. Калі ўсё працавала праз Pipes, было незаўважна, што там API кажа наконт такіх карыстальнікаў (за ўсімі не ўгледзеш), а калі праца пачала весьціся напрамую, тут і ўсплылі дзіўныя глюкі. На некаторыя запыты Python пачаў запытваць пароль, хоць той і даваўся яўна ў URL у выглядзе http://user:pass@host/. Я ўжо думаў, што гэта проста API глючыць месцамі, напісаў WorkAround нават (аб гэтым пазьней), ды вось толькі ўсё ня тое.

Выяўляецца, калі карыстач з закрытымі аднаўленьнямі чытае цябе, а ты яго не, то атрымаць сьпіс ягоных фолавераў праз API нельга. У Web інтэрфейсе паглядзець можна, а праз API забраць нельга. Логіка шоппц. Прычым мала таго, што нельга, выдавала б хоць якую інфу ў адказе, дые не, робіцца дзіўней. Выдаецца HTTP Error 401 (Not Authorized) і патрабуецца аўтарызацыя. Новая аўтарызацыя, нібыта блін у мяне 500 логінаў у гэты чортавы твітэр і я іх буду перабіраць. З такой радаснай нагоды я нават напісаў у Google групу twitter-development-talk. Пакуль ціха, будзем чакаць рэзультатаў.

Дарэчы пра тое, як пазьбегчы запыту пароля ў кансолі, калі дадзеныя атрымліваюцца праз urllib у python. Па змоўчаньні выкарыстоўваецца “Opener” FancyURLopener, які бярэ на сабе брудную працу па апрацоўцы многіх сітуацый. дык вось менавіта ён і выдае запыт пароля. Можна зрабіць для яго патомка, у ім перагрузіце мэтад атрыманьня пароля, але гэта тупіковы шлях і нам ён непатрэбны ўвогуле. Нам проста трэба выкарыстоўваць іншы клас для атрыманьня дадзеных, а менавіта проста URLOpener, які будзе не запытваць пароль, а генерыраваць выключэньне, якое мы зможам прыгожа апрацаваць у аўтаматычным рэжыме. Лістынгі даваць ня буду, пачытаць падрабязьней можна вось тут, сам код @unfollowr ляжыць на Github, там можна паглядзець, як яно ўвогуле ў мяне рэалізавана і працуе.

Виртуальный сервер – vps — XEN виртуализация на дороге не валяется

{ Comments : 2 Comments » }
{ Tags: 401, api, code, FancyURLopener, github, google groups, http, python, twitter, unfollowr, urllib, yahoo pipes }

jQuery val() & change() tricks

Oct 24 2009
Uniquetunes – Disconnecting People
  • belarusian
  • russian

Начал понемногу оживать блог, как вы уже, наверное, заметили :) Практика программирования и последующего рефакторинга хорошего кода даёт благодатные плоды для размышлений. Плохой код и его сопровождение такой радости не принесут, особенно если работать одному. На сей раз про jQuery, WYSIWYG и onChange event.
Read the rest of this entry »

Спортивное питание — креатин, dynamize и другое

  • belarusian
  • russian

Пачаў паціху ажываць блёг, як вы ўжо, напэўна, заўважылі :) Практыка праграмаваньня і далейшага рэфакторынгу добрага коду дае сваю добрую садавіну й гародніну. Благі код і ягонае суправаджэньне такой радасьці не прынясуць, асабліва калі працаваць аднаму. На гэта раз пра jQuery, WYSIWYG і onChange event.
Read the rest of this entry »

Спортивное питание — креатин, dynamize и другое

{ Comments : No Comments » }
{ Tags: ajax, ckeditor, events, javascript, jquery, null, onchange, sql, tinymce, wysiwyg }

wordpress categories parentness

Oct 23 2009
  • belarusian
  • russian

А это снова я со своим WordPress как с писанной торбой. Снова я зол и недоволен, потому что искал баги методом бинарного поиска, расставляя контрольные точки по всему шаблону, да ещё потом и по плагину небезызвестного Alex King. Тот ещё подлец, скажу я вам, не идеальный код пишет, мягко говоря.
Read the rest of this entry »

  • belarusian
  • russian

А гэта зноў я са сваім WordPress як зь пісанай торбай. Зноў я злы і незадаволены, таму што шукаў багі мэтадам бінарнага пошуку, расстаўляючы кантрольныя кропкі па ўсяму шаблону, ды потым яшчэ па плягіну даволі вядомага Alex King. Той яшчэ падлец, скажу я вам, не ідэальны код піша, мякка кажучы.
Read the rest of this entry »

{ Comments : 1 Comment » }
{ Tags: category, cat_is_ancestor_of, coding, dynamic typing, int, php, style, wordpress }

« Previous Entries

RSS antisocial feeling

  • Ворачиваться в страну шпрот собираешься?
  • (via priskorbno) хочу. давно хотел. где купить?
  • ??
  • "((foldl (+) 0 [1..100]) ^ 2) - (foldl (+) 0 (map (^ 2) [1..100]))"
  • ?

Tags

bash belarus blog blogs bugs coding concerts download friends fun gentoo google images internet javascript kde language life links linux livejournal me money music overlays perl photos php plugins portage projects rss school shell social social networks ssh studying tests twitter ubuntu univer vkontakte wifi wordpress

links

  • asocial feeling
  • Callisto overlay
  • daThumbs
  • last.fm
  • twitter
  • Vkontakte
  • ~idioteque

Recent Comments

  • bobrik on @listwatcher
  • Process_of_illumination on WordPress-bbPress syncronization
  • Process_of_illumination on WordPress-bbPress syncronization
  • Aviva Gabriel on @listwatcher
  • Aviva Gabriel on @listwatcher
  • Larry D. Halstead on @listwatcher
  • neagaoleg on Hide Mentions in Twitter Web Interface
  • neagaoleg on about
  • Martina Bella on @unfollowr
  • gamersroute.com on WordPress-bbPress syncronization

Archives

  • January 2010 (1)
  • November 2009 (2)
  • October 2009 (5)
  • September 2009 (2)
  • August 2009 (2)
  • July 2009 (3)
  • June 2009 (1)
  • April 2009 (2)
  • March 2009 (1)
  • February 2009 (1)
  • January 2009 (2)
  • December 2008 (12)
  • November 2008 (17)
  • October 2008 (20)
  • September 2008 (13)
  • August 2008 (25)
  • July 2008 (18)
  • June 2008 (15)
  • May 2008 (7)
  • March 2008 (1)
  • February 2008 (9)
  • January 2008 (11)
  • December 2007 (24)
  • November 2007 (27)
  • October 2007 (21)

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

Creative Commons License rss comments rss valid xhtml