Вы читаете журнал [info]anei_w

Vim: меняем местами ключи и значения php-массива

Дек. 29, 2011 | 02:55 pm

Наш тестер сегодня спросил, как в Vim поменять местами ключи и значения массива. Говорит, что периодически начинает писать конфиг, а затем осознаёт, что нужно всё сделать ровно наоборот.
Массив выглядит примерно так:
$a = array(
    'key' => 'value',
    1 => 1235,
    'param' => $var
);
Конечно, самое правильное решение - сначала подумать, а потом писать. Но ворона - птица гордая и сильная. Решение:

vmap gf :s/\(^\s\+\)\([^\s].\{-}\)\s*=>\s*\([^,]*\)/\1\3 => \2/<CR>:noh<CR>
nmap gf :s/\(^\s\+\)\([^\s].\{-}\)\s*=>\s*\([^,]*\)/\1\3 => \2/<CR>:noh<CR>


Добавлять нужно в .vimrc.
Выделяем строчки, в которых нужно поменять местами ключи и значения, жмём gf и наслаждаемся результатом. В нормальном режиме команда действует на текущую строку.

Да пребудет с вами :help non-greedy
Метки: ,

Ссылка | Оставить комментарий | В избранное | Поделиться

PHP 5.2.10 callbacks

Июн. 14, 2011 | 12:09 pm

Интересная особенность работы коллбэков в PHP 5.2.10 (подозреваю всю ветку 5.2, но другие версии не проверял) при вызове нестатической функции как статической:

<?php

class A {
    public function b() {
        echo "Called function A::b()\n";
    }
}

A::b();
// Called function A::b()

call_user_func(array('A', 'b'));
// Called function A::b()

call_user_func('A::b');
// PHP Warning:  call_user_func(A::b): First argument is expected to be a valid callback in php shell code on line 1
?>


В PHP 5.3.* все три способа работают одинаково.
Конечно, хотелось бы, чтобы при попытке вызова нестатической функции таким способом всегда поднималась ошибка, но увы.
Метки:

Ссылка | Оставить комментарий | В избранное | Поделиться

Изменение размеров iframe. Доступ к iframe через top.frames

Окт. 15, 2010 | 10:51 am

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

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

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

Для передачи данных предлагается использовать в потомке конструкцию вида "window.name = 'h100';". В родительском фрейме делаем такую проверку: "if (top.frames['h100']) ...".
В моём случае было только два варианта размера виджета, поэтому проверка проводилась два раза с двумя разными именами. И оказалось, что при изменении window.name в фрейме, старое имя остаётся в top.frames родителя. В моём случае код был такой:

if (!h) if (top.frames['ged.calc.b']) { h='b'; }
if (!h) if (top.frames['ged.calc.s']) { h='s'; }


В итоге получалось, что top.frames['ged.calc.b'] и top.frames['ged.calc.s'] указывали на один и тот же объект - обращение к .location.href в обоих случаях успешно загружало старицу в iframe. Обнаружил я это в Firefox, Хром и Оперу на этот счёт не тестировал. Проблема решается просто - использованием оператора delete, но сам факт её наличия интересен.

Ссылка | Оставить комментарий | В избранное | Поделиться

Всё гораздо проще...

Дек. 22, 2009 | 11:50 am

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

Тормоза появились снова после открытия одного известного формума. Виновником оказался некий флешовый баннер. Flashblock решил проблему окончательно.
Метки:

Ссылка | Оставить комментарий {2} | В избранное | Поделиться

Convert FLAC+CUE to MP3 on Linux

Фев. 20, 2009 | 05:11 pm
music: Brian Setzer - Really Rockabilly

Алгоритм конвертации из flac в mp3 простой - режем, проставляем теги, конвертируем :)
Требуются следующие пакеты (Ubuntu): cuetools shntool flac lame.

Режем:
cuebreakpoints sample.cue | shnsplit -o flac sample.flac


