PHP+Apache: глюк?

Категории: Разработка

Сегодня столкнулся с совершенно с чудовищным по своей странности багом.

Есть код. Простейший.

$a = array('' => 'value');

$key = '';  
$falseKey = false;  
$falseKey = (string)$falseKey; // $falseKey === '' будет true

var_dump(isset($a[$key]));  
var_dump(isset($a[$falseKey]));

Вы думаете, что в обоих случаях код выведет true?
А вот и нет.

Существуют какие-то глюки в связке модуля пхп и апача, которые приводят к тому, что во втором случае код выдаст false.

Это не вылечилось перезагрузкой апача. Вылечилось лишь его полной остановкой и запуском.

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

UPD (13.12.2015):
Таки “автором” этого глюка выступило расширение xdebug. К сожалению детального разбора проблемы я не осуществлял. Просто если вы встретились с неверным пониманием языком типов переменных, то смотрите в сторону xdebug.

Qt: настройка системы рендеринга

qt-graphicssystemЛинуксоиды разучились пользоваться консолью? :) Сломал себе систему рендерига до такой степени, что кеды показывали лишь черный экран с курсором.

Поскольку есть лишь консоль, то гугление в линксе на тему расположения конфига, в котором указана система рендеринга показывало лишь результаты, где народ рекомендовал поставить kcm-qt-graphicssystem.
Все это хорошо, но иксов-то нет.

А на деле все оказалось очень просто. Этот пресловутый модуль kcm просто правит содержимое файла

~/.kde/env/qt-graphicssystem.sh

В этом файле лишь одна строчка:

export QT_GRAPHICSSYSTEM=native

Файл есть не что иное, как глобальный экспорт переменной в сеансе kde. Нет никаких специальных файлов конфигурации (привет, dconf2!).

Поэтому если вы угробите свои кеды - просто пропишите другую систему в этот файл: native, raster или opengl.

Eclipse: корявый интерфейс в KDE

Категории: Разработка

eclipse-theme-dialog

Уже несколько вечеров я ломаю голову над вопросом: “почему в eclipse 4.5 (mars) застывает интерфейс при открытии выпадающих списков?”
Проявляется так:

  • открываем выпадающий список
  • пытаемся выбрать в нем пункт, а пункт не выбирается

Закрыть такой “зависший список можно только прицельным щелчком на стрелочке или нажатием на esc.

Из других интерфейсных проблем: наползание виджетов друг на друга как на скрине в начале статьи.

И последняя проблема - это рандомные креши.

К слову, все это происходит в kde 4.

Я грешил на все: кривые rpm, неправильную сборку самой eclipse и всякое-разное.

Но оказалось все гораздо проще: креши и фризы связаны с темой oxygen-gtk (кто-бы мог подумать). И самый первый репорт датируется аж 2014 годом. И его вроде даже закрыли.

В тему того же бага несколько другой: Bug 470994 - [GTK3] Eclipse Mars on Linux with oxygen-gtk theme looks unfinished.

Он как раз про вторую проблему с перекрывающимися виджетами.

Решается все просто: ставим нормальную тему gtk2 (bluecurve можно).
И выбираем ее в настройках кедов.

eclipse-theme-settings

Теперь с виджетами все ок, а выпадающие списки работают.
eclipse-theme-result

Bash: копирование файлов из списка

Категории: Разработка linux

Copy files (screenshot) Задача: у нас есть файл со списком стилей/скриптов/бинарников (нужное подчернуть) которые надо скопировать или переместить в другое место.
Да. Такие задачи бывают. :)

Допустим выглядит файл как-то так

$ cat css.txt  
css/reset-ls.css  
css/b-browser.css  
css/reg-form.css  
css/old/pop-up.css

Пути либо относительные, либо полные.

Скопировать все в новый локейшн можно простым однострочником

$ for i in $(cat css.txt); do cp $i /tmp/; done

Nginx: редирект на другую платформу/площадку при 404

Категории: Разработка

nginx_with_two_upstreamКазалось бы: что может быть проще, чем взять два бекенда и одну точку входа.
Когда первый бекенд не отвечает (или отвечает, но 404), то перенаправлять запрос (как можно прозначнее для пользователя) на второй бекенд.
Правильно! :) Проще быть ничего не может.

location / {  
 # Отправляем все 404 на @backendB  
 error_page 404 = @backendB;  
 proxy_intercept_errors on;  
 log_not_found off;  
 # Try the proxy like normal  
 proxy_set_header X-Forwarded-For $remote_addr;  
 proxy_set_header Host $host;  
 proxy_set_header X-Real-IP $remote_addr;  
 proxy_pass http://127.0.0.1:8081;  
}

location @backendB {  
 # Резервный бекенд  
 proxy_set_header X-Forwarded-For $remote_addr;  
 proxy_set_header Host $host;  
 proxy_set_header X-Real-IP $remote_addr;  
 proxy_pass http://127.0.0.1:8082;

# Настоящую 404ую мы уже получим от этого бекенда.

}