Журнал LinuxFormat - перейти на главную

LXF163: Raspberry Pi: Как создать IRC-чат

Материал из Linuxformat
Перейти к: навигация, поиск


Ус­та­нав­ли­ва­ем сер­вер IRC и об­ща­ем­ся с дру­ги­ми поль­зо­ва­те­ля­ми

Содержание

Raspberry Pi: Как создать IRC-чат

Алекс Кокс соз­да­ет сеть IRC с ну­ля и вды­ха­ет в нее не­сколь­ко не­здо­ро­вую жизнь, при­чем все­го в 224 МБ ОЗУ.

(thumbnail)
Наш эксперт Алекс Кокс – за­мес­ти­тель глав­но­го ре­дак­то­ра жур­на­ла PC Plus. Он поль­зу­ет­ся IRC с то­го мо­мен­та, как за­вел мо­дем и на­чал ре­гу­ляр­но по­лу­чать сче­та за те­ле­фон на 200 фун­тов.

Вы, ве­ро­ят­но, ду­мае­те, что Raspberry Pi – ком­пь­ю­тер для обу­чения. А мо­жет быть, для вас это не бо­лее чем иг­руш­ка. В це­лом, и то, и дру­гое спра­вед­ли­во – он пре­крас­но под­хо­дит для обе­их этих це­лей. И обе мы се­го­дня ох­ва­тим: и по­ве­се­лим­ся, и по­учим­ся. Но за­од­но и до­ка­жем, что RPi спо­со­бен и на дру­гую роль: (очень) ма­ло­мощ­но­го сер­ве­ра. Боль­шин­ст­во этих тех­но­ло­гий бу­дут ра­бо­тать на лю­бом ком­пь­ю­те­ре, под­клю­чен­ном к Ин­тернету, и вы смо­же­те их при­менить, да­же ес­ли у вас еще нет Pi.

В этой ста­тье мы уста­но­вим сер­вер IRC – клас­си­че­­ское при­ло­жение со скром­ны­ми сис­тем­ны­ми тре­бо­вания­ми, ко­то­рое по­зво­лит дру­гим под­клю­чить­ся к ва­ше­му Raspberry Pi, что­бы по­об­щать­ся, и по­лу­чим мас­су до­полнитель­ных ин­ст­ру­мен­тов в при­да­чу: от управ­ления ка­на­лом, ником и па­мят­ка­ми до ис­кусных бо­тов, ко­то­рые бу­дут си­деть на сер­ве­ре, под­дер­жи­вая ка­на­лы ак­тив­ны­ми, обу­ча­ясь (в неко­то­ром смыс­ле) и го­во­ря че­пу­ху по­се­ти­те­лям.

На­чи­на­ем

Для на­ше­го уро­ка со­ве­ту­ем восполь­зо­вать­ся све­жеуста­нов­лен­ным (еще без дополнений) Raspbian, вер­си­ей Debian для RPi. Мы вы­бра­ли его пре­ж­де все­го по­то­му, что необ­хо­ди­мые нам про­грам­мы уже про­тес­ти­ро­ва­ны в Debian для дру­гих ARM-плат­форм, та­ких как Squeezebox, по­это­му не бу­дет про­блем с со­вмес­ти­мо­стью. Об­раз дис­ка Wheezy мож­но ска­чать с офи­ци­аль­но­го сай­та Raspberry Pi (www.raspberrypi.org/downloads) или взять с DVD это­го но­ме­ра. Его уста­нов­ка опи­сы­ва­лась в пре­ды­ду­щих стать­ях о Raspberry Pi – об­ра­щай­тесь к ним за бо­лее под­роб­ны­ми объ­яснения­ми. Вкрат­це, вам нуж­но за­пи­сать об­раз дис­ка на SD-кар­ту ути­ли­той dd или уста­нов­щи­ком ARM Fedora (он ра­бо­та­ет с лю­бы­ми об­раз­ами дис­ков). Обя­за­тель­но из­мените раз­ме­ры раз­де­лов на сво­ей кар­те, что­бы ис­поль­зо­вать все доступ­ное ме­сто.

