ads

"Делай что можешь с тем, что имеешь, там, где ты есть". Теодор Рузвельт

понедельник, 13 апреля 2020 г.

Пример настройки dns-сервера bind9

Настроим в локальной сети 192.168.x.x сервер разрешения имен dns. Создадим имена srv, db, ftp в домене dom на сервере 192.168.0.1.

Файл /etc/bind/dom/named.dom

$TTL    86400
@       IN      SOA     srv.dom. root.srv.dom.  (
                                  20180128 ; Serial
                                  28800      ; Refresh
                                  14400      ; Retry
                                  3600000    ; Expire
                                  86400 )    ; Minimum
          IN      NS      srv.dom.

srv     IN      A     192.168.0.1
db    IN      A     192.168.2.2
ftp     IN      A  192.168.0.127

Файл /etc/bind/dom/db.ftp для настройки короткого имени ftp без домена dom.

$TTL    86400
@       IN      SOA     srv.dom. root.srv.dom.  (
                                  20180128 ; Serial
                                  28800      ; Refresh
                                  14400      ; Retry
                                  3600000    ; Expire
                                  86400 )    ; Minimum
          IN      NS      srv.dom.

      IN      A     192.168.0.127

Прописываем зоны в /etc/bind/named.conf

zone "dom" {
    type master;
    file "/etc/bind/dom/named.dom";
};
zone "ftp" {
    type master;
    file "/etc/bind/dom/db.ftp";
};

Конфиг для настройки анонимного ftp-сервера

Конфиг /etc/vsftpd.conf
listen=yes
tcp_wrappers=yes

write_enable=yes
anon_root=/
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_upload_enable=yes
anon_umask=000

Удаление тага в git

Удаление тага (с названием mytag) в локальном и удаленном репозиториях git

git tag -d mytag
git push origin :refs/tags/mytag

Другой вариант

git push --delete origin mytag
git tag -d mytag

понедельник, 2 июня 2014 г.

Batch-файлы в Windows

Несколько полезных скриптов для командной оболочки cmd в Windows (bat-файлы).

Скрипт с использованием системной утилиты wmic. Для его работы оболочка должна быть запущена от администратора. Помещает каталог указанного процесса в PATH и выполняет bat-файл.

:: egax
:: Добавляем в PATH каталог исполняемого файла %1 процесса.
:: Запускаем если передан .bat %2

@echo off
wmic /? > nul
for /f "delims=" %%a in ('wmic process where ^(name^="%1"^) get ExecutablePath^|find 
/V "ExecutablePath"^|findstr /V "^$"') do (
  echo Сервис найден %%a
  set PATH=%%~dpa
  if "%2" == "" goto end
  call "%~dp0\%2" %1 && goto end
)
if not exist "%~fs$PATH:1" (
  echo Запущенный сервис не найден.
  echo Запустите %1 и запустите вручную 'checkproc.bat %1 %2'.
)
:end
Скрипт используется для загрузки базы данных PostgreSQL
checkproc.bat postgres.exe install-bd.bat
Вот текст скрипта install-bd.bat для восстановления базы postgresql из sql-дампа, созданного pg_dump.
:: egax
:: Распаковка базы mybd

