<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>kernel panic in userspace</title>
	
	<link>http://bobrik.name</link>
	<description>You will squeeze the life out of me</description>
	<lastBuildDate>Mon, 01 Mar 2010 14:55:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/bobrik" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="bobrik" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://bobrik.hovel.ru</link><url>http://bobrik.hovel.ru/logo.png</url><title>bobrik</title></image><item>
		<title>Hide Mentions in Twitter Web Interface</title>
		<link>http://bobrik.name/2010/01/24/hide-mentions-in-twitter-web-interface/</link>
		<comments>http://bobrik.name/2010/01/24/hide-mentions-in-twitter-web-interface/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 23:25:47 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=762</guid>
		<description><![CDATA[Во время сессии вечно хочется сделать что-нибудь эдакое совсем бесполезное, лишь бы только не готовиться к экзаменам. Внезапно последний экзамен получился автоматом (был целиком на одной лекции), так что я решил попрактиковаться в JavaScript, вместо того, чтобы заниматься полезными делами.
Некоторые тви-фашисты (вроде меня) не слишком любят читать реплаи чужим людям. Порой хочется открыть веб-интерфейс, открыть [...]]]></description>
			<content:encoded><![CDATA[<div id="post-762-russian"><p>Во время сессии вечно хочется сделать что-нибудь эдакое совсем бесполезное, лишь бы только не готовиться к экзаменам. Внезапно последний экзамен получился автоматом (был целиком на одной лекции), так что я решил попрактиковаться в JavaScript<del datetime="2010-01-23T22:39:45+00:00">, вместо того, чтобы заниматься полезными делами</del>.</p>
<p>Некоторые тви-фашисты (вроде меня) не слишком любят читать реплаи чужим людям. Порой хочется открыть веб-интерфейс, открыть чью-нибудь ленту и просто почитать. Благо, букв немного. А там закрадутся 100500 реплаев, которые вообще ну никак в картину мира не вписываются. Так вот, давно хотелось их выпилить. Сначала я хотел сделать расширение для Chromium, но <del datetime="2010-01-23T22:39:45+00:00">не вышло</del> потом подумалось, что недурно было бы сделать что-нибудь более универсальное, например закладку. Пользователь на неё клац — и реплаи исчезли/появились. Ну не чудесно ли? :)</p>
<p><em>Этот большой и сташный кусок непостигшие дао могут пропустить, листайте ниже.</em> Написался следующий скрипт (лицензирую под GPL v3, к слову):</p>
<pre><code class="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();</code></pre>
<p>После долгих и мучительных попыток его минимизировать и при этом оставить в рабочем состоянии осталось только первое требование. Видимо, я слишком хитро написал, чтобы обфускатор правильно всё разбрал и потом собрал обратно. Ну и ладно. Тем не менее, <strong>всё, что нужно для использования</strong> — добавить на панель следующую ссылку:</p>
<p><code>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();</code></p>
<p>Потом можно в веб-интерфейсе твиттере этой кнопочкой пользоваться. Что стоит учесть:</p>
<ul>
<li>Повторное нажатие вернёт все реплаи</li>
<li>При использовании кнопки «more» настройка сохраняется и реплаи <strong>прячутся</strong></li>
<li>При переходе в DM, replies или другие меню реплаи тоже <strong>прячутся</strong></li>
<li>При появлении новых твиттов вверху страницы реплаи <strong>не прячутся</strong>, что логично (?)</li>
</ul>
<p>Enjoy, как говорится. Распространение в твиттере приветствуется %)</p>
</div><div id="post-762-belarusian" style="display: none"><p>Падчас сэсіі пастаянна хочацца зрабіць што-небудзь гэтакае зусім бессэнсоўнае, толькі б не рыхтавацца да іспытаў. Нечакана апошні экзамен атрымаўся аўтаматам (быў на адной лекцыі цалкам), так што я вырашыў папрактыкавацца ў JavaScript<del datetime="2010-01-23T22:39:45+00:00">, замест таго, каб займацца патрэбнымі справамі</del>.</p>
<p>Некаторыя тві-фашысты (кшталту мяне) ня дужа любяць чытаць рэплаі іншым людзям. Час ад часу хочацца адкрць вэб-інтэрфейс, адкрыць чыю-небудзь ленту і проста пачытаць. Добра, што літар няшмат. А там закрадуцца 100500 рэплаяў, якія ну ніяк не ўпісваюцца ў сьветаўленьне. Спачатку я хацеў напісаць пашырэньне для Chromium, але <del datetime="2010-01-23T22:39:45+00:00">ня выйшла</del> потым падумалася, што няблага было б і што-небудзь больш універсальнае зрабіць, напрыклад закладку. Карыстач на яе клац — і рэплаі зьніклі/зьявіліся. Ну не цуд, га? :)</p>
<p><em>Гэты вялікі і страшэнны кусок можна прапусьціць, калі вы дао не спасьціглі яшчэ.</em> Напісаўся наступны скрыпт (ліцэнзірую пад GPL v3, дарэчы):</p>
<pre><code class="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();</code></pre>
<p>Пасьля доўгіх і беспасьпяховых спроб яго мінімізаваць і пры гэтым заставіць у працоўным стане засталося толькі першае патрабаваньне. Напэўна, я дужа хітра напісаў, каб абфускатар правільна ўсё разабраў і потым сабраў зноў. Ну і ладна. Тым не менш, <strong>усё, ўто трэба для карыстаньня</strong> — дадаць на панэльку наступную спасылку:</p>
<p><code>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();</code></p>
<p>Потым можна будзе ў уэб-інтэрфейсе твітэра гэтай кнопкай карыстацца. Але варта ўлічваць:</p>
<ul>
<li>Паўторнае націсканьне верне ўсе рэплаі</li>
<li>Пры выкарыстаньні кнопкі «more» наладка захоўваецца і рэплаі <strong>хаваюцца</strong></li>
<li>Пры пераходзе ў DM, replies ці іншыя меню рэплаі таксама <strong>хаваюцца</strong></li>
<li>Пры зьяўленьні новых твітаў уверсе старонкі рэплаі <strong>не хаваюцца</strong>, што лягічна (?)</li>
</ul>
<p>Enjoy, як кажуць. Распаўсюд у твітэры вітаецца %)</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2010/01/24/hide-mentions-in-twitter-web-interface/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>new project: @listwatcher</title>
		<link>http://bobrik.name/2009/11/20/new-project-listwatcher/</link>
		<comments>http://bobrik.name/2009/11/20/new-project-listwatcher/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 14:44:03 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[bots]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[listwatcher]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[unfollowr]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=739</guid>
		<description><![CDATA[Снова мне что-то не сидится на месте, тянет что-нибудь сделать в меру бесполезное, что сам бы мог использовать неделю, а потом забыть. На сей раз захотелось поделиться с общественностью твиттера. Новый проект @listwatcher — бот, следящий за списками, в которых вы состоите, и сообщающий, если вдруг видны какие изменения на фронтах.
Чем-то он похож на мой [...]]]></description>
			<content:encoded><![CDATA[<div id="post-739-russian"><p>Снова мне что-то не сидится на месте, тянет что-нибудь сделать в меру бесполезное, что сам бы мог использовать неделю, а потом забыть. На сей раз захотелось поделиться с общественностью твиттера. Новый проект <a  href="http://twitter.com/listwatcher">@listwatcher</a> — бот, следящий за списками, в которых вы состоите, и сообщающий, если вдруг видны какие изменения на фронтах.</p>
<p>Чем-то он похож на мой другой проект для твиттера, а именно <a  href="http://twitter.com/unfollowr">@unfollowr</a>. Тот пишет личное сообщение, если вас кто-то перестал читать (а теперь пишет ещё и про количество спамеров, которые так поступили). Только вот в отличие от @unfollowr, @listwatcher пишет не только о</p>
<ul>
<li>списках, в которых вы состояли и из которых вас удалили</li>
</ul>
<p>но и о</p>
<ul>
<li>списках, в которые вас добавили (twitter не пишет сам)</li>
<li>списках, которые удалали или сделали приватными, в которые вы входили</li>
<li>списках, в которых вы состояли и которые переименовали</li>
</ul>
<p>Таким образом, можно будет всегда узнать, что некто подло вас перенёс из списка &#8220;boyz&#8221; в список &#8220;bastards&#8221; или удалил из списка &#8220;favs&#8221;. Впрочем, может вы того и заслуживаете. Меня не волнуют ваши проблемы подобного рода :)</p>
<p>В будущем планирую дописать на Django web-интерфейс с авторизацией по OAuth для настройки этого безобразия, чтобы можно было, допустим, изменить формат присылаемых сообщений, ограничить их по типу или использовать локализованные сообщения. Неплохо было бы что-нибудь ещё такое написать к @unfollowr, чтобы с графиками и прочим клёвым стаффом. Ждите и подписывайтесь :)</p>
<p>Что действительно стоило бы сделать, так это дизайн какой-нибудь приемлемый и описание как в твиттере, так и на страничке в блоге, чтобы можно было показывать людям. Если у кого есть идеи/желание — высказывайтесь я буду только рад.</p>
<p>p.s.: ещё было бы круто, если кто-нибудь помог бы мне перевести описание на английский (или какой-нибудь ещё вдобавок, если хотите)</p>
</div><div id="post-739-belarusian" style="display: none"><p>Зноў мне нешта ня седзецца на месцы, тягне што-небудзь зрабіць у меру бессэнсоўнае, каб сам мог пакарыстацца тыдзень, а потым забыць. На гэты раз захацелася падзяліцца з грамадскасьцю твітэра. Новы праект <a  href="http://twitter.com/listwatcher">@listwatcher</a> — бот, які глядзіць за сьпісамі, у якіх вы знаходзіцеся, і піша, калі бачны нейкія зьмены на франтах.</p>
<p>Чымсьці ён падобны на мой іншы праект для твітэра, а менавіта <a  href="http://twitter.com/unfollowr">@unfollowr</a>. Той піша асабістае паведамленьне, калі вас нехта перастаў чытаць (а цяпер яшчэ піша і пра колькасьць спамераў, якія так зрабілі). Толькі вось у адрозненні ад @unfollowr, @listwatcher піша ня толькі пра</p>
<ul>
<li>сьпісы, у якіх вы былі і зь якіх вас выдалілі</li>
</ul>
<p>але і пра</p>
<ul>
<li>сьпісы, у якія вас дадалі (twitter ня піша сам)</li>
<li>сьпісы, у якія вы ўваходзілі, але якія выдалілі ці зрабілі прыватнымі</li>
<li>сьпісы, у якія вы ўваходзілі, але якія перайменавалі</li>
</ul>
<p>Такім чынам, можна будзе заўсёды даведацца, што нехта вас перанёс са сьпісу &#8220;boyz&#8221; у сьпіс &#8220;bastards&#8221; ці выдаліў са сьпісу &#8220;favs&#8221;. Але ж, можа вы таго вартыя. Мяне не турбуюць вашыя праблемы такога кшталту :)</p>
<p>У будучым пляную даписаць на Django web-інтэрфейс з аўтарызацыяй па OAuth для наладкі ўсяго гэтага, каб магчыма было, дапусьцім, зьмяніць фармат дасылаемых паведамленьняў, абмежаваць іх па тыпу ці выкарыстоўваць лакалізаваныя паведамленьні. Няблага было б яшчэ что-небудь напісаць для @unfollowr, каб глядзець статыстыку з графікамі і іншымі клёвымі штукамі. Чакайце і падпісвайцеся :)</p>
<p>Што насамрэч варта было б зрабіць, дык гэта дызайн які-небудзь прыгожы і апісаньне як ў твітэры, так і на старонцы ў блоге, каб можна было паказваць людзям. Калі ў каго якія ідэі/пажаданьні — выказвайцеся, я буду толькі рады.</p>
<p>p.s.: яшчэ было б крута, калі хто-небудзь дапамог бы мне перакласьці апісаньне на ангельскую (ці якую яшчэ ў дадатак, калі пажадаеце)</p>
</div><div id="post-739-english" style="display: none"><p>We&#8217;re waiting for help in translation. You may use Google Translate now. Sorry :)</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/11/20/new-project-listwatcher/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>whitelisted unfollowr troubles</title>
		<link>http://bobrik.name/2009/11/13/whitelisted-unfollowr-troubles/</link>
		<comments>http://bobrik.name/2009/11/13/whitelisted-unfollowr-troubles/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 21:45:34 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[FancyURLopener]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[google groups]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[unfollowr]]></category>
		<category><![CDATA[urllib]]></category>
		<category><![CDATA[yahoo pipes]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=733</guid>
		<description><![CDATA[Свершилось чудо и моего ненаглядного @unfollowr добавили в список избранных пользователей Twitter, которым позволено использовать API запросы без ограничений. Теперь мне пишет, что осталось 20000 запросов в час, а не 150, хотя сколько бы я их ни делал, всё равно число не меняется. Не знаю даже, с какой попытки мне всё это далось. Далее о [...]]]></description>
			<content:encoded><![CDATA[<div id="post-733-russian"><p>Свершилось чудо и моего ненаглядного <a  href="http://twitter.com/unfollowr">@unfollowr</a> добавили в список избранных пользователей Twitter, которым позволено использовать API запросы без ограничений. Теперь мне пишет, что осталось 20000 запросов в час, а не 150, хотя сколько бы я их ни делал, всё равно число не меняется. Не знаю даже, с какой попытки мне всё это далось. Далее о печальном и разном.</p>
<p>Незадолго до этого я вообще решил переписать бота с Perl на Python. Просто так захотелось, да и Python надо немножко вспоминать иногда, а то я его что-то подзабросил. Переписалось всё отлично, даже лучше чем было. Как только можно было делать неограниченное количество запросов к API, так я даже от Yahoo Pipes отказался, который порой выдавал не самые полные данные, что, к слову, компенсировалось частыми проходами по спискам. Только вот Twitter API — вещь в себе и большая загадка порой.</p>
<p>Вот к примеру, есть некие люди, которые не хотят, чтобы их обновления видели другие люди, если им на то дозвол не выдан. Ну и бг с ними, пускай. Эдакие социопаты тоже не прочь узнать, кто это такой подлый перестал их читать. Тоже можно понять. Они фолловили @unfollowr, тот им через Yahoo Pipes тягал список фолловеров и вроде бы как и считал что-то. Вроде и считал, а вроде и нет. Когда всё работало через Pipes, было незаметно, что там API говорит по поводу таких пользователей (за всеми и не уследишь), а когда работа начала вестись напрямую, тут и всплыли странные глюки. На некоторые запросы Python начал спрашивать пароль, хоть тот и указывался явно в URL в виде http://user:pass@host/. Я уж думал, что это просто API глючит местами, написал WorkAround даже (об этом позже), да вот только всё не то.</p>
<p>Оказывается, если пользователь с закрытыми апдейтами читает тебя, а ты его нет, то получить список его фолловеров через API нельзя. В Web интерфейсе поглазеть можно, а через API забрать нельзя. Логика шопппц. Причём мало того, что нельзя, выдавало бы хоть какую инфу в ответе, так нет, делается хитрее. Выдаётся HTTP Error 401 (Not Authorized) и требуется авторизация. Новая авторизация, как будто блин у меня 500 логинов в этот чертов твиттер и я буду их перебирать. По такому радостному поводу я даже написал в Google группу <a  href="http://groups.google.com/group/twitter-development-talk">twitter-development-talk</a>. Пока тихо, будем ждать результатов.</p>
<p>К слову, о том, как избежать запроса пароля в консоли, если данные получаются с помощью urllib в python. По умолчанию используется &#8220;Opener&#8221; FancyURLopener, который берёт на себя грязную работу по обработке многих ситуаций. Так вот именно он и выдаёт запрос пароля. Можно унаследовать от него ещё один класс, в нём перегрузить метод получения пароля, но это всё тупиковый путь и нам не нужен в общем. Нам просто нужно использовать другой класс для получения данных, а именно просто URLOpener, который будет не запрашивать пароль, а генерировать исключение, которое мы сможем потом красиво обработать в автоматическом режиме. Листинги давать не буду, почитать подробнее можно <a  href="http://cis.poly.edu/cs912/urlopen.txt">вот здесь</a>, сам код @unfollowr <a  href="http://github.com/bobrik/unfollowr">лежит на Github</a>, там можно посмотреть, как оно вообще у меня реализовано и работает.</p>
</div><div id="post-733-belarusian" style="display: none"><p>Здарылася неверагоднае і майго ненагляднага <a  href="http://twitter.com/unfollowr">@unfollowr</a> дадалі ў сьпіс выбраных карыстачоў Twitter, якім дазволена выкарыстоўваць API запыты без абмежаваньняў. Цяпер мне піша, што засталося 20000 запытаў на гадзіну, а не 150, хаця колькі б я іх не рабіў, усё роўна чысло не зьмяняецца. Ня ведаю нават, зь якой спробы мне ўсё гэта далося. Далей пра сумнае і рознае.</p>
<p>Незадоўга да гэтага я ўвогуле вырашыў перапісаць бота з Perl на Python. Проста так захацелася, ды й  Python трэба ўзгадваць час ад часу, а то я нешта яго падзакінуў. Перапісалася ўсё проста цудоўна, нават лепей, чым было. Як толькі зьявілася магчымасьць рабіць неабмежаваную колькасьць запытаў да API, дык я адразу адмовіўся ад Yahoo Pipes, які час ада часу выдаваў не самыя поўныя дадзеныя, что, дарэчы, кампенсавалася частымі праходамі па сьпісах. Толькі вось Twitter API — рэч у сабе і вялікая загадка.</p>
<p>Вось напрыклад, ёсьць нейкія людзі, якія ня хочуць, каб іх аднаўленьні чыталі іншыя людзі, калі ім на тое не далі дазволу. Ну й фіг зь імі, няхай. Эдакія сацыяпаты таксама не супраць даведацца, хто такі подлы перастаў іх чытаць. Таксама можна зразумець. Яны фолавілі @unfollowr, той ім праз Yahoo Pipes цягаў сьпісы фолавераў і здаецца нават нешта там вылічваў. Здаецца і вылічваеў, а атрымваецца, што і не. Калі ўсё працавала праз Pipes, было незаўважна, што там API кажа наконт такіх карыстальнікаў (за ўсімі не ўгледзеш), а калі праца пачала весьціся напрамую, тут і ўсплылі дзіўныя глюкі. На некаторыя запыты Python пачаў запытваць пароль, хоць той і даваўся яўна ў URL у выглядзе http://user:pass@host/. Я ўжо думаў, што гэта проста API глючыць месцамі, напісаў  WorkAround нават (аб гэтым пазьней), ды вось толькі ўсё ня тое.</p>
<p>Выяўляецца, калі карыстач з закрытымі аднаўленьнямі чытае цябе, а ты яго не, то атрымаць сьпіс ягоных фолавераў праз API нельга. У Web інтэрфейсе паглядзець можна, а праз API забраць нельга. Логіка шоппц. Прычым мала таго, што нельга, выдавала б хоць якую інфу ў адказе, дые не, робіцца дзіўней. Выдаецца HTTP Error 401 (Not Authorized) і патрабуецца аўтарызацыя. Новая аўтарызацыя, нібыта блін у мяне 500 логінаў у гэты чортавы твітэр і я іх буду перабіраць. З такой радаснай нагоды я нават напісаў у Google групу <a  href="http://groups.google.com/group/twitter-development-talk">twitter-development-talk</a>. Пакуль ціха, будзем чакаць рэзультатаў.</p>
<p>Дарэчы пра тое, як пазьбегчы запыту пароля ў кансолі, калі дадзеныя атрымліваюцца праз urllib у python. Па змоўчаньні выкарыстоўваецца &#8220;Opener&#8221; FancyURLopener, які бярэ на сабе брудную працу па апрацоўцы многіх сітуацый. дык вось менавіта ён і выдае запыт пароля. Можна зрабіць для яго патомка, у ім перагрузіце мэтад атрыманьня пароля, але гэта тупіковы шлях і нам ён непатрэбны ўвогуле. Нам проста трэба выкарыстоўваць іншы клас для атрыманьня дадзеных, а менавіта проста URLOpener, які будзе не запытваць пароль, а генерыраваць выключэньне, якое мы зможам прыгожа апрацаваць у аўтаматычным рэжыме. Лістынгі даваць ня буду, пачытаць падрабязьней можна <a  href="http://cis.poly.edu/cs912/urlopen.txt">вось тут</a>, сам код @unfollowr <a  href="http://github.com/bobrik/unfollowr">ляжыць на Github</a>, там можна паглядзець, як яно ўвогуле ў мяне рэалізавана і працуе.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/11/13/whitelisted-unfollowr-troubles/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery val() &amp; change() tricks</title>
		<link>http://bobrik.name/2009/10/24/jquery-val-change-tricks/</link>
		<comments>http://bobrik.name/2009/10/24/jquery-val-change-tricks/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 23:40:44 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ckeditor]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[null]]></category>
		<category><![CDATA[onchange]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tinymce]]></category>
		<category><![CDATA[wysiwyg]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=723</guid>
		<description><![CDATA[Начал понемногу оживать блог, как вы уже, наверное, заметили :) Практика программирования и последующего рефакторинга хорошего кода даёт благодатные плоды для размышлений. Плохой код и его сопровождение такой радости не принесут, особенно если работать одному. На сей раз про jQuery, WYSIWYG и onChange event.
Read the rest of this entry &#187;
Пачаў паціху ажываць блёг, як вы [...]]]></description>
			<content:encoded><![CDATA[<div id="post-723-russian"><p>Начал понемногу оживать блог, как вы уже, наверное, заметили :) Практика программирования и последующего рефакторинга хорошего кода даёт благодатные плоды для размышлений. Плохой код и его сопровождение такой радости не принесут, особенно если работать одному. На сей раз про jQuery, WYSIWYG и onChange event.<br />
<a  href="http://bobrik.name/?p=723" class="more-link"><span class="readmore">Read the rest of this entry &raquo;</span></a></p>
</div><div id="post-723-belarusian" style="display: none"><p>Пачаў паціху ажываць блёг, як вы ўжо, напэўна, заўважылі :) Практыка праграмаваньня і далейшага рэфакторынгу добрага коду дае сваю добрую садавіну й гародніну. Благі код і ягонае суправаджэньне такой радасьці не прынясуць, асабліва калі працаваць аднаму. На гэта раз пра jQuery, WYSIWYG і onChange event.<br />
<a  href="http://bobrik.name/?p=723" class="more-link"><span class="readmore">Read the rest of this entry &raquo;</span></a></p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/10/24/jquery-val-change-tricks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress categories parentness</title>
		<link>http://bobrik.name/2009/10/23/wordpress-categories-parentness/</link>
		<comments>http://bobrik.name/2009/10/23/wordpress-categories-parentness/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 23:36:07 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[category]]></category>
		<category><![CDATA[cat_is_ancestor_of]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[dynamic typing]]></category>
		<category><![CDATA[int]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=719</guid>
		<description><![CDATA[А это снова я со своим WordPress как с писанной торбой. Снова я зол и недоволен, потому что искал баги методом бинарного поиска, расставляя контрольные точки по всему шаблону, да ещё потом и по плагину небезызвестного Alex King. Тот ещё подлец, скажу я вам, не идеальный код пишет, мягко говоря.
Read the rest of this entry [...]]]></description>
			<content:encoded><![CDATA[<div id="post-719-russian"><p>А это снова я со своим WordPress как с писанной торбой. Снова я зол и недоволен, потому что искал баги методом бинарного поиска, расставляя контрольные точки по всему шаблону, да ещё потом и по плагину небезызвестного <a  href="http://alexking.org/">Alex King</a>. Тот ещё подлец, скажу я вам, не идеальный код пишет, мягко говоря.<br />
<a  href="http://bobrik.name/?p=719" class="more-link"><span class="readmore">Read the rest of this entry &raquo;</span></a></p>
</div><div id="post-719-belarusian" style="display: none"><p>А гэта зноў я са сваім WordPress як зь пісанай торбай. Зноў я злы і незадаволены, таму што шукаў багі мэтадам бінарнага пошуку, расстаўляючы кантрольныя кропкі па ўсяму шаблону, ды потым яшчэ па плягіну даволі вядомага <a  href="http://alexking.org/">Alex King</a>. Той яшчэ падлец, скажу я вам, не ідэальны код піша, мякка кажучы.<br />
<a  href="http://bobrik.name/?p=719" class="more-link"><span class="readmore">Read the rest of this entry &raquo;</span></a></p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/10/23/wordpress-categories-parentness/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>i hate wp plugins developers</title>
		<link>http://bobrik.name/2009/10/21/i-hate-wp-plugins-developers/</link>
		<comments>http://bobrik.name/2009/10/21/i-hate-wp-plugins-developers/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 20:17:40 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=713</guid>
		<description><![CDATA[Это пост ненависти. Нет, правда, я уже не могу терпеть. Раньше мне было всё равно и я толком не разбирался в JavaScript, но тут уж как-то всё совпало и я решил немножко оптимизировать загрузку блога.
И что вы думаете? Загружалось аж 3 или даже 4 копии jQuery из разных источников. Каждый плагинописатель сам себе безголовый всадник [...]]]></description>
			<content:encoded><![CDATA[<div id="post-713-russian"><p>Это пост ненависти. Нет, правда, я уже не могу терпеть. Раньше мне было всё равно и я толком не разбирался в JavaScript, но тут уж как-то всё совпало и я решил немножко оптимизировать загрузку блога.</p>
<p>И что вы думаете? Загружалось аж 3 или даже 4 копии jQuery из разных источников. Каждый плагинописатель сам себе безголовый всадник и решает к своему плагину обязательным образом приложить Prototype или jQuery. Если вам не повезло и вы пользуетесь многими плагинами от такого рода авторов, то опасность того, что блог будет тормознутый как Windows XP после года использования детьми, весьма велика.</p>
<p>Ну неужели сложно догадаться, что раз такая насущная проблема с подключением одной и той же библиотеки, то должен быть какой-то простой и изящный путь? Ведь WordPress версию далеко не 0.2beta имеет. И есть же специальная функция, которой скармливается имя JS библиотеки, после чего WordPress сам высчитывает всё что нужно и подключает только нужные библиотеки, причём даже зависимости отследит как нужно. И имя у сей волшебной функции <a  href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">wp_enqueue_script</a>. Это разработчику надо обязательно знать.</p>
<p>Ну а простому пользователю надо знать, что можно включение всех дублирующихся библиотек отключать, можно даже простым закомментированием, но лучше всё же заменить (при наличии должных знаний в php) все подключения библиотек через wp_enqueue_script. Главное — быть осторожным, а если ты девочка — быть осторожной. Adios.</p>
</div><div id="post-713-belarusian" style="display: none"><p>Гэта пост нянавісьці. Не, насамрэч я ўжо не магу трываць. Раней мне было ўсё роўна і я дужа ў JavaScript не разьбіраўся, але тут неяк усё супала і я вырашыў трошкі аптымізаваць загрузку блога.</p>
<p>І што вы думаеце? Загружалася аж 3 ці нават 4 копіі jQuery з розных крыніц. Кодны плягінапісацель сам сабе безгаловы конны і вырашае да свайго плягіна абавязковым чынам падключыць Prototype ці jQuery. Калі вам не пашчасьціла і вы карыстаецеся шматлікімі плягінамі ад такога кшталту аўтараў, то верагоднасьць таго, што блог будзе працаваць як Windows XP пасьля году карыстаньня дзецьмі, вельмі вялікая.</p>
<p>Ну няўжо цяжка здагадацца, што калі такая праблема з падключэньнем адной і той жа бібліятэкі, то павінен быць нейкі просты і элегантны шлях? Ну і WordPress ужо даўне не ў вэрсіі 0.2beta, павінен умець. І насамрэч жа ёсьць спецыяльная функцыя, якой скармліваецца імя JS бібліятэкі, пасьля чаго WordPress сам вылічвае ўсё што трэба, прычым нават залежнасьці ўлічвае як трэба. І імя той чароўнай функцыі <a  href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">wp_enqueue_script</a>. Гэта распрацоўшчыку абавязкова ведаць.</p>
<p>Ну а простаму карыстачу трэба ведаць, што можна ўключэньне ўсіх дублюючыхся бібліятэк адключаць, можна нават прастым каментаваньнем, але ўсё ж лепей замяняць (калі маюцца адпаведныя навыкі) усе падключэньні бібліятэк на wp_enqueue_script. Галоўнае — быць асьцярожным, а калі ты дзяўчынка, то быць асьцярожнай. Adios.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/10/21/i-hate-wp-plugins-developers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>university labs git repo</title>
		<link>http://bobrik.name/2009/10/16/university-labs-git-repo/</link>
		<comments>http://bobrik.name/2009/10/16/university-labs-git-repo/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 06:13:47 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[bsuir]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[labs]]></category>
		<category><![CDATA[univer]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=710</guid>
		<description><![CDATA[Не могу сказать, что я в восторге от своего университета, но могло быть и хуже. Может и не могло, но лучше не думать о таком. Может, дальше будет лучше. Просто получается так, что я за один вечер курсов в Itransition узнаю по делу больше, чем за семестр (если не за год) в университете. Не на [...]]]></description>
			<content:encoded><![CDATA[<div id="post-710-russian"><p>Не могу сказать, что я в восторге от своего университета, но могло быть и хуже. Может и не могло, но лучше не думать о таком. Может, дальше будет лучше. Просто получается так, что я за один вечер курсов в Itransition узнаю по делу больше, чем за семестр (если не за год) в университете. Не на каждых курсах, конечно, но тенденция настораживает.</p>
<p>Но всё же в университете приходится писать всякие разные лабы (кто бы рассказывал как, а?) по программированию (?), которые потом расходятся по группе с изменёнными методами в стиле «getMnozhestvo». Становится довольно слабо похоже на моё, так что сдать получается :) Дабы моя писанина не пропадала, мало ли кому понадобится, я решил всё безобразие выкладывать в <a  href="http://github.com/bobrik/bsuir">репозиторий на Github</a>.</p>
<p>На что-то серьёзное код не претендует, скорее для ознакомления «как можно делать». Или для оценки, чем занимаются студенты ФИТУ на втором курсе (ну и дальше, как пойдёт). Может, со временем буду выкладывать ещё какие-нибудь отчёты по SC (semantic code) и прочему стаффу, который по заверениям завкафедры приведёт нас к счастливому будущему. Ну-ну</p>
</div><div id="post-710-belarusian" style="display: none"><p>Не магу сказаць, што я давольны сваім універсітэтам, але магло быць і горш. Можа і не магло быць, але пра такое лепш ня думаць. Проста атрымліваецца так, што за адзін вечар курсаў у Itransition я даведваюся па справе больш, чым за семестр (калі не за год) ва універсітэце. Не на кожным занятку, канешне, але тэндэнцыя настарожвае.</p>
<p>Але ўсё ж ва універсітэце прыходзіцца пісаць усякія розныя лабы (хто б распавядаў як, га?) па праграмаваньню (?), якія потым разыходзяцца па групе са змененымі метадамі ў стылі «getMnozhestvo». Становіцца даволі слаба падобна на маё, так што здаваць атрымліваецца :) Каб мая пісаніна не прападала, можа каму спатрэбіцца, я вырашыў нешта выкладваць у <a  href="http://github.com/bobrik/bsuir">рэпазіторый на Github</a>.</p>
<p>На нешта сур&#8217;ёзнае код не прэтэндуе, хутчэй для азнаямленьня «як можна рабіць». Ці для ацэнкі, чым займаюцца студэнты ФИТУ на другім курсе (ну і далей, як пойдзе). Можа, з часам буду выкладаць якія рэпорты па SC (semantic code) і іншаму стафу, які па абацаньням завкафедры прывядзе нас да шчасьлівай будучыні. Ну-ну</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/10/16/university-labs-git-repo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>negative remainder</title>
		<link>http://bobrik.name/2009/10/02/negative-remainder/</link>
		<comments>http://bobrik.name/2009/10/02/negative-remainder/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 14:36:30 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[negative remainder]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[weekday]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=701</guid>
		<description><![CDATA[Делая домашнее задание по Javascript (рукотворный календарик) столкнулся с проблемой определения дня недели для первого дня текущего месяца. Сначала всплыло то, что в буржуинском языке Sunday (воскресенье) — первый день недели, т.е. день недели с нулевым индексом. Ничего умнее того, чтобы доделать ещё один метод к классу Date, я не придумал.
Date.prototype.wDay = function ()
{
  [...]]]></description>
			<content:encoded><![CDATA[<div id="post-701-russian"><p>Делая домашнее задание по Javascript (рукотворный календарик) столкнулся с проблемой определения дня недели для первого дня текущего месяца. Сначала всплыло то, что в буржуинском языке Sunday (воскресенье) — первый день недели, т.е. день недели с нулевым индексом. Ничего умнее того, чтобы доделать ещё один метод к классу Date, я не придумал.</p>
<pre><code class="javascript">Date.prototype.wDay = function ()
{
  // sunday must be the last day of the week
  if (this.getDay() == 0)
    return 6;
  return this.getDay()-1;
}</code></pre>
<p>Дальше надо было получать сам первый день недели. С подозрением на то, что стандартной функции нет (да и искать было лень, хотелось поупражняться), я засел за это дело. Ковырялся-ковырялся, получилось нечто типа следующего:</p>
<pre><code class="javascript">Date.prototype.getFirstDay = function()
{
  return (7*5+this.wDay()-this.getDate()+1)%7;
}</code></pre>
<p>7*5 гарантированно больше числа дней в месяце, с учётом того, что календарь делался на третью от Солнца планету, так что мы всегда получали целое число для получения остатка от деления на 7. Только вот magick numbers не есть хорошо, как известно. Дальнейшие ковыряния с получением остатка от деления отрицательных чисел привели к неожиданным результатам.</p>
<p>Между делом я использовал в соседней консоли Python как калькулятор, который мне выдавал, что (4-16)%7 == 2. В то же время javascript делал нечто необъяснимое, что я сначала сбрасывал на счёт не самых естественных индексов для дней недели, всё же люди с 1 привыкли считать их. Wikipedia же <a  href="http://en.wikipedia.org/wiki/Remainder#The_case_of_general_integers">говорит</a> нам, что по-своему прав каждый, ведь -12 = 7*(-2)+2, равно как и -12 = 7*(-1)+(-5). Workaroud для такого делается следующим образом:</p>
<pre><code class="javascript">Date.prototype.getFirstDay = function()
{
  var firstDay = (this.wDay()-this.getDate()+1)%7;
  if (firstDay < 0)
  {
    return firstDay+7;
  }
  return firstDay;
}</code></pre>
<p>Такая вот коварная, хоть и примитивная математика.</p>
</div><div id="post-701-belarusian" style="display: none"><p>Робячы хатняе заданьне па Javascript (рукатворны каляндарык) сутыкнуўся з праблемай атрыманьня першага дня тыдню для бягучага месяца. Спачатку ўсплыла тое, што ў буржуйскай мове Sunday (нядзеля) — першы дзень тыдня, т.б. дзень тыдню з нулявым індэксам. Нічога разумней за тое, каб дарабіць яшчэ адзін метад для класа Date, я не прыдумаў.</p>
<pre><code class="javascript">Date.prototype.wDay = function ()
{
  // sunday must be the last day of the week
  if (this.getDay() == 0)
    return 6;
  return this.getDay()-1;
}</code></pre>
<p>Далей трэба было атрымаць сам першы дзень тыдню. З падазронасьцю, што стандартнай функцыі няма (ды й шукаць было лянота, хацелася папрактыкавацца), я засеў за гэтую справу. Калупаўся-калупаўся, атрымалася нешта кшталту наступнага:</p>
<pre><code class="javascript">Date.prototype.getFirstDay = function()
{
  return (7*5+this.wDay()-this.getDate()+1)%7;
}</code></pre>
<p>7*5 гарантавана больш ліку дней у месяца, з улікам таго, што каляндарык рабіўся на трэцюю ад Сонца плянэту, так што мы гарантавана атрымлівалі цэлае чысло для атрыманьня астатку ад дзяленьня на 7. Толькі вось magick numbers ня ёсьць добра, як вядома. Далейшыя калупаньні з атрыманьнем астатку ад дзяленьня на мінусавыя чысла прывялі да нечаканых рэзультатаў.</p>
<p>Між справай я выкарыстоўваў у суседняй кансолі Python як калькулятар, які мне выдаваў, што (4-16)%7 == 2. У той жа час javascript рабіў нешта неаб&#8217;ясняльнае, што я спачатку ськідаў на не самыя натуральныя індэксы для дней тыдню, усё ж людзі з 1 прывыклі лічыць іх. Wikipedia ж <a  href="http://en.wikipedia.org/wiki/Remainder#The_case_of_general_integers">кажа</a> нам, што кожны па-свойму правы, бо -12 = 7*(-2)+2, як і -12 = 7*(-1)+(-5). Workaroud для такога робіцца наступным чынам:</p>
<pre><code class="javascript">Date.prototype.getFirstDay = function()
{
  var firstDay = (this.wDay()-this.getDate()+1)%7;
  if (firstDay < 0)
  {
    return firstDay+7;
  }
  return firstDay;
}</code></pre>
<p>Такая вось хітрая, хоць і прымітыўная матэматыка.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/10/02/negative-remainder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>limit interface speed</title>
		<link>http://bobrik.name/2009/09/23/limit-interface-speed/</link>
		<comments>http://bobrik.name/2009/09/23/limit-interface-speed/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 15:29:42 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Runix]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[ad-hoc]]></category>
		<category><![CDATA[atheros]]></category>
		<category><![CDATA[connection speed]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[networks]]></category>
		<category><![CDATA[tc]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=695</guid>
		<description><![CDATA[По непредвиденным обстоятельствам у меня появился сосед, причём такой сосед, который не прочь посидеть в интернете и покачать оттуда что-нибудь объёмное. Лишать его интернета как-то не слишком красиво.
Ноутбук его отказался видеть проводную сеть на уровне автоматического получения адреса через DHCP, так что мне пришлось поплясать с бубном и каким-то чудом поднять Ad-hoc wifi между ноутбуками. [...]]]></description>
			<content:encoded><![CDATA[<div id="post-695-russian"><p>По непредвиденным обстоятельствам у меня появился сосед, причём такой сосед, который не прочь посидеть в интернете и покачать оттуда что-нибудь объёмное. Лишать его интернета как-то не слишком красиво.</p>
<p>Ноутбук его отказался видеть проводную сеть на уровне автоматического получения адреса через DHCP, так что мне пришлось поплясать с бубном и каким-то чудом поднять Ad-hoc wifi между ноутбуками. Не знаю, с чьей стороны это выглядело большим чудом, потому как раньше у меня Ad-hoc не работал в принципе, а теперь его ноутбук совершенно случайно (бури на солнце?) может терять сеть. Но теперь вроде всё работает.</p>
<p>Всё бы хорошо, только вот торренты имеют обыкновение съедать весь канал, а ограничение выставлять мне на его ноутбуке не слишком удобно. Да и к чему? :)</p>
<p>После не самых долгих поисков и ностальгии по детству, когда мне приходилось держать на себе сервер по раздаче интернета на 512 кбит на 30, а то и больше (sic!) человек, вспомнились нужные команды. Дабы не тратить время впустую, каждый раз вспоминая аргументы, я сделал простую функцию в ~/.zshrc:</p>
<pre><code class="bash">wlanspeed() {
        sudo tc qdisc replace dev  wlan0 root tbf rate ${1}kbit burst 10kb latency 70ms minburst 1500
}</code></pre>
<p>Лёгким движением руки и вызовом «wlanspeed 500», к примеру, скорость Wifi соединения ограничивается до 500 кбит. Подробней узнать что-нибудь по аргументам и не только можно <a  href="http://itdoc.com.ua/showthread.php?t=339">по ссылке</a>. Скажу только, что ограничивается только скорость <em>исходящего</em> трафика на интерфейсе (для интернета он входящий), так что если бы надо было резать скорость отдачи данных в интернет, понадобилось бы колдовать с метками пакетов и настройкой подобного хака для eth0. Благо, оно мне без нужды.</p>
</div><div id="post-695-belarusian" style="display: none"><p>Праз нечаканыя абставіны у мяне зьявіўся сусед, прычым такі сусед, які не супраць пасядзець у сеціве і спампаваць адтуль што-небудзь вялікае. Лішаць яго доступу ў сеціва неяк не дужа прыгожа было б.</p>
<p>Ноўтбук ягоны адмовіўся бачыць правадную сетку на ўзроўкі аўтаматычнага атрыманьня адрэсы праз DHCP, так што мне прыйшлося патаньчыць з бубнам і нейкім дзіўным чынам падняць Ad-hoc wifi між ноўтбукамі. Ня ведаю, з чыйго боку гэта выглядала большым цудам, таму як раней у мяне Ad-hoc не працаваў у прынцыпе, а цяпер ягоны ноўтбук выпадкова (нешта з сонцам?) можа губляць сетку. Але цяпер усё, зраецца, працуе як трэба.</p>
<p>Усё б добра, але толькі тарэнты маюць звычку зьядаць увесь канал, а абмежаваньне мне выставіць на суседскім ноўтбуку ня дужа зручна. Ды й для чаго? :)</p>
<p>Пасьля ня самых доўгіх пошукаў і настальгіі па дзяцінству, калі мне прыхлжзілася трымаць на сабе сэрвер па раздачы сеціва на 512 кбіт на 30, а то і больш (sic!) чалавек, узгадаліся патрэбныя каманды. Каб не марнаваць час кожны раз, узгадваючы аргументы, я зрабіў прастую функцыю ў ~/.zshrc:</p>
<pre><code class="bash">wlanspeed() {
        sudo tc qdisc replace dev  wlan0 root tbf rate ${1}kbit burst 10kb latency 70ms minburst 1500
}</code></pre>
<p>Лёгкім рухам рукі і выклікам «wlanspeed 500», напрыклад, хуткасьць Wifi злучэньня абмяжоўваецца да 500 кбіт. Падрабязьней даведацца што-небудзь пра аргументы і ня толькі магчыма <a  href="http://itdoc.com.ua/showthread.php?t=339">па спасылцы</a>. Скажу толькі, што абмяжоўваецца толькі хуткасьць <em>выходзячага</em> трафіку на інтэрфейсе (для інтэрнэта ён уходзячы), так што калі б трэба было рэзаць хуткасьць аддачы дадзеных у сеціва, то прыйшлося б шаманіць зь меткамі пакетаў і наладкай падобнага хаку для eth0. Добра, што яно мне не патрэбна.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/09/23/limit-interface-speed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>free ideas #0. irr.by</title>
		<link>http://bobrik.name/2009/09/19/free-ideas-0-irr-by/</link>
		<comments>http://bobrik.name/2009/09/19/free-ideas-0-irr-by/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 17:15:03 +0000</pubDate>
		<dc:creator>bobrik</dc:creator>
				<category><![CDATA[Belarusian]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[irr]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://bobrik.name/?p=685</guid>
		<description><![CDATA[Голова моя полнится различными идеями разной степени возможности коммерческой реализации. Объясняться это может либо передозировкой алкоголем, либо музой, либо тем, что я такой в общем-то всегда. Нужное подчеркнуть, остальное просто запомнить.
Дабы добро не залёживалось, я подумал им делиться. Если вы вдруг решите реализовать что-нибудь из моих идей — хоть сообщите. Просто сам я явно не [...]]]></description>
			<content:encoded><![CDATA[<div id="post-685-russian"><p>Голова моя полнится различными идеями разной степени возможности коммерческой реализации. Объясняться это может либо передозировкой алкоголем, либо музой, либо тем, что я такой в общем-то всегда. Нужное подчеркнуть, остальное просто запомнить.</p>
<p>Дабы добро не залёживалось, я подумал им делиться. Если вы вдруг решите реализовать что-нибудь из моих идей — хоть сообщите. Просто сам я явно не буду (?) заниматься такого рода рискованными мероприятиями (у меня и других хватает, уж поверьте). Всё выкладывать просто физически не получится, слишком уж много накопилось, да и некоторые вещи я пока что берегу для себя. Авось сам реализую что-нибудь.</p>
<p>Итак, сама сегодняшняя (сегодня я ей делюсь, сама она старше) идея: новое риэлторское агентство на основе объявлений из «<a  href="http://irr.by">Из рук в руки</a>». Меня идея посетила во время поисков жилья для очередного переезда. Если кто-то пытался искать в Минске жильё с помощью этой помойки, то я могу только посочувствовать. В основном сайт полнится объявлениями риэлторских агентств, причём последние не брезгуют недобросовестной рекламой. Мой сервис же (можно сделать некоммерческим!) занимается тем, что обходит всю эту помойку и пытается (псевдо-)интеллектуально выделить только честные объявления, которые давали живые люди, скорее всего те, кому принадлежит квартира (или что там они сдают).</p>
<p>Степень честности определяется общим количеством объявлений автора. Я исходил из того, что жильё надо найти быстро, поэтому не отсеивал даже слишком явные фейки, а исключал только те объявления, у которых авторы разродились как минимум на страницу объявлений. К слову сказать, таких на самом деле большинство. Для дополнительной точности стоило бы добавить семантического анализа на предмет фраз аля «Сдаётся чере аген(т)ство» (они даже написать не могут правильно, тупицы) или «Агент по факту», с различными вариациями, но это уже «домашнее задание», если изволите.</p>
<p>Что-то длинным становится мой пост, надо сворачиваться, иначе я его не переведу и он заваляется в черновиках. Надо вам и самим подумать, в конце концов. Дабы не быть голословным, можете заценить мой код на Perl, который вытаскивает и выводит в консоль найденное. Можно скачать вариант для <a  href="http://bobrik.name/uploads/get.txt">квартир</a> и для <a  href="http://bobrik.name/uploads/get_room.txt">комнат</a>. Пользуйте &#038; совершенствуйте %) Будут вопросы — пишите.</p>
<p>p.s.: жильё всё равно находил сам или через друзей.</p>
</div><div id="post-685-belarusian" style="display: none"><p>Галава мая поўніцца рознымі ідэямі дужа шырокага кола ступеняў магчымасьці камэрцыйнай рэалізацыі. Растлумачыць гэта магчыма ці перадазіроўкай алкаголем, ці музай, ці тым, што я такі ў прынцыпе заўсёды. Патрэбнае падкрэсьліць, астатняе проста запомніць.</p>
<p>Каб дабро не застойвалася, я падумаў ім дзяліцца. Калі вы вырашыце рэалізаваць якую з маіх ідэй, дык хаця б паведаміце. Проста я сам дакладна ня буду (?) займацца такога роду рызыковымі справамі (у мяне і іншых хапае, вы ўжо паверце). Усё выкладваць я проста фізычца не змагу, дужа ўжо шмат накапілася, ды й некаторыя рэчы я пакуль што захоўваю для сябе. Авось нешта і рэалізую сам.</p>
<p>Ітак, сама сёняшняя (сёньня я ёй дзялюся, сама яна старэй) ідэя: новая рыэлтарская агенцыя на аснове аб&#8217;яў з «<a  href="http://irr.by">Из рук в руки</a>». У мяне ідэя ўзьнікла падчас пошукаў жыльля дзеля чарговага пераезду. Калі хто спрабаваў шукаць у Менску жыльлё з дапамогай гэтай памойкі, то я магу толькі паспачуваць.  У асноўным сайт поўніцца аб&#8217;явамі рыэлтарскіх агенцый, прычым апошнія не чураюцца несумленнай рэклямы. Мой жа сэрвіс (можна зрабіць некамерцыйным!) займаецца тым, што аыходзіць усю гэтую памыйку і спрабуе (псэўда-)інтэлектуальна выдзеліць толькі сумленныя аб&#8217;явы, якія давалі жывыя людзі, хутчэй за ўсё тыя, каму належыць кватэра (ці ўто там яны здаюць)</p>
<p>Ступень сумленнасьці вылучаецца агульнай колькасьцю аб&#8217;яў аўтара. Я сыходзіў з таго, што жыльлё трэба знайсьці хутка, таму не адсейваў нават дужа яўныя фэйкі, і выключаў толькі тыя аб&#8217;явы, дзе аўтары разрадзіліся як мінімум на старонку аб&#8217;яў. Да слову, такіх насамрэч большасьць. Для дадатковай точнасьці варта было б дадаць семантычны аналіз на наяўнасьць фраз у стылі «Сдаётся чере аген(т)ство» (яны нават напісаць правільна ня могуць, тупіцы) ці «Агент по факту», з рознымі варыяцыямі, але гэта ўжо «дамашняе заданьне», калі пажадаеце.</p>
<p>Нешта доўгім становіцца мой пост, трэба зварачвацца, бо інакш я яго не перакладу і ён заваляецца ў чарнавіках. Трэба вам і самім падумаць самім, у рэшце рэшт. Каб ня быць галаслоўным, можаце зацаніць мой код на Perl, які выцягвае і выводзіць у кансоль знойдзенае. Можна спампаваць варыянт для <a  href="http://bobrik.name/uploads/get.txt">кватэр</a> і для <a  href="http://bobrik.name/uploads/get_room.txt">комнат</a>. Карыстайцеся &#038; рабіце лепей %) Будуць пытаньні — пішыце.</p>
<p>p.s.: жыльлё ўсё роўна знаходзіў сам ці праз сяброў.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://bobrik.name/2009/09/19/free-ideas-0-irr-by/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