Так как для за­пуска сер­ве­ра IRC нам не по­на­до­бит­ся LXDE или дру­гой гра­фи­че­­ский ин­тер­фейс, для на­ча­ла сто­ит убе­дить­ся, что сер­вер мо­жет ра­бо­тать «всле­пую», т. е. без монито­ра и уст­ройств вво­да. По умол­чанию SSH и сеть в Raspbian бу­дут за­пу­ще­ны, ес­ли вы не от­клю­чи­ли их ранее, а IP-ад­рес Raspberry Pi вы уз­наете от мар­шру­ти­за­то­ра. В этом слу­чае пе­ред пе­ре­хо­дом к сле­дую­ще­му ша­гу нуж­но оста­вить все пор­ты (кро­ме се­те­во­го и, естественно, входа пи­тания) пусты­ми.

Ес­ли IP-ад­рес уз­нать не уда­ет­ся, под­клю­чи­те монитор и кла­виа­ту­ру для пер­вич­ной на­строй­ки. Когда сис­те­ма за­гру­зит­ся, зай­ди­те в сис­те­му с обыч­ным ло­ги­ном и па­ро­лем (поль­зо­ва­тель pi, па­роль raspberry), вый­ди­те из про­грам­мы пер­во­на­чаль­ной на­строй­ки, ес­ли она от­кры­лась, за­тем по­про­буй­те по­пин­го­вать ка­кой-нибудь сайт в Ин­тернете для про­вер­ки, что сеть ак­тив­на. По­сле это­го, что­бы уз­нать локаль­ный ад­рес RPi, на­бе­ри­те ip addr в обо­лоч­ке Raspberry Pi. Ад­рес за­пи­ши­те: он по­на­до­бит­ся на сле­дую­щем эта­пе.

На­строй­ка

На лю­бом под­хо­дя­щем ком­пь­ю­те­ре с лю­бой ОС от­крой­те тер­ми­нал. В Windows кли­ен­та SSH по умол­чанию нет, по­это­му ска­чай­те PuTTY с сай­та www.chiark.greenend.org.uk/~sgtatham/putty и восполь­зуй­тесь им. Под­клю­чи­тесь с поль­зо­ва­те­лем pi на за­пи­сан­ный ва­ми локаль­ный IP-ад­рес – на­при­мер, ко­ман­дой ssh pi@192.168.1.100 или с по­мо­щью PuTTY, ука­зав ад­рес, про­то­кол SSH и порт 22.

Ес­ли у вас спро­сят па­роль, значит, со­единение уста­но­ви­лось. С это­го мо­мен­та Raspberry Pi дол­жен ра­бо­тать по­сто­ян­но; в слу­чае час­тых пе­ре­за­гру­зок его ад­рес мо­жет ме­нять­ся, тогда за­дай­те ста­ти­че­­ский IP-ад­рес – в чем вам по­мо­жет ру­ко­во­дство на http://elinux.org/RPi_Setting_up_a_static_IP_in_Debian.

Ус­та­нов­ка

Зай­ди­те в RPi с обыч­ны­ми ло­ги­ном и па­ро­лем, за­тем при­сту­пи­те к уста­нов­ке необ­хо­ди­мых па­ке­тов. За­пусти­те ко­ман­ду:

sudo apt-get update

для об­нов­ле­ния па­ке­тов до по­след­них вер­сий, за­тем вы­пол­ни­те ко­ман­ду:

sudo apt-get install ircd-hybrid

для уста­нов­ки по­следней вер­сии ARM-со­вмес­ти­мо­го сер­ве­ра Hybrid IRC. При уста­нов­ке бу­дет соз­дан но­вый поль­зо­ва­тель – irc – с ог­раничен­ны­ми пра­ва­ми, и за­тем от его имени бу­дет за­пу­щен сер­вер. Это са­мый про­стой сер­вер IRC из тех, что нам по­па­да­лись; конеч­но, есть и дру­гие, на­при­мер, inspircd, ratbox, dancer и rage, но ни один из них не раз­вер­нуть так бы­ст­ро. Про­верь­те ра­бо­ту сер­ве­ра: уста­но­ви­те па­кет irssi (кли­ент IRC для командной строки), за­пусти­те про­грам­му и на­бе­ри­те /join 127.0.0.1 для под­клю­чения к сер­ве­ру IRC на Raspberry Pi. На­бе­ри­те /exit для воз­вра­та в терминал.

