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 5.3.* все три способа работают одинаково.
Конечно, хотелось бы, чтобы при попытке вызова нестатической функции таким способом всегда поднималась ошибка, но увы.
<?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 всё понятно и вопросов не возникает. Конечно, неприятно, что в строке адреса на чужом сайте будет появляться новый якорь, но пережить это можно, благо на историю браузера это не влияет. А вот другой способ более забавен.
Для передачи данных предлагается использовать в потомке конструкцию вида "
В моём случае было только два варианта размера виджета, поэтому проверка проводилась два раза с двумя разными именами. И оказалось, что при изменении
В итоге получалось, что
Основная проблема заключалась в том, что две страницы - родительская и находящаяся в 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 решил проблему окончательно.
Тормоза появились снова после открытия одного известного формума. Виновником оказался некий флешовый баннер. 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.
Режем:
Обратите внимание, что формат имени разрезанных файлов - ‘split-track01.flac’. Задать свой шаблон имени файла можно при помощи ключа -a у shnsplit.
Проставляем теги из cue:
Cuetag умеет обрабатывать flac, ogg и mp3 файлы. Не работает с именами файлов, содержащими пробелы.
Источник: Split lossless audio (ape, flac, wv, wav) by cue file in Ubuntu.
Конвертируем:
Для конвертации Nick Sklavenitis написал небольшой скрипт. Есть и альтернатива. Работают скрипты примерно одинаково, но первому нужно указать в качестве параметра имя файла (можно маску), второй же просто ищет все файлы в текущей директории. Оба скрипта проставляют теги.
Ну и не забываем подчистить за собой :)
Требуются следующие пакеты (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
Готово.
Попробуйте выполнить следущие команды:
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
При пришлось поддерживать проект, написанный с использованием этого фреймворка, и я просто в ужасе. Расскажу только об одной вещи - логгировании ошибок.
В 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.d eb и monkeys-audio_3.99-u4-b5-1~gutsy~7.10mlk _i386.deb, затем набирайте в консоли
Lame и mp3splt есть в репозитерии:
Параметры всех трёх программ просты и понятны. Однако можно пойти по пути наименьшего сопротивления, и использовать скрипт cueape.sh, который сделает всё сам. Используется он так:
Параметры: -m для кодирования в mp3 и -o для ogg.
И последнее замечание. Если названия треков русскоязычные, стоит проверить кодировку cue-файла и при необходимости конфертировать файл в UTF-8. Конвертировать из Windows-1251 можно так:
Здесь windows.cue - исходный файл, utf.cue - новый.
Ссылки:
Howto:convert ape to wav/mp3/ogg on Linux
Тема на Ubuntu Forums со ссылкой на скрипт для Наутилуса
Расширение .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.d
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-d river-fglrx
http://packages.ubuntu.com/intrepid/fglr x-kernel-source
http://packages.ubuntu.com/intrepid/jock ey-gtk
http://packages.ubuntu.com/intrepid/xser ver-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. Зато иксы с ним работают шустро, и - ура, наконец-то! - можно нормально смотреть видео. А без компиза я как-нибудь проживу.
Меня прежде всего интересовал свободный драйвер, который пришет Novell по заказу AMD. При наличии соединения с интернетом, можно сразу вытащить его из репозитория, скомпилировать и установить, однако мне было лень устанавливать git под Windows, и я решил пойти длинным путём - заставить работать проприетарный драйвер. Мануал-то в Сети есть, но что от него толку без интернета? Пришлось качать deb-бы вручную из-под Windows, после чего наконец удалось их установить.
Вот список адресов для тех, кому, как и мне, придётся качать всё вручную:
http://packages.ubuntu.com/intrepid/xorg-d
http://packages.ubuntu.com/intrepid/fglr
http://packages.ubuntu.com/intrepid/jock
http://packages.ubuntu.com/intrepid/xser
Устанавливаем как обычно - через 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. Зато иксы с ним работают шустро, и - ура, наконец-то! - можно нормально смотреть видео. А без компиза я как-нибудь проживу.