Программируя на Си многие сталкивались с такими функциями как memcpy()
и memmove()
, по сути, функции делают одно и тоже, но вторая корректно отрабатывает ситуацию, когда области памяти перекрываются (на что появляются дополнительные накладные расходы).
В мире С++ никто не запрещает пользоваться этими функциями (часто эти функции используют различные механизмы оптимизации и могут статься быстрее своих собратьев из мира C++), но есть и более родное средство, работающее через итераторы: std::copy
. Это средство применимо не только к POD типам, а к любым сущностям, поддерживающим итераторы. О деталях реализации в стандарте ничего не сказано, но можно предположить, что разработчики библиотеки не настолько глупы, что бы не использовать, оптимизированные memcpy()
/memmove()
когда это возможно.
Но по наитию, хочется посмотреть, а что там с пересекающимися областями (overlapping memory blocks)? Ведь задача, на самом деле, не такая уж редкая. К примеру, хотим мы читать MPEG-TS пакеты (размер каждого 188 байт, каждый пакет начинается с 0x47 /sync byte/) из какого-то потока, и есть вероятность, что первое (а может и последующее, либо имеем дело с M2TS контейнером, размер блока которого 192 байта и лишние 4 байта в большинстве случаем мы можем игнорировать) чтение может попасть на середину пакета. В таких случаях обычно делается так: вычитываем блок 188 байт, далее ищем байт синхронизации, если он в нулевой позиции - всё отлично, если нет, то данные от него и до конца, нужно переместить в начало блока, в освободившееся место нужно дочитать недостающу порцию, после чего пакет считается вычитанным и можно отдавать его на обработку.
Наглядно процесс копирования данных в начало блока можно показать этой картинкой:
Т.е. видим, что есть перекрытие. Логично, было бы применить какой-то аналог memmove()
, но в стандартной библиотеке есть только std::move
который делает совершенно не то. Но при этом, читая описание для std::copy
(
http://www.cplusplus.com/reference/algorithm/copy) видим следующую строчку:
The ranges shall not overlap in such a way that result points to an element in the range [first,last).
т.е. на самом деле, если начало области (result) куда копировать, лежит вне области [first,last), то всё должно быть ок. И это реально так.
Но посмотрим такую схему копирования с перекрытием:
пока не обращаем внимание на то, что result тут в конце. Смысл картинки в том, что блок памяти нужно сдвинуть с начала на какое-то смещение вперёд, соответственно если это смещение меньше размера сдвигаемого блока, то адрес назначения у нас будет лежать в пределах [first,last), таким образом условие применимости std::copy
не соблюдаются. И если применить его, мы просто затрём данным в перекрывающейся области.
Но тут на помощь нам приходит его собрат, как раз решающий эту проблему: std::copy_backward
, всё отличие этой функции в том, что он осуществляет копирование с конца. Т.е. для случая изображённой на второй картинке, он возьмёт (далее очень грубо, т.е. на самом деле last и result это указатели на конец блока, а ближайшие данные находятся по last-1 и result-1) элемент из last и ложится в result, далее из last-1 в result-1, далее из last-2 в result-2 и так далее.
Видно, что при такой схеме копирования, когда мы начнём писать в перекрывающуюся область, данные в ней уже будут обработаны. Т.е. для нас всё хорошо. Забавно, что условие применимости при перекрывающийся областях для std::copy_backward
слово в слово повторяет данное условие для std::copy
.
Итак, резюмируя, простое правило:
- Если result < first (“сдвиг блока к началу /или влево/”), то применяем
std::copy
, в качестве result указываем НАЧАЛО блока-назначения.
- Если result > first (“сдвиг блока к концу /или вправо/”), то применяем
std::copy_backward
, в качестве result указываем КОНЕЦ блока-назначения.
Текст является творческим переосмыслением англоязычной статьи:
http://www.trilithium.com/johan/2006/02/copy-confusion, картинки взяты от туда же, пример из собственного опыта.
Референс:
PS Статья была опубликована на Habrahabr:
http://habrahabr.ru/post/218451
В синтаксисе регулярок в GCC 4.8.1/libstdc++4.8 нет поддержки квадратных скобок: []
. Пришлось использовать Boost.Regex
Ах да, пруф:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631
Да, времена, когда нужно было считать модлайны, дабы выжать из своего монитора и видюхи максимум уже прошли (вздох, вспомнив пару ADI Microscan 4V и S3 Trio 64V+). Но если вас настигла проблема или вдруг, как мне, для тестов, потребовалось нестандартное разрешение экрана, то вот простой калькулятор:
http://www.arachnoid.com/modelines/
Ниже по тексту идёт теория, а так же информация о том, куда нужно вставлять полученный модлайн.
Про калькулятор написал, что простой. Не хороший, а простой. Почему так? А потому, что очень много тонких настроек скрыто, по сути, вы задаёте жалемое разрешение и частоту обновления. Ну а для более тонкой настройки есть и другие, типа:
http://xtiming.sourceforge.net/cgi-bin/xtiming.pl
В оффлайне, аналогами этих калькуляторов, пожалуй будут: gtf
и xvidtune
Первая прячется в пакете (debian-based) xserver-xorg-core
, вторая в пакете x11-xserver-utils
.
Пользоватся gtf
так же просто как первым описанным калькулятором, просто передаём ей разрешение и частоту на вход, получаем результат:
$ gtf 800 480 60
# 800x480 @ 60.00 Hz (GTF) hsync: 29.82 kHz; pclk: 29.58 MHz
Modeline "800x480_60.00" 29.58 800 816 896 992 480 481 484 497 -HSync +Vsync
xvidtune
своим названием говорит: запускам и тюним в интерактивном режиме.
Для добавления сгенерированного ModeLine нужно добавить его в секцию “Monitor” в /etc/X11/xorg.conf
или создать файл /etc/X11/xorg.conf.d/00-modeline.conf
примерно следующего содержимого:
Section "Monitor"
ModeLine "800x480_60.00" 29.58 800 816 896 992 480 481 484 497 -hsync +vsync
EndSection
Можно добавить параметр Identifier
что бы указать к какому монитору добавлять.
Второй вариант: использовать xrandr
.
Выглядит это примерно так:
xrandr --newmode "800x480_60.00" 29.58 800 816 896 992 480 481 484 497 -HSync +Vsync
xrandr --addmode HDMI1 "800x480_60.00"
xrandr --output HDMI1 --mode "800x480_60.00"
Больше теории о ModeLine:
Если возникнет вопрос, что мол, скоро Wayland закопает XOrg, то ответ простой:
- если и закопает, то не скоро
- и подобные знания могут потребоваться внезапно, к примеру, генератор Marshall V-SG4K-HDI позволяет задать кастомный сигнал, и тут как раз пригодится mode line
- может потребовать для конфигурирования Frame Buffer без иксов и Wayland вообще
Итак, буквально перед новым годом стал обладателем горелки китайского производства BRS-8
Плюс этой горелки - её цена. Мне она обошлась в 2200 рублей в местном магазине во Владивостоке. Естественно встал вопрос надёжности отдельных частей, всё же “китай” в России уже термин нарицательный, описывающий определённое качество товаров, крайне далеко отстоящее от положительного.
Гугление особо ничего не дало, многократных подтверждений и особых болезней тоже не было выявлено, но получилось выделить следующее (наиболее собрано получилось тут:
http://www.youtube.com/watch?v=jEds1uRhWkI):
- Износ шланга, травление в районе крепления к штуцеру со стороны регулятора и крепления к самой горелки
- Износ регулятора, начинает сифонить, при этом изнашивается не резиновые прокладки, а металл (!!!)
- Насос, точнее резьба, которая вкручивается в баллон, из-за своей пластиковой природы изнашивается. У некоторых сифонит по периметру, в месте вхождения насоса в пробку.
Логичным путём было поискать возможные замены для отдельных узлов и агрегатов. И тут… у меня родилась мысль…
В названии этой горелки в разных каталогах встречается приписка “Booster +1”, что как бы намекает на отношение этой горелки к
Kovea KB-0603 Booster +1. Действительно, визуальное сравнение по фотографиям приводит только к следующим различиям:
- форма ног самой печки;
- наличие бутылки в комплекте BRS-8
- более скудный ремкомплект у BRS-8
- отсутствие переходника на цанговый баллон у BRS-8
Всё. Визуальных конструкционных раздичий больше не наблюдается. Шланг, регулятор, насос, рассекатель пламени (он и оригинального бустера нередко теряется) похожи как, почти, две капли воды. Сами поглядите:
Соответственно было решено попытаться заказать комплектующие от оригинального бустера, примерить на китайский BRS-8 и посчитать результирующую стоимость полученного мутанта.
Насос, пока, было решено не покупать, а когда потребуется, взять в местном магазине (ровно как и ремкомплект и переходник на цанговый баллон). Шланг, регулятор и рассекатель пламени брались на
http://kovea.ru. При этом, в каталоге их нет, поэтому нужно писать на
eshop@kovea.ru или
service@kovea.ru. Стоимость этих позиций узнаётся в этом разделе:
http://kovea.ru/page/service/. Жителям Москвы будет проще лично забрать необходимые позиции там, для удалёнки, оплата через робокассу (почти все возможные методы оплаты) и доставка EMS или другой курьерской службой.
Подкатом много картинок. Здесь и далее все изображение кликабельны.
Давно хотелось иметь в PlantUML возможно в Sequence диаграмме рисовать две параллельные ветки выполнения (на самом деле иногда больше, но хотя бы…).
И вот, случайно в последней версии нащупал такую команду:
Т.е. при примерно таком коде:
@startuml
hide footbox
A++
par2
A -> B ++
B -> B ++
return
return
else
A -> C ++
C -> C ++
end
A--
@enduml
мы получим следующую картинку:
в общем, чего и хотелось.
Правда при таком подходе, если, допустим, A, B и C - разные потоки, то операции с A нужно корректно вставлять в одну из веток par2
PS в примере можно видеть различные операции типа ++
и --
найти их описание можно здесь:
http://plantuml.sourceforge.net/incubation.html
Люблю работать с бумажными носителями. Люблю гаджеты, облегчающие эту работу. И хоть я не пишу под мобильные платформы, но информация о средствах прототипирования пользовательского интерфейса для мобильных приложений с помощью бумаги меня заинтересовала. Итак:
- Блокноты для прототипирования:
http://onapkin.com/shop/ удобны, но не обязательны
1. Ещё блокноты:
- Программа для склейки и анимирования:
https://popapp.in/, там же: демонстрация работы.
- Статья на хабре про трафарет для iPhone:
http://habrahabr.ru/post/209002/, трафареты для Android на сайте производителя:
1.
http://www.uistencils.com/collections/frontpage/products/android-tablet-stencil-kit - для планшетов
2.
http://www.uistencils.com/collections/frontpage/products/android-stencil-kit - для телефонов
Особнячком, русский магазин, который возит на заказ:
http://moiprototip.ru/
Не думаю, что проблема дистрибутивно-специфичная, но писать буду про Linux Mint 16.
Итак, имеем проблему: при загрузке с CD и уже в самой системе после установки у нас заблокирован Wifi:
user@user-X551CAP ~ $ rfkill list
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: yes
2: asus-wlan: Wireless LAN
Soft blocked: no
Hard blocked: no
3: asus-bluetooth: Bluetooth
Soft blocked: no
Hard blocked: no
4: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
Обращаем внимание на строку
для устройства phy0
. Обычно такое бывает когда карта выключена или через BIOS или через переключатель корпусе ноутбука. В случае конкретной модели Asus это состояние должно переклчаться через Fn-F2. Да вот беда: не работает эта комбинация. Вызов acpi_listen
молчит как партизан при нажатии этой кнопки.
Но самым шоком стало то, что после засыпания и просыпания карта включалась! Собственно это стало поводом к поиску. И… первым воркэраундом :)
Перебирая выводы команд lspci -nn
, lsmod
, изучил какие модули используются. Особо заинтересовали модули из серии wmi - Windows Management Instrumentation и, в частности, asus_nb_wmi отвечающий, судя по всему за трансляцию различных клавиатурных эвентов, и его опция wapf, которая, судя по интернетам, отвечает за поведение клавиш включения/выключения Wifi и Bt.
Итак, погуглив по интернетам, нахожу следующие ссылки:
-
http://ubuntuforums.org/showthread.php?t=2173539
-
http://ubuntuforums.org/showthread.php?t=2172434
В общем, вроде как у некоторых проблему решает. Забегая вперёд хочу отметить: wifi заработал со значением wapf равным единице, но сама клавиша Fn-F2 - нет. Пробовать начинал с 0. Беда в том, что просто перегрузка модуля не помогает, нужно или полностью перегружать модули для карты и всего сопутствующего или просто перегружать комп.
В общем решение: создаём файл /etc/modprobe.d/asus.conf следующего содержимого:
options asus_nb_wmi wapf=1
и перегружаем комп.
Отмечу, что ещё до этого решения я задал через параметры ядра (задал в /etc/default/grub.conf) следующие настройки:
GRUB_CMDLINE_LINUX_DEFAULT="... rfkill.master_switch_mode=2 rfkill.default_state=1"
Быть может они помогли в комплексе, но проверять WAPF без параметров для rfkill было уже лень.
Ссылки по теме:
https://gist.github.com/endolith/157796 и
http://www.alanwood.net/unicode/emoticons.html
Краткая выдержка, есть вероятность, что не во всех шрифтах будет отображаться корректно:
☹
☺
☻
♾
〠 smile in hat
ツ
㋡
😁
😃
😆
😇
😈
😉
😊
😋
😌
😎
😏
😐
😞
😠
😣
😲
😹
😺
Ставим из PPA kubuntu-ppa/backports. Подробности:
-
http://www.ubuntuupdates.org/package/kubuntu-ppa_backports/saucy/main/base/kdevelop
-
http://www.ubuntuupdates.org/ppa/kubuntu-ppa_backports?dist=saucy
-
http://www.kubuntu.org/news/kdevelop-4.6
А если коротко:
sudo add-apt-repository ppa:kubuntu-ppa/backports
sudo apt-get update
sudo apt-get install kdevelop
Ничего необычного, используем пакет LaTeX multicols:
http://tex.stackexchange.com/questions/78294/lyx-3-column-document Колонок может быть и больше :)
И на будущее нужно ознакомиться с LyX FAQ:
http://wiki.lyx.org/FAQ/FAQ в частности, там есть информация как убрать дату из заголовка.
Здесь же в совете номер 5 есть информация как копипастить таблицы из Open- и LibreOffice.
Просто последовательность действий - на память (брать из PPA не хотелось). Как качать NDK, SDK и Android Studio я расписывать не буду. Распаковку всего этого добра произвёл в ~/Android. Имена директорий привёл к виду (или переименованием или созданием необходимых симлинков):
- android-sdk
- android-ndk
- android-studio
По сути, этот рецепт подходит для любого дистрибутива, в большинстве случаев будет отличаться только первый пункт.
Итак…
Необходимое
- Ставим OpenJDK:
sudo apt-get install openjdk-7-jdk libswt-cairo-gtk-3-jni libswt-cairo-gtk-3-jni ant
- В ~/.profile или ~/.bashrc_profile прописываем:```bash
export ANDROID_HOME=$HOME/Android/android-sdk
export ANDROID_NDK=$HOME/Android/android-ndk
For compability
export NDK_HOME=$ANDROID_NDK
export ANDROID_SWT=/usr/share/java
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_NDK:$HOME/Android/android-studio/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ANDROID_HOME/tools/lib
1. Переходим в **~/Android/android-studio/bin** и выполняем:```shln -s studio.sh android-studio```
2. Добавляем следующие параметры в **studio.vmoptions** и **studio64.vmoptions** (предварительно сделайте резервные копии, пригодятся при обновлениях):```
-Dswing.aatext=true
- На этом шаге можно перелогиниться, вызвать android и поставить платформы, утилиты, потом запустить Android Studio и сделать необходимые настройки.
Опциональное
Ярлыки в меню
FIXME относительные пути к иконкам не воспринимаются, поэтому иконки не отображаются, только текст.
- Создаём файл: ~/.local/share/applications/android-sdk.desktop со следующим содержимым:```desktop
[Desktop Entry]
Encoding=UTF-8
Name=Android SDK
Comment=Android Sofware Development Kit
Exec=android
Icon=~/Android/android-sdk/tools/apps/SdkController/res/drawable-xhdpi/ic_launcher.png
Terminal=false
Type=Application
Categories=IDE;Development;
1. Извлекаем иконку Android Studio: ```shunzip -o lib/resources.jar artwork/icon_AS_128.png``` Вызываем команду из корня android-studio
2. Создаём файл: **~/.local/share/applications/android-studio.desktop**:```desktop
[Desktop Entry]
Version=1.0
Type=Application
Name=Android Studio
Exec=android-studio %f
Icon=~/Android/android-studio/artwork/icon_AS_128.png
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupNotify=true
StartupWMClass=jetbrains-android-studio
MimeType=application/x-extension-iml;
Автодополнение BASH
Автодополнение для команд android, adb, emulator, fastboot и repo.
- Идём в ~/Android
- Забираем последнюю версию скрипта (предполагаю, что git уже установлен):
bashgit clone https://github.com/mbrubeck/android-completion.git
- Создаём файл ~/.bash_completion и помещаем в него:```bash
. $HOME/Android/android-completion/android
. $HOME/Android/android-completion/repo
Готовый PPA:
https://launchpad.net/~no1wantdthisname/+archive/ppa описание там же.
UPD: ломает загрузку минта в графику к чертям собачьим. НЕ ИСПОЛЬЗОВАТЬ
UPD2: мужики нашли workaround:
http://forums.linuxmint.com/viewtopic.php?f=208&t=136307. Не пробовал
UPD3: применил решение из UDP2, только поместил в более логичное место: ~/.profile. Система работает. А то смотреть без слёз на рендеринг шрифтов в QtCreator’е было нельзя.
UPD4: Сохраню тут для потомков и собственного удобства:
# move infinality-settings out of system profile
sudo mv /etc/profile.d/infinality-settings.sh /etc/infinality-settings.sh
# make execute by everyone
sudo chmod a+rx /etc/infinality-settings.sh
а уже вызов /etc/infinality-settings.sh
добавить в ~/.profile
Хотя в той же теме на форуме, сказано, что
исправлено в mdm (его вообще мог зафейлить любой косяк в /etc/profile.d/*
):
https://github.com/linuxmint/mdm/commit/ee1a28b3c295c283aa94b890658d78be25e31bb7 и доступно всё это в Mint 17.2 ‘Rafaela’. Альтернативной апдейту: отредактировать /etc/init/mdm.conf
согласно патчу.
Что бы в
LyX начали сходу работать русский нужно поставить пакеты: texlive-lang-cyrillic и cm-super. Точнее даже не так: набивать тексты вы сможете сразу, а вот генерировать PDF - только после установки пакетов.
Внезапно, при логине в систему (иксы) выдалось, что рендеринг у меня софтовый. Хотя пакет с драйвером radeon стоял. Изучение /var/log/Xorg.0.log указало на то, что не получается загрузить модули ati и fglrx. При этом нет попыток грузить модуль radeon:
$ cat /var/log/Xorg.0.log | grep "ati<br/>|radeon<br/>|fglxrx"
[ 990.107] Build Operating System: Linux 3.2.0-37-generic x86_64 Ubuntu
[ 990.107] Current Operating System: Linux gaz-work 3.11.0-13-generic #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013 x86_64
(++) from command line, (!!) notice, (II) informational,
Using a default monitor configuration.
[ 990.109] (=:simple_smile: Automatically adding devices
[ 990.109] (=:simple_smile: Automatically enabling devices
[ 990.109] (=:simple_smile: Automatically adding GPU devices
[ 990.109] X.Org ANSI C Emulation: 0.4
[ 990.113] Initializing built-in extension XVideo-MotionCompensation
[ 990.114] (II) Module glx: vendor="X.Org Foundation"
[ 990.114] (=:simple_smile: Matched ati as autoconfigured driver 1
[ 990.115] (=:simple_smile: Matched ati as autoconfigured driver 3
[ 990.115] (II) LoadModule: "ati"
[ 990.116] (WW) Warning, couldn't open module ati
[ 990.116] (II) UnloadModule: "ati"
[ 990.116] (II) Unloading ati
[ 990.116] (EE) Failed to load module "ati" (module does not exist, 0)
[ 990.117] (II) Module vesa: vendor="X.Org Foundation"
[ 990.117] (II) Module modesetting: vendor="X.Org Foundation"
[ 990.118] (II) Module fbdev: vendor="X.Org Foundation"
[ 990.118] (=:simple_smile: Matched ati as autoconfigured driver 1
[ 990.118] (=:simple_smile: Matched ati as autoconfigured driver 3
[ 990.119] (II) LoadModule: "ati"
[ 990.120] (WW) Warning, couldn't open module ati
[ 990.120] (II) UnloadModule: "ati"
[ 990.120] (II) Unloading ati
[ 990.120] (EE) Failed to load module "ati" (module does not exist, 0)
Почесав макушку, решил попытаться “помочь” серверу, подтолкнув его в нужном направлении. Для чего идём в /etc/X11 создаём каталог xorg.conf.d, а в нём файл radeon.conf (используя любой редактор на своё усмотрение) со следующим содержимым:
Section "Device"
Identifier "radeon"
Driver "radeon"
EndSection
Сохраняемся, перелогиниваемся, радуемся отсутствию предупреждения о софтовом рендеринге. Проверяем:
$ cat /var/log/Xorg.0.log | grep "ati<br/>|radeon<br/>|fglxrx"
[ 2082.177] Build Operating System: Linux 3.2.0-37-generic x86_64 Ubuntu
[ 2082.177] Current Operating System: Linux gaz-work 3.11.0-13-generic #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013 x86_64
(++) from command line, (!!) notice, (II) informational,
[ 2082.178] (**) | |-->Device "radeon"
Using a default monitor configuration.
[ 2082.178] (=:simple_smile: Automatically adding devices
[ 2082.178] (=:simple_smile: Automatically enabling devices
[ 2082.179] (=:simple_smile: Automatically adding GPU devices
[ 2082.179] X.Org ANSI C Emulation: 0.4
[ 2082.183] Initializing built-in extension XVideo-MotionCompensation
[ 2082.184] (II) Module glx: vendor="X.Org Foundation"
[ 2082.184] (II) LoadModule: "radeon"
[ 2082.185] (II) Loading /usr/lib/xorg/modules/drivers/radeon_drv.so
[ 2082.219] (II) Module radeon: vendor="X.Org Foundation"
[ 2082.236] (II) RADEON(0): Creating default Display subsection in Screen section
[ 2082.248] (II) Module exa: vendor="X.Org Foundation"
[ 2082.313] (II) Module fb: vendor="X.Org Foundation"
[ 2082.313] ABI class: X.Org ANSI C Emulation, version 0.4
[ 2082.313] (II) EXA(0): Driver registered support for the following operations:
[ 2082.313] (II) Composite (RENDER acceleration)
[ 2082.313] (II) RADEON(0): Acceleration enabled
и
$ glxinfo |grep -i render
direct rendering: Yes
OpenGL renderer string: Gallium 0.4 on AMD RS880
До этого вместо AMD RS880 выводилось следующее:
$ glxinfo | grep -i render
direct rendering: Yes
OpenGL renderer string: Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits)
Собственно всё.
Все - не все, но многие знают, что в Firefox, Google Chrome и, вроде, Опере можно в свойствах закладки указать т.н. ключевое слово (keyword), набрав которое в адресной строке браузера и нажав Ввод перейдёшь по ссылке, на которую указывает данная закладка.
Удобно? Кому как. Но! У этого функционала есть ещё одно одно применение.
Дело в том, что в самом адресе закладки можно указать подстановочную последовательность (плейсхолдер, placeholder, уж не знаю как более корректно перевести это слово на русский язык) %s
. На это место будет подставлен весь текст который будет введён после ключевого слова.
На пальцах. Допустим, у нас есть закладка, у которой ключевое слово g
, тогда, если в адресной строке введём:
g ябеда-корябеда солёный огурец
то вместо %s
будет подставлено: “ябеда-корябеда солёный огурец”
Теперь чуете? Правильно! Мы можем вызывать какие-то URL с параметрами. Это общий случай, я же, в основном, использую это для поиска. К примеру, у меня такой набор (жирным выделены названия закладок):
- Google Search - поиск в Google
- Location:
https://www.google.ru/search?q=%s
- Keyword:
g
- Man pages search - поиск по unix man pages
- Location:
http://manned.org/browse/search?q=%s
- Keyword:
man
- C++ Reference - поиск по сайту
http://cplusplus.com
- Location:
http://www.cplusplus.com/search.do?q=%s
- Keyword:
cpp
- Ohloh Code Search - отличный поиск примеров использования кода, да и вообще, возможных реализаций ваших идей
- Location:
http://code.ohloh.net/search?s=%s
- Keyword:
code
- Wikipedia [rus] - поиск в русской Википедии
- Location:
http://ru.wikipedia.org/w/index.php?search=%s
- Keyword:
wpru
Да, в самом Firefox можно ключевые слова задать для существующих поисковых систем (в Search bar), но вручную там нельзя добавить произвольную (задав только URL для поиска), только установкой соответствующего расширения, которого может не оказаться. Плюс метод работает во многих браузерах, так что импортировав закладки, получите и работающий поиск, к которому привыкли.
В
luakit это сделано прямо и ровно через технологию Search Engine. Пример можно посмотреть прямо в коробке в файле globals.lua (
или тут).