Сле­дую­щий этап дол­гий и нуд­ный, и мы не по­мо­жем вам его со­кра­тить. На­до от­крыть файл на­строй­ки Hybrid и за­полнить его всей необ­хо­ди­мой ин­фор­ма­ци­ей о ва­шей се­ти. Во-пер­вых, по неиз­вест­ной при­чине фай­лы на­строй­ки Hybrid на­хо­дят­ся в ка­та­ло­ге, доступ к ко­то­ро­му по умол­чанию за­пре­щен, и нуж­но вы­полнить ко­ман­ду

sudo chmod 755 /etc/ircd-hybrid/

чтобы открыть доступ. Затем скомандуйте

sudo nano /etc/ircd-hybrid/ircd.conf

для от­кры­тия фай­ла (или от­крой­те его в дру­гом ре­дак­то­ре); все па­ра­мет­ры, ко­то­рые нуж­но за­дать, снаб­же­ны под­роб­ны­ми ком­мен­та­рия­ми, и про­блем быть не долж­но. Обя­за­тель­но про­чти­те все, так как в фай­ле есть стро­ка, ко­то­рую нуж­но рас­ком­мен­ти­ро­вать пе­ред за­пуском сер­ве­ра.

Об­ра­ти­те осо­бое внимание на раз­дел Operator – в нем за­да­ют­ся лю­ди с ре­аль­ной вла­стью на сер­ве­ре. В иде­аль­ном слу­чае это, конеч­но, исключительно вы. Со­храните файл на­строй­ки, вый­ди­те из него и вы­полните ко­ман­ду:

mkpasswd <your intended pass>

что­бы сгенери­ро­вать за­шиф­ро­ван­ный па­роль. Вернитесь в кон­фи­гу­ра­ци­он­ный файл и най­ди­те раз­дел Operator. Из­мените стро­ку user на user = “*@127.0.0.1 – это оз­на­ча­ет, что толь­ко во­шед­ший на сер­вер с это­го локаль­но­го ком­пь­ю­те­ра мо­жет по­лу­чить пра­ва на­стоя­ще­го опе­ра­то­ра. Соз­дан­ный за­шиф­ро­ван­ный па­роль вставь­те в по­ле password.

Сер­ви­сы

Те­перь по­ра уста­но­вить па­кет services. К со­жа­лению, в Wheezy нет под­держ­ки hybserv, сер­вис­но­го движ­ка ircd-hybrid по умол­чанию. В про­цес­се на­пи­сания ста­тьи мы не раз пы­та­лись ском­пи­ли­ро­вать его из ис­ходников, но на­прас­но, и вме­сто это­го об­ра­ти­лись к сто­роннему ком­понен­ту сер­ви­сов: Anope. Его то­же при­дет­ся ком­пи­ли­ро­вать из ис­ходников, но он по крайней ме­ре ра­бо­та­ет.

Для на­ча­ла соз­да­дим све­жий под­ка­та­лог, на­при­мер, anope, в до­машнем ка­та­ло­ге и за­гру­зим в него ар­хив Anope ко­ман­дой

wget http://sourceforge.net/projects/anope/files/anope-stable/Anope%201.8.7/anope-1.8.7.tar.gz.

Рас­па­ку­ем его ко­ман­дой

tar xvfz anope-1.8.7.tar.gz

и пе­рей­дем в соз­дан­ный ка­та­лог. В Anope есть скрипт на­строй­ки. На­бе­ри­те ./Config для его за­пуска и внима­тель­но рас­смот­ри­те па­ра­мет­ры. Во­об­ще-то есть все шан­сы, что по­дой­дут и па­ра­мет­ры по умол­чанию, но сто­ит убе­дить­ся, что зна­чения вер­ны для вашей сис­те­мы. По за­вер­шении ра­бо­ты скрип­та на­бе­ри­те make и отойдите завари­ть себе ча­шеч­ку чая. Когда ко­ман­да за­кон­чит ра­бо­ту, вы­полните

sudo make install

По­ра сно­ва из­менить файл на­строй­ки. При же­лании мож­но мно­го че­го по­ме­нять, но, что­бы Anope за­ра­бо­тал, доста­точ­но из­менить все­го несколь­ко па­ра­мет­ров. На­бе­ри­те cd ~/services для пе­ре­хо­да в install, уста­но­воч­ный ка­та­лог Anope, и ско­ман­дуй­те

nano example.conf

