Pull to refresh

Про грабли

Reading time 2 min
Views 1.2K
Lumber room
Юзеp — человек, наступающий на гpабли.

Чайник — начинающий юзеp, ни pазу не наступавший на гpабли и потому увеpенный, что гpаблей не существует.

Ламеp — юзеp, pегуляpно наступающий на гpабли, но по-пpежнему увеpенный что гpаблей не существует.

Читать дальше →
Total votes 27: ↑13 and ↓14 -1
Comments 9

goto в CORE:: GLOBAL:: exit — где грабли?

Reading time 2 min
Views 1K
Perl *
У меня есть CGIшка, которую хочется запустить под FastCGI.

Она использует фреймвок, который обрабатывает html-шаблоны, выводит ошибки (die) в браузер, делает всяческие редиректы, отдаёт файлы, etc. — всё как обычно. Этот фреймвок, после формирования и вывода ответа на STDOUT, делает exit() — что тоже, в общем, не оригинально.

Этот exit() может быть вызван внутри eval(), а то и нескольких вложенных eval-ов — к примеру, если где-то, в глубине вычислений, CGIшка решает выдать юзеру редирект. Она при этом вызывает функцию фреймвока, он делает print "Location: ..." и exit().

Но под FastCGI exit() делать нельзя.
Читать дальше →
Total votes 4: ↑3 and ↓1 +2
Comments 31

Cookies та просто готовились

Reading time 1 min
Views 541
Lumber room
Обнаружил вдруг сегодня, что на локальном зеркале проекта не работают кукисы. Что бы ты не ставил, всегда возвращает testCookie = 1, что в Сафари, что в Файрфоксе. Перерыл проект в поисках ошибки — пусто, перерыл все зависимые библиотеки (вдруг шалят то ;-) — пусто. Обновил все что только можно — без результатно. От бессилия решил погуглить… ну и понятное дело, что нашел в чем причина. Прямо в спецификации и сказано, что A Set-Cookie with Domain=.com or Domain=.com., will always be rejected, because there is no embedded dot. Одного не понимаю, как я за всю свою жизнь раньше не напоролся на подобную граблю? :-)
Rating 0
Comments 0

Prototype, Ajax.PeriodicalUpdater и Internet Explorer

Reading time 1 min
Views 924
Ajax *
Довольно простой код для использования Ajax.PeriodicalUpdater предлагается в описании API на официальном сайте prototype

new Ajax.PeriodicalUpdater('items', '/items', {
  method: 'get', frequency: 3, decay: 2
});


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

Искал решение долго и упорно, но в рунете ничего внятного не нашел (возможно, искал не так долго и упорно, как того требовалось бы). А вот покопавшись по забугорским сайтам наткнулся на такую статью: blog.innerewut.de/2007/9/22/ie-doesn-t-let-us-rest

И тогда проблему решил следующим способом:
Читать дальше →
Total votes 11: ↑9 and ↓2 +7
Comments 19

Пара граблей в Ruby [on Rails] (absolute noob's guide)

Reading time 1 min
Views 692
Lumber room
Языки и технологии я изучаю методом умножения шишек на лбу. Набредете на такие вот грабли — хоть немного места на лбу сбережете.

ruby-debug-ide и mkmf


Убунтоиды могут столкнуться с такой бедой: при установке gem ruby-debug-ide установщик жалуется на отсутствие какого-то mkmf и отказывается продолжать. И sudo здесь ни при чем. Не ищите соответсвующий gem, загляните лучше в системный менеджер пакетов (aptitude, Synaptic или Adept или сильномогучие apt-get и dpkg :) ). Кроме вполне логичного для программистов build-essential должен быть установлен еще и ruby[X]-dev (где [X] — предпочитаемая вами версия Ruby, скорее всего у вас 1.8, т.е. пакет ruby1.8-dev). После его установки повторите команду на установку ruby-debug-ide, всё пойдет как по маслу.

Совет в принципе применяется ко всем библиотекам с native extension в сердце.