Обратите внимание, что формат имени разрезанных файлов - ‘split-track01.flac’. Задать свой шаблон имени файла можно при помощи ключа -a у shnsplit.

Проставляем теги из cue:
cuetag sample.cue split-track*.flac


Cuetag умеет обрабатывать flac, ogg и mp3 файлы. Не работает с именами файлов, содержащими пробелы.

Источник: Split lossless audio (ape, flac, wv, wav) by cue file in Ubuntu.

Конвертируем:
Для конвертации Nick Sklavenitis написал небольшой скрипт. Есть и альтернатива. Работают скрипты примерно одинаково, но первому нужно указать в качестве параметра имя файла (можно маску), второй же просто ищет все файлы в текущей директории. Оба скрипта проставляют теги.

Ну и не забываем подчистить за собой :)
Метки: ,

Ссылка | Оставить комментарий | В избранное | Поделиться

Отсутствие звука после спящего режима в Ubuntu 8.10 Intrepid Ibex

Янв. 11, 2009 | 06:22 pm
music: Dire Straits - Tunnel Of Love

Ubuntu 8.10 отказывается проигрывать звук после выхода из спящего режима. Баг описан на LaunchPad, там же указано решение.

Попробуйте выполнить следущие команды:

sudo /etc/init.d/alsa-utils stop
sudo alsa force-reload
sudo /etc/init.d/alsa-utils start

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

sudo vim /etc/pm/sleep.d/fixsound

#!/bin/bash
/etc/init.d/alsa-utils stop
alsa force-reload
/etc/init.d/alsa-utils start

Установим права для скрипта:

sudo chmod 770 /etc/pm/sleep.d/fixsound

Готово.
Метки:

Ссылка | Оставить комментарий | В избранное | Поделиться

Image in label element bug (Internet Explorer)

Дек. 29, 2008 | 02:09 pm