– от­кро­ет­ся при­мер фай­ла на­строй­ки. Про­кру­ти­те его со­дер­жи­мое и рас­ком­мен­ти­руй­те па­ра­метр IRCDModule, уста­но­вив его в ‘hybrid’, что­бы Anope знал, с ка­ким сер­ве­ром IRC ему при­дет­ся взаи­мо­дей­ст­во­вать. За­дай­те на­деж­ный па­роль в раз­де­ле Remote Server и за­помните его, по­то­му что он при­го­дит­ся вам в фи­наль­ной на­строй­ке Hybrid. За­дай­те имя се­ти и циф­ры, за­дан­ные при уста­нов­ке Hybrid, за­тем ука­жи­те имя опе­ра­то­ра-ад­минист­ра­то­ра в по­ле ServicesRoot. Со­храните файл с именем services.conf. Те­перь зай­ди­те на сайт www.anope.org/ilm.php?p=lm и за­полните фор­му. Она вы­даст текст, ко­то­рый мож­но вста­вить в /etc/ircd-hybrid/ircd.conf, что­бы Hybrid знал все необ­хо­ди­мое об Anope. На­конец, вы­полните ко­ман­ду


~/services/services

что­бы за­пус­тить Anope, и ко­ман­ду

sudo /etc/init.d/ircd-hybrid restart

для пе­ре­за­пус­ка Hybrid с но­вы­ми на­строй­ка­ми.

Egg’оизмы

Сер­ви­сы за­пу­ще­ны, и мы мо­жем со­сре­до­то­чить­ся на за­пуске од­но­го-двух бо­тов с Eggdrop. Скрип­ты для этой утилиты на­пи­са­ны на TCL, а в Raspbian он по умол­чанию не уста­нов­лен. Сде­лать это мож­но, за­пустив ко­ман­ды sudo apt-get install tcl8.4 и install tcl-dev8.4. Убе­ди­тесь, что уста­нав­ли­вае­те вер­сию 8.4: по умол­чанию уста­но­вит­ся 8.5, а она не ла­дит с Eggdrop. Еще од­на вещь, ко­то­рая нуж­на Eggdrop и ко­то­рую оста­лось уста­но­вить – telnet. Ус­та­но­ви­те его ко­ман­дой apt-get. Eggdrop так­же уста­нав­ли­ва­ет­ся из ис­ход­ных ко­дов; за­гру­зи­те ар­хив ко­ман­дой

wget ftp://ftp.eggheads.org/pub/eggdrop/source/1.6/eggdrop1.6.9.tar.gz

за­тем рас­па­куй­те его ко­ман­дой

tar xvzf eggdrop1.6.9.tar.gz

Пе­рей­ди­те в соз­дан­ный ка­та­лог и ско­ман­дуй­те ./configure, что­бы под­го­то­вить уста­нов­ку Eggdrop для Raspberry Pi.

За­тем мы с ва­ми обой­дем некий ка­мень пре­ткно­вения. В ис­ход­ном ко­де Eggdrop есть до­сад­ная ошиб­ка, из-за ко­то­рой ко­ман­да make за­вер­ша­ет­ся неудач­но. В ре­дак­то­ре nano от­крой­те файл src/md5/md5c.c, най­ди­те стро­ку 208 и за­мените ее на сле­дую­щую:

data = ((unsigned char *)data) + free;

вклю­чая точ­ку с за­пя­той в кон­це – за­тем со­храните файл и вернитесь в основ­ной ка­та­лог Eggdrop. Те­перь все долж­но быть го­то­во; за­пусти­те make config, за­тем make clean, за­тем make и, на­конец, make install, что­бы за­вер­шить уста­нов­ку Eggdrop. За­тем – как буд­то бы­ло ма­ло пре­ды­ду­ще­го «за­тем» – ис­пра­вим еще од­ну ошиб­очку в libc, вы­полнив ко­ман­ду

export MALLOC_CHECK_=4

что­бы под­го­то­вить сис­те­му. От­крой­те файл eggdrop.simple.conf в nano и про­бе­ги­тесь по нему, за­да­вая па­ра­мет­ры по сво­ему усмот­рению. Сер­вер, к ко­то­ро­му мы под­клю­ча­ем­ся – 127.0.0.1, так как сер­вер на­хо­дит­ся на том же локаль­ном ком­пь­ю­те­ре; ес­ли вы хо­ти­те вы­пустить бо­та Eggdrop во внешний мир (но помните, что та­кие бо­ты не по­ощ­ря­ют­ся в боль­шин­ст­ве се­тей, по­то­му что бы­ва­ют на ред­кость на­до­ед­ны­ми) или за­пустить Eggdrop на дру­гом ком­пь­ю­те­ре, здесь мож­но ука­зать лю­бой IRC-сер­вер. Убе­ди­тесь, что внима­тель­но про­смот­ре­ли файл на­строй­ки – как с Hybrid; здесь есть од­на стро­ка, ко­то­рую нуж­но уда­лить, что­бы все за­ра­бо­та­ло.