Поклонникам jruby придется избегать пакетов с native extensions — ищите версии пакетов, поемеченные -jruby.

habtm: id в таблице ассоциаций


habtm — это сокращенно has_and_belongs_to_many (будут проблемы — ищите на форумах и так, и этак). Ему нужна таблица ассоциаций, состоящая только из id двух связываемых объектов. И если от timestamps легко избавиться, то колонка id в качестве первичного ключа создается без нашего ведома и может попортить немало кровушки таким нубам как я. Чтобы избавиться от нее, не нужно делать одну лишнюю миграцию. Код создания таблицы ассоциации може выглядеть следующим образом:

class CreateOnesTwos < ActiveRecord::Migration
  def self.up
    create_table :ones_twos, :id => false do |t| # вон он, дополнительный параметр :id
      t.references :one
      t.references :two
    end
  end

  def self.down
    drop_table :ones_twos
  end
end
Total votes 8: ↑6 and ↓2 +4
Comments 3

Порядок инициализации в конструкторах

Reading time 2 min
Views 50K
C++ *
Итак, вот небольшая программа на C++:

#include <iostream>

class A {
private:
  int a;
  int b;
public:
  A(int x) : b(x), a(b) {}
  void dump() {
    std::cout << "a=" << a << " b=" << b << std::endl;
  }
};

int main() {
  A a(42);
  a.dump();
  return 0;
}

Если вы считаете, что она выдаст

a=42 b=42

То вас ждёт сюрприз
Total votes 79: ↑70 and ↓9 +61
Comments 74

CakePHP. Behaviors — измена!

Reading time 2 min
Views 462
Lumber room
Как обычно я не ищу лёгких путей, и как обычно сталкиваюсь с задачами не рассмотренными в book.cakephp.org ;-)

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

И вот сейчас, я в очередной раз наступил на грабли, причём ответа на мой вопрос — нет.

Итак, в чём состояла задача:

Model A — hasMany Model B
Model B — belongsTo Model A

Model B — actAs ('Image')

Image — чудесный behavior Евгения Томенко, который служит для связки записи в модели с сохранённой картинкой.

В случае запроса Model B ->… любой формы — behavior срабатывал как часы, и я получал нужные мне данные, в данном случае — картинки.

Однако, когда стала задача построить запрос вида

Model B -> Model -> A ( с условиями, где выборка идёт по полям Model A)

оказалось — что поиск и педжинация работают отлично, однако в результатах связанной Model B — нет и следа работы behavior… Я просто получал поля модели, без нужных мне «искривлений».

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

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

А именно — сортировать по полям, расположенным в i18n таблице — нельзя. Не получится. Только по тем полям, которые присутствуют в явном виде. Вот так.

