+38 (067) 901-63-22

Корзина

0 товара(ов) на сумму
0 грн.

Генерация штрих-кода для вставки его в 1С при работе в Linux

В Linux есть отличная команда barcode, которая генерирует штрих-коды в векторном формате ps. Но, 1С не понимает такие форматы. Более того, barcode, генерирует штрих-код на размер листа А4 или Letter. Установка пользовательского размера листа не увенчалась успехом. Но, не будем же мы вставлять изображение штрих-кода размером с лист А4...

Однако, есть способ, как решить данные проблемы.

Генерируем штрих-код в формате ps с помощью команды barcode:

barcode -p letter -g 200x100 -u mm -b 13423432320 -e 128 -o sss.ps

Теперь, нужно преобразовать его в понятный для 1С формат - это или jpg или png. За это отвечает команда ImageMagic convert. Кроме того, есть возможность указать четкость изображения с помощью параметра -density 150. А так же есть очень полезный параметр для нашего случая -trim. Этот параметр обрезает изображение. Т.е. обрезает всё белое пространство нашего листа.

Получаем такую команду для генерации jpg:

convert -density 150 -trim sss.ps sss.jpg

Для генерации png:

convert -density 150 -trim sss.ps sss.png

Сравнивая изображения png и jpg видим, что jpg имеет размер 21,2Кб, а png - 2,7Кб. Т.е. получается, что png лучше использовать, т.к. размер такого файла в 10 раз меньше. Кроме того, в png нет фона.

Для того, чтоб не нужно было вызывать несколько команд из линукс и после каждой делать тайм-аут, рекомендую заключить обе команды в "одну команду", например так:

barcode -p letter -g 200x100 -u mm -b 13423432320 -e 128 -o sss.ps | convert -density 150 -trim sss.ps sss.png

Оптимизация изображений средствами командной строки Linux

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

Есть много разных редакторов — Photoshop, Lightroom и им подобных. Кроме того, появилось уже очень много всяких онлайн сервисов, которые позволяют сжимать и оптимизировать картинки.

Если этих картинок с десяток, то можно обойтись каким-нибудь сервисом. А вот если их больше, на помощь приходят консольные утилиты. Одни из таких ImageMagick, jpegoptim, optipng

ImageMagick представляет из себя кроссплатформенный набор утилит, который содержит очень много функций для работы с изображениями — конвертирование из одного формата в другой, различные трансформации (ресайз, обрезка, вращение, зеркальное отражение), применение разных эффектов, вроде размытия… и очень много других.

Jpegoptim и optipng позволяют сжать изображение без потери качества, а для jpegoptim также возможно сжатие с потерями.

Примеры с ImageMagick

Поиск и ресайз всех изображений до 500px

Для одного файла:

<code>convert -resize ‘500>’ input.jpg output.jpg</code>

Для нескольких изображений можно использовать такую магию:

<code>find -regex “.*[jpg|png]” -exec convert {} -resize ‘500>’ {} \;</code>

Разместить маленькое изображение внутри белого квадрата, заданного размера

<code>convert input.jpg -gravity center -background white -extent 500x500 output.jpg</code>

Создание пиктограмм 80×80

<code><span class="keyword">for</span> file <span class="keyword">in</span> *.jpg; <span class="keyword">do</span> convert <span class="variable">$file</span> -resize 80x80 -background white -gravity center -extent 80x80 80x80-<span class="variable">$file</span>; <span class="keyword">done</span></code>

Примеры с jpegoptim и optipng.

<code>jpegoptim input.jpg</code>

В этом режиме удаляется вся мета-информация, кроме Exif и комментариев. По-умолчанию используется алгоритм сжатия без потери качества

Сжатие с потерями, удаление всей мета-информации:

<code>jpegoptim input.jpg -m50 --strip-all</code>

Для оптимизирования всех png изображений можно использовать следующую команду

<code>find -name *.png -exec -optipng -o3 <span class="string">'{}'</span> \</code>

где -o может быть от -o0 до -o7
Чем выше этот параметр, тем больше фильтров будет использовано для оптимизации. Размер будет меньше, но и обрабатываться каждое изображение будет дольше.

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

Прочее

В данном разделе будут размещаться небольшие сниппеты, которые определенным образом относятся к теме статьи.

Скачивание картинок списком, удаление белого пространства вокруг них

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

<code>wget -i list.txt</code>

Для того, чтобы обрезать одну картинку нужно запустить команду:

<code>convert input.jpg -trim output.jpg</code>

Чтобы обрезать несколько, то можно воспользоваться find:

<code>find ./ -name <span class="string">"*.jpg"</span> -exec convert {} -trim out/{} \;</code>

где out — папка, куда будут сохраняться обработанные картинки

Источник: http://diggitize.me/imageoptimize/

Конвертирование .xls в .csv в Linux

Для того, чтобы сконвертировать .xls в .csv, прибегнем к помощи утилиты xls2csv, установить которую в CentOS Linux можно, выполнив в командной строке следующую команду:

$ sudo yum -y install xls2csv

После успешной установки xls2csv, попробуем конвертировать наш файл .xls в .csv, для дальнейшего разбора данных. Для конвертации выполним команду:

$ xls2csv file.xls > file.csv

Как вы уже наверное догадались, file.xls - это исходный файл в формате Excel, а file.csv - это полученный файл в результате конвертации.

После выполнения последней команды, вы сможете получить все данные, присутствующие в файле file.xls, в файле .csv, согласно формату csv (данные разделенные запятой).

Источник: http://www.ithowto.ru/329-konvertirovanie-xls-v-csv-v-linux.html

Как сменить имя хоста (компьютера) в Linux Ubuntu

change-hostname-ubuntu

Итак, давайте рассмотрим очередной глупый вопрос для матёрого линуксоида, но довольно сложную проблему для новичка, а именно - как сменить имя компьютера (hostname) в Ubuntu Linux. Сделать это очень просто, нужно просто отредактировать два текстовых файла и перезагрузить сеть. Всё.

Начнём. Для начала нужно отредактировать файл /etc/hosts:

sudo gedit /etc/hosts
		

Выглядеть он должен примерно так:

1 2
		
127.0.0.1 localhost 127.0.1.1 hostname
		

Где вместо "hostname" - имя вашего компьютера. Вот именно его то и нужно сменить. Изменяем, сохраняем.

Теперь нужно поправить файл /etc/hostname:

sudo gedit /etc/hostname
		

В этом файле содержится только название вашего компьютера и ничего более. Смело изменяем его и сохраняем файл.

Вот и всё. Теперь осталось только перезагрузить сеть и изменения вступят в силу:

sudo service hostname restart sudo service networking restart
		

Можно продолжать работать, но могут возникнуть небольшие проблемы, поэтому лучше будет перезагрузить компьютер.

Источник: http://ubuntovod.ru/instructions/change-hostname-ubuntu.html

Реализация быстрого импорта из Excel на PHP

Мы продолжаем рассказывать о технологиях, используемых на нашем сервисе email-маркетинга Pechkin-mail.ru. Одной из ключевых задач любого сервиса, связанного с данными клиентов, является загрузка этих данных на сервис. Для Печкина очень важно быстро и без проблем для пользователя загружать адресные базы, содержащие email-адреса, имена, фамилии и другие дополнительные данные.

то использовать в качестве инструмента?

В качестве базового стандарта, используемого при импорте адресных баз, мы взяли Microsoft Excel. Объясняется это просто:

  • это стандартный инструмент, которым на базовом уровне владеют 100% пользователей компьютеров. Более того, в бизнесе — это де-факто корпоративный стандарт и используется даже, если на рабочих компьютерах Mac или Linux.
  • Практически все CRM-, CMS-, облачные или десктопные системы имеют экспорт в Excel или CSV, который простым пересохранением приводится к формату XLS или XLSX.
  • Известно также, что “90% ошибок ПО сидит в полуметре от монитора”. Не в обиду будет сказано рядовым пользователям, но мы должны учитывать самый базовый уровень подготовки и тех. поддержке для объяснения достаточно сказать “Загрузите Excel-файл”, а не объяснять процедуру подготовки файла в нужном формате.

Проблему пользователей при импорте адресных баз сняли. Но тут возникает уже проблема непосредственно разработки.

Наша боль, как разработчиков