Если поместить внутрь элемента <label> картинку, то в Internet Explorer при щелчке по картинке не призойдёт ничего полезного - чекбокс или радиокнопка, привязанные через атрибут for, не изменят своего состояния. Баг воспроизводится в IE7 и 8 (bug #348575). Баг помечен как не подлежащий исправлению, то есть раньше девятой версии ситуация не изменится. Решение одно - в IE повесить на картинку обработчик onclick. Пример такого скрипта можно посмотреть здесь.
Метки: ,

Ссылка | Оставить комментарий | В избранное | Поделиться

CodeIgniter

Дек. 11, 2008 | 05:43 pm
music: Tony Joe White - Aint Goin Down This Time

CodeIgniter - это php-фреймворк. Быстрый, лёгкий и ужасно написаный.
При пришлось поддерживать проект, написанный с использованием этого фреймворка, и я просто в ужасе. Расскажу только об одной вещи - логгировании ошибок.

В CI прописан хендлер для отлова ошибок, названный почему-то “_exception_handler”. Он красиво оборачивает ошибки и выводит из пользователю, ориентируясь на значение error_reporting, которое в проекте устанавливается в 0 через функцию одноимённую функцию php. Вам уже смешно? Мне - нет. Потому что на значение директивы display_errors из php.ini CI плюёт с большой колокольни, выводя ошибки на экран в любом случае. Вывод ошибок на экран не отключается. Если мы не хотим, чтобы пользователь видел ошибки на продакшене, нужно установить error_reporting в 0.

“Люто, яростно ненавижу” (c) Mithgol
Метки:

Ссылка | Оставить комментарий {1} | В избранное | Поделиться

Convert APE to MP3 in Ubuntu

Дек. 4, 2008 | 02:42 pm

По мотивам мануала “Howto:convert ape to wav/mp3/ogg on Linux”. Предполагается, что читатель знает, что такое консоль, и не испытывает перед ней первобытного ужаса.

Расширение .ape соответствует формату Monkey’s Audio, который позволяет кодировать музыку без потери качества. Для конвертации музыки из этого формата в mp3 нужны следующие программы:

mac - утилита для кодирования и декодирования формата ape.
lame - не нуждается в представлении
mp3splt - для разрезания mp3 согласно информации из cue-файла

mac берём отсюда. Несмотря на то, что последняя версия там для Ubuntu 7.10, на 8.10 всё тоже работает отлично. Качайте в отдельную директорию libmac2_3.99-u4-b5-1~gutsy~7.10mlk_i386.deb и monkeys-audio_3.99-u4-b5-1~gutsy~7.10mlk_i386.deb, затем набирайте в консоли
sudo dpkg -i *


Lame и mp3splt есть в репозитерии:
sudo apt-get install lame mp3splt


Параметры всех трёх программ просты и понятны. Однако можно пойти по пути наименьшего сопротивления, и использовать скрипт cueape.sh, который сделает всё сам. Используется он так:
./cueape.sh [input ape file] [input cue file] [parameters]

Параметры: -m для кодирования в mp3 и -o для ogg.

И последнее замечание. Если названия треков русскоязычные, стоит проверить кодировку cue-файла и при необходимости конфертировать файл в UTF-8. Конвертировать из Windows-1251 можно так:
iconv -fcp1251 -tutf8 -owindows.cue utf.cue

Здесь windows.cue - исходный файл, utf.cue - новый.

Ссылки:
Howto:convert ape to wav/mp3/ogg on Linux
Тема на Ubuntu Forums со ссылкой на скрипт для Наутилуса
Метки: ,

Ссылка | Оставить комментарий {1} | В избранное | Поделиться

Драйвера ATI Radeon для Ubuntu 8.10

Ноя. 24, 2008 | 02:11 am
music: Ничего не воспроизводится

После обновления до Ubuntu 8.10 меня ожидал неприятный, хоть и ожидаемый сюрприз - начисто отказались стартовать иксы. Проблема заключается в драйвере fglrx из стандартной поставки, который не работает с многими атишными карточками, в том числе и с моей x2400. Ситуация осложнялась тем, что интернет у меня на ноутбуке только через WiFi, а его настройку из консоли я не осилил.
Меня прежде всего интересовал свободный драйвер, который пришет Novell по заказу AMD. При наличии соединения с интернетом, можно сразу вытащить его из репозитория, скомпилировать и установить, однако мне было лень устанавливать git под Windows, и я решил пойти длинным путём - заставить работать проприетарный драйвер. Мануал-то в Сети есть, но что от него толку без интернета? Пришлось качать deb-бы вручную из-под Windows, после чего наконец удалось их установить.
Вот список адресов для тех, кому, как и мне, придётся качать всё вручную:
http://packages.ubuntu.com/intrepid/xorg-driver-fglrx
http://packages.ubuntu.com/intrepid/fglrx-kernel-source
http://packages.ubuntu.com/intrepid/jockey-gtk
http://packages.ubuntu.com/intrepid/xserver-xorg-video-radeon
Устанавливаем как обычно - через sudo dpkg -i
aticonfig --initial может ругаться на отсутствие файлов /etc/ati/control и /etc/ati/amdpcsdb.default
Не беда:

sudo cp /etc/ati/control.dpkg-new /etc/ati/control
sudo cp /etc/ati/amdpcsdb.default.dpkg-new /etc/ati/amdpcsdb.default


После выполнения aticonfig --initial иксы стартовали успешно.
Но родной проприетарный драйвер мне не нравится абсолютно, я давно хотел попробовать свободный radeonhd. Ставил из git-репозитория по этому мануалу. Всё прошло абсолютно успешно, проблем не возникло никаких.
Да, с этим драйвером не работает компиз и 3D. Зато иксы с ним работают шустро, и - ура, наконец-то! - можно нормально смотреть видео. А без компиза я как-нибудь проживу.
Метки: , ,

Ссылка | Оставить комментарий {1} | В избранное | Поделиться