За­пуск бо­та

Со­хра­ни­те файл на­строй­ки и вы­зо­ви­те Eggdrop ко­ман­дой

./eggdrop -m eggdrop.simple.config

Она за­пуска­ет локаль­ный сер­вер telnet на пор­ту 3333, к ко­то­ро­му мож­но под­клю­чить­ся для дальней­шей на­строй­ки бо­та, хо­тя мы со­сре­до­то­чим­ся на ад­минист­ри­ро­вании бо­та че­рез пря­мое IRC-под­клю­чение. Она так­же под­клю­ча­ет бо­та к ка­на­лу, ука­зан­но­му в фай­ле на­строй­ки. За­пусти­те IRC-кли­ент irssi, под­клю­чи­тесь к сер­ве­ру 127.0.0.1, зай­ди­те в ранее ука­зан­ный ка­нал и от­правь­те со­об­щение сво­ему бо­ту ко­ман­дой

/msg <botname> hello

При пер­вом за­пуске бо­та вы оп­ре­де­ли­тесь как его вла­де­лец, и бот бу­дет от­ве­чать вам. Пе­ре­клю­чи­тесь на дру­гую панель в irssi, на­жав Alt + но­мер панели, где бу­дет по­ка­зан дру­же­люб­ный от­вет бо­та. Сде­лай­те то, что он ве­лит – то есть за­дай­те свой па­роль – и вы смо­же­те под­клю­чить­ся к вы­де­лен­но­му ка­на­лу бо­та на­пря­мую, на­брав

/dcc chat <bot name>

Но вот бе­да: на дан­ный мо­мент он не де­ла­ет ниче­го осо­бен­ного, про­сто кра­су­ет­ся в ка­на­ле. Пре­лесть Eggdrop – в рас­ши­ряе­мо­сти скрип­та­ми на TCL, и та­ко­вых уй­ма в Ин­тернете. Один из на­ших лю­би­мых – egg-fu; это реа­ли­за­ция очень про­сто­го скрип­та ис­кусст­вен­но­го ин­тел­лек­та. Ка­ж­дое ут­вер­ждение до­бав­ля­ет­ся в его вир­ту­аль­ный мозг, по­это­му стро­ка вро­де «LXF ве­ли­ко­ле­пен» свя­жет свой­ст­во «ве­ли­ко­ле­пен» с объ­ек­том «LXF». По­сле­дую­щее ут­вер­ждение «LXF – жур­нал» до­ба­вит в спи­сок свойств «жур­нал», и у бо­та бу­дет несколь­ко ва­ри­ан­тов ком­мен­та­рия, когда объ­ект всплы­вет в раз­го­во­ре.

Ус­та­но­ви­те его, зай­дя в ~/eggdrop/scripts/ и за­гру­зив файл ко­ман­дой

wget http://sourceforge.net/projects/egg-fu/files/egg-fu/2.0.11/egg-fu_2.0.11.zip

и за­тем рас­па­ко­вав ко­ман­дой

unzip egg-fu_2.0.11.zip

От­крой­те соз­дан­ный ра­нее файл на­строй­ки Eggdrop, про­кру­ти­те его до кон­ца и до­бавь­те стро­ку

source scripts/egg-fu_2.0.11.tcl

Бла­го­да­ря ей при сле­дую­щем за­пуске Eggdrop за­гру­зит скрипт egg-fu. Но это еще не все – мы об­на­ру­жи­ли, что egg-fu вы­да­ет ошиб­ки, ес­ли не про­пи­сать пол­ные пу­ти в его фай­ле на­строй­ки и пол­ный путь в верхней час­ти са­мо­го скрип­та, по­это­му, пре­ж­де чем дви­гать­ся даль­ше, позаботьтесь об этом. По­том пе­ре­за­пусти­те бо­та. От­крой­те irssi, начните се­анс ча­та DCC с бо­том и от­правь­те ему ко­ман­ду .die по вы­де­лен­но­му ка­на­лу свя­зи, что­бы вы­клю­чить его. Те­перь сно­ва за­пусти­те бо­та, на сей раз сбросив флаг -m, так как при по­сле­дую­щих за­пусках этот флаг уже ни к че­му. Вернитесь в irssi, зай­ди­те в ка­нал бо­та и по­бе­се­дуй­те с ним. Воз­мож­но, не сра­зу, но в кон­це кон­цов он начнет под­хва­ты­вать ва­ши вы­ра­жения и от­ве­чать вполне ес­те­ст­вен­но.