Excel — это не open-source разработка, а проприетарное решение. Формат данных, особенно в новых версиях после 2007 года (xlsx), нетривиален. На Печкине используется PHP, поэтому мы начали поиск библиотек, которые позволят нам решить данную задачу. Но тут столкнулись с проблемой, что целый ряд библиотек, не позволяют читать xlsx:

  • php-spreadsheetreader reads a variety of formats (.xls, .ods AND .csv)
  • PHP-ExcelReader (xls only)
  • PHP_Excel_Reader (xls only)
  • PHP_Excel_Reader2 (xls only)
  • XLS File Reader Коммерческая и xls only
  • SimpleXLSX Из описания способен читать xlsx, однако, автор ссылается только на xls
  • PHP Excel Explorer Коммерческая и xls only

Обратила на себя наше внимание библиотека PHPExcel. Ее мы использовали еще несколько лет назад в сервисе sms-рассылок SMS24X7.ru. Петя Соколов (Petr_Sokolov), наш талантливый разработчик, написал обертку для этой библиотеки, исправляющую ряд ее недостатков и багов.

Библиотека, безусловно, интересная и развитая. Но для Печкина ее использовать стало невозможно уже через пару лет, когда выросли и мы и наши клиенты — ее катастрофическая требовательность к ресурсам и огромное время парсинга файлов. Например, нередки случаи загрузки на сервис адресных баз > 100 000 строк со сложной структурой. А если файл уже 500 000 строк и “весит” больше 30Мб?

И тут нас отпустило...

В процессе поисков мы наткнулись на коммерческую библиотеку libxl, увидев результаты “кустарного benchmark” на Stackoverflow.

Библиотека написана на C++, а благодаря великолепному объектно-ориентированному расширению для PHP от Ilia Alshanetsky, легка в освоении и интеграции (например, переписать наше текущее решение с PHPExcel на LibXL заняло около 3 часов). Что очень классно, учитывая, что, к сожалению, документации от разработчика расширения нет и необходимо пользоваться расширением Reflection.

Процесс установки очень прост.

<code>cd /usr/local/src/ wget http://libxl.com/download/libxl.tar.gz tar zxfv libxl.tar.gz cd libxl-3.5.4.1/ ln -s include_c include cd ../ wget https://github.com/iliaal/php_excel/archive/master.zip unzip master.zip cd php_excel-master/ ./configure --with-excel --with-libxl-libdir=../libxl-3.5.4.1/lib64 --with-libxl-incdir=../libxl-3.5.4.1/include_c make make test make install</code>

В результате компиляции вы получите файл excel.so в папке /usr/lib/php5/20090626/. Теперь достаточно создать файл /etc/php5/conf.d/excel.ini с содержимым.

<code>extension=excel.so</code>

Проверим установился ли модуль и перезагрузим веб-сервер.

<code>php -m | grep excel service lighttpd restart </code>

В коде все тоже очень просто. Подгружаете файл и читаете необходимые ячейки. Например, вот так:

<code><span class="variable">$doc</span> = <span class="keyword">new</span> ExcelBook(); <span class="variable">$doc</span>->loadFile(‘example.xls’); <span class="keyword">for</span>(<span class="variable">$r</span>=<span class="variable">$sheet</span>->firstRow();<span class="variable">$r</span><=<span class="variable">$sheet</span>->lastRow();<span class="variable">$r</span>++){ <span class="keyword">for</span>(<span class="variable">$c</span>=<span class="variable">$sheet</span>-> firstCol();<span class="variable">$c</span><=<span class="variable">$sheet</span>-> lastCol();<span class="variable">$c</span>++){ <span class="keyword">echo</span> ‘Строка: ’.<span class="variable">$r</span>.’ Столбец: ’.<span class="variable">$c</span>.’ Значение: ’.<span class="variable">$sheet</span>->read(<span class="variable">$r</span>,<span class="variable">$c</span>).’<br />’; } } </code>


Полученные результаты производительности

Отсутствие потребности в оперативной памяти (в процессе загрузки файла и его чтения) приятно порадовало.

06cbbe1e4598038cb5b16350059aa079 А вот и прирост скорости загрузки excel-файла и его чтения на различных размерах адресных баз.

c549159dbbee487c12bef0eb5eaa0ae0Данные тесты проводились на xlsx-файлах с N подписчиками в один стоблец с email. Реальные же адресные базы еще больше и сложнее и преимущество в скорости и потреблении памяти выглядит еще значительнее.

Стоимость библиотеки 199$ за девелоперскую лицензию, но, поверьте, это того стоит. Безусловно рекомендуем всем, кто сталкивается с проблемой импорта Excel-файлов на свой сервис.

Источник: http://habrahabr.ru/company/pechkin/blog/224207/

Настройка окружения LXDE для терминальных пользователей XRDP в Linux Ubuntu

Чтоб проще было создавать новых пользователей при работе в XRDP, рекомендуется сделатья ряд настроек скелета пользователей.

1. Скелет находится по адресу: /etc/skel

Владельца и группу для данного каталога указываем: root

2. В каталоге /etc/skel/Desktop можно создать те ярлыки, которые будут создаваться у пользователя при первом входе в систему.

Например, вот так выглядит содержимое файла ярлыка 1С на рабочем столе:

[Desktop Entry] Version=1.0 Type=Application Terminal=false Exec=/opt/1C/v8.3/x86_64/1cestart /L ru Categories=Office;Finance; Name[ru_RU]=1С:Предприятие Name=1C:Enterprise Icon=1cestart

3. Для того, чтоб пользователи не смогли редактировать рабочий стол, укажите права 555 на каталог /etc/skel/Desktop.

chmod -R 555 /etc/skel/Desktop

4. Для работы в режиме терминала, фон рабочего стола лучше указать однотонный. Т.к. в этом случае проще будет передаваться изображение рабочего стола.

Для того, чтоб у всех пользователей был одинаковый рабочий стол, скопируйте файлы в /etc/skel/.config/pcmanfm/LXDE соответвующего настроенного пользователя.

В частности, внешний вид рабочего стола определяется в конфигурационном файле /etc/skel/.config/pcmanfm/LXDE. Вот его содержимое:

[config] bm_open_method=0 [volume] mount_on_startup=1 mount_removable=1 autorun=1 [ui] always_show_tabs=0 max_tab_chars=32 win_width=734 win_height=503 splitter_pos=150 media_in_new_tab=0 desktop_folder_new_win=0 change_tab_on_drop=1 close_on_unmount=1 focus_previous=0 side_pane_mode=places view_mode=icon show_hidden=0 sort=gicon;ascending; toolbar=newtab;navigation;home; show_statusbar=1 pathbar_mode_buttons=0

/etc/skel/.config/pcmanfm/LXDE/desktop-items-0.conf

[*] wallpaper_mode=color wallpaper_common=0 wallpapers_configured=1 wallpaper0=/usr/share/lxde/wallpapers/lxde_blue.jpg desktop_bg=#423d3d desktop_fg=#ffffff desktop_shadow=#000000 desktop_font=Sans 12 show_wm_menu=0 sort=mtime;ascending; show_documents=0 show_trash=0 show_mounts=0

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

/etc/skel.xscreensaver

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

6. Для того, чтоб пользователи не могли сменить заставку, запретите чтение всем пользователям файла /usr/bin/xscreensaver-demo:

chmod -R 700 /usr/bin/xscreensaver-demo chgrp -R root /usr/bin/xscreensaver-demo chown -R root /usr/bin/xscreensaver-demo

LXDE

LXDE.org|Lightweight X11 Desktop Environment: "Одно из главных достоинств LXDE - небольшие требования к железу. Философия LXDE - это лёгкость, полезность и практичность."

Contents

Установка

LXDE модульный и вы можете выбирать только те пакеты, которые вам нужны.

Минимально необходимые пакеты для запуска LXDE: lxde-common, lxsession, desktop-file-utils и оконный менеджер.

Вы можете установить группу пакетов LXDE:

# pacman -S lxde