@echo off
::имя базы и архива
set dbname=mybd
set initsql=}initsql{.sql
echo Установка базы %dbname% (требуется пароль postgres) . . .
pushd "%~dp0"
for /f %%a in ('dir /B "%dbname%"') do (
  echo drop database %dbname%; >> %initsql%
  echo create database %dbname% encoding 'win' template template0; >> %initsql%
  echo \connect %dbname% >> %initsql%
  echo \i %%a >> %initsql%
  echo vacuum full analyze; >> %initsql%
  psql -U postgres -f %initsql% template1 > nul 2>install-%dbname%.log
  del /q %initsql%
)
:end
popd

воскресенье, 6 апреля 2014 г.

gdal_translate и gdalwarp для перепроицирования изображений

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

  • gdal_translate
  • gdalwarp

Для своего проекта dbCartajs мне потребовались изображения для разных проекций. Изображения я хочу вывести на канвас вместе с векторными данными. Для этого цели из программы Orbitron я позаимствовал картинку с плоской картой Земли в небольшом разрешении.

worldmap.jpg

Она отлично подходит для экспериментов, но как быть с другими проекциями - меркатор, сфера? Я нашел несколько картинок в разных проекциях, но все они оказались в разных цветовых сочетаниях и разрешениях, поэтому решил попробовать самостоятельно преобразовать исходную картинку с помощью утилит gdal, используя их описание и примеры.

Сначала, преобразуем исходную картинку в формат tiff - родной формат gdal - и задаем координаты привязки изображения.

gdal_translate -of Gtiff -co "TFW=YES" -a_ullr -180 90 180 -90 worldmap.png worldmap.tif

Для проекции Меркатора нужно ограничить размеры на полюсах (80-85 градусов).

gdal_translate -of Gtiff -projwin -180 84 180 -84 worldmap.tif worldmap-1.tif

Теперь формируем изображение в проекции Меркатора в формате tiff.

gdalwarp -s_srs EPSG:4326 -t_srs EPSG:3857 worldmap-1.tif worldmap-merc.tif

Браузер не работают с tiff, поэтому переводим его в jpeg.

gdal_translate -of JPEG worldmap-merc.tif worldmap-merc.jpg

Вот результат

worldmap-merc.jpg

Аналогично получаем картинки для других проекций, например ortho.

gdalwarp -s_srs EPSG:4326 -t_srs "+proj=ortho +lon_0=0 +lat_0=0" worldmap-1.tif worldmap-ortho.tif
gdal_translate -of JPEG worldmap-ortho.tif worldmap-ortho.jpg
worldmap-ortho.jpg

понедельник, 31 марта 2014 г.

Конфиг c анонимным доступом для vsftpd

Конфиг-файл для FTP-сервера vsftpd под Linux.

Включает анонимный доступ (пользователи ftp, anonymous) с маской файлов rw.

Корневой каталог /.

listen=yes
tcp_wrappers=yes

write_enable=yes
anon_root=/
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_upload_enable=yes
anon_umask=000

вторник, 11 февраля 2014 г.

Создание self-extract архива tar

Созданием самораспаковывающийся архив .run в среде Linux - аналог архива .exe в Windows.

Создаем файл скрипта распаковки архива extract.sh.

#!/bin/bash
echo ""
echo "Self Extracting Installer"
echo ""

export TMPDIR=`mktemp -d /tmp/selfextract.XXXXXX`

ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' $0`

tail -n+$ARCHIVE $0 | tar -xzv - -C $TMPDIR

CDIR=`pwd`
cd $TMPDIR
./installer

cd $CDIR
rm -rf $TMPDIR

exit 0

# newline after
__ARCHIVE_BELOW__

Пакуем скрипт запуска и архив tar.gz в bundle

cat extract.sh a.tar.gz > installer.run

Запускаем

sh installer.run

Использование Samba для скачивания/закачивания каталогов

Чтобы "скачать" через консоль каталог файлов по сети с машины под Windows (Samba-сервером под Linux) удобно воспользоваться утилитой smbclient из пакета samba. Например.

Список доступных сетевых папок

smbclient -L 192.168.0.9 -U Администратор

Подключаемся

smbclient //192.168.0.9/E$ -U Администратор

В оболочке Samba вводим команды для "скачивания" рекурсивно папки в текущий каталог

smb:/> recurse
smb:/> prompt
smb:/> mget Документы

Аналогично можно закачать папку из текущего каталога

smb:/> recurse
smb:/> prompt
smb:/> mput home

Текущим путем является текущий путь в терминале, в котором был запущен smbclient.

Расширенный аналог утилиты wc в Linux

Скрипт рекурсивно считает число строк в файлах каталогов. Можно задавать маски поиска имен файлов на вхождение или не вхождение. Скрипт использовался в средах Windows и Linux (локаль koi8-r) для версии языка Python 2.4. Подробности вызова смотри в исходнике или в справке при вызове без параметров:

python pywc.py

Текст:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Выводит число строк, байт для каждого файла каталога рекурсивно и итоговую строку."""

import sys, os, re
import fileinput as i
import fnmatch as f

__version__ = '0.3'

E = lambda text: text.encode({'posix':'koi8-r', 'nt':'cp866'}.get(os.name))
_E = lambda text: text.decode({'posix':'koi8-r', 'nt':'cp866'}.get(os.name))
E_OS = lambda text: text.encode({'posix':'koi8-r', 'nt':'cp1251'}.get(os.name))
_E_OS = lambda text: text.decode({'posix':'koi8-r', 'nt':'cp1251'}.get(os.name))

STR_HELP = u"""\
Вызов: python pywc.py <папка> [<файл_масок> | - ]
Выводит число строк, байт для каждого файла в ПАПКЕ по маскам из ФАЙЛА_МАСОК.

ФАЙЛ_МАСОК содержит маски поиска на включение и исключение файлов, разделенных пустой строкой.
Если ФАЙЛ_МАСОК задан как -, читает стандартный ввод, если не задан, подсчитываются все файлы.

Пример файла:
  # включать
  *.c *.cpp
  *.h *.asm

  # исключать
  *\.svn\* *\stdafx.h

Примеры использования:
  python pywc.py .               Считать все файлы в текущем каталоге и ниже. 
  python pywc.py тест1 dir       Считать файлы в test1 и ниже, используя файл масок dir."""

REG_COL = '(?:[ \t]*#.*\r?\n?)*((?:[^\r\n]+\r?\n?)+)'
REG_ROW = '([^ \t\r\n]+)'

def subinfo(lines, size, files, _files, ts, lastprint=True):
    """Выводит расчеты в stdout."""
    print lines, size, ts
    print E(u'Посчитано файлов'), files, E(u'из'), files + _files             
    if (lastprint):
        print

args = sys.argv[1:]

if (not args):
    print E(STR_HELP)
    sys.exit(2)

# файл масок поиска и исключений
_wcfile = []
if (len(args) > 1):
    if (args[1] == '-'):
        wcfile = sys.stdin
    else:
        wcfile = file(args[1])
    _wcfile = re.findall(REG_COL, _E_OS(wcfile.read()))

res = []
for x in _wcfile:
    res += [re.findall(REG_ROW, x)]

# каталог подсчетов    
os.chdir(args[0])

dd = sublines = subsize = subfiles = _subfiles = None
totallines = totalsize = totalfiles = _totalfiles = 0
for root, dirs, files in os.walk(u'.', topdown=False):
    # подпапки
    if (root != dd):
        if (sublines):
            subinfo(sublines, subsize, subfiles, _subfiles, E(u'ИТОГО'))
        sublines = subsize = subfiles = _subfiles = 0
        dd = root
    for name in files:
        curname = os.path.normpath(os.path.join(root, name))
        absname = os.path.join(_E_OS(os.getcwd()), curname)
        if (res):      
            p = e = False        
            # вхождения
            for x in res[0]:
                p = (f.fnmatch(name, x) or f.fnmatch(curname, x) or f.fnmatch(absname, x))
                if (p):
                    break
            # исключения
            if (len(res) > 1 and p):            
                for x in res[1]:
                    e = (f.fnmatch(name, x) or f.fnmatch(curname, x) or f.fnmatch(absname, x))
                    if (e):
                        break                    
            if (not (p and (not e))):
                print >> sys.stderr, E(u'Игнорируем'), E(curname)
                _subfiles += 1
                _totalfiles += 1
                continue
        for line in i.input(E_OS(absname)):
            pass
        else:
            curlines, cursize = i.filelineno(), os.stat(curname)[6]            
            # по подпапкам
            sublines += curlines
            subsize += cursize
            subfiles += 1
            # всего
            totallines += curlines
            totalsize += cursize
            totalfiles += 1
            print curlines, cursize, E(curname)
            i.close()
else:
    if (sublines):
        subinfo(sublines, subsize, subfiles, _subfiles, E(u'ИТОГО'))

if (totallines):
    subinfo(totallines, totalsize, totalfiles, _totalfiles, E(u'ВСЕГО'), lastprint=False)

понедельник, 23 декабря 2013 г.

Перекодировка файлов в каталоге из Windows-1251 в UTF-8

Еще один конвертор на shell. Перекодировка всех файлов в указанном каталоге из Windows-1251 в UTF-8.

Маска файлов *.txt указана в скрипте в параметре для find. Для компактности ее можно вынести в параметр скрипта $2.

#!/bin/bash
# 
# Конвертим рекурсивно файлы из кодировки Windows в Юникод из каталога $1

export TMP_F=`mktemp`

trap "rm -f $TMP_F" EXIT

find "$1" -name \*.txt -print|while read x
do 
    echo $x
    iconv -f cp1251 -t utf8 "$x">$TMP_F && cat $TMP_F > "$x"
done

вторник, 1 октября 2013 г.

Конвертор mp3-файлов в VBR-формат

Конвертор mp3-файлов в VBR-формат с хорошим качеством и небольшим размером.

Удобен для сжатия mp3-файлов с большим битрейтом (256, 320 Кб/с). Использует утилиты lame и id3info.

#!/bin/bash
#
# Конвертор mp3-файлов в VBR-битрейт

# Вызов: bash mp3conv [каталог_с_mp3]
# egax

parse_tag ()
{
    retval=$(echo "$1" | grep -P "$2" | iconv -f CP1251 -t UTF-8)

    expr match "$retval" ".*:[ \\t]*\(.*\)"
}

cd "$1"
for curfile in *.mp3; do

    tag=$(id3info "$curfile")

    # берем поля тага
    title=$(parse_tag "$tag" TIT2)

    artist=$(parse_tag "$tag" TPE1)
    track=$(parse_tag "$tag" TRCK)

    year=$(parse_tag "$tag" TYER)
    album=$(parse_tag "$tag" TALB)

    newfile="$curfile"
    # новое имя файла $artist - [$track_]$title.mp3
    if [ ! -z "$artist" ] && [ ! -z "$title" ]; then

        if [ ! -z $track ]; then
            [ $track -lt 10  ] && track=0"$track"

            title="$track"_"$title"
        fi
        newfile="$artist"" - "$title".mp3"

    fi

    dirname=1
    # имя папки для новых файлов [$year_]$album
    if [ ! -z "$album" ]; then

        [ -z $year ] || album="$year"_"$album"
        dirname="$album"

    fi

    # создаем папку если не создана
    [ -d "$dirname" ] || mkdir "$dirname"

    newfile="$dirname"/"$newfile"

    # конвертим файл с VBR-битрейдом и копируем таги v2 и v1
    lame --vbr-new -B 192 "$curfile" "$newfile"

    id3cp -2 "$curfile" "$newfile"
    id3cp -1 "$curfile" "$newfile"
done

Настройка проектов для разработки плагинов PHP

Повысить скорость выполнения скриптов, особенно с использованием циклических вычислений, можно, перенеся части кода на язык C и оформив их как плагин PHP. У PHP есть отличный API позволяющий, даже не имея особых навыков программирования на С,создавать модули. Макросы и функции для работы с массивами, строками, входными аргументами уже есть в наличии, а примеры их использования есть в документации и исходном коде.

Создадим свое расширение myextension и настроим проект в среде Visual C 9 из пакета разработки Microsoft Visual Studio 9. В VС9 можно собирать модули для php версий 5.2, 5.3, 5.4. Для версии php 5.5 нужно использовать пакет Visual Studio 2012.

Для создания каркаса проекта с в каталоге ext в папке исходных кодов php запускаем скрипт ext_skel под Linux или ext_skel_win32.php под Windows с установленым пакетом Cygwin.

./ext_skel --extname=myextension

В созданной папке myextension открываем файл myextension.dsp в среде VC9. Открываем окно свойств проекта раскрываем меню Configuration Properties.

Включаем режим отладки в настройках Linker->Debugging->General Debug Info, выбираем Yes (/DEBUG).

В настройках C/C++->General->Debug Information Format выбираем Program Database (/ZI).

Указываем скрипт запуска во вкладке Debugging как Command с ....\Debug_TS\php.exe и Command Arguments с -f myextension.php.

Ставим точку останова, запускаем режим отладки по клавише F5 и убеждается, что она работает.

myext3.png

Все. Теперь сделаем тоже самое, но для среды NetBeans IDE 7.2 под Linux. Для этого в системе должна быть установлена отладочная версия php. Для этого берем исходники с сайта php.net, например, php-5.4.9.tar.gz. Распаковываем и собираем с режимом отладки:

./configure --prefix=/usr/local/php54d/ --enable-debug
make install

После установки запускаем редактор NetBeans, создаем проект "Приложение на C/C++" и включаем в него все файлы расширениями .h и *.c из каталога */ext/myextension. Открываем вкладку "Собрать" в окне свойств проекта. В подпункте "Тип конфигурации" указываем "Динамическая библиотека".

В разделе "Компилятор C" прописываем пути к инклудам php:

  • /usr/local/php54d/include/php
  • /usr/local/php54d/include/php/main
  • /usr/local/php54d/include/php/Zend
  • /usr/local/php54d/include/php/TSRM

В подпункте "Препроцессорные определения" указываем COMPILE_DL_MYEXTENSION=1.

В настройке "Компоновщик"->"Вывод" меняем имя libmyextension на php_myextension.

Теперь компилируем модуль и копируем его в каталог модулей php. По умолчанию это будет что-то типа /usr/local/php54d/lib64/extensions/debug-non-zts-20100525. После этого ставим точку останова и запускаем режим отладки. Если все настройки сделаны правильно, должно получиться.

nb0.png

Сборка плагина (extension) для PHP 5.x

Краткая сводка действий для сборки плагина под PHP 5.2-5.5

Сборка под Linux

PHP должен быть установлен в системе.

phpize
./configure
make
make test
make install (или скопировать вручную php_extension.so)

Сборка под Windows

Используем среду Visual Studio 2008.

Настройка php-sdk (поставляется отдельно от дистрибутива php):

setenv /x86 /xp /release
cd c:\php-sdk\
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat <php_src_dir>

Для PHP 5.2 также нужен win32build (ставится тоже отдельно):

set INCLUDE=c:\win32build\include

Выставляем переменные окружения Visual Studio:

c:\Program Files\Microsoft Visual Studio 9.0\VC in cvars32.bat

Собираем PHP через configure.js и nmake. В VS2008Express отсутствует компилятор сообщений mc.exe. Его можно взять из VS2010 добавив в Makefile строчку перед "MT = ...":

MC=C:\Program Files\Microsoft SDKs\Windows 7.0A in\mc.exe 
MT=C:\Program Files\Microsoft SDKs\Windows 6.0A in\mt.exe

Либо установить Windows SDK.

Инициализируем плагин:

  1. php.exe extskelwin32.php --extname=myextension --proto=myprototypefile.dat
  2. Раскомментарить ARGENABLE или ARGWITH в config.w32

Собираем PHP 5.2 с плагином:

buildconf.bat
cscript /nologo configure.js --disable-zts --disable-cgi --disable-fastcgi 
--disable-path-info-check --disable-bcmath --disable-calendar 
--disable-com-dotnet --disable-ctype --disable-xmlreader --disable-zlib 
--disable-xmlwriter --disable-ftp --disable-filter --disable-ctype 
--disable-com-dotnet --enable-cli --without-xml --without-libxml 
--without-simplexml --disable-ipv6 --with-EXTENSION[=shared[,PATH]]
nmake

Сборка PHP 5.3-5.5 с плагином:

buildconf.bat
cscript /nologo configure.js --disable-all --enable-cli 
--with-EXTENSION[=shared[,PATH]]
nmake

Для компиляции через Visual Studio в настройках проекта нужно выставить флаг препроцессора _USE_32BIT_TIME_T.

понедельник, 30 сентября 2013 г.