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

Ruby е първият език за програмиране, който дойде при нас от Страната на изгряващото слънце. Известно време той беше широко известен само в Япония, тъй като цялата документация по него не беше преведена на английски, но веднага щом започнаха да го превеждат и публикуват, Ruby се интересува от цял ​​свят, а през 1998 г. форумът „приказки за рубини“.

Създателят на езика Юкихиро Мацумото (или "Мац") беше недоволен от съществуващия по това време скриптови езици... Според него "Perl 4 не беше достатъчно мощен и Python не беше достатъчно обектно-ориентиран." Имаше нужда от перфектния език за задачите си. Затова той взе най-доброто от други езици, създавайки нов, в който добави всичко, което смята за необходимо и правилно, и премахна излишното. Избирайки имена за своето творение, Мацумото искаше то да бъде донякъде подобно на Perl, много идеи от който преминаха към Ruby. Той е имал избор между Корал и Руби, а някои източници твърдят, че окончателното име е избрано благодарение на хороскопа.

Ruby съществува от почти 20 години и се развива активно, с подкрепата на общността на програмирането и нейните фенове, както и на самия Мац.

Рубиновата философия

Мацумото учи програмиране, докато все още е студент, но идеята за създаване на собствен език му хрумва едва няколко години по-късно. Той искаше да създаде "истински" OOP език, който да има прост и разбираем синтаксис и можем спокойно да кажем, че успя. За разлика от езиците, които разчитат на скоростта на машинно изпълнение на програма, Matz разработи Ruby, за да улесни нещата за хората. Дори като жертвате малко компютърни ресурси.

Ruby използва така наречения принцип на „най-малко изненада“. Това означава, че програмата ще се държи според очакванията на енкодера. Мац използва тази концепция само за собствено удобство, но с нарастването на популярността на езика той научи, че други програмисти мислят по същия начин. Това несъмнено беше приятна изненада за него.

Ruby се придържа към концепцията на Smalltalk за третиране на всеки тип данни като обект, което означава, че могат да му бъдат присвоени методи и обектни променливи. Това е неговата изгодна разлика от езици като, например, C ++.

Заслужава да се отбележи и гъвкавостта на езика. Например, можете да замените операцията за събиране и да използвате нотацията, която е по-удобна за вас. Например, определете, че добавянето на числа ще работи, когато въведете думата плюс (1 плюс 2), а не знака (1 + 2). Тоест вие не се приспособявате към езика, а напротив, той се приспособява към вас. Това ви дава огромна свобода по отношение на самоизразяването, тъй като можете да замените оператори, методи и т.н. Не забравяйте обаче, че с много свобода идва и голяма отговорност (с други думи, не се бъркайте какво, къде и как сте преименували).

Къде се използва Ruby

Системата за проследяване на грешки Redmine е написана в Ruby, редактор за вектор Inkscape графика... Също така третата версия на Metasploit (изследователски проект информационна сигурност) е напълно пренаписан в Ruby. Ruby се използва в много големи организации като NASA, Motorola и др.

Ruby придоби най-голяма популярност благодарение на Ruby on Rails, издаден през 2004 г. Rails е бил използван за създаване на такива гиганти като Twitter, GitHub, Kickstarter, Diaspora и др. Много е приятно и удобно да пишете уебсайтове на него. Например, за бази данни можете да използвате интерфейса за заявка за активен запис, който ви позволява да извличате данни без използвайки SQLзаявки (които много разработчици харесват много).

Сега за Ruby, или по-скоро за Ruby on Ralis, славата на езика за стартиращи фирми е утвърдена. На Rails е доста лесно да се реализират проекти за кратко време, които се отличават с оригиналност и ефективност и надхвърлят шаблонните целеви страници и онлайн магазините. Разбира се, с нарастването на натоварването на сайта и промяната на изискванията, някои проекти се пренаписват на други езици, които отчитат определени специфики и са по-подходящи за някои случаи (например Java или Scala). Въпреки това, Ruby и Rails продължават да се развиват, така че скоро може да не е необходима миграция.

Трудността при изучаването на Ruby

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

Освен това трябва да се отбележи, че свободните места за програмиране в чист Ruby са рядкост. 90 процента от тях най-вероятно ще бъдат за Ruby on Rails. RoR програмистите са сред най-търсените в ИТ индустрията днес. Към високата заплата трябва да се добави висок статус на принадлежност към елита и завист от страна на други програмисти, например php-специалисти, които пишат уебсайтове за визитки за 100 рубли.

Плюсове / минуси на Ruby

Ruby е обичан за:

  • ООП в стил Smalltalk;
  • подкрепа от общността (общност от програмисти);
  • прост и удобен синтаксис;
  • голяма заплата;
  • подкрепа за най-новите обещаващи подходи за програмиране;
  • голям брой готови решения.

Недостатъците на Ruby включват:

  • лоша поддръжка за Windows. Тъй като Ruby е разработен основно за Linux, ще бъде по-трудно да се работи с IDE, да се инсталират допълнителни библиотеки и т.н. в система, която не е подобна на Unix.
  • няма свободни места, ако не е Ruby on Rails;
  • малко документация на руски език;
  • консумация на памет.

Свързани технологии

Ruby on Rails- рамка за работа в мрежата. Създаден е от екип от програмисти, ръководен от Дейвид Х. Ханссън през 2004 г., и по-късно е значително подобрен с усилията на общността на разработчиците.

RubyGems - пакетен мениджърза Ruby, опростяване на инсталацията допълнителни библиотеки(скъпоценни камъни).

MacRuby- езикова реализация, която е предназначена за работа Mac система OS X. Това ще ви улесни при писането на приложение за Mac.
mruby е подобрена реализация, върху която в момента се работи от самия Юкихиро Мацумото.

  • Превод

аз трябва да знам Рубисравнително наскоро, благодарение на прекрасната рамка Ruby on Rails... Не се смятам за експерт по Ruby, но прочетох PickAxe, написах няколко помощни програми за Ruby за моя собствена употреба, а също и разработвах в Rails в свободното си време.

Ruby е основният ми език в момента. Започнах с TurboPascalв училище, учил ° Си C ++в университета, написал дисертацията на Javaи аз също учих PHPот нулата, защото исках да се науча как да правя уеб сайтове бързо и лесно. Мисля, че писането на код е форма на забавление за мен и едва след това всичко останало. В началото мислех кой език да науча, Pythonили Руби. Избрах последното, защото не исках грешният отстъп да причинява неизправност на кода ми.

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

По-скромно е, непълен списъкпричини, които могат (или не) да ви мотивират да използвате Ruby или поне да играете с него. Внимание: ако използвате друг език за програмиране за работа или за други цели - не ми се оплаквайте, ако вече не искате да го използвате. Точно това ми се случи, но за мен не е толкова важно. Ruby е прекрасен и елегантен език и като много такива неща, той може да завладее ума ви и да разбие душата ви.

Накратко, предупредени сте.

Защо да научите Ruby?

1. Получавате всички удобства (удоволствие) без трикове.

Рубивзе назаем всичко най-добро от други езици за програмиране, от Общи приказкипреди Java, от Perlпреди Python... Тук основни възможностикоито по принцип можете да видите на други езици:
  • Изключения. Вярвате или не, изключенията са едно от най-важните неща в разработването на софтуер от всякакъв вид. Програмистите са включени PHP4, не знаят нищо за тях и ще ви кажат, че можете просто да отпечатате (грешки) на екрана или да използвате техния собствен "супер-дупер" клас за обработка на грешки. Късмет за всички ни Рубиидва с опитай да хванеш(или още по-добре започват / спасяват) блокове и набор от предварително дефинирани, разширяеми изключения за правилна обработкагрешки.
  • Пространства от имена: модули Рубинаправете използването на пространства от имена лесно, ентусиастите трябва да го харесат C ++и Java.
  • Вградени регулярни вярвания: за всички ценители Perl, можете да увиете нещо // и се превръща в регулярен израз, готов за сравнение (за това използваме оператора =~ ).
  • Претоварване на оператора: Рубиви позволява да дефинирате оператори като +, -, > , и т.н. за всеки от вашия клас.
  • Пакети: наречени " скъпоценни камъни”(Камъчета), те наистина отговарят на името си, освен това - работят. Пакетите поддържат зависимости и могат да бъдат както междуплатформени, така и специфични за платформата.
  • Интерактивна конзола: може да се използва за интерактивно тестване на код, подобно на конзола Python

2. Ще обичате малките неща.

Рубиграциозен. Защо? Защото той не се опитва да направи кода толкова лаконичен, че да пречи на четливостта и разбирането. Има няколко съвета, които могат да ви помогнат:
  • Можете да използвате и двата оператора, акои освен аков условни изрази. Разбира се, можете да използвате акос противоположното значение на израза, но използвайки освен акообикновено води до по-малко грешки. Освен това можете да използвате и двата оператора като условни модификатори, като ги поставите след израза, а не преди: order.new, освен ако order.exists
  • Можете да използвате въпросителни и удивителни знаци в края на името на метода. Това споразумениене се налага, а знакът „ ? „Използва се, когато методът се върне вярноили фалшиво, докато знакът " ! „Използва се за методи, които правят нещо необратимо, като изтриване на запис от база данни, разделяне последен знакот низ и др.
  • Можете да използвате псевдоними ( псевдоним) за вече създадени методи. По този начин можете да получите методите съществувати съществува, без режийни разходи и без повторения.
  • Можете да използвате директиви attr_reader, attr_writerили attr_accessorза автоматично създаване getter / seteerза членове на класа.
  • И още малко конвенция за именуване: с константи, класове и модули се пишат Главна буква, методите и членовете на класа трябва да започват с малка буква, глобалните променливи се именуват, започвайки с " $ ", имената на променливи на обекти започват с" @ ", И имена на променливи на клас с" @@ ", И така нататък.
  • Когато извиквате методи, не е необходимо да пишете скоби. Можете да напишете write File.open ("/ home / h3rald / test.txt") или просто File.open "/home/h3rald/test.txt", което е особено удобно с методи без аргументи.

3. Вече няма нужда да използвате точка и запетая.

Искате ли да напишете следната инструкция? Просто отидете на нова линия... щракнете върху " Въведете„И сте готови. V РубиКато в Python, нов ред разделя инструкциите, така че не е нужно да използвате точка и запетая през цялото време. За съжаление, това означава, че като фенове C ++, не можем да напишем програма в един ред. Но не е толкова лошо, нали?

4. Всичко е обект, както трябва да бъде.

Когато учех Java, казаха ми, че всичко е обект.
- "Че, 14 и 374346.678 - обекти?"
- "Не, глупако, това са числа!"

V Рубичисла, символи, булеви числа и всичко останало е обект. Сериозно. Това означава, че можете да пишете неща като това:
"ТРЯБВА ДА" ВИНАГИ ДА ИЗПОЛЗВАТЕ ГЛАВНИ ".lowcase # ще се върне" не трябва "винаги да използвате главни букви" вместо нещо подобно:
# PHP код
strtolower ("ТРЯБВА ДА" ВИНАГИ ИЗПОЛЗВАТЕ ГЛАВНИ ПИТАЛИ ")
Това ви спестява време, спестява скоби и така е по-логично.

5. Всичко има значение.

Или „вече не е необходимо да се използва връщанеза връщане на стойности". Бързо, това е така: всички инструкции в Ruby връщат стойност, дори присвояването на променливи, така че всъщност не е нужно да използвате ключова дума « връщане„В края на методите. Стойността на последното задание винаги ще се връща.

6. Можете да промените средата по всякакъв начин.

Първият път, когато видях това, бях впечатлен. Представи си типична ситуация: започнахте да използвате системен клас или клас, написан от някой друг и разбрахте, че имате нужда от такъв допълнителен методв него. Има няколко начина за решаване на този проблем в типичните езици за програмиране:
  • Вие променяте изходния код на класа, ако имате достъп до него. Но това обикновено е лоша идея, не го правете.
  • Вие наследявате класа си от това и добавяте към него нов метод... Обикновено това - добра идея... Но поради един метод може да се окаже донякъде монотонен. Освен това ще трябва да промените малко другия си код съответно.
  • Можете просто да създадете метод извън класа. Ще работи, но няма да е много елегантно и също е в противоречие с ООП.
V Рубиможете да добавите метод към оригиналния клас, без да редактирате изходните кодове. Това може да се направи дори за системния клас.
Искаме ли да добавим метод за преобразуване на метри в футове? Нека просто разширим класа Числова, както е показано:
клас Числов
деф. крака
самостоятелно * 3,2808399
край
край

Оттук нататък всички наши номера ще имат нов метод, който може да се използва като всеки друг:
5.feet # ще върне 16.4041995
Класове в Рубиникога не се затваря и може да бъде разширен по всяко време и отвсякъде. Естествено, тази възможност трябва да се използва с повишено внимание!

7.Не можете да вземете еднорози от птици и край, но получавате магарета, ако искате.

Ясно си спомням как беше моят учител C ++, използва животни, за да илюстрира основните концепции на обектно-ориентираното програмиране – класове и наследяване. Беше малко озадачаващо, когато тя ни обясни множественото наследяване, образувайки „пегас“ от „птици“ и „коне“. Луди неща Рубине позволява множествено наследяване. Изглежда като тенденция и в крайна сметка е въпрос на вкус. Не съм доволен от множественото наследяване, тъй като може да доведе до непредвидими неща. Въпреки това е възможно да се създаде нещо подобно с помощта на модули Рубитака че променливите и методите на един модул ще бъдат добавени към конкретен клас, ако модулът е включен в него.

8. XML е наистина ненужен.

XMLе красив, често използван език за маркиране, който може да се обработва от всички езици за програмиране и се използва навсякъде. За съжаление е твърде тромав за писане, труден за анализиране и, нека бъдем честни, труден за четене в повечето случаи. Но вижте следния фрагмент:
regexp:! ruby ​​/ regexp / a-zA-Z /
номер: 4.
низ: низ

Разбира се, че е по-лесно и по-лесно. XML, истина? Добре дошли да се отдадете YAMLлюбим (но не единствен) език за маркиране Руби, с помощта на който всеки обект може да бъде представен в проста, сбита, но завършена форма.
Ruby може да работи с XMLно простота YAMLподкупи много разработчици, които сега го използват вместо това XML, например за конфигурационни файлове (това беше направено в Релси). Представеният по-горе фрагмент е получен чрез изпълнение на следния кодов фрагмент:
("string" => "a niz", "number" => 4.7, "regexp" => /a-zA-Z/).to_yaml
Метод to_yaml, дефиниран за клас Обект, който е родител на всички други обекти и следователно е достъпен за всички обекти Руби... Това позволява обектите да бъдат преобразувани в YAMLи обратно, напълно прозрачен за разработчика. Готино, нали?

9.Ламбда е нещо повече от гръцка буква.

Рубивзе назаем малко магия от Lispи Perlв обекти и блокове Proc. Procе „блок от код, свързан с набор от локални променливи. Веднъж свързани, те могат да бъдат извикани в различни контексти и все още имат достъп до тези променливи." Нека разгледаме следното:
def gen_times (фактор)
върне Proc.new (| n | n * фактор)
край

Times3 = gen_times (3)
пъти5 = gen_times (5)

Times3.call (12) # => 36
times5.call (5) # => 25
times3.call (times5.call (4)) # => 60

Ключовата дума можеше да бъде ламбдавместо Прок.нов, това не се отразява на резултата. Може да изглежда познато на хората, които знаят Perlи Python(или Lisp). Това може да се направи дори на PHPно не много хора се възползват от тази възможност.
Освен това, в Рубиблокове от „несъздаденото Proc", Например, за да преглеждате съдържанието на обект и да изпълните някакъв код, като метода всекина разположение за клас масив:
.each (| c | поставя c * 2) # => ще върне всеки елемент, умножен по 2
Ако кодът не се побира на един ред, се препоръчва да се използва конструкцията направи... край, вместо да използвате скоби. Фенове Рубине обичам скоби.

10. Можете да използвате Rails.

Не на последно място... винаги можете да използвате Релсиза разработване на уеб приложения. Развитието няма да бъде толкова лесно, колкото с PHP, но Релсибяха записани в Рубизащото има функции, които не се срещат на други езици.

Заключение

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

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

Въведение

Днес търсачката е един от най-широко използваните методи за навигация в киберпространството, който се разраства и разширява всеки ден от своето съществуване. Ясно е, че алгоритмите за извличане на информация трябва постоянно да увеличават своята сложност и ефективност. Целта на тази работа не е да опише алгоритми за намиране на информация, а просто да даде въвеждащо описание за тях. Също така целта на тази работа е да напише уеб приложение за търсене на езика Ruby програмиране.

Като се има предвид горното, могат да се формират следните цели:

Запознаване с алгоритми за извличане на информация

Написване на приложение за търсене в мрежата

Целите се осъществяват с помощта на задачи:

Изследване на теорията за търсене

Изучаване на езика за програмиране Ruby

Запознаване с езика за маркиране на Haml

Въведение в метаезика Sass

Използване на Ruby, Haml и Sass за писане на код на уеб приложение

Отстранете грешките в полученото приложение

Теоретична част

Теория за извличане на информация

Първо трябва да дефинирате търсачка.

Система за търсене -софтуерно-хардуерен комплекс с уеб интерфейс, който дава възможност за търсене на информация в Интернет.

Според изпълняваните функции и задачите, които трябва да се решават, търсачките се класифицират на:

справката е най-често срещаният тип функция информационни системи, и се състои в предоставяне на абонатите на системата на възможност за получаване на инсталационни данни за определени класове обекти;

търсачките са най-разпространеният клас информационни системи. Като цяло, формата може да се счита за някои информационно пространство, посочено по отношение на информационно-логическото описание на предметната област);

изчислено. Функцията на системата е да обработва информацията в системата по определени изчислителни алгоритми за различни цели.

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

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

В документалните търсачки един елемент от информацията е документ, който не е разделен на по-малки елементи и информацията, когато е въведена, обикновено не е структурирана или е структурирана в ограничена форма... За въведения документ могат да се установят някои формализирани позиции – дата на производство, изпълнител, предмет. Някои видове документални информационни системи предвиждат установяване на логическа връзка между въведените документи – подчинение по семантично съдържание.

Геоинформационните данни са организирани като отделни информационни обектиобвързани с обща електронна топографска основа. Географски информационни системисе използват за информационна подкрепа в тези предметни области, структурата на информационните обекти и процеси, в които има географски компонент.

Съществува и следната класификация на търсачките (фиг. 1.)

Фиг. 1. Класификация на търсачките

Говорейки за търсачките, си струва да споменем теорията на заявките за търсене и тяхната класификация. Така през 1949 г. професор по филология от Харвард описва някои от характеристиките на извличането на информация.

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

Първият закон свързва честотата на появяване (възникване) на дадена дума с ранга на тази честота. На най-често срещаните думи се присвоява ранг, равно на едно... Тези думи, които са по-рядко срещани - ранг, равен на две и т.н. Ципф установи, че произведението на честотата на срещане на думата и нейния ранг е константа.

Тази зависимост обикновено се показва като хипербола. Значението на константата на Zipf е различно за различните езици, но в рамките на една езикова група остава непроменено. За руския език константата е приблизително 0,06-0,07.

Zipf установи, че честотата на срещане на думите и броят на думите, включени в текста с дадена честота, също са взаимосвързани.

От една страна, получената крива ще запази своите параметри за всички текстове в рамките на един език. От друга страна, независимо на какъв език е написан текстът, формата на Zipf кривата ще остане непроменена. Само коефициентите ще се различават.

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