Установятся следующие пакеты:

  • gpicview: Простой и легкий просмоторщик изображений
  • libfm: Библиотека для работы с файлами (lxshortcut: Простое средство редактирования ярлычков)
  • lxappearance: Редактор тем для изменения GTK+ тем, иконок и шрифтов для приложений GTK
  • lxappearance-obconf: Плагин для настройки Openbox через LXAppearance
  • lxde-common: Установки по умолчанию конфигурационных файлов для большинства интегрированных компонентов LXDE
  • lxde-icon-theme: Тема значков LXDE
  • lxdm: Легковесный менеджер дисплея приветствия
  • lxinput: Конфигурационная утилита для клавиатуры и мышки в LXDE
  • lxlauncher: Панель запуска приложений для нетбуков
  • lxmenu-data: Коллекция файлов адаптирующая меню LXDE под стандарты спецификации freedesktop.org
  • lxmusic: Минималистичный проигрыватель музыки базирующийся на xmms2
  • lxpanel: Панель задач с менеджером приложений, меню программ и апплетов
  • lxrandr: Менеджер экрана для LXDE
  • lxsession: Совместимый X11 менеджер сессий с поддержкой выключения, перезагрузки и ждущего режима
  • lxtask: Диспетчер задач и системный монитор LXDE
  • lxterminal: Стандартный эмулятор терминала для LXDE
  • menu-cache: Механизм кеширования для freedesktop.org-совместимых меню
  • openbox: Легкий и удобно конфигурируемый менеджер окон (рекомендуемый менеджер, разработанный вне проекта LXDE).
  • pcmanfm: Файловый менеджер, функционал рабочего стола и обоев

Вам также следует установить Gamin. Gamin - это инструмент для отслеживания изменений в файлах и директориях, который является реализацией подсистемы FAM. Запуск производится по требованию программ, которые им поддерживаются, поэтому не требуется отдельно демона, подобного FAM. Если у Вас установлен FAM - удалите запуск этого демона из /etc/rc.conf и остановите его перед установкой Gamin

pacman -S gamin

Другие легковесные приложения, которые рекомендуется использовать на слабых системах:

  • leafpad: Простой и легкий текстовый редактор
  • mousepad: Простой текстовый редактор (является текстовым редактором по умолчанию среды Xfce)
  • xarchiver: Легкий архиватор
  • obconf: Инструмент для настройки тем и стилей Openbox

Запуск окружения LXDE

Есть несколько способов запустить LXDE.

Display Managers

Если Вы используете менеджеры SLiM, GDM, или KDM, в настройках сессии нужно выбрать LXDE.

Инструкция по использованию LXDM ниже на этой странице.

Если не используете менеджер дисплея приветствия добавьте

export DESKTOP_SESSION=LXDE

в ваш ~/.bash_profile Для првавильного функционирования Xdg-open

Консоль

Для использования команды startx необходимо добавить в файл ~/.xinitrc команду запуска LXDE:

exec startlxde

Если Вы хотите выполнять startx автоматически при загрузке, прочитайте статью Запуск X при загрузке.

Для других задач Вы должны быть уверены, что демон dbus запущен.

Советы и рекомендации

Автомонтирвание

PCManFM (Русский)#Работа с томами

Автозапуск программ

.desktop файлы

Вы можете скопировать ярлык программы .desktop из <code>/usr/share/applications/ в ~/.config/autostart/. Например, добавим lxterminal в автозапуск:

$ ln -s /usr/share/applications/lxterminal.desktop ~/.config/autostart/

После добавления .desktop файлов Вы можете упралять ими с помощью lxsession-editAUR.

autostart файл

Второй способ. Использование файла ~/.config/lxsession/LXDE/autostart. Этот файл не скрипт, но каждая строка представляет собой команду, которая будет выполнена, если строка начинается с символа @, команда после @ будет автоматически повторно выполняться, если она падает. Например, чтобы выполнить lxterminal и leafpad автоматически при запуске:

~/.config/lxsession/LXDE/autostart
@lxterminal @leafpad

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

Существует также глобальный файл автозапуска /etc/xdg/lxsession/LXDE/autostart. Если эти файлы присутствуют одновременно, то оба будут выполнены.

Горячие клавиши

Управление горячими клавишами осуществляется через Openbox и подробно описаны здесь. Пользователи LXDE должны следовать этим инструкциям, чтобы отредактировать файл ~/.config/openbox/lxde-rc.xml

Дополнительный графический интерфейс для редактирования горячих клавиш - obkeyAUR доступен в AUR. Поумолчанию obkey редактирует файл rc.xml, Но вы можете использовать его в LXDE таким образом:

$ obkey ~/.config/openbox/lxde-rc.xml

Больше информации о obkey здесь.

Курсоры

Полная статья: X11 Cursors.

Последний lxappearance2-gitAUR в AUR предоставляет функциональные возможности для изменения тем курсора. Если Вы не хотите устанавливать экспериментальный lxappearance2, можете указать свой курсор в файле ~/.Xdefaults. См. Configuring Cursor Themes.

Простым способом является добавление курсор к теме по умолчанию. Сначала нужно создать каталог:

# mkdir /usr/share/icons/default

Then you can specify to add to the icon theme the cursor. This will use the xcursor-bluecurve pointer theme:

/usr/share/icons/default/index.theme
[icon theme] Inherits=Bluecurve

Шрифты настройка

Для установки шрифтов, вы можете использовать lxappearance и установить основной шрифт. Для настройки других шрифтов можно использовать Openbox configuration tool ObConf:

# pacman -S obconf

Раскладка клавиатуры

udev

Когда вы используете udev, конфигурация ввода по умолчанию записываются в /etc/X11/xorg.conf.d/10-evdev.conf в <code>Section "InputClass". Вы можете редактировать этот или создать новый файл /etc/X11/xorg.conf.d/20-keyboard.conf по следующему примеру (переключение раскладки клавишами Alt+Shift, индикация CAPS-диодом на клавиатуре):

Section "InputClass" Identifier "evdev keyboard catchall" MatchIsKeyboard "on" MatchDevicePath "/dev/input/event*" Driver "evdev" Option "XkbModel" "pc104" Option "XkbLayout" "us,ru" Option "XkbOptions" "grp:alt_shift_toggle,grp_led:caps" EndSection

Вы можете найти список всех значений в /usr/share/X11/xkb/rules/base.lst.

Другие способы

1 способ: Добавьте в /etc/xdg/lxsession/LXDE/autostart следующие строки перед @lxpanel --profile LXDE:

@setxkbmap -option grp:switch,grp:alt_shift_toggle,grp_led:scroll us,ru

или в ~/.config/lxsession/LXDE/autostart (для конкретного пользователя):

setxkbmap -option grp:switch,grp:alt_shift_toggle,grp_led:scroll us,ru

2 способ: Create /etc/xdg/autostart/setxkmap.desktop as following:

[Desktop Entry] Version=1.0 Encoding=UTF-8 Name=Fix keyboard settings Exec=setxkbmap -rules xorg -layout "us,ru" -variant ",winkeys" -option "grp:ctrl_shift_toggle" Terminal=false Type=Application

3 способ: Добавьте в ~/.Xkbmap, для текущего пользователя, или в /etc/X11/Xkbmap, для всей системы, строку:

-option grp:ctrl_shift_toggle,grp_led:scroll us,ru

4 способ: Добавьте следующую строку в /etc/X11/xinit/xinitrc или ~/.xinitrc:

setxkbmap -option grp:ctrl_shift_toggle,grp_led:scroll us,ru

5 способ: Установите fbxkbAUR из AUR

6 способ: Xorg (Русский)#Переключение раскладок средствами X.org

Посредством LXDE

  1. Правый клик на панели задач
  2. “Добавить/убрать элементы панели”
  3. “Добавить”
  4. “Индикатор раскладок клавиатуры”

LXDM

LXDE теперь обеспечивает экспериментальную менеджер дисплея приветствия LXDM. Это реализовано с GTK+ и supports theming.

Установка LXDM

# pacman -S lxdm

Для автоматического запуска LXDM Вы можете редактировать /etc/inittab или <code>/etc/rc.conf. Для получения дополнительной информации см. Экранный менеджер.

Настройка

Все конфигурационные файлы для LXDM расположены в /etc/lxdm. Основной файл конфигурации <code>lxdm.conf хорошо документирован в его коментарии. Файл, Xsession, является общесистемным и не должен редактироваться. Другие файлы - это bash скрипты, которые выполняются при наступлении определенных событий в LXDM. К ним относятся:

  1. LoginReady: Выполняется с правами root когда LXDM готова показать окно входа в систему.
  2. PreLogin: Выполняется с правами root перед входом пользователя.
  3. PostLogin: Выполняется с правами авторизованного пользователя сразу после входа.
  4. PostLogout: Выполняется с правами авторизованного пользователя после выхода.
  5. PreReboot: Выполняется с правами root перед перезагрузкой компьютера с LXDM.
  6. PreShutdown: Выполняется с правами root перед выключением компьютера с LXDM.
Ожидаемое поведение после Logout

Может быть немного удивительно, что LXDM по умолчанию не очищает фон рабочего стола и не убивает процессы пользователя после его выхода. Для решения проблемы необходимо добавить в файл /etc/lxdm/PostLogout:

#!/bin/sh # Kills all your processes when you log out. killall --user $USER -TERM # Set's the desktop background to solid black. Useful if you have multiple monitors. xsetroot -solid black
Автоматический вход

Если вы хотите войти в учетную запись без ввода пароля, найдите строку в /etc/lxdm/lxdm.conf, которая выглядит следующим образом:

#autologin=username

Раскомментируйте его и подставьте нужное имя пользователя, вместо "username".

PCManFM

Если вы хотите иметь доступ к Корзине, монтированию томов и folder/file tracking Вам необходима поддержка gvfs:

pacman -S polkit-gnome gvfs

polkit-gnome обеспечивает аутентификацию и должен быть запущен при входе в систему:

$ mkdir -p ~/.config/autostart $ cp /etc/xdg/autostart/polkit-gnome-authentication-agent-1.desktop ~/.config/autostart

В Arch'е этот файл в настоящее время не работает на некоторых системах. Если у вас проблема запуском, удалите строку

OnlyShowIn=GNOME;XFCE;

из файла ~/.config/autostart/polkit-gnome-authentication-agent-1.desktop:

PCManFM @ LXDE wiki

Замена оконного менеджера

Openbox, стандартный менеджер окон LXDE, может быть заменен другими. Например fvwm, icewm, dwm, metacity, compiz ...etc.

LXDE будет пытаться использовать оконный менеджер из пользовательского фаула конфигурации lxsession ~/.config/lxsession/LXDE/desktop.conf.Если его не существует, будет пытаться использовать глобальный файл конфигурации <code>/etc/xdg/lxsession/LXDE/desktop.conf.

Замените команду openbox-lxde на ваш менеджер окон:

[Session] window_manager=openbox-lxde

Для metacity:

window_manager=metacity

Для compiz:

window_manager=compiz ccp --indirect-rendering

Выключение, Перезагрузка (LXSession-logout)

Для работы Выключения, Перезагрузки, Режима сна и Режима ожидания Должен быть запущен dbus. Должен быть установлен пакет upower.

# pacman -S upower

См. xinitrc#Preserving the session подробнее о logind/ConsoleKit.

Редактирование меню приложений

Tango-preferences-desktop-locale.png

Tango-preferences-desktop-locale.png

Эта статья или раздел нуждается в переводе

Примечания: пожалуйста, используйте первый аргумент шаблона для указания дополнительной информации. (обсуждение: Talk:LXDE (Русский)#)

(нужно проверить перевод). Ссылка на оригинал
Меню приложений работает через передачу .desktop файлов, которые расположены в <code>/usr/share/applications. Многие DE запускают программы, которые supersede эти настройки для кастомизации меню. Для LXDE еще только создают редактор меню приложений, но вы можете настроить его вручную, если нужно. Сторонние редакторы меню вы можете найти в AUR - lxmedAUR.

Чтобы добавить или редактировать элемент меню, создайте или сделайте ссылку на .desktop файл в <code>/usr/share/applications. Смотрите the desktop entry specification на freedesktop.org для получения информации о структуре .desktop файлов.

Для удаления элементов из меню вместо удаления .desktop файлов, вы можете редактировать файл элемента, добавляя следующую строку:

NoDisplay=true.

Для ускорения процесса редактирования большого числа файлов вы можете поместить их в цикл. Например:

cd /usr/share/applications for i in program1.desktop program2.desktop ...; do cp /usr/share/applications/$i \ /home/user/.local/share/applications/; echo "NoDisplay=true" >> \ /home/user/.local/share/applications/$i; done

Это будет работать для всех приложений, исключая KDE. Для них единственный путь удалить их из списка меню - зайти в KDE и использовать собственный редактор меню. Для каждого элемента, который вы не желаете лицезреть, проверьте опцию 'Show only in KDE' (отображать только в KDE). Если добавление NoDisplay=True не работает, вы можете добавить ShowOnlyIn=XFCE.

gmaps.js — самый легкий способ использования Google Maps API

Расскажу об одной небольшой (~30kb) JS библиотеке для удобной работы с Google Maps API под названием gmaps.js.
Раз уж библиотека создана для ускорения процесса веб-разработки, то и я вас задерживать не буду. Как можно понять из названия, она делает не что иное, как упрощает взаимодействие с API Google Maps. Многие из вас работали с API и, вероятно, каждый раз вам приходилось попотеть, чтобы порыться в документации и реализовать, например, свое собственное описание метки на карте. Или подписаться на событие взаимодействия с картой…

Итак, она пока еще не заимела ни одной мажорной версии, а в текущий момент имеет версию 0.1.12.3. Распространяется под лицензией MIT License и разрабатывается целым сообществом (и вы тоже можете в этом помочь).

Примеры возможностей

Создание карты
<code><span class="keyword">new</span> GMaps({ div: <span class="string">'#map'</span>, lat: -<span class="number">12.043333</span>, lng: -<span class="number">77.028333</span> });</code>

А еще можно добавить опции zoom, width, height. Хотя по стандарту ширина и высотка карты будут подогнаны под контейнер.

События
<code>map = <span class="keyword">new</span> GMaps({ div: <span class="string">'#map'</span>, zoom: <span class="number">16</span>, lat: -<span class="number">12.043333</span>, lng: -<span class="number">77.028333</span>, click: <span class="keyword">function</span>(e) { alert(<span class="string">'click'</span>); }, dragend: <span class="keyword">function</span>(e) { alert(<span class="string">'dragend'</span>); } });</code>

Поддерживаются все события Maps API.

Геолокация
<code>GMaps.geolocate({ success: <span class="keyword">function</span>(position) { map.setCenter(position.coords.latitude, position.coords.longitude); }, error: <span class="keyword">function</span>(error) { alert(<span class="string">'Geolocation failed: '</span>+error.message); }, not_supported: <span class="keyword">function</span>() { alert(<span class="string">"Your browser does not support geolocation"</span>); }, always: <span class="keyword">function</span>() { alert(<span class="string">"Done!"</span>); } });</code>

Ну разве не прелесть?

Добавление маркера
<code>map.addMarker({ lat: -<span class="number">12.043333</span>, lng: -<span class="number">77.028333</span>, title: <span class="string">'Lima'</span>, click: <span class="keyword">function</span>(e) { alert(<span class="string">'You clicked in this marker'</span>); }, infoWindow: { content: <span class="string">'<p>Home, sweet home...</p>'</span> } } });</code>
И всё, всё, всё!

Библиотека поддерживает почти полный функционал Maps API, включая вывод статических карт(картинкой), наложение слоев, прокладывание маршрутов, рисование полигонов, рисование своих контролов, GeoRSS и всякое такое остальное…

Прошу ознакомиться с сайтом библиотеки: http://hpneo.github.com/gmaps/ и начинать творить.
И сразу же форкнуть репозиторий на Github: https://github.com/HPNeo/gmaps