Чем дальше, тем смеш­нее

Дальней­шее раз­ви­тие бо­та за­ви­сит от вас. Мы очень по­за­ба­ви­лись, за­пустив сра­зу двух бо­тов с ис­кусст­вен­ным ин­тел­лек­том (для это­го мы уста­но­ви­ли дру­гую вер­сию egg-fu в дру­гой ка­та­лог и соз­да­ли от­дель­ный файл на­строй­ки для Eggdrop, ука­зы­ваю­щий на дру­гой ка­та­лог). Да, бо­ты пе­ренима­ют друг от дру­га пол­ную ерунду, но вре­мя от вре­мени за­хо­дить на ка­нал и смот­реть, ка­кой сте­пени бе­зу­мия они достиг­ли – неве­ро­ят­ное удо­воль­ст­вие!

Ес­ли ваш сер­вер бу­дет пуб­лич­ным, воз­мож­но, вы за­хо­ти­те уста­но­вить и дру­гих бо­тов. Бо­ты, спо­соб­ные вы­пол­нять раз­лич­ные дей­ст­вия от управ­ления ка­на­ла­ми до про­стых игр, име­ют­ся на www.egghelp.org/tcl.htm. Конеч­но, пуб­лич­ный сер­вер тре­бу­ет до­ба­воч­ной на­строй­ки: убе­ди­тесь, что все па­ро­ли на­деж­ны; за­пускай­те все от имени поль­зо­ва­те­ля с ог­раничен­ны­ми пра­ва­ми, пе­ре­на­правь­те пор­ты Raspberry Pi на мар­шру­ти­за­то­ре и, по­жа­луй, под­клю­чи­тесь к сер­ви­су ди­на­ми­че­­ско­­го DNS, ти­па www.dyndns.com, что­бы по­се­ти­те­ли всегда мог­ли най­ти сер­вер, да­же ес­ли ваш до­машний IP-ад­рес из­менит­ся. И, на­конец, помните: ес­ли мозг ва­ше­го бо­та слиш­ком раз­бухнет, то Raspberry Pi, у ко­то­ро­го, ра­зу­ме­ет­ся, не са­мая мощ­ная ар­хи­тек­ту­ра, за­виснет, по­ка бу­дет ду­мать, что бы ему та­ко­го от­ве­тить. Что­бы сер­вер ра­бо­тал плав­но, мы ог­раничи­ли ре­сур­сы про­цес­со­ра, доступ­ные ка­ж­до­му про­цес­су Eggdrop. С по­мо­щью apt-get уста­но­ви­те cpulimit, за­тем за­пусти­те Eggdrop с пре­фик­сом cpulimit --limit 40 (на­при­мер), что­бы он ис­поль­зо­вал не бо­лее 40 % доступ­ных цик­лов про­цес­со­ра RPi. Это за­мед­ля­ет бо­та, но под­дер­жи­ва­ет жизнь сер­ве­ра.

К то­му же, «мозг» бо­та хранит­ся в обыч­ном тек­сто­вом фай­ле, а зна­чит, ту­да лег­ко за­лезть и достать несколь­ко фраз. Ес­ли у ва­ших сра­жаю­щих­ся бо­тов раз­ви­лась одер­жи­мость Джеф­фом Гол­дб­лю­мом [аме­ри­кан­ский ак­тер, – прим. пер.], как у на­ших, сде­лай­те это обя­за­тель­но. Вы раньше зна­ли, что Джефф Голд­б­люм «на­вер­ное, пьян» или «ком­пь­ю­тер­ная про­грам­ма», а так­же что «Ро­бо­коп – это не Джефф Гол­дб­люм и, на­вер­ное, че­ло­век, и, зна­чит, я знаю, что Ро­бо­коп – это исследование но­ги»? Нет? Ну вот, а те­перь знае­те. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика