Улыбайтесь и верьте в чудеса!

    Улыбайтесь!

    — Здрасьте! — заявила, задорно улыбаясь, девушка лет семнадцати–восемнадцати, подойдя ко мне на остановке. Следом приблизился молодой человек с удивлённо приподнятыми бровями и, кажется, слегка растерянно улыбаясь. Я вспомнил, что только что эти ребята стояли в нескольких метрах от меня, когда я пытался высмотреть, спускается ли с горки какой-нибудь подходящий мне автобус. Парень поздоровался вслед за спутницей.

    — Здравствуйте! — я тоже слегка растерялся, поскольку ещё не понимал, зачем именно ко мне подошли ребята.

    — А вы откуда? Вы иностранец? — продолжила девушка. Она явно была инициатором того, чтобы подойти ко мне.

    — Нет, я из России.

    — Ой. Вы улыбались, а ещё у вас синие волосы. Я подумала, что вы приехали из другой страны.

    — Из этой же самой. Из Петербурга.

    — А там много таких? Нельзя за это «отхватить»? — продолжил уже парень.

    — Некоторые люди там тоже красят волосы и радуются жизни, — на автомате ответил я, — сленг насилия меня немного напряг, но на лице юноши была всё та же слегка растерянная улыбка и я допустил, что это был не намёк или угроза, а всего лишь интерес, а значит можно расслабиться, — Думаю, что «отхватить», в принципе, можно везде, но я к этому не стремлюсь, поэтому сейчас вполне обходится, — с горки спускался пятьдесят девятый и я, заметив его, сделал последнюю затяжку, ликвидировал окурок в урну и стал двигаться в сторону подъезжающего автобуса.

    — Ой, а вам тоже на 59-й? — воодушевлённо спросила девушка. У разговора явно намечалось продолжение.

    — Да, — констатировал я и поспешил занять удобное место у открывающихся дверей подъехавшего автобуса.


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

    — А можно с вами ещё поговорить? — девушка была настроена довольно решительно.

    — Да, конечно, — улыбнулся я. Сидевшая рядом женщина засуетилась, и я выпустил её, подвинувшись к окошку. На освободившееся место сразу присела девушка.

    — Вы просто такой другой, — девушка испуганно замерла, вздёрнув брови почти до края чёлки, — ой, извините! — я не удержался и улыбка на моём лице расплылась ещё шире, девушка поняла, что меня не обидели её слова, — что очень хочется узнать, почему и как. Мы думали, что в России никто не улыбается на улице. А почему вы улыбались? Музыка хорошая наверное? — присев рядом она заметила наушники, торчащие из моих ушей. Молодой человек сел на соседнее сиденье через проход от нас.

    — Хорошая музыка, хорошее настроение. А ещё улыбаться приятно и полезно. Ведь улыбка — это не просто гримаса на лице, — как же всё таки вбиваются в мозг некоторые мысли и фразы, спасибо «Доктору» за эту, — Даже когда грустно, стоит улыбнуться, и ваш мозг через какое-то время решает, что всё хорошо — и всё действительно становится хорошо. А если всё хорошо, то ваша улыбка может подарить немного радости окружающим людям. Вот вы же сейчас тоже улыбаетесь, — лица обоих действительно улыбались уже вполне решительно и доброжелательно.

    — А говорят, что у русских менталитет такой, что никто не улыбается, — продолжила девушка.

    — Ещё и докопаться же могут: «чё лыбишься?» — и в драку полезут, — добавил юноша.

    — Надо, наверное, в Петербург ехать, там люди хорошие… — предположила она. Наверное, ребята — старшеклассники или студенты-первокурсники, раз их так занимают вопросы «куда ехать?» и «где хорошие люди?»

    — Да зачем куда-то обязательно ехать? То есть можно и ехать, конечно. Но люди хорошие есть везде. Вот, посмотрите, целый автобус прекрасных людей. Никто же не лезет в драку и не обижает вас или меня за то, что мы улыбаемся.

    — Ну прям философ! — прыснула юная особа, — А сколько вам лет?

    — 29.

    — Ого! 29 и волосы крашеные. А дети у вас есть?

    — Пока нет, но будут, наверное.

    «Время лечит» с улыбкой пояснила она, пересказав эту часть диалога своему спутнику — поскольку он сидел через проход от нас с ней, ему не всё было слышно в шумном салоне движущегося автобуса.


    — Ой, а как вас зовут? А то что-то мы набросились как какие-то журналисты и даже не представились, — интересно, это было её сознательной «признанием» или просто пролетевшей ассоциацией?

    — Алекс.

    — Я Юля, а это Кирилл, — указала она на товарища.

    — Приятно познакомиться.

    — А чем вы занимаетесь? — кажется, «признание» журналистами было без кавычек. Ну или оно позволило ей ещё больше вжиться в эту роль.

    — Я программист.

    — Ой, а правда не из другой страны? Синие волосы, улыбка на улице и программист. Как-то прям не верится.

    — Как я и говорил, всего лишь из Питера.

    — Там и родились?

    — Да.

    — Коренной, значит, — видимо, Юля до сих пор пыталась проассоциировать какие-то части моей внешней репрезентации или образ мышления с местом моего рождения и/или проживания. Стоило исправить это недоразумение.

    — Вроде того. Но я и тут, в Оренбурге, успел прожить 10 лет. И в других городах пожил. Покатался по пути, — я улыбнулся.


    На какое-то время повисла пауза, и я вспомнил о необходимости расплатиться за проезд — я постоянно путаю, платят ли в Оренбурге при входе или выходе из транспорта, помнил только что это, вроде, противоположно принятому в Петербурге. Но там я тоже постоянно забывал, когда именно нужно это делать, поэтому переспросил у попутчицы.

    — Ой, вы уже выходите на следующей? — заволновалась она, из чего я сделал вывод, что платят тут явно при выходе.

    — Нет, я еду до… Восхода, — я ехал без конкретной точки назначения, но ТЦ «Восход» — удобная координата для обозначения центра города, — просто каждый раз забываю, когда в Оренбурге принято оплачивать проезд — при входе или при выходе.

    — А, значит почти до нас, — прокомментировала девушка, отметив, что время ещё есть, — Скажите, вот вы программист, а что ещё вас интересует? Есть ещё какие-нибудь желания в жизни?

    — Конечно же есть! Если б не было никаких желаний, не было бы и жизни.

    — Точно философ! — рассмеялась девушка и пересказала очередную часть беседы своему спутнику.


    — А вы давно краситесь? — спросил на этот раз Кирилл, благо автобус как раз остановился и временно не шумел.

    — Около двух лет.

    — А как ваши родственники к этому относятся? — продолжил он.

    — Да нормально. Периодически удивляются новому цвету — я был и белым, и фиолетовым.

    — А, значит не всегда в… зелёный? — мда, антоцианин в моих волосах явно перешагнул очередной рубеж от ультрамарина через бирюзовый к зелёному.

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

    — Я думаю, если бы я покрасился, мои бы решили, что я «нетрадиционной ориентации».

    — Ну мои родственники уже знают, что я вполне традиционной ориентации — я люблю людей, — улыбнулся я в ответ и подумал: «конкретно сейчас, например, люблю каждого из вас, за то, что вы подняли мне настроение», — но вслух проговаривать не стал, помня, как много всего-чего-попало люди могут слышать за словами, однокоренными любви. Тем более, в городе, где за улыбку можно «отхватить». Ребята тем временем обменялись выразительными взглядами, обдумывая, видимо, формулировку моего ответа.


    — А ты что, тоже хочешь покраситься? — снова вступила в разговор Юля, обращаясь уже к своему спутнику.

    — Да.

    — В такой же бирюзовый, что ли? Или всё таки в аквамарин?

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

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

    — А сначала у вас был русый? — пока мы с Кириллом перекидывались фразами о покраске через проход, сидевшая рядом Юля успела рассмотреть уже прорастающие корни моего родного цвета.

    — Да, светло русый, такой же, как у вас обоих.

    — Понятно теперь, чего ждать от окрашивания, — заключила она, задумчиво глядя на своего спутника.

    Они продолжили беседу друг с другом о ком-то из их общих друзей, красивших волосы, и ещё о чём-то, а я отвлёкся, разглядывая в окно всё больше разрастающийся и блестящий ночными огнями Оренбург. Мы подъезжали к «Восходу». Я стал натягивать на плечи лежавший всю дорогу на коленях рюкзак, Юля увидев это, пропустила меня, слегка расстроенно потянув:

    — Ой, да, уже ва-аша <остановка>!

    — Да, мне пора. Было приятно с вами поболтать.

    Я выбрался в проход, и Кирилл протянул руку, чтобы попрощаться рукопожатием — довольно крепким. Я расплатился с водителем, а когда вернулся к двери, увидел что Юля заняла освобождённое мною место у окна, а Кирилл подсел рядом и секунду назад то ли чмокнул её в щёку, то ли сказал что-то ей на ухо, после чего повернулся ко мне. Теперь я смог рассмотреть их обоих сразу. Они были юны, красивы, оба смотрели на меня и дружелюбно улыбались. Мне вдруг захотелось, чтобы улыбки как можно дольше продержались на их лицах.

    — Хорошего вам вечера! — я широко улыбнулся, произнося это.

    — И вам!

    — Улыбайтесь и верьте в чудеса! — двери автобуса открылись и я вышел, уже не слыша, ответят ли мне что-нибудь. Я чувствовал себя юным, радостным, живым и немножко влюблённым.

    Меня зовут Алекс Семёнов

    Меня зовут Алекс Андреевич Семёнов

    Котики, зайки, подруги и друзья, делюсь с вами своей радостью! Сегодня (4 мая 2017) у меня был удивительно насыщенный день. Один из его результатов — нам с вами, возможно, придётся познакомиться заново. Со этого дня меня официально зовут Алекс Андреевич Семёнов. Последние три с лишним года я всегда и всем представлялся исключительно Алексом. А сегодня я получил в ЗАГСе свидетельство о перемене имени.

    Изменения могут показаться вам незначительными, но для меня они очень важны:

    1. Моё имя — Алекс. Алекс — это не Александр и не Алексей, это просто Алекс. Я сам выбрал это имя. Именно так я просил ко мне обращаться последние три с лишним года. Именно так представлялся.

    2. Моя фамилия — Семёнов. Теперь она, наконец, написана без ошибки — через букву «ё». Правило, что вместо «ё» можно писать «е» всегда казалось мне глупым и ошибочным. Это две разные буквы с разным произношением. Представьте себе, что в вашей фамилии взяли, например, букву «о» и стали писать вместо неё «ю» (ну, они же похожи! И там, и тут кружочек! и пусть все сами догадываются, как именно нужно произносить букву в каждом отдельном случае). В других странах ничего не знают о наших глупых правилах употребления одних букв вместо других. И было обидно, что люди ошибались, произнося мою фамилию неправильно, из-за того, что когда-то в ЗАГСе кто-то забыл поставить две точки над моей фамилией в свидетельстве о рождении.


    Возможно, у вас есть вопросы. Я попробую ответить на самые популярные за прошедшие три года:

    Алекс — это Александр или Алексей?

    Алекс — это Алекс. Именно так. Это имя простое и лаконичное. И я верю, что вам будет просто его запомнить.

    А у тебя что, прямо в паспорте так и написано: «Алекс»?

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

    Обновлено: да, в паспорте так и написано.

    Разве Алекс — это самостоятельное имя, а не уменьшительная форма от Александра или Алексея?

    Да, Алекс — это самостоятельное имя.

    А как можно по другому тебя называть, есть ли другие варианты, кроме Алекса, как Саша для Александра или Лёша для Алексея?

    Меня можно называть Алексом. Меня нельзя называть как-то иначе. Алекс — единственная возможная форма моего имени. Имя Алекс никак не изменяется. У имени Алекс нет уменьшительно-ласкательной формы. И всё это я считаю его огромным преимуществом перед старым именем.

    Можно ли называть тебя Сашей (Саней, Саньком, Шуриком и любыми другими производными от имени Александр)?

    Нет, меня нельзя называть чужими именами. Меня можно называть Алексом. Я уже пару лет не откликаюсь почти ни на какие формы имени Александр, поскольку сам представляюсь всем Алексом. То есть, увидев меня на улице, бесполезно кричать: «Саша!» — я вряд ли обращу внимание на это, ведь я — Алекс. Разве что, я узнаю ваш голос, но в этом случае я могу обернуться и вообще на любое другое имя, просто чтобы удостовериться, что угадал голос правильно.

    Можно лично я буду называть тебя Сашей (или любыми другими формами имени Александр), я же так привык(ла)?

    Мы можем договориться: тогда я в тоже выберу любое случайное имя, которым мне захочется вас называть, и которое, на мой взгляд, вам подходит больше, чем ваше собственное. Шутка! На самом деле, я предпочитаю обращение Алекс, о чём многократно говорил каждой и каждому из вас последние три года. Алекс, именно так. Это мой личный выбор. Конечно, если кто-то не знал о моей перемене имени, я расскажу об этом и постараюсь объяснить всё так же, как сейчас. Но повторные и многократные попытки называть меня чужим именем я восприму как оскорбительные и, скорее всего, предпочту не общаться с людьми, не уважающими мой выбор.


    Я постараюсь ответить и на другие вопросы, если ответа на них нет выше. Задавайте в комментариях.

    P.S. Спасибо вдохновившему меня Джону и Кайе, подарившей веру.

    Путь продуктивиста

    Манифест Майка Варди
    в переводе Алекса Семёнова

    Pedro Moura Pinheiro (CC BY-NC-SA 2.0)

    ^. Введение

    Я придумал термин «продуктивист», потому что без него никак. Так много людей называют себя экспертами в продуктивности, но являются ими единицы. Я не эксперт в продуктивности. Зато я продуктивист.

    Да, я говорил об этом раньше, но стоит повторить: продуктивист — не эксперт в продуктивности. Продуктивист — не гуру. Продуктивист — энтузиаст в области продуктивности.

    Он изучает продуктивность с помощью инструментов или привычек. Он копает глубже многих. Продуктивист видит мир иначе, как комик, например. Он похож на энтузиастов в других областях; он расширяет границы своего ремесла. Он любит исследовать новые процессы, идеи, новые способы достижения целей.

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

    Я назвал это Путём Продуктивиста, и будь вы продуктивист или нет, попробуйте найти свой клад на этом пути.

    1. Не боритесь с внутренними часами.

    Совы способны быть продуктивными так же, как жаворонки. Иногда они такие же непродуктивные. Но ваш организм знает лучше внешних сил и обстоятельств, когда вам лечь раньше или встать позже. Он знает, когда вы на пике активности, а когда нет. Слушайте организм и соглашайтесь с ним. Как только вы перестанете сражаться с внутренними часами, вы сможете планировать своё расписание: и рабочее время, и отдых, чтобы выжать максимум из вашей повседневной жизни.

    2. Пробейтесь через срочное, чтобы добраться до важного.

    Мы всегда куда-то спешим. Кто-то всегда ждёт от вас чего-то ещё со вчера. Так займитесь этим. Если вы будете работать над чем-то, зная, что важное дело ждёт своего часа, а неделание срочной задачи только отложит ваши дальнейшие планы, вы выполните эту работу. И если у вас получится достаточно часто работать над важными вещами, вы сможете качественнее работать над всем, в том числе и над срочными задачами.

    3. Не старайтесь работать производительнее. Будьте производительнее.

    Работа, чтобы работать — не цель. Иначе вы никогда не прекратите эту работу. Вы должны прекращать работать время от времени, чтобы просто жить. И если вы производительны — вы будете делать правильные вещи, а не что попало. Независимо от того, какое сейчас время.

    4. Не беритесь за что попало. Беритесь за нужные вещи.

    Это соответствует всей концепции — жить или работать. Осознанно выбирайте то, что поможет вам добиться ваших целей с наименьшим сопротивлением (внутренним или любым другим). Иначе вы обнаружите, что это дела выбирают вас, а не вы их. И это, зачастую, не те дела, что вам нужны.

    5. Установите пределы. 
Они помогут вам не захлебнуться.

    Вы не можете сделать все. Перестаньте даже пытаться. Мы не машины, мы — существа, которым жизненно необходимы не только достижения и отметки успеха. Не бойтесь отказываться от вещей, которые вам сейчас не к месту. Лучше закрыть дверь сейчас, чем оказаться у закрытых дверей позже, когда уже не хватит сил добраться до того, что за ними. (Примечание: Три действительно волшебное число. Не пытайтесь делать больше, чем 3 вещи сразу. Никогда.)

    6. Потратьте время, чтобы обустроить удобное пространство для себя, и оно подарит вам больше времени для вас самих.

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

    7. Иногда бумага — лучший из инструментов.

    Не стоит недооценивать её силу. Бумага — реальный фактор личной продуктивности. Вам не нужно специальных устройств, чтобы пользоваться ею, не нужно подключение к интернету и она невероятно удобная для использования. Бумага и ручка всегда с собой у продуктивиста, поскольку они могут пригодиться в любой момент. Берите бумагу на свой вкус, будь это блокнот с ручкой из ближайшего киоска, модный Молескин, или навороченный Pilot Hi-Tec C. Только убедитесь, что не забыли их дома.

    8. Со списками «Что сделать?» покончено — выполняя их вы останетесь ни с чем. Список «Сделать, чтобы»? Вот этот список стоит выполнить.

    Ставить галочки — это всего лишь ставить галочки. Вычёркивать — это просто вычёркивать. В конце концов, если вы не проделали всё описанное выше, то выполненные вами задачи такие же пустые, как квадраты, в которые вы ставили галочки. В конце концов, если вы не проделали всё описанное выше, то вы просто вычеркнули своё время так же, как и задачи в списке. Зачем вы делаете всё это? Почему именно вы — тот, кто этим занят? Почему это вообще нужно сделать? Это принципы списка «Сделать, чтобы». Этот список расскажет вам меньше о том, чем заняться сегодня, но будет более полным — поскольку построен на более глубоких целях. Составьте этот список сейчас. Не важно выполнять задачи. Важно выполнять свои задачи.

    9. Чтобы стать более продуктивным в будущем, нужно потратить время на настройку себя в настоящем.

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

    10. Будьте жадным к своему времени, это сделает вас более щедрым со временем.

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

    $. Вывод

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

    Спасибо за чтение.

    Оригинал: The Way of The Productivityist: A Manifesto, Mike Vardy

    Я-манифест

    Последние два года я всё чаще слышу, что следует использовать «я-высказывания» для упрощения коммуникации и снижения конфликтности ситуации. На мой субъективный взгляд, это — довольно успешный приём, применение которого действительно позволяет некоторым людям воспринимать информацию проще и приемлемее. Однако, с моей точки зрения, этот приём так же сильно усложняет жизнь и коммуникацию той стороны, которая хочет выразить свои чувства и эмоции, а так же вместо конкретной проблемы выделяет некую абстрактную проблему, которую собеседнику проще воспринять и/или проигнорировать.

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

    Я считаю, что «я-высказывания» не только усложняют коммуникацию, но и делают её более запутанной, более некомфортной для меня, желающего выразить собственное мнение, более сложной для восприятия моим собеседником (потому что вместо конкретной эмоции мне приходится превращать её в нечто абстрактное, удобное и комфортное для восприятия).

    Отныне и до тех пор, пока я прямо не заявлю иное, я заявляю, что:

    • всё, произносимое мною, является выражением моего личного субъективного мнения, основанного на моём личном опыте и моих личных эмоциях;

    • всё, что я произношу вслух, пишу в личной переписке или доношу иными способами передачи информации, является исключительно моим личным субъективным мнением;

    • в случае необходимости высказаться от лица некоей группы (будь то группа людей, находящихся рядом и участвующих в беседе, или организации, представителем которой я являюсь, или более общей группы, включающей в себя некоторое неопределённое количество людей), я обязан уточнить отдельно, от лица какой конкретно группы я пытаюсь сейчас говорить (напр. «как сотрудник ООО „Рога и Копыта“», «как мужчина», «как участник движения „за право на молодость“», «как гражданин Российской Федерации»);

    • в случае необходимости апеллировать к какому-то конкретному своду правил и или законов, я также обязан уточнить отдельно, на что я ссылаюсь (напр. «с точки зрения уголовного кодекса Российской Федерации», «исходя из Международной Классификации Болезней 10-го пересмотра»).

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

    Я приведу конкретные примеры из личной практики:

    Если я говорю:

    • «ты неправ», то любителей «я-высказываний» я прошу воспринимать это выражение как «мне кажется неверным высказанное тобой мнение»;
    • «ты поступил неправильно» — «мне кажется, что поступать подобным образом неправильно»;
    • «ты делаешь мне неприятно» — «мне неприятно, когда люди поступают со мной подобным образом»;
    • «ты постоянно не слушаешь меня» — «я испытываю сильный дискомфорт от того, что ощущаю, что моя речь постоянно не воспринимается собеседником».

    Сравните, пожалуйста фразы слева и справа. Я слышал определение «я-высказываний», как «открытого выражения эмоций», но по факту я вижу, что то, что ощущается — то, что хочется высказать открыто — приходится завуалировать в формулу, которая позволяет моему собеседнику воспринять информацию, которую я хочу открыто донести до него, говоря от первого лица и выражая моё личное мнение, в удобной, комфортной, смягчённой и обобщённой форме. То есть вместо открытого выражения эмоций, я должен использовать специальную формулу, позволяющую моему собеседнику воспринять это сообщение:

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

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

    Всё вышесказанное является моим личным субъективным мнением. Я прошу воспринимать все мои последующие высказывания в соответствии с этим манифестом, который я обозначу как «я-манифест».

    Ставим рубиновый типограф на Рельсы

    В продолжение вчерашней темы, добавил простой способ типографить избранные поля в модели ActiveRecord.

    Достаточно написать в нужной модели примерно следующее:

    class Article < ActiveRecord::Base
      typograf :title, use_p: false, use_br: false
      typograf :content, :teaser
    end
    

    И тогда каждый раз перед сохранением (конкретнее, перед проверкой правильности полей) будет проходить типографирование этих полей, посредством Типографа студии Артемия Лебедева.

    Поддерживается несколько возможных синтаксисов объявления моделей для типографирования:

    • для одного конкретного поля:

      typograf :content
      
    • можно указать параметры для типографирования этого поля:

      typograf :content, entity_type: AlsTypograf::NO_ENTITIES
      
    • для нескольких полей сразу (тоже с возможностью объявить параметры типографирования, общие для всех объявленных полей):

      typograf :skills, :achievements, :additional,
               use_br: false,
               use_p: true
      
    • для нескольких полей сразу (но с объявлением параметров для каждого конкретного поля):

      typograf foo: {entity_type: AlsTypograf::HTML_ENTITIES},
               bar: {use_p: true, use_br: false},
               baz: {max_nobr: 5},
               some_other_field_name: {}
      

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

    Типограф студии Артемия Лебедева с отблеском Рубина

    Понадобилось мне типографировать тексты, добавляемые в админке одного из приложений. Поиск в интернете ни одного годного типографа на Ruby не показал. Зато, я вспомнил, что студия Артемия Лебедева позволяет типографировать тексты с помощью их веб-сервиса. Поэтому, я написал маленькую обёртку к их сервису.

    Пользоваться очень просто.

    • Установите:

      gem install als_typograf
      
    • В коде приложения используйте метод process модуля AlsTypograf следующим образом:

      require 'als_typograf'
      AlsTypograf.process('- Это что, "Типограф"?') # "<p>— Это что, «Типограф»?</p>"
      

    Обёртка поддерживает несколько опций, предоставляемых веб-сервисом Студии, их можно подставлять как к конкретному запросу:

    AlsTypograf.process('- Это что, "Типограф"?', use_p: false, use_br: true)
    

    так и выставлять глобально, для всех запросов на типографирование:

    AlsTypograf.encoding = 'CP1251' # По-умолчанию используется кодировка UTF-8
    AlsTypograf.html_entities! # Заставляет использовать сущности HTML, такие как: &nbsp;, &mdash; &hellip;

    Документация для рубинового типографа хранится (и автоматически обновляется при любых изменениях) на сервисе rubydoc.info, который весьма рекомендую всем разработчикам.

    Метапрограммирование в Ruby

    Что такое метапрограммирование?

    Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtime. In many cases, this allows programmers to get more done in the same amount of time as they would take to write all the code manually, or it gives programs greater flexibility to efficiently handle new situations without recompilation. (via Wikipedia)

    Это руководство перечисляет все стандартные методы Ruby, используемые для метапрограммирования, а так же приводит примеры их обычного употребления. В конце мы получим пример использования метапрограммирования для динамического создания классов, соответствующих таблицам в БД, включающих методы, соответствующие полям таблицы, на манер ActiveRecord.

    Инструментарий метапрограммиста

    Ruby содержит множество методов для динамического создания кода. Ознакомимся с ними:

    Получение, установка и удаление переменных

    Получение, установка и удаление констант (и классов)

    Объявление и удаление методов

    Выполнение кода, построенного «на лету»

    Методы интроспекции (рефлексии, отражения)

    Интроспекция — важная часть метапрограммирования, позволяющая изучать объекты, получая их структуру и данные

    Выполнение кода в строках и блоках

    Вы могли слышать о методе eval, позволяющем выполнять строку или блок как код на Ruby. Когда нужно выполнить код внутри контекста какого-то объекта, можно использовать методы instance_eval и module_eval (синоним class_eval).

    Метод instance_eval выполняет код в контексте существующего объекта.

    [1, 2, 3, 4].instance_eval('size') # вернёт 4
    

    В примере мы передали методу instance_eval строку 'size', что интерпретировалось как получение метода :size массивом. Это эквивалентно следующему вызову:

    [1, 2, 3, 4].size
    

    Кроме того, вы можете передавать методу instance_eval блок.

    # Получаем среднее арифметическое чисел в массиве
    [1, 2, 3, 4].instance_eval { inject(:+) / size.to_f } # вернёт 2.5
    

    Методы inject(:+) и size.to_f вроде бы «висят в воздухе» и не относятся ни к какому объекту, однако они выполняются в блоке, в контексте объекта, поэтому они интерпретируются как self.inject(:+) и self.size.to_f где self — наш массив.

    В то время как instance_eval выполняет код в контексте объекта, метод module_eval выполняет код в контексте модуля или класса.

    Fixnum.module_eval do
      def to_word
        if (0..3).include? self
          ['ничего', 'один', 'пара', 'несколько'][self]
        elsif self > 3
          'много'
        elsif self < 0
          'отрицательно'
        end
      end
    end
    1.to_word # вернёт 'один'
    2.to_word # вернёт 'пара'
    

    Мы видим, как module_eval заново открывает существующий класс Fixnum и добавляет в него новый метод. Само по себе это не очень интересно, и мы можем сделать это иначе:

    class Fixnum
      def to_word
        # ...
      end
    end
    

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

    class Fixnum
      def self.create_multiplier(name, num)
        module_eval "def #{name}; self * #{num}; end"
      end
    end
    
    Fixnum.create_multiplier('multiply_by_pi', Math::PI)
    4.multiply_by_pi # вернёт 12.5663706143592
    

    Пример выше создаёт метод класса (или «метод-синглетон») create_multiplier, с помощью которого мы сможем создавать методы, применимые к любому объекту класса Fixnum.

    Использование send

    Метод send работает почти как instance_eval, поскольку вызывает метод объекта, переданный в качестве параметра. Он удобен, когда мы динамически получаем имя необходимого метода в виде строки или символа.

    method_name = 'size'
    [1, 2, 3, 4].send(method_name) # вернёт 4
    

    Мы можем передать имя метода в виде строки 'size' или символа :size

    Полезное свойство метода send — возможность вызывать приватные методы, как например метод Module#define_method.

    Array.define_method(:ducky) { puts 'ducky' }
    # NoMethodError: private method `define_method' called for Array:Class
    

    Используя send получаем:

    Array.send(:define_method, :ducky) { puts 'ducky' }
    

    Создание методов

    Как мы видим в примере выше, мы можем создавать методы классов с помощью define_method.

    class Array
      define_method(:multiply) do |arg|
        collect { |i| i * arg }
      end
    end
    
    [1, 2, 3, 4].multiply(16) # returns [16, 32, 48, 64]
    

    method_missing

    Метод method_missing, объявленный в классе, вызывается в случае получения экземпляром класса несуществующего метода. Это может быть использовано для выполнения этих отсутвующих методов, вместо отправки ошибки NoMethodError.

    class Fixnum
      def method_missing(meth)
        method_name = meth.id2name
        if method_name =~ /^multiply_by_(\d+)$/
          self * $1.to_i
        else
          raise NoMethodError, "undefined method `#{method_name}' for #{self}:#{self.class}"
        end
      end
    end
    
    16.multiply_by_64 # вернёт 1024
    16.multiply_by_x # ошибка NoMethodError
    

    Как работает метод attr_accessor?

    Многие из нас используют attr_accessor в классах, однако не все понимают, какую работу он за нас выполняет. attr_accessor динамически генерирует getter и setter для переменной экземпляра. Давайте посмотрим на примере.

    class Person
      attr_accessor :first_name
    end
    
    john = Person.new
    john.first_name = 'John'
    john.instance_variables # вернёт ["@first_name"]
    john.methods.grep /first_name/ # вернёт ["first_name", "first_name="]
    

    Также мы видим, что attr_accessor создаёт переменную экземпляра @first_name и два метода: getter first_nameи setter first_name=.

    Реализация

    Все классы наследуют методы Module, поэтому мы поместим методы сюда.

    class Module
      # First using define_method
      def attr1(symbol)
        instance_var = ('@' + symbol.to_s)
        define_method(symbol) { instance_variable_get(instance_var) }
        define_method(symbol.to_s + "=") { |val| instance_variable_set(instance_var, val) }
      end
    
      # Second using module_eval
      def attr2(symbol)
        module_eval "def #{symbol}; @#{symbol}; end"
        module_eval "def #{symbol}=(val); @#{symbol} = val; end"
      end
    end
    
    class Person
      attr1 :name
      attr2 :phone
    end
    
    person = Person.new
    person.name = 'John Smith'
    person.phone = '555-2344'
    person # returns
    

    define_method и module_eval оба вернут один и тот же результат.

    Пример использования: Active Record для бедных

    Те, кто знаком с Ruby on Rails, уже догадываются, как можно реализовать класс ActiveRecord, который пройдётся по полям таблицы и добавит классу соответствующие методы getter и setter для полей таблицы.

    Мы можем пойти дальше и динамически создать классы, соответствующие таблицам.

    В этом примере мы создадим ActiveRecord для бедных. Этот класс соединится с базой данных MySQL, создаст динамически классы, соответствующие каждой таблице, а так же наполнит эти классы методами getter и setter, соответсвующими полям таблицы.

    require 'rubygems'
    require 'mysql'
    
    class PoorMan
      # сохраним список сгенерированных классов в переменной класса
      class << self; attr_reader :generated_classes; end
      @generated_classes = []
    
      def initialize(attributes = nil)
        if attributes
          attributes.each_pair do |key, value|
            instance_variable_set('@' + key, value)
          end
        end
      end
    
      def self.connect(host, user, password, database)
        @@db = Mysql.new(host, user, password, database)
    
        # пройдёмся по списку таблиц и создадим классы для них
        @@db.list_tables.each do |table_name|
          class_name = table_name.split('_').collect { |word| word.capitalize }.join
    
          # создаём класс для таблицы, используя Module#const_set
          @generated_classes << klass = Object.const_set(class_name, Class.new(PoorMan))
          klass.module_eval do
            @@fields = []
            @@table_name = table_name
    
            def fields; @@fields; end
          end
    
          # пройдёмся по списку полей таблицы и создадим методы getter и setter для них
          @@db.list_fields(table_name).fetch_fields.each do |field|
            # добавляем getter и setter
            klass.send :attr_accessor, field.name
    
            # добавляем имя поля в список полей
            klass.module_eval { @@fields << field.name }
          end
        end
      end
    
      # получаем строку таблицы по идентификатору
      def self.find(id)
        result = @@db.query("select * from #{@@table_name} where id = #{id} limit 1")
        attributes = result.fetch_hash
        new(attributes) if attributes
      end
    
      # получаем все строки
      def self.all
        result = @@db.query("select * from #{@@table_name}")
        found = []
        while(attributes = result.fetch_hash) do
          found << new(attributes)
        end
        found
      end
    end
    
    # соединяем класс PoorMan с базой данных, всё остальное он сделает самостоятельно
    PoorMan::connect('host', 'user', 'password', 'database')
    
    # печатаем список сгенерированных классов
    p PoorMan::generated_classes
    
    # получаем пользователя с идентификатором 1
    user = Users.find(1)
    
    # получаем всех пользователей
    Users.all
    

    Оригинал статьи: Ruby’s metaprogramming toolbox, автор — Corban Brook

    Некоторые примеры могут не работать на Ruby < 1.8.7

    Интеграция WYSiWYG-редактора TinyMCE в рельсовые приложения

    Вчера закончил работу (ну, её было не очень много) по переделыванию плагина TinyMCE для рельсов в полноценный gemТеперь редактировать текстовые данные в рельсовых приложениях ещё проще.

    Достаточно вставить в environment.rb:

    config.gem 'tiny_mce', source: 'http://gemcutter.org/'
    

    В нужный контроллер:

    uses_tiny_mce only: [:new, :create, :edit, :update]
    

    В обёртку:

    include_tiny_mce_if_needed
    

    А в представлении указать у нужного поля текста класс mceEditor:

     form_for @page do |f|
      f.text_area :content, class: 'mceEditor'
     end
    

    После этого остановите свой проект, наберите в командной строке rake gems:install, запустите проект снова — файлы для TinyMCE автоматически установятся в нужное место. Если вы обновите гем (например, в связи с обновлением кода TinyMCE его авторами) — удалите public/javascript/tiny_mce, перезапустите приложение и новые файлы лягут в нужное место.

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

    Ссылки проекта:

    Удаление программ с помощью setup.py

    Некоторые программы написанные на Питоне (например, Lekhonee) поставляются с файликом setup.py, с помощью которого довольно просто устанавливаются

    python setup.py build
    sudo python setup.py install
    А вот удалить такую программу достаточно сложно, ибо команды sudo python setup.py uninstall нету. Ну, не предусмотрели его любители красивого кода на питоне. Красивое, ведь, лучше, чем некрасивое, ага? А код на Питоне, видимо, настолько красивый, что удалять его со своего компьютера — грех смертный.

    Тем не менее, способ удаления таких программ есть, и он довольно прост:

    sudo python setup.py install --record files.txt
    cat files.txt | sudo xargs rm -rf
    
    На самом деле, неприятно удивляет это питоновское стандартное средство установки программ. Но, оказывается, бывает и такое.

    А если подумать перед установкой…

    …то можно использовать уже упоминавшийся в блоге checkinstall:
    sudo checkinstall python setup.py install
    Тогда деинсталлировать это приложение можно будет как обычно, с помощью apt:
    sudo apt-get purge lekhonee

    Сколько стоит Ubuntu?

    Да, я знаю что Ubuntu распространяется бесплатно. Сегодня меня заинтересовало другое.

    Сколько стоила бы аналогичная система, построенная из платных аналогов.

    Посмотрим, что мы получаем в комплекте с Ubuntu:

    • операционную систему на базе ядра GNU/Linux;
    • приятную, расширяемую и настраиваемую графическую оболочку;
    • набор Офисных приложений:
      • редактор текстов (который в платных аналогах любят называть текстовым процессором);
      • приложение электронных таблиц;
      • редактор презентаций;
      • мощное приложение для ведения переписки, календаря и заметок + ещё одно, исключительно для заметок но более удобное;
    • два графических редактора: растровый и векторный;
    • кучу игрушек и прочих приятных мелочей.

    Внушительный список, не правда ли? Сколько вы готовы заплатить за такой набор? А теперь посчитаем, что нам предлагают производители коммерческого ПО:

    Тип ПО Ubuntu Windows OS X
    Ядро системы GNU/Linux $0,00 Windows Vista Home Premium $239,951 OS X 1.5.6 $129,00
    Офисный пакет OpenOffice, Evolution или KOffice, Kontact $0,00 Office Home and Student 2007 $149,952 iWork 09 $79,00
    Растровый графический редактор GIMP или Krita (из KOffice) $0,00 Adobe Photoshop CS4 $699,00 Adobe Photoshop CS4 $699,00
    Векторный графический редактор Draw (из OpenOffice), Inkscape или Karbon (из KOffice) $0,00 Adobe Illustrator CS4 $599,00 Adobe Illustrator CS4 $599,00
    Итого: $0,00 $1687,45 $1506,00

    Берём среднее арифметическое от стоимости комплектов под Windows и OS X и получаем $1596,725.

    Можно сколько угодно говорить о неточном соответствии возможностей тех или иных программ, представленных в сравнении, однако потребности большинства пользователей «ВКонтакте» и «Одноклассников» Ubuntu легко покрывает.

    У меня нету лишних полутора тысяч долларов, которые я отдал бы за ту толику функциональности, которая не предоставлена бесплатными аналогами. А вы?


    1. На русском сайте корпорации Microsoft найти цену на какие-либо продукты нереально

    2. См. 1 

    Совместное использование Cucumber и Factory_Girl или роковая ошибка create_time_zone_conversion_attribute?

    Недавно открыл для себя Cucumber — утилиту для описания поведения вашего приложения. Весьма хорошая штука, доложу вам. Но о ней конкретно я расскажу как-нибудь потом.

    Ещё я использую вместо стендовых данных (известных также как fixtures) замечательный гем от ThoughtBot под названием Factory Girl — он позволяет делать «заготовки» моделей и ваще очень крут (о нём — как вы, может быть, уже догадались — тоже в другой раз).

    Но вот соединить их при тестировании одного проекта оказалось не так-то просто! При тестировании функционала каждый сценарий, начиная со второго использования метода Factory.create вылетал с ошибкой. Как показал бэктрэйс — ошибка случалась в функции ActiveRecord::Base.create_time_zone_conversion_attribute? Гугл рассказал мне, что разработчики рельсов решают эту проблему уже очень долго, и хотя патч, решающий её, давно найден — всё никак не вольют его в основной код. И на то есть веские причины, а именно — утечка мозгов памяти в production-режиме.

    Тем не менее, при тестировании функционала эта утечка памяти не так критична, потому как тестовый сервер Cucumber'а запускается и останавливается регулярно — при каждом прогоне, а сервер приложения висит довольно долго и может отъесть довольно большой кусок памяти и подавиться им. Ну, надоели вступительные слова, вот…

    …решение проблемы:

    Необходимо поместить в директорию lib файл activerecord_reset_sublass_fix.rb, а так же добавить его вызов в файл config/environments/test.rb следующим образом:

    Ubuntu + Compiz — удобно и красиво!

    Очень давно не писал в блог. Сегодня взглянул в очередной раз на черновики и решил, что буду их выкладывать потихоньку. Ну и что, что недописано (и вообще, пора менять слова «компиз фьюжн» на просто «компиз»). Будет рассказ по-частям :-)

    Расскажу о композитном менеджере окон Compiz Fusion. Его историю можете прочитать на сайте проекта, а меня интересует конкретно его применение.

    Для начала, разберёмся, что же это вообще такое? Компиз — это менеджер окон, использующий для отрисовки OpenGL и повзоляющий производить над окнами всякие визуальные преобразования. За кратким обзором и скриншотами опять отправляю на сайт проекта. А с теми, кого скриншоты уже порадовали, приступим к установке:

    sudo apt-get update
    sudo apt-get install compiz compizconfig-settings-manager simple-ccsm emerald fusion-icon
    

    После того, как всё установится, необходимо запустить Fusion Icon (Приложения → Системные → Compiz Fusion Icon). В вашем системном лотке (трее) появится иконка с логотипом Compiz Fusion (эдакий синенький кубик со стрелочкой). По нажатию на нём правой кнопкой выпадает менюшка, из которой вы можете выбрать менеджер окон (Select Window Manager), декоратор (Select Window Decorator), а так же быстро перезагрузить менеджер окон, изменить несколько параметров прямо из меню, либо открыть менеджер настроек Compiz Fusion (и офигеть от их обилия (-; ), а так же открыть менеджер тем Emerald. Советую сразу добавить это приложение в автозапуск (Система → Параметры → Сеансы → Добавить; Имя: Compiz Fusion Icon, Команда: fusion-icon, Комментарий: иконка для запуска и управления Compiz Fusion). Теперь, выбирайте менеджер окон Compiz и декоратор Emerald и мы быстро пробежимся по появившимся у вас возможностям. Кстати, когда вы впервые выберете Compiz в качестве менеджера, экран меркнёт и появится окошко с предложением сохранить настройки, но без… заголовка и кнопок закрытия. Не пугайтесь, согласитесь, оно хорошее (-; Заголовок появится буквально через пару-тройку секунд и останется с вами надолго (-;

    С первого взгляда…

    • …мы увидим, что у панелей появились тени. Ну, это конечно круто, но не сильно увеличивает удобство пользования системой, да?

    • Тогда нажмите на Alt + Tab и вы увидите, что стандартное переключение приложений заменено на новый, красивый, улучшенный переключатель, изображающий превьюшки запущенных приложений. Вы можете перематывать его и вперёд и назад (если нажимать Alt + Shift + Tab [Внимание!!! Данное утверждение верно в том, случае, если у вас не заняты системой кнопкосочетания Alt + Shift либо Shift + Tab]).

      Показывает уменьшенное окно приложения

      Кстати, если вы хотите пролистывать в переключателе также приложения, открытые на других ваших рабочих местах, добавьте Ctrl к описанным выше клавишам. Что же ещё интересного появилось у вас?

    • Попробуйте нажать Alt + Ctrl + или Alt + Ctrl + и снова будете приятно удивлены (-: Переход на другое рабочее место будет очень плавным и симпатичным. Кроме того, вы можете одновременно переходить на другое рабочее место и тащить за собой туда же окно приложения, активное в данный момент. Для этого стоит всего-лишь зажать ещё и кнопку Shift (т. е. получится Shift + Alt + Ctrl + или Shift + Alt + Ctrl + ). Остальные окна при этом останутся на своих местах. Если вам удобнее управляться с окнами мышкой (поначалу, у всех так, со временем вы можете изменить своё мнение), просто тащите окошко к правому краю экрана, и когда оно окажется за краем больше, чем наполовину, рабочая область сдвинется вправо, вслед за вашим окном.

    • Продолжим далее. Допустим, мы поработали в нескольких приложениях на разных рабочих местах, и забыли, где же конкретно открыто окно… скажем, Пиджина. Стоит нажать Super1 + e и ваше рабочее место отодвинется вглубь монитора так, что вы сможете увидеть сразу все рабочие места. Вы даже сможете передвигать окна между ними. Не верите? Просто попробуйте! (-;

      Открытые приложения на всех рабочих местах

      Чтобы вернуться к какому-либо рабочему месту, вам нужно всего лишь щёлкнуть по нему мышкой. Или прокрутить скролл, пока оно не окажется подсвеченным. Или выбрать стрелочками. Чтобы вернуться на старое рабочее место, можете нажать Esc или щёлкнуть правой кнопкой мыши.

    • Есть и другой способ быстро найти окно — нажать Shift + Alt + . При этом, на экране появятся все открытые вами окна, разбросанные мозайкой по всех поверхности экрана. Стрелками или мышкой вы можете выбрать любое из этих окон и после этого отпустить Shift + Alt.

      Открытые приложения на всех рабочих местах


    1. Если кто не знал, так линуксоиды называют кнопочку Win (с таким корявым окошком) 

    Сборка приложений из исходного кода в Ubuntu

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

    Два простых пути для установки приложений из меню, мышкой:

    • ПриложенияУстановка/удаление…
    • СистемаАдмининстрированиеПрограмма управления пакетами Synaptic
    В первом интерфейсе все приложения снабжены своей иконкой, а так же небольшим сопроводительным текстом-описанием и рейтингом (статистика собирается анонимно со всех пользователей, которые разрешили использовать их данные). Во втором интерфейсе есть абсолютно все пакеты, однако в нём проще запутаться и поставить или удалить не то, что требуется.

    Однако, бывают случаи, когда необходимое вам приложение отсутствует в репозитории, например потому, что оно ещё не стабильно, либо распространяется только в исходных кодах, либо его написал ваш сосед-программист, ну или по какой-то другой причине. Тогда придётся собирать его из исходников. Если вы обратитесь к любому руководству по сборке приложений, вы увидите три строки, известных (почти) любому пользователю линукса со стажем более полугода. А именно:

    ./configure
    make
    sudo make install
    Кратко о каждой из этих команд

    ./configure

    Эта команда подготавливает исходные коды к компиляции под конкретную платформу, а именно в вашей операционной системе. Она проверяет налицие необходимых программ (компиляторов, сборщиков и т. п.), библиотек, а так же заголовочных файлов (something.h). Достаточно часто случается, что в вашей системе недостаёт какого-нибудь необходимого приложения, либо файла заголовков, необходимого для компиляции программы. В таком случае, эта команда выведет сообщение об ошибке. Если у вас достаточный опыт, то вы, конечно же, легко определите, что заголовочный файл some_extra_thing.h находится в пакете extra_things_for_cool_nerds-dev, однако не всегда просто определить, что именно хочет от вас программа, чего ей не хватает.

    Тогда нам на помощь придёт утилита под названием auto-apt. Она хранит информацию о заголовочных файлах, которые имеются в репозиториях и поможет вам найти, в каком пакете хранится тот или иной заголовочный файл.

    Если ./configure вывела вам сообщение о недостаче заголовочного файла Xlib.h, воспользуйтесь командой

    auto-apt search Xlib.h
    Она ответит вам следующим:
    usr/include/X11/Xlib.h libdevel/libx11-dev
    Это обозначает, что нужный вам файл содержится в пакете libx11-dev, относящемся к категории libdevel (пакеты для разработки) и после установки пакета (sudo apt-get install libx11-dev) будет лежать по адресу usr/include/X11/Xlib.h

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

    auto-apt run ./configure
    Вам нужно будет только следить за процессом установки и изредка нажимать Y для установки необходимых пакетов.

    make

    Это вторая и, пожалуй, главная команда из этой триады. Она выполняет компиляцию и сборку всех необходимых компонентов системы. Если ошибка появляется во время выполнения этой команды, скорее всего ошибка в коде, который вы пытаетесь собрать. В таком случае, остаётся только обратиться к разработчику программы. Но обычно, после успешного выполнения ./configure, здесь ошибок не бывает.

    make install

    Этой командой вы устанавливаете приложение. Если вы хотите установить её для всех пользователей, общесистемно, вам необходимы права пользователя root. В Ubuntu это решается вызовом этой команды после sudo, то есть
    sudo make install
    НО! При установке этим путём, вы можете нарушить целостность системы, поскольку эта команда не сохранит данные о том, какие файлы и куда были установлены. Таким образом, удаление этой программы сможет принести вам много мороки. Чтобы облегчить возможноые страдания, была написана утилита под названием checkinstall. Она проверяет, что и как хочет сделать команда make install, а потом собирает по полученным сведениям deb-пакет и устанавливает его в систему (то есть, для удачного выполнения этой команды ей так же нужны права суперпользователя). Благодаря этому, вы сможете потом легко удалить ненужное вам более приложение, используя например Synaptic, упоминавшийся в начале статьи.

    Установка программ в пользовательский каталог

    Бывает, что некоторые программы не нужны общесистемно, тогда нужно на этапе конфигурирования указать, что программа будет устанавливаться в пользовательский (или иной) каталог. Для этого, обычно, первая команда видоизменяется следующим образом:
    ./configure --prefix=/home/$USER
    Тогда команду make install нужно вызывать без префикса sudo.

    Выводы

    Для упрощения установки программы из исходных кодов, в Ubuntu вы можете воспользоваться немного изменённым набором команд:
    auto-apt run ./configure
    make
    sudo checkinstall
    для установки общесистемной, либо:
    auto-apt run ./configure --prefix=/home/$USER
    make
    make install
    для установки в пользовательский каталог.

    Разработка сайтов в Ubuntu или LAMP = Ubuntu + Apache + MySQL + PHP

    Ubuntu - это линукс для людей. Поэтому, установка набора для веб-разработчика в нём производится одной командой:

    sudo tasksel install lamp-server
    После её выполнения, на вашем компьютере обоснуются Apache, MySQL и PHP. А мы сразу же займёмся созданием первого сайта.

    Все сайты, над которыми тружусь, я храню в папках вида ~/Sites/www.example.com.dev/. Это удобно, потому как не приходится настраивать права доступа к файлам и придумывать структуру папок в /var/www/, а так же каждому из них можно выделить человекочитаемое имя, оканчивающееся на .dev (которое соответствует названию папки), и при разработке и тестировании набирать в адресной строке браузера www.rotuka.com.dev и попадать на локальную версию вашего сайта.

    Создание и настройка текстового сайта

    Допустим, мы приступаем к разработке сайта rotuka.com, тогда создадим для него личную папку
    mkdir -p ~/Sites/rotuka.com.dev/public
    Теперь, нам нужно рассказать нашему локальному апачу об этом сайте. Создаём файлик для этого сайта:
    sudo gedit /etc/apache2/sites-available/rotuka.com.dev
    и вписываем в него следующие строки:
    <VirtualHost *:80>
        ServerName rotuka.com.dev
        ServerAlias www.rotuka.com.dev
        DocumentRoot /home/$USER/Sites/rotuka.com.dev/public
    </VirtualHost>
    где $USER нужно заменить на ваше имя пользователя.

    Сохраняем файл, закрываем gedit и говорим апачу, что этот сайт теперь нужно обслуживать:

    sudo a2ensite rotuka.com.dev
    При выполнении, эта команда скажет вам, что апачу необходимо перезагрузить данные конфигурации, что мы и сделаем:
    sudo /etc/init.d/apache2 reload
    Теперь, настроим удобное обращение к сайту. Для этого пропишем, что хост rotuka.com.dev обслуживается на нашем компьютере, локально. Открываем файл /etc/hosts
    sudo gedit /etc/hosts
    находим там строку, начинающуюся на 127.0.0.1 (обычно, это первая строка) и вписываем в её конец, через пробел от предыдущих данных, rotuka.com.dev. Сохраняем файл, закрываем редактор.

    Теперь кидаем какой-нибудь файлик index.html в папочку нашего сайта (/home/$USER/Sites/www.rotuka.com.dev/public) или выполняем команду

    echo -e "<html>\n  <head>\n    <meta http-equiv="Content-type" content="text/html;
    charset=utf-8" />\n    <title>Тестовый сайт</title>\n  </head>\n  <body>\n
    <h1>Тестовый сайт</h1>\n    <p>Привет, веб-разработчик</p>\n  </body>\n</html>\n"
    > /home/$USER/Sites/rotuka.com.dev/index.html
    Всё, теперь уже можно вписать в адресную строку браузера http://rotuka.com.dev/ и увидеть, что сайт вас приветствует (-:

    Ссылки по-теме:

    Wacom Bamboo One + Ubuntu. Установка и решение проблем

    Вчера мне в руки попал планшетик Wacom Bamboo One. Забавная вещица. Если её установить (-;

    Страница руководства, посвящённая Wacom посылает нас на довольно подробное руководство по установке и настройке последних драйверов для линейки Bamboo, которое приведёт вас к вполне рабочему тандему Бамбук+Убунту, однако если вы используете терминал, либо постраничный поиск в файрфоксе, либо вы просто любите системный звук ошибки - вы получите много проблем. Ибо теперь каждый вызов системного сигнала будет приводить к перезагрузке иксов.

    Решения этой проблемы гугл не знает. Яндекс, кстати, тоже. И лишь кустарные методы позволят использовать. Чтобы лишить себя проблем (хотя бы временно), выполните следующие действия:

    1. Откройте настройку звука (Система -> Параметры -> Звук) и на вкладе “Системный сигнал” снимите галочку с параметра “Включить системный сигнал” и поставьте галочку “Визуальный системный сигнал”, чтобы вместо звука сигнал был произведён путём мигания какой-либо области экрана.
    2. Запустите терминал (Приложения -> Стандартные -> Терминал), выберите в меню Правка -> Текущий профиль… и снимите галочку с параметра “Подавать гудок
    3. Запустите Firefox (Приложения -> Интернет -> Firefox Web Browser) и введите в адресной строке about:config. Затем найдите параметр accessibility.typeaheadfind.enablesound и поставьте ему значение false.

    Установка Ruby on Rails в Ubuntu (для разработки)

    Я постараюсь поддерживать эту статью в актуальном состоянии. На данный момент, все действия, описанные в статье, актуальны для следующих версий ПО:

    • Ubuntu Karmic Koala (9.10)
    • Ruby 1.8.7 (2009-06-12 patchlevel 174)
    • Rubygems 1.3.5
    • Ruby on Rails 2.3.4

    Установка Ruby

    В репозиториях Убунту лежит актуальная версия интерпретатора Ruby, поэтому для установки Ruby хватит одной стандартной команды:
    sudo apt-get install ruby-full build-essential libruby-extras libsqlite3-ruby

    Установка Rubygems

    1. RubyGems в репозитории Ubuntu Karmic пока актуальные, поэтому можно смело ставить из репозитория командой:
      sudo apt-get install rubygems
    2. Однако, если вы предпочитаете ручную установку RubyGems, воспользуйтесь следующими командами:
      wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
      tar xzvf rubygems-1.3.5.tgz
      cd rubygems-1.3.5
      sudo ruby setup.rb
      sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
      Для того, чтобы у вас заработало дополнение команд в консоли, необходимо открыть файл настроек дополнения
      sudo gedit /etc/bash_completion.d/gem1.8
      И вставить в начало этого файла, сразу после комментариев, следующий код:
      have()
      {
        unset -v have
        PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&
        have="yes"
      }
      А в самый конец вставить:
      [ -n "${have:-}" ] && complete -F _gem18 $filenames gem
      Теперь вы в консоли сможете набирать gem i и консоль будет сама дополнять команду до gem install,

      Если же у вас уже была установлена более старая версия Rubygems, вы можете обновить её до текущей:

      sudo gem update --system
      Иногда, после обновления этой командой, gem может начать выдавать ошибку:
      /usr/bin/gem:23: uninitialized constant Gem::GemRunner (NameError)
      Для её устранения, необходимо отредактировать исполняемый файл (sudo gedit /usr/bin/gem) и перед строкой require "rubygems" вставить строку require "rubygems/gem_runner"

    Установка Rails

    Теперь, когда нас установлены актуальные версии интерпретатора и менеджера гемов, мы можем присутпить к установке самих Rails.
    sudo gem install rails
    Всё, рельсы установлены. Чтобы проверить, что всё в порядке, создадим приложение на рельсах:
    cd ~
    mkdir Sites
    cd Sites
    rails my_first_site
    cd my_first_site
    ./script/server
    Эти команды создадут в вашей домашней директории поддиректории Sites, а в ней, в директории my_first_site rails-приложение, после чего запустит стандартный сервер WEBrick, поставляемый вместе с интерпретатором Ruby. Если установка прошла без ошибок, то вы сможете увидеть приветствие рельсов, пройдя по ссылке http://127.0.0.1:3000/.

    Установка дополнительных гемов

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

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

    sudo apt-get install librmagick-ruby
    Если же вы захотите установить самую последнюю версию этого гема, вам нужно будет скачать исходные коды для библиотек ImageMagick (а они потянут за собой много-много других библиотек). Скорее всего, для вас это излишне. Но команды напишу: bash sudo apt-get install libmagick9-dev sudo gem install rmagick Ещё лично я советую поставить вам несколько плагинов, которые облегчат вам жизнь при работе с Rails в дальнейшем. Установка одной командой: bash sudo gem install mongrel BlueCloth RedCloth sqlite3-ruby ZenTest И о каждом геме поподробнее: * mongrel — более быстрый, чем WEBrick сервер, написанный специально для работы с Rails. Если н установлен, то по команде ./script/server рельсы станут запускать именно его. * BlueCloth и RedCloth — библиотеки, используемые рельсовыми хелперами markdown и textilize, соответственно, для разметки текста. * sqlite3-ruby — библиотека для работы с базами sqlite3 (которые создаются по-умолчанию при создании рельсового приложения). * ZenTest — набор утилит для автоматического тестирования приложения. По команде autotest запускается тестирующий демон, который будет проверять все изменённые файлы, пробегая связанные с ними тесты. Об этой утилите я напишу позже

    *[ПО]: Программное обеспечени

    Настройка GTalk в Kopete (KDE4)

    Сегодня поставил на своём лаптопе Kubuntu KDE4 и столкнулся с проблемой при настройке GTalk в Kopete. При соединении выдавалась ошибка «SSL support could not be initialized for account user@example.com. This is most likely because the QCA TLS plugin os not installed on your system».

    Первым делом я, естественно, попытался решить эту проблему путём установки этого самого QCA TLS, довольно логично, не правда ли? Тем более, что и пакетик в репозиториях нашёлся одноименный.

    sudo apt-get install qca-tls

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

    sudo apt-get install libqca2-plugin-ossl

    После этого перезапускаю Kopete и… вуаля, всё заработало.

    Кстати, не лишним будет напомнить, что для общения с вашего аккаунта GTalk из Копете необходимо выставить следующие настройки:

    1. При создании аккаунта выбрать протокол Jabber
    2. В качестве Jabber ID ввести ваше имя пользователя, вместе с доменным именем, то есть username@gmail.com или username@example.com если вы используете Google Apps на домене вашей организации и т. п.
    3. В параметрах соединения (Вкладка Connection) поставить все три галочки: Use protocol encryption (SSL); Allow plain-text password authentication; Override default server information
    4. Выставить в качестве имени сервера talk.google.com, порт 5223.
    Этих настроек должно быть вполне достаточно для комфортной работы. Не забудьте установить поддержку QCA TLS, если выскочит ошибка. Одной командой это делается так:

    sudo apt-get install qca-tls libqca2-plugin-ossl

    Неделя на Рельсах (выпуск от 10 сентября 2008 г.)

    Перевод. Оригинальная статья: This Week in Rails (September 10, 2008), за авторством Gregg Pollack

    Добро пожаловать в пятый выпуск «Недели на рельсах», еженедельный отчёт о событиях в околорельсовом сообществе. Antonio Cangiano (автор идеи) был весьма занят, поэтому на этой неделе я решил его подменить.

    Вы, скорее всего, уже слышали о выходе Rails 2.0.4 и Rails 2.1.1. Оба релиза — в основном исправляют ошибки, за подробностями отправляйтесь в списки изменений.

    Если ваше приложение на Рельсах использует много тяжёлых SQL запросов, вы скорее всего захотите взглянуть на плагин от Fernando Blat, называемый Query memcached. Этот плагин замещает стандартную функциональность Рельсов по кешированию результатов запросов к базе, сохраняя их в memcached для использования в последующих запросах.

    Вы когда-нибудь пытались реализовать «продвинутый поиск» в приложении на Рельсах? И скорее всего, ваши контроллеры от этого весьма разжирели. Одно из решений этой проблемы — Searchgasm от Binary Logic — плагин, объектно-ориентированная обёртка вокруг запроса к базе, благодаря которой код ваших контроллеров останется простым и коротким.

    Ryan Daigle рассказал нам о новых фишках, введённых в новейших ревизиях кода Рельс: Connection Pooling (количество соединений с базой данных), Shallow Routes («уплощение» маршрутов к вложенным ресурсам), а так же Mailer Layouts («обёртки» для сообщений электронной почты). Совсем скоро мы увидим кандидата в релиз Рельс 2.2, поэтому следите за новостями.

    Для ваших друзей Java-программистов, использующих Apache Derby, которые хотят опробовать JRuby, Michael Galpin написал введение в Рельсы с использованием JRuby и Derby.

    На прошлой неделе Last week Mark Imbriaco из компании 37 Signals объединил собрал отличную статью и скринкаст о том, как они используют HAProxy на сервере. Если вы ещё не в курсе преимуществ использования HAProxy перед apache round robin load balancer, обязательно посмотрите скринкаст.

    Возможно, вы стали использовать jQuery вместо Prototype в Рельсовых приложениях. Вы могли использовать для этого плагин (например, jQuery on Rails), но если вы начали с нуля, то наверняка заработали много проблем с отправкой отметок аутентификации (authenticity tokens) в ваших AJAX-запросах. Lawrence Pit описал код jQuery, который вам необходим чтобы избежать дальнейших проблем.

    Neverblock — это библиотека, которая позволяет использовать Нити Ruby (Ruby Fibers) для записи не-блокирующего конкуррентного кода. В рамках этого проекта недавно был выпущен не блокирующий адаптер PostgreSQL, не блокирующий адаптер MySQL, и совсем недавно библиотеку для использования их Нитей на Ruby 1.8 совместно с Рельсами с ошеломляющими результатами тестов производительности! Этот проект очень молод, однако это ещё один шаг к безопасным мульти-поточным Рельсам.

    Наконец, я хочу рассказать о нескольких событиях. Ruby DCamp состоится 11-12-го октября в Арлингтоне, Rails Summit Latin America будет проходить 15-го и 16-го октября в Сан-Пауло, в Бразилии, а также South Carolina Ruby Conference пройдёт 18-го октября в Колумбии.

    Спасибо за чтение! Если вы предпочитаете слушать эти новости (с незначительными уточнениями), обратите внимание на подкаст № 46 Rails Envy, который вышел сегодня. Это не ошибка, что подкаст охватывает ту же информацию, что и данная статья, потому что я принимал участие в его создании.

    Gnome Do

    Первой статьёй решил описать небольшую утилитку, которой пользуюсь ежедневно и, даже, ежеминутно. Имя ей — Gnome Do.

    Эта небольшая утилитка позволяет сделать многие вещи настолько быстро, насколько это, в приницпе, возможно (но, не быстрее, как уточняют её создатели).

    Потратил на её изучение примерно 20 минут (это с учётом настройки дополнительных плагинов, о них позже), после этого забыл о стандартном меню в Убунту.

    Чем же эта программа хороша?

    Она позволяет быстро и эффективно запускать установленные приложения
    Нажмите Win(Super) + Пробел и вводите название желаемого приложения. При этом, она использует не только название исполняемого файла (например, firefox, pidgin или gimp), но также и привычное название этой программы, написанное в вашем меню. Таким образом, не важно, каким редактором текста вы пользуетесь. Достаточно начать набирать «Редактор текста», и Gnome Do сразу предложит вам запустить один из установленных редакторов. Кроме того, вы можете начать набирать название не с начала, а с того слова, с которого захотите, например «Редактор текста», Ду всё равно найдёт нужное приложение.
    Ду запоминает, какие приложения вы используете чаще
    Значит, если у вас, к примеру, установлено несколько почтовых агентов, и когда вы начали набирать слово «почта», Ду предложит вам Evolution, в то время, как вы предпочитаете Thunderbird, вы сможете нажать кнопку и Ду откроет список найденных результатов, в котором вы выберете Thunderbird. Всё! В следующий раз Ду будет предлагать в качестве первого результата Thunderbird.
    Ду не замечает ваших ошибок!
    Если вы случайно опечатаетесь и начнёте писать pigin вместо Pidgin, Ду догадается об этом и предложит именно то, что вы хотели написать
    Продолжение скоро последует. Вот, высплюсь… ((-:

    Привет, рунет!

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

    Может быть, со временем, не только об Убунте. Да всё может быть со временем. Увидим (-:

Подпишитесь на статьи с помощью РСС или Атом .