barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 29 июля 2011 г.

cmd.exe - открытие программы в новом командном окне

Команда "start" открывает любую команду в новом командном окне:

start ["заголовок"] [/dпуть] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [имя_файла] [параметры]

Основные параметры следующие:
  •  "заголовок" - задает заголовок окна
  •  /d - задает каталог запуска
  •  /wait - запускает приложение с окончанием завершения его работы
  •  имя_файла - имя исполняемого файла для запуска 
  •  параметры - параметры, передаваемые запускаемому приложению  

    четверг, 28 июля 2011 г.

    Имя пакета PostgreSQL-модуля для PHP в Debian

     php5-pgsql

    Отключение "живой сессии" в 1С-Битрикс

    "Живая сессия" в 1С-Битрикс позволяет не закрывать сессию на сервере, пока активно окно браузера пользователя. Однако, несмотря на очевидные плюсы, решение это потребляет трафик, причем значительно (10-20 Мб за пару часов). Хорошо, что разработчики Битрикса предусмотрели возможность её отключить:

    Настройки -> Настройки Продукта -> Настройки модулей -> Главный модуль -> Вкладка "Авторизация" -> Снять галочку "Продлевать сессию при активности посетителя в окне браузера".

    вторник, 26 июля 2011 г.

    ucfirst для utf8 строк в php

    function mb_ucfirst($str)
    {
         $str[0] = mb_strtoupper($str[0]);
         return $str;
    }

    Изменение location.hash без записи в историю браузера

    Для организации своей системы навигации по сайту очень удобно использовать hash-часть адреса (расположенную после "#"). Если из JavaScript изменять значение location.hash простым присваиванием (кстати, location.hash содержит не только все то, что расположено после символа "#", но и его самого), то каждое изменение будет запоминаться браузером и использоваться, например, при нажатии кнопки "Назад". Такое поведение не всегда удобно, т.к. пользователь может ожидать, что при нажатии "Назад" он вернется на предыдущую страницу, а не будет гулять по всей истории своих hash-переходов в пределах данной страницы. В таком случае необходимо не менять hash-часть не непосредственно, а использовать метод location.replace():

    location.replace(location.protocol+"//"+location.host+location.pathname+location.search+"#"+newHashValue);

    Такое изменение не вызовет перезагрузки страницы, т.к. изменилась только hash-часть адреса, а также не будет сохранено в истории браузера (точнее в истории браузера предыдущий адрес будет заменен на новый).

    понедельник, 25 июля 2011 г.

    Как убрать рамку вокруг ссылок в IE / Firefox

    a
         {
         outline:none;
         }

    Извлечение двоичных данных (типа bytea) из PostgreSQL в PHP

    После выполнения SELECT`а с извлечением данных из столбца Postgres необходимо данные, извлеченные из таблицы, пропустить через функцию pg_unescape_bytea():

    $arr = pg_fetch_assoc($result);
    $arr["blob_col"] = pg_unescape_bytea($arr["blob_col"]);

    Для записи двоичных данных в Postgres перед выполнением соответствующего INSERT / UPDATE двоичные данные пропускаются через функцию pg_escape_bytea().

    среда, 20 июля 2011 г.

    cp1251 в php + utf8 в PostgreSQL

    Проблема: БД использует кодировку UTF-8, php-страница, на которой нужно отображать данные из БД - cp1251.

    Решение: в строку соединения с БД postgres добавить опцию options='--client_encoding=WIN', т.е. получится нечто вроде:

    pg_connect("host=some_host port=5432 user=root password=root dbname=mydb options='--client_encoding=WIN'");

    понедельник, 18 июля 2011 г.

    Неперетаскивающиеся значки на рабочем столе XFCE

    Проблема: значки на рабочем столе не перетаскиваются, при попытке начать двигать мышкой, зажав левую кнопку на значке, начинается выделение вместо перетаскивания.
    Причина: конфликт с xneur.
    Решение: добавить Xfdesktop в список не обрабатываемых (в gxneur: Настройки -> Приложения -> Не обрабатываеть эти приложения -> Добавить). Регистр в названии приложения Xfdesktop важен!

    пятница, 15 июля 2011 г.

    Файл настройки соединения с БД в 1С-Битрикс

    Файл лежит тут (относительно директории устновки битрикса):

    bitrix/php_interface/dbconn.php

    В нём находятся все параметры соединения с БД, которую Битрикс использует для хранения данных. Там можно, например, посмотреть пароль от БД, если Вы его забыли или никогда и не знали ;)

    Проверка открытости порта на php

    Проверка открытости порта $port на компьютере с ip $ip (с таймаутом подключения $wait в секундах):

    $that = @fsockopen($ip, $port, $errno, $errstr, $wait);
    if($that)
         {
         echo "Порт $ip : $port открыт";
         }
    else
         {
         echo "Порт $ip : $port закрыт";
         }

    ping в php

    Если в php не запрещен exec, то выполнить ping можно следующим образом:

    exec("ping -c 1 -w 200 $db_host",$output, $status); // для Windows: -n вместо -c
    if ($status==0)
         echo "Online";
    else
         echo "Offline";

    Кодировка POST/GET параметров в Glasshfish 2

    Проблема: при передаче из формы данных на JSP-страницу русские символы превращаются в чепуху, хотя кодировки всех страниц - UTF-8. Причем это случается только при использовании в качестве контейнера Glassfish, с Tomcat 6 все нормально.

    Решение: в файл sun-web.xml проекта вставить следующие строчки в блок <sun-web-app>:

    <locale-charset-info>
         <locale-charset-map locale="" charset=""/>
         <parameter-encoding default-charset="UTF-8"/>
    </locale-charset-info>


    суббота, 9 июля 2011 г.

    Переключение раскладок в XFCE

    В XFCE оказывается также беда с раскладками, что и в LXDE (http://barbitoff.blogspot.com/2011/06/lxde.html). Решается также, вызовом из консоли:
    setxkbmap -option grp:switch,grp:alt_shift_toggle us,ru
    Аналога etc/xdg/lxsession/LXDE/autostart для XFCE не нашел, поэтому зашел Настройки -> Диспетчер настроек XFCE -> Сеансы и Запуск -> Автозапуск приложений -> Добавить, куда и вставил написанную выше команду.
    Ну или можно руками положить файл с расширением .desktop и любым именем в ~/.config/autostart со следующим содержанием:
    [Desktop Entry]
    Encoding=UTF-8
    Version=0.9.4
    Type=Application
    Name=keymap
    Comment=
    Exec=setxkbmap -option grp:switch,grp:alt_shift_toggle us,ru
    StartupNotify=false
    Terminal=false
    Hidden=false

    Логи сервлетов Tomcat

    Логи, записываемые сервлетами (вызовом config.getServletContext().log("...")), выполняемыми Apache Tomcat, помещаются в /var/log/tomcat6/ в файлы с именами вида <vhostName>.<yyyy-mm-dd>.log (например, localhost.2011-07-09.log).

    Адрес административной панели Apache Tomcat в Debian Squeeze

    Для доступа к административной панели Tomcat, установленного из репов Debian, во-первых, нужно установить пакет tomcat6-admin. После этого, необходимо добавить пользователя с ролью "manager", добавив в файл /etc/tomcat6/tomcat-users.xml строчку вида:
    <user username="iammanager" password="mypass" roles="manager"/>
    Теперь под этим пользователем можно зайти по адресу (предварительно перезапустив Tomcat):
    http://localhost:8080/manager/html/
    Для доступа к панели управления хостом (host-manager), необходима роль "admin", т.е. в /etc/tomcat6/tomcat-users.xml необходимо написать следующее (если Вы хотите, чтобы пользователь iammanager был не только "manager", но и "admin"):
    <user username="iammanager" password="mypass" roles="manager,admin"/>
    Теперь можно войти и в панель управления хостом по адресу:
    http://localhost:8080/host-manager/html

    четверг, 7 июля 2011 г.

    Редактор с подсветкой синтаскиса ActionScript под Linux

    От одной только подсветки синтаксиса толку конечно мало, но бывает нужна именно она (просто посмотреть какой-нибудь файлик). Нашел замечательную вещь - Geany (в репозитории Debian присутствует) - не просто подсвечивает синтаксис, но вообще является IDE (компиляторов правда он не включает, их нужно подключать отдельно). Т.е. для того же ActionScript он показывает классы, методы и члены класса (намешал правда все в кучу - и члены класса, и локальные переменные в методах, так что не очень юзабельно).

    воскресенье, 3 июля 2011 г.

    Регистронезависимое сравнение строк в SQLite

    По-умолчанию сравнение строк в SQLite - бинарное (в отличие от MySQL). Есть несколько вариантов сделать его регистронезависимым:
    1) добавив COLLATE NOCASE после оператора сравнения: ... WHERE a = b COLLATE NOCASE
    2) добавив COLLATE NOCASE в объявление столбца таблицы, если для него всегда должно использоваться регистронезависимое сравнение (однако, это значение может быть переопределено в конкретном запросе установкой соответствующего COLLATE):
    CREATE TABLE somename(
    ...
    d VARCHAR(20) COLLATE NOCASE
    ...
    )

    суббота, 2 июля 2011 г.

    AUTO_INCREMENT в SQLite

    В отличие от MySQL, в SQLite автоинкрементный первичный ключ должен задаваться следующим образом:

    id INTEGER PRIMARY KEY AUTOINCREMENT

    т.е. "INTEGER" целиком (а не INT), большими или маленькими буквами, и AUTOINCREMENT без "_" как в MySQL. Если написать как в MySQL, то поле вообще не становится ключевым, и если его пропускать в INSERT`ах, оно будет пустым, и никаких ошибок при этом возникать не будет. При этом роль ключа всё равно будет выполнять 64-битный псевдостолбец ROWID.

    пятница, 1 июля 2011 г.

    Fancybox и Blogspot

    В интеграции Fancybox в блог на платформе Blogspot есть одна весомая проблема: fancybox предполагает размещение всех своих файлов (3 js, 1 css и аж 20 картинок) в каком-либо каталоге. На платформе блогспот такая возможность не предусмотрена. Поэтому приходится делать следующее:
    1. Во-первых, для работы Fancybox нужен jQuery. Т.к. библиотека jQuery доступна сразу на нескольких сайтах (http://code.jquery.com/jquery-1.6.1.min.js, https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js), то можно просто включить ссылку на неё в шаблон (Дизайн -> Изменить HTML -> Добавить <script language='JavaScript' src='http://code.jquery.com/jquery-1.6.1.min.js' type='text/javascript'/> в head).

    2. Со скриптами Fancybox (сам fancybox и необходимые для эффектов и переключения фотографий колесом jquery-плагины easing и mousewheel) можно поступить по-разному. Во-первых, можно вставить их аналогично п.1 в шаблон, только уже непосредственно, открыв тег <script> и вставив исходный текст туда. Но мне, например, сам Fancybox, в отличие от jQuery, был нужен только в одном единственном посте (точнее, странице), поэтом я открыл <script language="javascript" type="text/javascript"> в самом посте и вставил текст библиотек туда, чтобы не загружать шаблон.

    3. Теперь нужно разобраться с картинками. Если нет своего хоста, куда можно их положить, проще всего пожалуй будет залить их на blogspot (создать новое сообщение, там перейти в "Изменить Html", где нажать на "Добавить изображение" и методично залить все 20 картинок. В итоге в теле сообщения появятся теги с картинками, из них нам нужны только ссылки (вида http://1.bp.blogspot.com/-JVCSBJ0vUyQ/Tg ... ). Теперь открываем css Fancybox`a, и заменяем там все ссылки на картинки (url(*.png) и AlphaImageLoader(src='*.png')) ссылками на только что залитые на blogspot картинки.

    4. Все, css готов к вставке в блог. Идем в Дизайн -> Дизайнер шаблонов -> Дополнительно -> Добавить CSS, куда и вставляем отредактированный в п.3 код. (ну или можно вставить его в тег <style> в html-коде шаблона).

    5. Все, fancybox готов к использованию в постах блога.
    UP от 08.08.2012: уже не помню, про какую версию Fancybox я писал этот пост, но с текущей версией (2.0.6) все гораздо проще: картинки там всего 3 (blank.gif, fancybox_loading.gif и fancybox_sprite.png), что порядком упрощает задачу.