Както и да е, всички заявка за търсенемогат да бъдат класифицирани според три характеристики: продължителност на заявката, яснота на заявката, етап на търсене.

И така, според дължината, всички заявки са разделени на

Една дума ("промоция")

Две думи (" промоция в търсачките»

Три думи („промоция на професионална търсачка“)

Подробно („промоцията на професионалната търсачка е евтина“)

По отношение на яснотата всички искания са разделени на:

Ясна заявка („цена за iPad 2“)

Размита заявка („Озон“, която може да бъде както газ, така и името на магазина и името на директора)

Според етапа на търсене всички заявки са разделени на:

Осъзнаване на проблема („сайтът не работи“)

Намиране на решение („хостинг сайтове“)

Избор на решение ("кой хостинг да избера")

Намиране на местоположението на транзакцията („хостинг тарифи masterhost“)

Езикът за програмиране RUBY

Рубин - динамичен, отразяващ, интерпретиран език на високо нивопрограмиране за бързо и лесно обектно-ориентирано програмиране. Езикът е независим от операционна системамногонишкова реализация, силно динамично въвеждане, събиране на боклук и много други функции. Ruby е близък по синтаксис до езиците Perl и Eiffel, в обектно-ориентиран подход към Smalltalk. Също така, някои характеристики на езика са взети от Python, Lisp, Dylan и Clu. Днес интерпретаторът Ruby е внедрен за почти всички платформи (Unix, Win32, OS X). Създателят на езика е Юкихиро Мацумото.

Ruby е напълно обектно-ориентиран език за програмиране. Всичко е обекти, а функциите са методи на тези обекти.

Основни характеристики на Ruby:

Преведен език:

Възможност за директни системни повиквания.

Мощна поддръжка за операции с низове и правила (регулярни изрази).

Незабавно проявление на промените по време на развитието.

Няма етап на компилация.

Лесно и бързо програмиране:

Не е нужно да декларирате променливи.

Променливите се въвеждат динамично.

Прост и последователен синтаксис.

Автоматично управление RAM.

Обектно-ориентирано програмиране:

Всичко е обект. Дори името на класа е екземпляр на класа Class.

Класове, методи, наследяване, полиморфизъм, капсулиране и т.н.

Самотни методи.

Миксини, използващи модули (способност за разширяване на клас без наследяване);

Итератори и затваряния.

Широки възможности за метапрограмиране.

Съоръжения:

Неограничен диапазон от цели числа.

Модел за обработка на изключения.

Всички оператори връщат стойности, дори и контролни структури.

Механизмът за улавяне на изключения.

Поддръжка за поточно предаване; както техните собствени, така и системи от семейството на UNIX.

недостатъци:

Неконтролируемост на някои процеси (като разпределяне на паметта), невъзможност за посочване на структури от данни на ниско ниво или подпрограми;

Невъзможността за компилация и съпътстващата оптимизация на програмата;

Отворен изходен код дори в завършена програма

Последствието от първите два недостатъка е много ниска скоростстартиране и изпълнение на програми.

Също така си струва да се отбележи, че за Ruby има много модули (добавки) за почти всякакъв вид задачи (интерфейси за програмиране, сложни математически изчисления, работа с аудио, видео, 3D и др.). Затова този език за програмиране беше избран като основен за писане на практическата част.

1.3. Опростен език за маркиране HAML

Haml е език за маркиране за олекотено генериране на XHTML. HAML се компилира в HTML. Haml е много по-прост от Html "" и ви позволява да опростите и ускорите писането на уеб приложения.

Например, тази част от кода на Haml "e

% html (html_attrs ("ru"))

% заглавие Моят блог

% meta (http-equiv = "Content-Type" content = "text / html; charset = utf-8")

Stylesheet_link_tag "main"

% h1 Моят блог

% h2 публикации

- @ entries.each do | запис |

% h3.title = запис.заглавие

% p.date = entry.posted.strftime ("% A,% B% d,% Y")

% p.body = запис.тяло

Всички права запазени © Иван

HTML-кодът се трансформира

Моят блог