Я, конечно, не хочу сказать, что сортировка построенная через i18n таблицу будет работать быстро, или в принципе будет работать вменяемым образом. Может и не будет. Но в таком случае, если необходимо как-то сортировать результаты кроме id,created — то никаких шансов использовать этот behavior у вас нет. Он не сработает. :(

И если первые грабли можно обойти вторым запросом (сначала получив список id Model B, а потом затребовать непосредственно из Model B все записи (тут-то behavior сработает). То во вторых граблях, единственный способ сортировать — обходиться без коробочного behavior.

2All: Если кто-то решил данные вопросы — поделитесь решением в комментариях. Речь идёт о CakePHP 1.2.3.8166
Total votes 3: ↑1 and ↓2 -1
Comments 8

Win-игры под Linux: миф или реальность?

Reading time 5 min
Views 4.6K
Games and game consoles
Топик написан под влиянием множества заявлений (в том числе в хабрасообществе) о том, что игр под Linux почти нет, соответственно последний не является десктоп-системой, способной конкурировать с Windows. Используется данный аргумент, в паре с другим — «под ваш линукс нет нужного для работы софта» — в качестве последней линии обороны, когда говорить об «удобстве», «простоте освоения» или «безопасности» уже бесполезно. Любая домохозяйка без проблем освоит Ubuntu, особенно если обучать её именно на этой системе, а не переучивать с винды. Да и вирусы под эту ОС пока что приходится собирать вручную, с чтением мануала. И вот тут-то выступает некто, заявляющий примерно следующее: «Но ведь у домохозяйки есть дети, которые хотят погонять в игрушки, а их-то на вашей красноглазой недооси и нету! Ха-ха-ха! (здесь смех киношного злодея)».

Читать дальше →
Total votes 82: ↑67 and ↓15 +52
Comments 229

Javascript: Хороший стиль кода как правило

Reading time 1 min
Views 578
Lumber room
imageБанальное поучение для начинающих программистов :)

Говорила мне мама: «Сынок, объявляй переменные явно, даже если это вроде бы и не обязательно!», а я все ленился.
Читать дальше →
Total votes 40: ↑28 and ↓12 +16
Comments 10

Бег с препятствиями или создание одного проекта

Reading time 7 min
Views 1K
Self Promo

О чем разговор


chefonline.ruChefonline.ru – это кулинарный портал, как бы банально это ни звучало. У нас есть персональная и общая книги рецептов, есть возможность создавать списки покупок, планировать меню, хранить избранное, можно писать в коллективный блог или просто читать его, есть другие интересные и полезные сервисы для любителей и сочувствующих.

Портал достаточно молод, сделано хоть и немало, но многое все еще находится в разработке или в виде идей, поэтому рассказать хотелось бы не о самом проекте, а о процессе его создания. Надеюсь, наш опыт будет полезен хабра-людям.
Читать дальше →
Total votes 59: ↑51 and ↓8 +43
Comments 89

Особенности национальных выражений

Reading time 2 min
Views 915
Perl *
Захотелось мне поделиться с хабравчанами-перловодами одним интересным случаем, произошедшим у нас на работе. В процессе ревизии старого кода была обнаружена некая загадочная конструкция (здесь и далее реальный код несколько сокращён и приглажен):
sort { my ($x, $y) = ($a, $b); ($x =~ s{/}g) <=> ($y =~ s{/}g); } @array;
Казалось бы, обычная сортировка с переопределённой функцией сравнения. По изначальной задумке автора здесь должна была быть сортировка массива строк по количеству прямых слэшей в этих строках (известно, что выражение замены возвращает в качестве значения количество произведённых замен), однако что-то в этой функции не то. Вроде бы, «заменительная» часть выражения s/pattern/replace/g никогда не была опциональной, однако именно это мы видим в выражениях $a =~ s{/}g. Как же оно работает? Вот с этим мы сейчас и будем разбираться.
Читать дальше →
Total votes 46: ↑39 and ↓7 +32
Comments 54

Заказчик и его грабли

Reading time 3 min
Views 564
Lumber room
Все время при общении с фрилансерами сталкиваюсь с одними и теми же проблемами. Давайте взглянем на них со стороны заказчика. Итак, грабли и попытки их обойти. Сценарий «заказчик обращается к незнакомому фрилансеру».
Читать дальше →
Total votes 22: ↑16 and ↓6 +10
Comments 25

CMS своими руками. Теория велосипедостроения

Reading time 8 min
Views 24K
CMS *
Как много веселых ребят
И все делают велосипед.
А один из них как-нибудь утром
Придумает порох.
Виктор Цой.

image

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

Итак, я стал смотреть, по каким же запросам попадают ко мне начинающие «разработчики велосипедов», и постарался осветить некоторые вещи, которые для меня самого были неочевидны в начале работ.

Ну-с, показывайте ваши синяки...
Total votes 168: ↑147 and ↓21 +126
Comments 208

Какие ошибки в письмах делают люди и роботы

Reading time 7 min
Views 43K
Мосигра corporate blog
Каждый день мне пишут роботы и обычные люди. В топике я расскажу про глупые ошибки в письмах, которых можно легко избежать. А ещё — о том, как устроена обработка почты у нас в компании.

Читать дальше →
Total votes 80: ↑79 and ↓1 +78
Comments 67

Мегафон, роуминг и грабли: обычное дело с необычным концом

Reading time 3 min
Views 4.4K
Legislation in IT
image
История про Мегафон, роуминг и… собственно, этим уже всё сказано.

Началась эта история в конце июля, когда я решил сьездить в отпуск на Украину через Белоруссию, из родного Питера. Сменив пару лет назад своего оператора с Мегафона на Теле2, я оставил симку Мегафона и периодически кидал на неё 100-300 рублей, с настроенной переадресацией на Теле2. К сожалению, Теле2 не работает за пределами Питера и области, поэтому я решил воспользоваться мегафоновским номером, закинул на него денег до баланса порядка 500 рублей, и поехал.
Через день, где-то на территории Белоруссии, мне приходит СМС от Мегафона:
«Услуга Роуминг временно приостановлена. Роуминг подключится автоматически при балансе более 1500 руб. Справки *101#». Ну и, собственно, всё! Связи нет вообще, предлагаемый *101#, естественно, не набрать.
Читать дальше →
Total votes 114: ↑109 and ↓5 +104
Comments 36

Windows 8. Опыт публикации приложений в Windows Store

Reading time 6 min
Views 15K
«Alawar Entertainment» corporate blog Game development *
Windows Store

Привет всем, эта статья – о нашем опыте публикации десктопных и WinRT приложений в Windows Store. На данный момент опубликовано и доступно в магазине одно WinRT приложение и два обычных. В процессе разработки и публикации находятся ещё несколько.

Читать дальше →
Total votes 44: ↑31 and ↓13 +18
Comments 3

Про переводы

Reading time 6 min
Views 46K
Мосигра corporate blog Game development *

Это вот «Плаксовая манта» по версии издателя

Мы тут постоянно переводим настольные игры, и я в этом довольно живо участвую. Потому что, например, терпеть не могу объяснять «ночной столик» жестами или рисовать «базовый лагерь».

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

Имена в примерах

Почти все понимают, что в примерах должны участвовать Alice, Bob и другие товарищи по алфавиту. При этом в мнемонической системе ещё есть персонажи Eve и Mallory, которые не ложатся в последовательность, потому что это Eavesdropper и Malicious attacker, то есть пассивный и активный злоумышленники. В нашей мнемонической системе злоумышленника играет Зиновий, что часто придаёт особый шик переводам примеров.
Читать дальше →
Total votes 140: ↑138 and ↓2 +136
Comments 114

Практика IPv6

Reading time 4 min
Views 31K
Selectel corporate blog
Краткое содержание:
  • Новости облака Селектел:
    1. IPv6 во всех шаблонах включен по умолчанию. Все новые машины устанавливаются с настройками IPv6 и сразу после установки доступны по своему IPv6 адресу.
    2. В списке шаблонов доступна openSUSE 12.3 с ядром Linux 3.7-xen
  • Рассказ про практические проблемы, с которыми мы столкнулись при эксплуатации IPv6.


С openSUSE всё понятно, так что обсудим последствия IPv6.



Оригинал статьи в корпоративном блоге Селектел.

IPv6 для облачных серверов


Для всех виртуальных машин в пулах Санкт-Петербург (1) и Санкт-Петербург (2) при установке новых виртуальных машин и переустановке существующих поддержка IPv6 включается по умолчанию (и является предпочтительным протоколом для исходящих соединений). IPv4, разумеется, остаётся и работает. Раньше мы IPv6 выдавали, но по умолчанию не включали.

Зачем это нужно? Честно сказать, сейчас львиная доля Интернета работает на ipv4. Отдельные островки живого IPv6 есть в Азии, плюс несколько крупных сайтов (таких, как google.com, vk.com, facebook.com) отвечают по IPv6. Домашние пользователи в России практически все работают только по IPv4.
Вот более-менее актуальная информация о том, у кого из провайдеров России есть IPv6: version6.ru/isp

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

Что означает появление IPv6 с практической точки зрения для конкретно взятого облачного сервера?
О проблемах в postgre, dad и прочих сложных вещах
Total votes 75: ↑67 and ↓8 +59
Comments 27