UPD: KidsKilla подсказывает, что, в принципе, по Maps API ToS никто не имеет право создавать свои врапперы(оболочки) поверх действующего API, пока не получит официальное разрешение Гугла. (https://developers.google.com/maps/terms, пункт 10.2). На что разработчик (Gustavo Leon) ответил, что сделает две вещи: 1)запросит разрешения у гугла 2)уже открыт тикет по подключению не только Google Maps API, но и OpenStreetMap. Это же счастье!


Источник: http://habrahabr.ru/post/145152/

Google Maps API

f4fd091dКартографический сервис – зачем это? Ну например, я 10 лет жил в нашей маленькой провинции, а потом взял и понаехал в Москву, и всё для меня так ново. А где магазины, боулинг, кафешки, парки отдыха – надо знать же, где тратить московскую зарплату. Но вот беда, как узнать? Раньше был справочник «Желтые страницы» и там была карта и всё по адресам. Чтобы найти что-то уходило масса времени. Сейчас стало всё в разы проще. Вот прекрасный пример: http://www.pushkino.org/. Но это далеко не всё.
Я могу отслеживать погоду, пожары, пробки (кстати!) в реальном времени.
Мой заказчик может не вводить свой адрес, а попросту отметить его на карте и я буду знать куда доставить ему товар – какое классное решение, не надо всего этого – «Проспект маршала Блюхера, 43, г. Санкт-Петербург, Россия».


Задача для примера

Всё лучше узнавать практически, так что сделаем задачу для примера, чтобы обрести навыки. Вот примерный план работ:

  1. Вывести карту (надо же!)
  2. Задать город
  3. Переместить карту к городу
  4. Маркером указать адрес
  5. Добавить информации
  6. Вывести карту (надо же!)
  7. Сохранить маркер с иноформацией (при клике на него вывести ее)
  8. Избежать нагромождения (т.е. сделать кластеризацию) маркеров.


Как делать?


Ключ API

Ключ API нужен для использования работы с картой, т.е. при запросе всех их скриптов и сервисов в параметры нужно добавлять &key=[тут наш ключ]. Впрочем для http://localhost он не нужен. Получить его надо тут: http://code.google.com/apis/maps/signup.html. Кстати, работает и без него на сайте, но может это временно.
Для v.3 не нужен

Map\Marker\InfoWindow

ca139c33Для работы нам понадобится 3 основных объекта. Первое – это карта.
Карта создается очень просто. У нас есть какой-то определенный контейнер:

<code><span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">"map_canvas"</span>></span><span class="tag"></<span class="title">div</span>></span> </code>

Подключаем скрипт:

<code><span class="tag"><<span class="title">script</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span> <span class="attribute">src</span>=<span class="value">"http://maps.google.com/maps/api/js?sensor=false"</span>></span><span class="tag"></<span class="title">script</span>></span> </code>

Инициализируем карту:

<code><span class="function"><span class="keyword">function</span> <span class="title">initialize</span><span class="params">()</span> {</span> <span class="keyword">var</span> myLatlng = <span class="keyword">new</span> google.maps.LatLng(-<span class="number">34.397</span>, <span class="number">150.644</span>); <span class="keyword">var</span> myOptions = { zoom: <span class="number">8</span>, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } <span class="keyword">var</span> map = <span class="keyword">new</span> google.maps.Map(document.getElementById(<span class="string">"map_canvas"</span>), myOptions); } </code>

center: myLatlng – это координаты центра карты
zoom – это увеличение при инициализации
mapTypeId – тип (политическая, физическая, гибрид)
Карта готова!

Второе — это метки:

<code><span class="keyword">var</span> marker = <span class="keyword">new</span> google.maps.Marker({ position: myLatlng, map: map, title:<span class="string">"Hello World!"</span> }); </code>

position – собственно координаты метки
map – на какую карту метку поместить
title – при наведении мыши будет писать “Hello World!”.

InfoWindow

<code><span class="keyword">var</span> contentString = <span class="string">'<div id="content">Тут всё то про что должно быть рассказано</div>'</span>; <span class="keyword">var</span> infowindow = <span class="keyword">new</span> google.maps.InfoWindow({ content: contentString }); <span class="keyword">var</span> marker = <span class="keyword">new</span> google.maps.Marker({ position: myLatlng, map: map, title: <span class="string">'Uluru (Ayers Rock)'</span> }); google.maps.event.addListener(marker, <span class="string">'click'</span>, <span class="keyword">function</span>() { infowindow.open(map,marker); }); </code>

content – содержимое в метке

<code>google.maps.event.addListener(marker, <span class="string">'click'</span>, <span class="keyword">function</span>() { infowindow.open(map,marker); }); </code>

— при клике на метку, показать окно с информацией, на карте map с привязкой к marker.

Geocoding

Geocoding – это просто отличная библиотека, которая позволяет делать всего 2 вещи:

  • По наименованию чего-то, найти это на карте и сообщить координаты
  • По координатам, сообщить всё что находится на этих координатах.

Запрос выглядит так. Например, мы хотим узнать где находится Иваново. Пишем запрос:
http://maps.googleapis.com/maps/api/geocode/json?address=Иваново&sensor=false&language=ru

И в ответе приходит:

<code>{ <span class="string">"status"</span>: <span class="string">"OK"</span>, <span class="string">"results"</span>: [ { <span class="string">"types"</span>: [ <span class="string">"locality"</span>, <span class="string">"political"</span> ], <span class="string">"formatted_address"</span>: <span class="string">"город Иваново, Ивановская область, Россия"</span>, - полный адрес <span class="string">"address_components"</span>: [ { - составляющие адреса <span class="string">"long_name"</span>: <span class="string">"город Иваново"</span>, <span class="string">"short_name"</span>: <span class="string">"город Иваново"</span>, <span class="string">"types"</span>: [ <span class="string">"locality"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Ивановский район"</span>, <span class="string">"short_name"</span>: <span class="string">"Ивановский район"</span>, <span class="string">"types"</span>: [ <span class="string">"administrative_area_level_2"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Ивановская область"</span>, <span class="string">"short_name"</span>: <span class="string">"Ивановская область"</span>, <span class="string">"types"</span>: [ <span class="string">"administrative_area_level_1"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Россия"</span>, <span class="string">"short_name"</span>: <span class="string">"RU"</span>, <span class="string">"types"</span>: [ <span class="string">"country"</span>, <span class="string">"political"</span> ] } ], <span class="string">"geometry"</span>: { <span class="string">"location"</span>: { - местонахождение <span class="string">"lat"</span>: <span class="number">56.9924086</span>, <span class="string">"lng"</span>: <span class="number">40.9677888</span> }, <span class="string">"location_type"</span>: <span class="string">"APPROXIMATE"</span>, <span class="string">"viewport"</span>: { - размеры <span class="string">"southwest"</span>: { <span class="string">"lat"</span>: <span class="number">56.9699256</span>, <span class="string">"lng"</span>: <span class="number">40.9265167</span> }, <span class="string">"northeast"</span>: { <span class="string">"lat"</span>: <span class="number">57.0148916</span>, <span class="string">"lng"</span>: <span class="number">41.0090609</span> } }, <span class="string">"bounds"</span>: { - границы <span class="string">"southwest"</span>: { <span class="string">"lat"</span>: <span class="number">56.9699256</span>, <span class="string">"lng"</span>: <span class="number">40.9265167</span> }, <span class="string">"northeast"</span>: { <span class="string">"lat"</span>: <span class="number">57.0148916</span>, <span class="string">"lng"</span>: <span class="number">41.0090609</span> } } } } ] } </code>

Вся прелесть в том, что можно в address параметре передавать значение на любом языке(Ivanovo, Іваново, <тут была арабская вязь>), еще лучше, что для Санкт-Петербурга прокатывает «Спб» и «Питер». Правда есть и недочеты: мой родной город Ивано-Франковск упорно называет Ивано-Франковськ, на украинский манер.
Вторая возможность, это по координатам узнать адрес:

http://maps.googleapis.com/maps/api/geocode/json?latlng=55.75320193022759,37.61922086773683&sensor=false&language=ru
получаем:

<code>{ <span class="string">"status"</span>: <span class="string">"OK"</span>, <span class="string">"results"</span>: [ { <span class="string">"types"</span>: [ <span class="string">"street_address"</span> ], <span class="string">"formatted_address"</span>: <span class="string">"Красная пл., 3, город Москва, Россия, 109012"</span>, <span class="string">"address_components"</span>: [ { <span class="string">"long_name"</span>: <span class="string">"3"</span>, <span class="string">"short_name"</span>: <span class="string">"3"</span>, <span class="string">"types"</span>: [ <span class="string">"street_address"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Красная пл."</span>, <span class="string">"short_name"</span>: <span class="string">"Красная пл."</span>, <span class="string">"types"</span>: [ <span class="string">"route"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Тверской"</span>, <span class="string">"short_name"</span>: <span class="string">"Тверской"</span>, <span class="string">"types"</span>: [ <span class="string">"sublocality"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"город Москва"</span>, <span class="string">"short_name"</span>: <span class="string">"город Москва"</span>, <span class="string">"types"</span>: [ <span class="string">"locality"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"АО Центральный"</span>, <span class="string">"short_name"</span>: <span class="string">"АО Центральный"</span>, <span class="string">"types"</span>: [ <span class="string">"administrative_area_level_2"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Москва"</span>, <span class="string">"short_name"</span>: <span class="string">"Москва"</span>, <span class="string">"types"</span>: [ <span class="string">"administrative_area_level_1"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"Россия"</span>, <span class="string">"short_name"</span>: <span class="string">"RU"</span>, <span class="string">"types"</span>: [ <span class="string">"country"</span>, <span class="string">"political"</span> ] }, { <span class="string">"long_name"</span>: <span class="string">"109012"</span>, <span class="string">"short_name"</span>: <span class="string">"109012"</span>, <span class="string">"types"</span>: [ <span class="string">"postal_code"</span> ] } ], <span class="string">"geometry"</span>: { <span class="string">"location"</span>: { <span class="string">"lat"</span>: <span class="number">55.7546971</span>, <span class="string">"lng"</span>: <span class="number">37.6215214</span> }, <span class="string">"location_type"</span>: <span class="string">"ROOFTOP"</span>, <span class="string">"viewport"</span>: { <span class="string">"southwest"</span>: { <span class="string">"lat"</span>: <span class="number">55.7515495</span>, <span class="string">"lng"</span>: <span class="number">37.6183738</span> }, <span class="string">"northeast"</span>: { <span class="string">"lat"</span>: <span class="number">55.7578447</span>, <span class="string">"lng"</span>: <span class="number">37.6246690</span> } } } }, { ... </code>

Супер! Для того чтобы указать свой адрес, можно просто кликнуть на свой дом, добавить квартиру – и всё. Иногда это не срабатывает, например, если дома стоят вплотную друг к другу и считываются как 1 объект, а не 2-3, адрес у них будет один. Особенно плохо, когда они находятся на пересечении улиц, и один дом относится к одной улице, а второй – к перпендикулярной, но думаю по необходимости – можно указать улицу, а дом и квартиру уже вбить. Очень удобное для смартфонов решение.
Кстати, не используйте jquery $.getJSON для получения данных, используйте класс Geocoder (http://code.google.com/apis/maps/documentation/javascript/reference.html#Geocoder), он работает лучше (т.е. это означает что getJSON у меня не работает).

А теперь о не очень хорошем. Geocoder – насколько клевая функция, что пользоваться ею можно только 2500 запросов в день. Google предлагает Google API Key Premier от 10000$ в год, и тогда ограничение будет в 100 тыс. запросов в день, причем куча всяких «клевых» дополнений, но я их не могу себе позволить.

Markercluster

Когда слишком много маркеров — это выглядит конечно ужасно. Поэтому хорошо бы делать кластеризацию всех этих маркеров. Тут на Хабре я видел уже обсуждение по этому поводу: http://habrahabr.ru/blogs/google/28621/
В общем, есть отличный инструмент (а тут их целый набор http://code.google.com/apis/maps/articles/toomanymarkers.html) который помогает сделать так, чтобы толпы маркеров не пугали нас.
До:

7e88dc86865f1474Это именно то что нам надо.
Эту библиотеку можно скачать тут: http://google-maps-utility-library-v3.googlecode.com/svn/trunk/
Как использовать.
Добавляем библиотеку

<code><span class="tag"><<span class="title">script</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span> <span class="attribute">src</span>=<span class="value">"/Media/script/map/markerclusterer_packed.js"</span>></span><span class="tag"></<span class="title">script</span>></span> </code>

Составляем массив маркеров, не добавляя в карту:

<code><span class="keyword">var</span> markers = []; <span class="keyword">var</span> marker = <span class="keyword">new</span> google.maps.Marker({ position: latlng }); markers.push(marker); markerClusterer = <span class="keyword">new</span> MarkerClusterer(_<span class="keyword">this</span>.map, markers, { maxZoom: <span class="number">13</span>, gridSize: <span class="number">50</span>, styles: <span class="literal">null</span> }); </code>

maxZoom – максимальный зум при котором мы еще группируем маркеры, дальше – уже нет.
gridSize – размер ячеек сетки, чем меньше значение, тем меньше сетка группировки
styles – дополнительные стили

Код из примера

Я не буду тут расписывать что как собрать, собственно все инструменты готовы, дам ссылки на исходники, и прокомментирую некоторые вещи.
Cерверного кода (asp.net mvc) там очень мало, всего 4 запроса:

  • собственно страница
  • получить все маркеры (в json)
  • загрузить файл (через ajaxUploader) и получить ссылку для картинки
  • сохранить в базу данных маркер (на выходе json result = ok)

Основной код jquery ( тут полностью: cocosanka.ru/media/script/map/map.js ) Там есть комментарии, и всё такое.
Некоторые функции требующие пояснения:

Вычисление значения Zoom по границам
(взято отсюда: http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/43958790eafe037f/66e889029c555bee?fwc=2)

<code><span class="keyword">this</span>.getZoom = <span class="function"><span class="keyword">function</span> <span class="params">(bounds)</span> {</span> <span class="keyword">var</span> width = $(<span class="string">".map"</span>).width(); <span class="keyword">var</span> height = $(<span class="string">".map"</span>).height(); <span class="keyword">var</span> dlat = Math.abs(bounds.getNorthEast().lat() - bounds.getSouthWest().lat()); <span class="keyword">var</span> dlon = Math.abs(bounds.getNorthEast().lng() - bounds.getSouthWest().lng()); <span class="keyword">var</span> max = <span class="number">0</span>; <span class="keyword">if</span> (dlat > dlon) { max = dlat; } <span class="keyword">else</span> { max = dlon; } <span class="keyword">var</span> clat = Math.PI * Math.abs(bounds.getSouthWest().lat() + bounds.getNorthEast().lat()) / <span class="number">360.</span>; <span class="keyword">var</span> C = <span class="number">0.0000107288</span>; <span class="keyword">var</span> z0 = Math.ceil(Math.log(dlat / (C * height)) / Math.LN2); <span class="keyword">var</span> z1 = Math.ceil(Math.log(dlon / (C * width * Math.cos(clat))) / Math.LN2); <span class="comment">//18 – это максимальный zoom для google.maps</span> <span class="keyword">return</span> <span class="number">18</span> - ((z1 > z0) ? z1 : z0); } </code>

Функция для «прыжка» маркера:

<code><span class="keyword">this</span>.toggleBounceMarker = <span class="keyword">function</span>() { <span class="keyword">if</span> (_<span class="keyword">this</span>.setMarker.getAnimation() != <span class="literal">null</span>) { _<span class="keyword">this</span>.setMarker.setAnimation(<span class="literal">null</span>); } <span class="keyword">else</span> { _<span class="keyword">this</span>.setMarker.setAnimation(google.maps.Animation.BOUNCE); } } </code>

Получение адреса:

<code><span class="keyword">this</span>.SetAddresses = <span class="function"><span class="keyword">function</span> <span class="params">(results)</span> {</span> $(<span class="string">".address_list"</span>).show(); $(<span class="string">".address_list"</span>).empty(); <span class="keyword">var</span> addressText = _<span class="keyword">this</span>.ComposeAddress(results[<span class="number">0</span>]); ... } <span class="comment">//Составить строку адреса по первому результату </span> <span class="keyword">this</span>.ComposeAddress = <span class="function"><span class="keyword">function</span> <span class="params">(item)</span> {</span> retAddress = <span class="string">""</span>; $.each(item.address_components, <span class="function"><span class="keyword">function</span> <span class="params">(i, address_item)</span> {</span> <span class="keyword">var</span> isOk = <span class="literal">false</span>; $.each(address_item.types, <span class="function"><span class="keyword">function</span> <span class="params">(j, typeName)</span> {</span> <span class="comment">//не будем брать значения адреса улицы и локали (города) - город потом будет в administrative_level_2</span> <span class="keyword">if</span> (typeName != <span class="string">"street_address"</span> && typeName != <span class="string">"locality"</span>) { isOk = <span class="literal">true</span>; } }); <span class="keyword">if</span> (isOk) { <span class="keyword">if</span> (retAddress == <span class="string">""</span>) { retAddress = address_item.long_name; } <span class="keyword">else</span> { retAddress = retAddress + <span class="string">", "</span> + address_item.long_name; } } }); <span class="keyword">return</span> retAddress; } </code>


Итого

Google Maps API – очень классная и удобная штука, которая легка в использовании и понимании. Единственно, что плохо – так это слабое покрытие регионов в России, так что сервисам, которые предполагается использовать в глубинке google.maps пока мало интересен, а вот для больших городов (особенно Москва и Питер), а также для Украины – всё отлично.
Geocoding – очень полезная вещь и при правильном использовании может стоить тех денег, что за нее просят (ну или Microsoft или Яндекс подоспеет с аналогом уже есть. Хотя насколько я знаю, картографическая информация стоит бешеных вложений.)

Пример\исходники

На живой пример можно глянуть тут: http://cocosanka.ru/map (может перестать работать если будет достигнут лимит в Geocoding). Вводите город, потом перетаскиваете маркер, потом загружаете картинку и сохранить. При клике на маркеры выводятся картинки.

Исходники: https://bitbucket.org/chernikov/citylocator

Источник: http://habrahabr.ru/post/110460/

Примеры работы с разными map API

bd72073cЕсть много статей на тему знакомства с Google Map Api и Yandex Map Api, но про остальные картографические сервисы не так много практического материала. В недавнем времени работал с Api:

  1. Google map
  2. Yandex map
  3. Yahoo map
  4. Bing map
  5. OpenStreet map

И хотел обобщить работу с вышеупомянутыми сервисами, а именно инициализация карты и установление маркеров по клику мышки. Материалы в статье представлены в виде Html кода, javascript и результата — скриншота, а так же исходники на vs 2010 MVC3.

С Google map ситуация проще всего: практического материала много, мой пример выглядит следующим образом:
Html page:

<code><span class="tag"><<span class="title">script</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span> <span class="attribute">src</span>=<span class="value">"http://maps.google.com/maps/api/js?sensor=false"</span> ></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">jquery-1.5.1.min.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">LoadGoogle.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">h2</span>></span>GoogleMap<span class="tag"></<span class="title">h2</span>></span> <span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">"map"</span> <span class="attribute">style</span>=<span class="value">"width: 1400px; height: 500px;"</span>></span><span class="tag"></<span class="title">div</span>></span> </code>

Script:

<code>$(document).ready(<span class="function"><span class="keyword">function</span> <span class="params">()</span> {</span> initialize(); }); <span class="comment">//инициализация карты в div "map"</span> <span class="function"><span class="keyword">function</span> <span class="title">initialize</span><span class="params">()</span> {</span> <span class="keyword">var</span> haightAshbury = <span class="keyword">new</span> google.maps.LatLng(<span class="number">51.0532</span>, <span class="number">31.83</span>);<span class="comment">//(долгота, широта)</span> <span class="keyword">var</span> mapOptions = { zoom: <span class="number">12</span>,<span class="comment">//масштаб</span> center: haightAshbury,<span class="comment">//позиционируем карту на заданые координаты</span> mapTypeId: google.maps.MapTypeId.TERRAIN<span class="comment">//задаем тип карты</span> }; map = <span class="keyword">new</span> google.maps.Map(document.getElementById(<span class="string">"map"</span>), mapOptions);<span class="comment">//инициализация карты</span> google.maps.event.addListener(map, <span class="string">'click'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(event)</span> {</span> addMarker(event.latLng); });<span class="comment">//добавляем событие нажание мышки</span> } <span class="comment">//функция добавления маркера</span> <span class="function"><span class="keyword">function</span> <span class="title">addMarker</span><span class="params">(location)</span> {</span> <span class="keyword">var</span> shadow = <span class="keyword">new</span> google.maps.MarkerImage(<span class="string">'/Images/roles.png'</span>, <span class="keyword">new</span> google.maps.Size(<span class="number">37</span>, <span class="number">32</span>), <span class="keyword">new</span> google.maps.Point(<span class="number">0</span>, <span class="number">0</span>), <span class="keyword">new</span> google.maps.Point(<span class="number">0</span>, <span class="number">32</span>)); <span class="comment">// Теневое изображение</span> <span class="keyword">var</span> image = <span class="keyword">new</span> google.maps.MarkerImage(<span class="string">'/Images/smilies.png'</span>, <span class="keyword">new</span> google.maps.Size(<span class="number">20</span>, <span class="number">32</span>), <span class="keyword">new</span> google.maps.Point(<span class="number">0</span>, <span class="number">0</span>), <span class="keyword">new</span> google.maps.Point(<span class="number">0</span>, <span class="number">32</span>)); <span class="comment">//изображение маркера</span> marker = <span class="keyword">new</span> google.maps.Marker({ position: location, map: map, shadow: shadow, icon: image, title: <span class="string">"My title!)"</span>, zIndex: <span class="number">999</span> });<span class="comment">//добавление маркера</span> </code>

В результате получим карту Google c возможностью добавлять маркеры:

53ce9ecbДля инициализации Yandex map вам понадобится ключ доступа к сервису и следующий пример:
Html page:

<code><span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"http://api-maps.yandex.ru/1.1/index.xml?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">jquery-1.5.1.min.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">LoadYandex.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">h2</span>></span>YandexMap<span class="tag"></<span class="title">h2</span>></span> <span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">"YMapsID"</span> <span class="attribute">class</span>=<span class="value">"YMaps YMaps-cursor-grab"</span> <span class="attribute">style</span>=<span class="value">"width: 1400px; height: 500px;"</span>></span> <span class="tag"></<span class="title">div</span>></span> </code>

Script:

<code>$(document).ready(<span class="function"><span class="keyword">function</span> <span class="params">()</span> {</span> initialize(); }); <span class="function"><span class="keyword">function</span> <span class="title">initialize</span><span class="params">()</span> {</span> map = <span class="keyword">new</span> YMaps.Map(document.getElementById(<span class="string">"YMapsID"</span>));<span class="comment">//инициализация карты</span> map.setCenter(<span class="keyword">new</span> YMaps.GeoPoint(<span class="number">31.87</span>, <span class="number">51.0532</span>)<span class="comment">//(широта, долгота)</span> , <span class="number">12</span> <span class="comment">//Масштаб</span> , YMaps.MapType.MAP);<span class="comment">//тип карты</span> map.addControl(<span class="keyword">new</span> YMaps.TypeControl());<span class="comment">//смена типа карты</span> map.addControl(<span class="keyword">new</span> YMaps.ToolBar());<span class="comment">//инструменты</span> map.addControl(<span class="keyword">new</span> YMaps.Zoom());<span class="comment">//смена масштаба</span> map.addControl(<span class="keyword">new</span> YMaps.MiniMap());<span class="comment">//Небольшая отображающая местоположение</span> map.addControl(<span class="keyword">new</span> YMaps.ScaleLine());<span class="comment">//Отображение масштаба</span> YMaps.Events.observe(map, map.Events.Click, <span class="function"><span class="keyword">function</span> <span class="params">(map, mEvent)</span> {</span> addMarker(mEvent.getGeoPoint()); });<span class="comment">// событие щелчка мыши на карте</span> } <span class="comment">//функция добавления маркера </span> <span class="function"><span class="keyword">function</span> <span class="title">addMarker</span><span class="params">(location)</span> {</span> <span class="keyword">var</span> geoPlacemark = <span class="keyword">new</span> YMaps.Placemark(<span class="keyword">new</span> YMaps.GeoPoint(location.__lng, location.__lat), { draggable: <span class="number">1</span> }); <span class="comment">//координаты добавления метки</span> geoPlacemark.name = <span class="string">"Название чего то"</span>; geoPlacemark.description = <span class="string">"описание чего то"</span>; map.addOverlay(geoPlacemark);<span class="comment">//добавление метки </span> } </code>

В результате получим карту Yandex c возможностью добавлять маркеры:

Яндекс картаОбратите внимание на координаты, в Google идет сначала долгота, потом широта, а в Yandex наоборот!

Пример работы с Yahoo map api:
Html page:

<code><span class="tag"><<span class="title">script</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span> <span class="attribute">src</span>=<span class="value">"http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=appidhere"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">LoadYahoo.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">body</span> <span class="attribute">onload</span>=<span class="value">"initialize_ymap()"</span>></span> <span class="tag"><<span class="title">h2</span>></span>YahooMap<span class="tag"></<span class="title">h2</span>></span> <span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">"ymap"</span> <span class="attribute">style</span>=<span class="value">"width: 1400px;height: 500px;"</span>></span><span class="tag"></<span class="title">div</span>></span> <span class="tag"></<span class="title">body</span>></span> </code>

Script:

<code><span class="function"><span class="keyword">function</span> <span class="title">initialize_ymap</span><span class="params">()</span> {</span> <span class="keyword">var</span> yPoint = <span class="keyword">new</span> YGeoPoint(<span class="number">51.0532</span>, <span class="number">31.83</span>);<span class="comment">//(долгота, широта)</span> <span class="keyword">var</span> map = <span class="keyword">new</span> YMap(document.getElementById(<span class="string">'ymap'</span>));<span class="comment">//инициализация карты</span> map.setMapType(YAHOO_MAP_SAT);<span class="comment">//тип карты</span> map.drawZoomAndCenter(yPoint, <span class="number">6</span>);<span class="comment">//масштаб</span> map.addTypeControl();<span class="comment">//добавление контроля типа</span> YEvent.Capture(map, EventsList.MouseClick, reportPosition); <span class="comment">//событие нажатия на карте</span> <span class="comment">//функция добавления маркера</span> <span class="function"><span class="keyword">function</span> <span class="title">reportPosition</span><span class="params">(_e, _c)</span>{</span> <span class="keyword">var</span> mapmapCoordCenter = map.convertLatLonXY(map.getCenterLatLon()); <span class="comment">//переобразование координат </span> <span class="keyword">var</span> currentGeoPoint = <span class="keyword">new</span> YGeoPoint( _c.Lat, _c.Lon ); <span class="comment">//Точка куда нужно поставить маркер</span> map.addMarker(currentGeoPoint); <span class="comment">//Добавление маркера</span> } } </code>

В результате получим карту Yahoo c возможностью добавлять маркеры:

Yahoo картаДля работы с Bing map api нужно взять ключ:
www.microsoft.com/maps/developers/web.aspx
Пример работы с Bing map api:
Html page:

<code><span class="tag"><<span class="title">script</span> <span class="attribute">charset</span>=<span class="value">"UTF-8"</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span> <span class="attribute">src</span>=<span class="value">"http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">charset</span>=<span class="value">"UTF-8"</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span> <span class="attribute">src</span>=<span class="value">"https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0&s=1"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">LoadBing.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">body</span> <span class="attribute">onload</span>=<span class="value">"GetMap();"</span>></span> <span class="tag"><<span class="title">h2</span>></span>BingMap<span class="tag"></<span class="title">h2</span>></span> <span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">'mapDiv'</span> <span class="attribute">style</span>=<span class="value">"position:absolute; width:1400px; height:500px;"</span>></span><span class="tag"></<span class="title">div</span>></span> <span class="tag"></<span class="title">body</span>></span> </code>

Script:

<code><span class="function"><span class="keyword">function</span> <span class="title">GetMap</span><span class="params">()</span> {</span> <span class="keyword">var</span> map = <span class="keyword">new</span> Microsoft.Maps.Map(document.getElementById(<span class="string">"mapDiv"</span>), { credentials: <span class="string">"ххххххххxxxxxxxxxxxxxxxxx"</span>,<span class="comment">//ключ</span> center: <span class="keyword">new</span> Microsoft.Maps.Location(<span class="number">51.0532</span>, <span class="number">31.83</span>),<span class="comment">//(долгота,широта)</span> mapTypeId: Microsoft.Maps.MapTypeId.road,<span class="comment">//(тип карты)</span> zoom: <span class="number">8</span><span class="comment">//масштаб</span> }); <span class="comment">//Событие на кликание мышки на карте</span> Microsoft.Maps.Events.addHandler(map, <span class="string">'click'</span>, displayLatLong); <span class="function"><span class="keyword">function</span> <span class="title">displayLatLong</span><span class="params">(e)</span> {</span> <span class="keyword">if</span> (e.targetType == <span class="string">"map"</span>) { <span class="keyword">var</span> point = <span class="keyword">new</span> Microsoft.Maps.Point(e.getX(), e.getY());<span class="comment">//координаты вставки маркера</span> <span class="keyword">var</span> loc = e.target.tryPixelToLocation(point);<span class="comment">//позиция маркера</span> <span class="keyword">var</span> pin = <span class="keyword">new</span> Microsoft.Maps.Pushpin(loc);<span class="comment">//маркер</span> map.entities.push(pin);<span class="comment">//вставляем маркер</span> } } } </code>

В результате получим карту Bing c возможностью добавлять маркеры:

Карты BindПример работы с OpenStreet map api:

Html page:

<code><span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"http://www.openlayers.org/api/OpenLayers.js"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"@Url.Content("</span>~/<span class="attribute">Scripts</span>/<span class="attribute">LoadOpenStreet.js</span>")" <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="tag"></<span class="title">script</span>></span> <span class="tag"><<span class="title">body</span> <span class="attribute">onload</span>=<span class="value">"GetMap();"</span>></span> <span class="tag"><<span class="title">h2</span>></span>OpenStreetMap<span class="tag"></<span class="title">h2</span>></span> <span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">"OSMap"</span> <span class="attribute">style</span>=<span class="value">"position:absolute; width:1400px; height:500px;"</span>></span><span class="tag"></<span class="title">div</span>></span> <span class="tag"></<span class="title">body</span>></span> </code>

Script:

<code><span class="function"><span class="keyword">function</span> <span class="title">GetMap</span><span class="params">()</span> {</span> map = <span class="keyword">new</span> OpenLayers.Map(<span class="string">"OSMap"</span>);<span class="comment">//инициализация карты</span> <span class="keyword">var</span> mapnik = <span class="keyword">new</span> OpenLayers.Layer.OSM();<span class="comment">//создание слоя карты</span> map.addLayer(mapnik);<span class="comment">//добавление слоя</span> map.setCenter(<span class="keyword">new</span> OpenLayers.LonLat(<span class="number">31.83</span>, <span class="number">51.0532</span>) <span class="comment">//(широта, долгота)</span> .transform( <span class="keyword">new</span> OpenLayers.Projection(<span class="string">"EPSG:4326"</span>), <span class="comment">// переобразование в WGS 1984</span> <span class="keyword">new</span> OpenLayers.Projection(<span class="string">"EPSG:900913"</span>) <span class="comment">// переобразование проекции</span> ), <span class="number">10</span> <span class="comment">// масштаб</span> ); <span class="keyword">var</span> layerMarkers = <span class="keyword">new</span> OpenLayers.Layer.Markers(<span class="string">"Markers"</span>);<span class="comment">//создаем новый слой маркеров</span> map.addLayer(layerMarkers);<span class="comment">//добавляем этот слой к карте</span> map.events.register(<span class="string">'click'</span>, map, <span class="function"><span class="keyword">function</span> <span class="params">(e)</span> {</span> <span class="keyword">var</span> size = <span class="keyword">new</span> OpenLayers.Size(<span class="number">21</span>, <span class="number">25</span>);<span class="comment">//размер картинки для маркера</span> <span class="keyword">var</span> offset = <span class="keyword">new</span> OpenLayers.Pixel(-(size.w / <span class="number">2</span>), -size.h); <span class="comment">//смещение картинки для маркера</span> <span class="keyword">var</span> icon = <span class="keyword">new</span> OpenLayers.Icon(<span class="string">'/Images/smilies.png'</span>, size, offset);<span class="comment">//картинка для маркера</span> layerMarkers.addMarker(<span class="comment">//добавляем маркер к слою маркеров</span> <span class="keyword">new</span> OpenLayers.Marker(map.getLonLatFromViewPortPx(e.xy), <span class="comment">//координаты вставки маркера</span> icon));<span class="comment">//иконка маркера</span> }); <span class="comment">//добавление событие клика по карте</span> } </code>

В результате получим карту OpenStreet c возможностью добавлять маркеры:

OpenStreet картаВот такие интересные примеры работы с картами, думаю кому то будут полезны.

Исходники на VS2010 MVC3.

Источник: http://habrahabr.ru/post/131249/